glsl_lang_pp/
exts.rs

1use std::collections::HashMap;
2
3use once_cell::sync::Lazy;
4
5use crate::types::type_names::TypeNameAtom;
6
7#[macro_use]
8pub mod names;
9
10use names::ExtNameAtom;
11
12pub struct ExtensionSpec {
13    name: ExtNameAtom,
14    type_names: Vec<TypeNameAtom>,
15}
16
17impl ExtensionSpec {
18    pub fn new(name: ExtNameAtom, type_names: Vec<TypeNameAtom>) -> Self {
19        Self { name, type_names }
20    }
21
22    pub fn name(&self) -> &ExtNameAtom {
23        &self.name
24    }
25
26    pub fn type_names(&self) -> &[TypeNameAtom] {
27        &self.type_names
28    }
29}
30
31pub struct Registry {
32    extensions: HashMap<ExtNameAtom, ExtensionSpec>,
33}
34
35impl Registry {
36    pub fn new() -> Self {
37        Self {
38            extensions: Default::default(),
39        }
40    }
41
42    pub fn all(&self) -> impl Iterator<Item = &ExtensionSpec> {
43        self.extensions.values()
44    }
45
46    pub fn get(&self, name: &ExtNameAtom) -> Option<&ExtensionSpec> {
47        self.extensions.get(name)
48    }
49
50    pub fn add(&mut self, spec: ExtensionSpec) {
51        self.extensions.insert(spec.name.clone(), spec);
52    }
53}
54
55// TODO: Fill registry with extension data from Khronos
56
57impl Default for Registry {
58    fn default() -> Self {
59        Self {
60            extensions: [
61                ExtensionSpec::new(ExtNameAtom::from("GL_3DL_array_objects"), vec![]),
62                ExtensionSpec::new(
63                    ExtNameAtom::from("GL_AMD_gpu_shader_int16"),
64                    vec![
65                        TypeNameAtom::from("int16_t"),
66                        TypeNameAtom::from("i16vec2"),
67                        TypeNameAtom::from("i16vec3"),
68                        TypeNameAtom::from("i16vec4"),
69                        TypeNameAtom::from("uint16_t"),
70                        TypeNameAtom::from("u16vec2"),
71                        TypeNameAtom::from("u16vec3"),
72                        TypeNameAtom::from("u16vec4"),
73                    ],
74                ),
75                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_compute_shader"), vec![]),
76                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_derivative_control"), vec![]),
77                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_enhanced_layouts"), vec![]),
78                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_explicit_attrib_location"), vec![]),
79                ExtensionSpec::new(
80                    ExtNameAtom::from("GL_ARB_explicit_uniform_location"),
81                    vec![],
82                ),
83                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_gpu_shader5"), vec![]),
84                ExtensionSpec::new(
85                    ExtNameAtom::from("GL_ARB_gpu_shader_fp64"),
86                    vec![
87                        type_name!("double"),
88                        type_name!("dvec2"),
89                        type_name!("dvec3"),
90                        type_name!("dvec4"),
91                        type_name!("dmat2"),
92                        type_name!("dmat3"),
93                        type_name!("dmat4"),
94                        type_name!("dmat2x2"),
95                        type_name!("dmat2x3"),
96                        type_name!("dmat2x4"),
97                        type_name!("dmat3x2"),
98                        type_name!("dmat3x3"),
99                        type_name!("dmat3x4"),
100                        type_name!("dmat4x2"),
101                        type_name!("dmat4x3"),
102                        type_name!("dmat4x4"),
103                    ],
104                ),
105                ExtensionSpec::new(
106                    ExtNameAtom::from("GL_ARB_gpu_shader_int64"),
107                    vec![
108                        TypeNameAtom::from("int64_t"),
109                        TypeNameAtom::from("i64vec2"),
110                        TypeNameAtom::from("i64vec3"),
111                        TypeNameAtom::from("i64vec4"),
112                        TypeNameAtom::from("uint64_t"),
113                        TypeNameAtom::from("u64vec2"),
114                        TypeNameAtom::from("u64vec3"),
115                        TypeNameAtom::from("u64vec4"),
116                    ],
117                ),
118                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_sample_shading"), vec![]),
119                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_separate_shader_objects"), vec![]),
120                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_shader_bit_encoding"), vec![]),
121                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_shader_draw_parameters"), vec![]),
122                ExtensionSpec::new(
123                    ExtNameAtom::from("GL_ARB_shader_image_load_store"),
124                    vec![
125                        type_name!("image1D"),
126                        type_name!("iimage1D"),
127                        type_name!("uimage1D"),
128                        type_name!("image2D"),
129                        type_name!("iimage2D"),
130                        type_name!("uimage2D"),
131                        type_name!("image3D"),
132                        type_name!("iimage3D"),
133                        type_name!("uimage3D"),
134                        type_name!("image2DRect"),
135                        type_name!("iimage2DRect"),
136                        type_name!("uimage2DRect"),
137                        type_name!("imageCube"),
138                        type_name!("iimageCube"),
139                        type_name!("uimageCube"),
140                        type_name!("imageBuffer"),
141                        type_name!("iimageBuffer"),
142                        type_name!("uimageBuffer"),
143                        type_name!("image1DArray"),
144                        type_name!("iimage1DArray"),
145                        type_name!("uimage1DArray"),
146                        type_name!("image2DArray"),
147                        type_name!("iimage2DArray"),
148                        type_name!("uimage2DArray"),
149                        type_name!("imageCubeArray"),
150                        type_name!("iimageCubeArray"),
151                        type_name!("uimageCubeArray"),
152                        type_name!("image2DMS"),
153                        type_name!("iimage2DMS"),
154                        type_name!("uimage2DMS"),
155                        type_name!("image2DMSArray"),
156                        type_name!("iimage2DMSArray"),
157                        type_name!("uimage2DMSArray"),
158                    ],
159                ),
160                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_shader_image_size"), vec![]),
161                ExtensionSpec::new(
162                    ExtNameAtom::from("GL_ARB_shader_storage_buffer_object"),
163                    vec![],
164                ),
165                ExtensionSpec::new(
166                    ExtNameAtom::from("GL_ARB_shader_texture_image_samples"),
167                    vec![],
168                ),
169                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_shader_texture_lod"), vec![]),
170                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_shading_language_420pack"), vec![]),
171                ExtensionSpec::new(ext_name!("GL_ARB_shading_language_include"), vec![]),
172                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_shading_language_packing"), vec![]),
173                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_sparse_texture2"), vec![]),
174                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_tessellation_shader"), vec![]),
175                ExtensionSpec::new(
176                    ExtNameAtom::from("GL_ARB_texture_cube_map_array"),
177                    vec![
178                        type_name!("samplerCubeArray"),
179                        type_name!("samplerCubeArrayShadow"),
180                        type_name!("isamplerCubeArray"),
181                        type_name!("usamplerCubeArray"),
182                    ],
183                ),
184                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_texture_gather"), vec![]),
185                ExtensionSpec::new(
186                    ExtNameAtom::from("GL_ARB_texture_multisample"),
187                    vec![
188                        type_name!("sampler2DMS"),
189                        type_name!("isampler2DMS"),
190                        type_name!("usampler2DMS"),
191                        type_name!("sampler2DMSArray"),
192                        type_name!("isampler2DMSArray"),
193                        type_name!("usampler2DMSArray"),
194                    ],
195                ),
196                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_texture_query_lod"), vec![]),
197                ExtensionSpec::new(
198                    ExtNameAtom::from("GL_ARB_texture_rectangle"),
199                    vec![
200                        type_name!("sampler2DRect"),
201                        type_name!("sampler2DRectShadow"),
202                    ],
203                ),
204                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_uniform_buffer_object"), vec![]),
205                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_vertex_attrib_64bit"), vec![]),
206                ExtensionSpec::new(ExtNameAtom::from("GL_ARB_viewport_array"), vec![]),
207                ExtensionSpec::new(
208                    ExtNameAtom::from("GL_EXT_YUV_target"),
209                    vec![TypeNameAtom::from("__samplerExternal2DY2YEXT")],
210                ),
211                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_blend_func_extended"), vec![]),
212                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_control_flow_attributes"), vec![]),
213                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_device_group"), vec![]),
214                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_frag_depth"), vec![]),
215                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_geometry_shader"), vec![]),
216                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_gpu_shader5"), vec![]),
217                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_multiview"), vec![]),
218                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_nonuniform_qualifier"), vec![]),
219                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_null_initializer"), vec![]),
220                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_primitive_bounding_box"), vec![]),
221                ExtensionSpec::new(
222                    ExtNameAtom::from("GL_EXT_ray_flags_primitive_culling"),
223                    vec![],
224                ),
225                ExtensionSpec::new(
226                    ExtNameAtom::from("GL_EXT_ray_query"),
227                    vec![
228                        TypeNameAtom::from("accelerationStructureEXT"),
229                        TypeNameAtom::from("rayQueryEXT"),
230                    ],
231                ),
232                ExtensionSpec::new(
233                    ExtNameAtom::from("GL_EXT_samplerless_texture_functions"),
234                    vec![],
235                ),
236                ExtensionSpec::new(
237                    ExtNameAtom::from("GL_EXT_shader_explicit_arithmetic_types"),
238                    vec![
239                        TypeNameAtom::from("float64_t"),
240                        TypeNameAtom::from("f64vec2"),
241                        TypeNameAtom::from("f64vec3"),
242                        TypeNameAtom::from("f64vec4"),
243                        TypeNameAtom::from("f64mat2"),
244                        TypeNameAtom::from("f64mat3"),
245                        TypeNameAtom::from("f64mat4"),
246                        TypeNameAtom::from("f64mat2x2"),
247                        TypeNameAtom::from("f64mat2x3"),
248                        TypeNameAtom::from("f64mat2x4"),
249                        TypeNameAtom::from("f64mat3x2"),
250                        TypeNameAtom::from("f64mat3x3"),
251                        TypeNameAtom::from("f64mat3x4"),
252                        TypeNameAtom::from("f64mat4x2"),
253                        TypeNameAtom::from("f64mat4x3"),
254                        TypeNameAtom::from("f64mat4x4"),
255                        TypeNameAtom::from("float32_t"),
256                        TypeNameAtom::from("f32vec2"),
257                        TypeNameAtom::from("f32vec3"),
258                        TypeNameAtom::from("f32vec4"),
259                        TypeNameAtom::from("f32mat2"),
260                        TypeNameAtom::from("f32mat3"),
261                        TypeNameAtom::from("f32mat4"),
262                        TypeNameAtom::from("f32mat2x2"),
263                        TypeNameAtom::from("f32mat2x3"),
264                        TypeNameAtom::from("f32mat2x4"),
265                        TypeNameAtom::from("f32mat3x2"),
266                        TypeNameAtom::from("f32mat3x3"),
267                        TypeNameAtom::from("f32mat3x4"),
268                        TypeNameAtom::from("f32mat4x2"),
269                        TypeNameAtom::from("f32mat4x3"),
270                        TypeNameAtom::from("f32mat4x4"),
271                        TypeNameAtom::from("float16_t"),
272                        TypeNameAtom::from("f16vec2"),
273                        TypeNameAtom::from("f16vec3"),
274                        TypeNameAtom::from("f16vec4"),
275                        TypeNameAtom::from("f16mat2"),
276                        TypeNameAtom::from("f16mat3"),
277                        TypeNameAtom::from("f16mat4"),
278                        TypeNameAtom::from("f16mat2x2"),
279                        TypeNameAtom::from("f16mat2x3"),
280                        TypeNameAtom::from("f16mat2x4"),
281                        TypeNameAtom::from("f16mat3x2"),
282                        TypeNameAtom::from("f16mat3x3"),
283                        TypeNameAtom::from("f16mat3x4"),
284                        TypeNameAtom::from("f16mat4x2"),
285                        TypeNameAtom::from("f16mat4x3"),
286                        TypeNameAtom::from("f16mat4x4"),
287                        TypeNameAtom::from("int64_t"),
288                        TypeNameAtom::from("i64vec2"),
289                        TypeNameAtom::from("i64vec3"),
290                        TypeNameAtom::from("i64vec4"),
291                        TypeNameAtom::from("uint64_t"),
292                        TypeNameAtom::from("u64vec2"),
293                        TypeNameAtom::from("u64vec3"),
294                        TypeNameAtom::from("u64vec4"),
295                        TypeNameAtom::from("int32_t"),
296                        TypeNameAtom::from("i32vec2"),
297                        TypeNameAtom::from("i32vec3"),
298                        TypeNameAtom::from("i32vec4"),
299                        TypeNameAtom::from("uint32_t"),
300                        TypeNameAtom::from("u32vec2"),
301                        TypeNameAtom::from("u32vec3"),
302                        TypeNameAtom::from("u32vec4"),
303                        TypeNameAtom::from("int16_t"),
304                        TypeNameAtom::from("i16vec2"),
305                        TypeNameAtom::from("i16vec3"),
306                        TypeNameAtom::from("i16vec4"),
307                        TypeNameAtom::from("uint16_t"),
308                        TypeNameAtom::from("u16vec2"),
309                        TypeNameAtom::from("u16vec3"),
310                        TypeNameAtom::from("u16vec4"),
311                        TypeNameAtom::from("int8_t"),
312                        TypeNameAtom::from("i8vec2"),
313                        TypeNameAtom::from("i8vec3"),
314                        TypeNameAtom::from("i8vec4"),
315                        TypeNameAtom::from("uint8_t"),
316                        TypeNameAtom::from("u8vec2"),
317                        TypeNameAtom::from("u8vec3"),
318                        TypeNameAtom::from("u8vec4"),
319                    ],
320                ),
321                ExtensionSpec::new(
322                    ExtNameAtom::from("GL_EXT_shader_explicit_arithmetic_types_float16"),
323                    vec![
324                        TypeNameAtom::from("float16_t"),
325                        TypeNameAtom::from("f16vec2"),
326                        TypeNameAtom::from("f16vec3"),
327                        TypeNameAtom::from("f16vec4"),
328                        TypeNameAtom::from("f16mat2"),
329                        TypeNameAtom::from("f16mat3"),
330                        TypeNameAtom::from("f16mat4"),
331                        TypeNameAtom::from("f16mat2x2"),
332                        TypeNameAtom::from("f16mat2x3"),
333                        TypeNameAtom::from("f16mat2x4"),
334                        TypeNameAtom::from("f16mat3x2"),
335                        TypeNameAtom::from("f16mat3x3"),
336                        TypeNameAtom::from("f16mat3x4"),
337                        TypeNameAtom::from("f16mat4x2"),
338                        TypeNameAtom::from("f16mat4x3"),
339                        TypeNameAtom::from("f16mat4x4"),
340                    ],
341                ),
342                ExtensionSpec::new(
343                    ExtNameAtom::from("GL_EXT_shader_explicit_arithmetic_types_float32"),
344                    vec![
345                        TypeNameAtom::from("float32_t"),
346                        TypeNameAtom::from("f32vec2"),
347                        TypeNameAtom::from("f32vec3"),
348                        TypeNameAtom::from("f32vec4"),
349                        TypeNameAtom::from("f32mat2"),
350                        TypeNameAtom::from("f32mat3"),
351                        TypeNameAtom::from("f32mat4"),
352                        TypeNameAtom::from("f32mat2x2"),
353                        TypeNameAtom::from("f32mat2x3"),
354                        TypeNameAtom::from("f32mat2x4"),
355                        TypeNameAtom::from("f32mat3x2"),
356                        TypeNameAtom::from("f32mat3x3"),
357                        TypeNameAtom::from("f32mat3x4"),
358                        TypeNameAtom::from("f32mat4x2"),
359                        TypeNameAtom::from("f32mat4x3"),
360                        TypeNameAtom::from("f32mat4x4"),
361                    ],
362                ),
363                ExtensionSpec::new(
364                    ExtNameAtom::from("GL_EXT_shader_explicit_arithmetic_types_float64"),
365                    vec![
366                        TypeNameAtom::from("float64_t"),
367                        TypeNameAtom::from("f64vec2"),
368                        TypeNameAtom::from("f64vec3"),
369                        TypeNameAtom::from("f64vec4"),
370                        TypeNameAtom::from("f64mat2"),
371                        TypeNameAtom::from("f64mat3"),
372                        TypeNameAtom::from("f64mat4"),
373                        TypeNameAtom::from("f64mat2x2"),
374                        TypeNameAtom::from("f64mat2x3"),
375                        TypeNameAtom::from("f64mat2x4"),
376                        TypeNameAtom::from("f64mat3x2"),
377                        TypeNameAtom::from("f64mat3x3"),
378                        TypeNameAtom::from("f64mat3x4"),
379                        TypeNameAtom::from("f64mat4x2"),
380                        TypeNameAtom::from("f64mat4x3"),
381                        TypeNameAtom::from("f64mat4x4"),
382                    ],
383                ),
384                ExtensionSpec::new(
385                    ExtNameAtom::from("GL_EXT_shader_explicit_arithmetic_types_int16"),
386                    vec![
387                        TypeNameAtom::from("int16_t"),
388                        TypeNameAtom::from("i16vec2"),
389                        TypeNameAtom::from("i16vec3"),
390                        TypeNameAtom::from("i16vec4"),
391                        TypeNameAtom::from("uint16_t"),
392                        TypeNameAtom::from("u16vec2"),
393                        TypeNameAtom::from("u16vec3"),
394                        TypeNameAtom::from("u16vec4"),
395                    ],
396                ),
397                ExtensionSpec::new(
398                    ExtNameAtom::from("GL_EXT_shader_explicit_arithmetic_types_int32"),
399                    vec![
400                        TypeNameAtom::from("int32_t"),
401                        TypeNameAtom::from("i32vec2"),
402                        TypeNameAtom::from("i32vec3"),
403                        TypeNameAtom::from("i32vec4"),
404                        TypeNameAtom::from("uint32_t"),
405                        TypeNameAtom::from("u32vec2"),
406                        TypeNameAtom::from("u32vec3"),
407                        TypeNameAtom::from("u32vec4"),
408                    ],
409                ),
410                ExtensionSpec::new(
411                    ExtNameAtom::from("GL_EXT_shader_explicit_arithmetic_types_int64"),
412                    vec![
413                        TypeNameAtom::from("int64_t"),
414                        TypeNameAtom::from("i64vec2"),
415                        TypeNameAtom::from("i64vec3"),
416                        TypeNameAtom::from("i64vec4"),
417                        TypeNameAtom::from("uint64_t"),
418                        TypeNameAtom::from("u64vec2"),
419                        TypeNameAtom::from("u64vec3"),
420                        TypeNameAtom::from("u64vec4"),
421                    ],
422                ),
423                ExtensionSpec::new(
424                    ExtNameAtom::from("GL_EXT_shader_explicit_arithmetic_types_int8"),
425                    vec![
426                        TypeNameAtom::from("int8_t"),
427                        TypeNameAtom::from("i8vec2"),
428                        TypeNameAtom::from("i8vec3"),
429                        TypeNameAtom::from("i8vec4"),
430                        TypeNameAtom::from("uint8_t"),
431                        TypeNameAtom::from("u8vec2"),
432                        TypeNameAtom::from("u8vec3"),
433                        TypeNameAtom::from("u8vec4"),
434                    ],
435                ),
436                ExtensionSpec::new(
437                    ExtNameAtom::from("GL_EXT_shader_implicit_conversions"),
438                    vec![],
439                ),
440                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_shader_integer_mix"), vec![]),
441                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_shader_io_blocks"), vec![]),
442                ExtensionSpec::new(
443                    ExtNameAtom::from("GL_EXT_shader_non_constant_global_initializers"),
444                    vec![],
445                ),
446                ExtensionSpec::new(
447                    ExtNameAtom::from("GL_EXT_shader_texture_image_samples"),
448                    vec![],
449                ),
450                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_shader_texture_lod"), vec![]),
451                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_terminate_invocation"), vec![]),
452                ExtensionSpec::new(ExtNameAtom::from("GL_EXT_tessellation_shader"), vec![]),
453                ExtensionSpec::new(
454                    ExtNameAtom::from("GL_EXT_texture_buffer"),
455                    vec![
456                        type_name!("samplerBuffer"),
457                        type_name!("isamplerBuffer"),
458                        type_name!("usamplerBuffer"),
459                        type_name!("imageBuffer"),
460                        type_name!("iimageBuffer"),
461                        type_name!("uimageBuffer"),
462                    ],
463                ),
464                ExtensionSpec::new(
465                    ExtNameAtom::from("GL_EXT_texture_cube_map_array"),
466                    vec![
467                        type_name!("samplerCubeArray"),
468                        type_name!("samplerCubeArrayShadow"),
469                        type_name!("isamplerCubeArray"),
470                        type_name!("usamplerCubeArray"),
471                        type_name!("imageCubeArray"),
472                        type_name!("iimageCubeArray"),
473                        type_name!("uimageCubeArray"),
474                    ],
475                ),
476                ExtensionSpec::new(ext_name!("GL_GOOGLE_include_directive"), vec![]),
477                ExtensionSpec::new(ext_name!("GL_GOOGLE_cpp_style_line_directive"), vec![]),
478                ExtensionSpec::new(ExtNameAtom::from("GL_KHR_blend_equation_advanced"), vec![]),
479                ExtensionSpec::new(
480                    ExtNameAtom::from("GL_KHR_shader_subgroup_arithmetic"),
481                    vec![],
482                ),
483                ExtensionSpec::new(ExtNameAtom::from("GL_KHR_shader_subgroup_ballot"), vec![]),
484                ExtensionSpec::new(ExtNameAtom::from("GL_KHR_shader_subgroup_basic"), vec![]),
485                ExtensionSpec::new(
486                    ExtNameAtom::from("GL_KHR_shader_subgroup_clustered"),
487                    vec![],
488                ),
489                ExtensionSpec::new(ExtNameAtom::from("GL_KHR_shader_subgroup_quad"), vec![]),
490                ExtensionSpec::new(ExtNameAtom::from("GL_KHR_shader_subgroup_shuffle"), vec![]),
491                ExtensionSpec::new(
492                    ExtNameAtom::from("GL_KHR_shader_subgroup_shuffle_relative"),
493                    vec![],
494                ),
495                ExtensionSpec::new(ExtNameAtom::from("GL_KHR_shader_subgroup_vote"), vec![]),
496                ExtensionSpec::new(ExtNameAtom::from("GL_NV_mesh_shader"), vec![]),
497                ExtensionSpec::new(
498                    ExtNameAtom::from("GL_NV_ray_tracing"),
499                    vec![
500                        TypeNameAtom::from("accelerationStructureNV"),
501                        TypeNameAtom::from("rayPayloadNV"),
502                        TypeNameAtom::from("rayPayloadInNV"),
503                        TypeNameAtom::from("hitAttributeNV"),
504                        TypeNameAtom::from("callableDataNV"),
505                        TypeNameAtom::from("callableDataInNV"),
506                    ],
507                ),
508                ExtensionSpec::new(
509                    ExtNameAtom::from("GL_NV_shader_noperspective_interpolation"),
510                    vec![],
511                ),
512                ExtensionSpec::new(ExtNameAtom::from("GL_NV_shader_sm_builtins"), vec![]),
513                ExtensionSpec::new(
514                    ExtNameAtom::from("GL_NV_shader_subgroup_partitioned"),
515                    vec![],
516                ),
517                ExtensionSpec::new(
518                    ExtNameAtom::from("GL_OES_EGL_image_external"),
519                    vec![TypeNameAtom::from("samplerExternalOES")],
520                ),
521                ExtensionSpec::new(
522                    ExtNameAtom::from("GL_OES_EGL_image_external_essl3"),
523                    vec![TypeNameAtom::from("samplerExternalOES")],
524                ),
525                ExtensionSpec::new(ExtNameAtom::from("GL_OES_geometry_point_size"), vec![]),
526                ExtensionSpec::new(ExtNameAtom::from("GL_OES_geometry_shader"), vec![]),
527                ExtensionSpec::new(ExtNameAtom::from("GL_OES_gpu_shader5"), vec![]),
528                ExtensionSpec::new(ExtNameAtom::from("GL_OES_primitive_bounding_box"), vec![]),
529                ExtensionSpec::new(ExtNameAtom::from("GL_OES_sample_variables"), vec![]),
530                ExtensionSpec::new(ExtNameAtom::from("GL_OES_shader_image_atomic"), vec![]),
531                ExtensionSpec::new(ExtNameAtom::from("GL_OES_shader_io_blocks"), vec![]),
532                ExtensionSpec::new(
533                    ExtNameAtom::from("GL_OES_shader_multisample_interpolation"),
534                    vec![],
535                ),
536                ExtensionSpec::new(ExtNameAtom::from("GL_OES_standard_derivatives"), vec![]),
537                ExtensionSpec::new(ExtNameAtom::from("GL_OES_tessellation_point_size"), vec![]),
538                ExtensionSpec::new(ExtNameAtom::from("GL_OES_tessellation_shader"), vec![]),
539                ExtensionSpec::new(
540                    ExtNameAtom::from("GL_OES_texture_buffer"),
541                    vec![
542                        type_name!("samplerBuffer"),
543                        type_name!("isamplerBuffer"),
544                        type_name!("usamplerBuffer"),
545                        type_name!("imageBuffer"),
546                        type_name!("iimageBuffer"),
547                        type_name!("uimageBuffer"),
548                    ],
549                ),
550                ExtensionSpec::new(
551                    ExtNameAtom::from("GL_OES_texture_cube_map_array"),
552                    vec![
553                        type_name!("samplerCubeArray"),
554                        type_name!("samplerCubeArrayShadow"),
555                        type_name!("isamplerCubeArray"),
556                        type_name!("usamplerCubeArray"),
557                        type_name!("imageCubeArray"),
558                        type_name!("iimageCubeArray"),
559                        type_name!("uimageCubeArray"),
560                    ],
561                ),
562                ExtensionSpec::new(
563                    ExtNameAtom::from("GL_OES_texture_3D"),
564                    vec![type_name!("sampler3D")],
565                ),
566                ExtensionSpec::new(
567                    ExtNameAtom::from("GL_OES_texture_storage_multisample_2d_array"),
568                    vec![
569                        type_name!("sampler2DMSArray"),
570                        type_name!("isampler2DMSArray"),
571                        type_name!("usampler2DMSArray"),
572                    ],
573                ),
574                ExtensionSpec::new(ExtNameAtom::from("GL_OVR_multiview"), vec![]),
575                ExtensionSpec::new(ExtNameAtom::from("GL_OVR_multiview2"), vec![]),
576            ]
577            .into_iter()
578            .map(|spec| (spec.name.clone(), spec))
579            .collect(),
580        }
581    }
582}
583
584pub static DEFAULT_REGISTRY: Lazy<Registry> = Lazy::new(Registry::default);
585pub static EMPTY_REGISTRY: Lazy<Registry> = Lazy::new(Registry::new);