xref: /aosp_15_r20/external/angle/src/compiler/translator/builtin_function_declarations.txt (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1// The format of this file:
2//   C++ style single-line comments are supported.
3//   Leading whitespace is only for formatting and doesn't have semantic meaning.
4//
5//   Grouping:
6//   Groups of functions are denoted by "GROUP BEGIN" and "GROUP END". Groups can be nested.
7//   Groups can have metadata related to the group itself. This is given at the end of the GROUP
8//   BEGIN line in JSON object format.
9//   Example:
10//     GROUP BEGIN <group name> {"shader_type": "FRAGMENT"}
11//     GROUP END <group name>
12//
13//   Defaults:
14//   Default metadata for functions can be set with "DEFAULT METADATA" followed by metadata in JSON
15//   object format. The metadata is applied to all following functions regardless of grouping until
16//   another "DEFAULT METADATA" line is encountered, or until the end of a top-level group.
17//   Example:
18//     DEFAULT METADATA {"opSuffix": "ComponentWise"}
19//
20//   Supported function metadata properties are:
21//     "essl_level"
22//         string, one of COMMON_BUILTINS, ESSL1_BUILTINS, ESSL3_BUILTINS, ESSL3_1_BUILTINS,
23//         ESSL3_2_BUILTINS, ESSL_INTERNAL_BACKEND_BUILTINS.
24//     "opSuffix"
25//         (optional) string, suffix to add to EOp code.  The op is derived from the function name,
26//         and this suffix is applied to disambiguate between functions of the same name but in
27//         different groups.
28//     "suffix"
29//         string, suffix that is used to disambiguate C++ variable names created based on the
30//         function name from C++ keywords, or disambiguate two functions with the same name.
31//     "essl_extension"
32//         string, ESSL extension where the function is defined.
33//     "essl_extension_becomes_core_in"
34//         string, ESSL level where functions from this extension have become core.
35//     "hasSideEffects"
36//         boolean, can be used to mark a function as having side effects. Functions with an out or
37//         inout parameter are automatically treated as having side effects.
38//
39//   Function declarations:
40//   Lines that declare functions are in a similar format as in the GLSL spec:
41//     <return type> <function name>(<param type>, ...);
42//   Parameter types can have "out" or "inout" qualifiers.
43
44GROUP BEGIN Math {"queryFunction": true}
45  GROUP BEGIN Trigonometric
46    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
47      genType radians(genType);
48      genType degrees(genType);
49      genType sin(genType);
50      genType cos(genType);
51      genType tan(genType);
52      genType asin(genType);
53      genType acos(genType);
54      genType atan(genType, genType);
55      genType atan(genType);
56    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
57      genType sinh(genType);
58      genType cosh(genType);
59      genType tanh(genType);
60      genType asinh(genType);
61      genType acosh(genType);
62      genType atanh(genType);
63  GROUP END Trigonometric
64
65  GROUP BEGIN Exponential
66    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
67      genType pow(genType, genType);
68      genType exp(genType);
69      genType log(genType);
70      genType exp2(genType);
71      genType log2(genType);
72      genType sqrt(genType);
73      genType inversesqrt(genType);
74  GROUP END Exponential
75
76  GROUP BEGIN Common
77    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
78      genType abs(genType);
79    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
80      genIType abs(genIType);
81    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
82      genType sign(genType);
83    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
84      genIType sign(genIType);
85    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
86      genType floor(genType);
87    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
88      genType trunc(genType);
89    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
90      genType round(genType);
91    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
92      genType roundEven(genType);
93    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
94      genType ceil(genType);
95      genType fract(genType);
96      genType mod(genType, float);
97      genType mod(genType, genType);
98      genType min(genType, float);
99      genType min(genType, genType);
100    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
101      genIType min(genIType, genIType);
102      genIType min(genIType, int);
103      genUType min(genUType, genUType);
104      genUType min(genUType, uint);
105    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
106      genType max(genType, float);
107      genType max(genType, genType);
108    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
109      genIType max(genIType, genIType);
110      genIType max(genIType, int);
111      genUType max(genUType, genUType);
112      genUType max(genUType, uint);
113    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
114      genType clamp(genType, float, float);
115      genType clamp(genType, genType, genType);
116    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
117      genIType clamp(genIType, int, int);
118      genIType clamp(genIType, genIType, genIType);
119      genUType clamp(genUType, uint, uint);
120      genUType clamp(genUType, genUType, genUType);
121    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
122      genType mix(genType, genType, float);
123      genType mix(genType, genType, genType);
124    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
125      genType mix(genType, genType, genBType);
126    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
127      genIType mix(genIType, genIType, genBType);
128      genUType mix(genUType, genUType, genBType);
129      genBType mix(genBType, genBType, genBType);
130    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
131      genType step(genType, genType);
132      genType step(float, genType);
133      genType smoothstep(genType, genType, genType);
134      genType smoothstep(float, float, genType);
135    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
136      genType modf(genType, out genType);
137      genBType isnan(genType);
138      genBType isinf(genType);
139      genIType floatBitsToInt(genType);
140      genUType floatBitsToUint(genType);
141      genType intBitsToFloat(genIType);
142      genType uintBitsToFloat(genUType);
143    DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
144      genType fma(genType, genType, genType);
145    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "EXT_gpu_shader5, OES_gpu_shader5", "suffix": "Ext"}
146      genType fma(genType, genType, genType);
147    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
148      genType frexp(genType, out genIType);
149      genType ldexp(genType, genIType);
150    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
151      uint packSnorm2x16(vec2);
152      uint packHalf2x16(vec2);
153      vec2 unpackSnorm2x16(uint);
154      vec2 unpackHalf2x16(uint);
155      uint packUnorm2x16(vec2);
156      vec2 unpackUnorm2x16(uint);
157    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
158      uint packUnorm4x8(vec4);
159      uint packSnorm4x8(vec4);
160      vec4 unpackUnorm4x8(uint);
161      vec4 unpackSnorm4x8(uint);
162  GROUP END Common
163
164  GROUP BEGIN Geometric
165    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
166      float length(genType);
167      float distance(genType, genType);
168      float dot(genType, genType);
169      vec3 cross(vec3, vec3);
170      genType normalize(genType);
171      genType faceforward(genType, genType, genType);
172      genType reflect(genType, genType);
173      genType refract(genType, genType, float);
174  GROUP END Geometric
175
176  GROUP BEGIN Matrix
177    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
178      mat2 matrixCompMult(mat2, mat2);
179      mat3 matrixCompMult(mat3, mat3);
180      mat4 matrixCompMult(mat4, mat4);
181    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
182      mat2x3 matrixCompMult(mat2x3, mat2x3);
183      mat3x2 matrixCompMult(mat3x2, mat3x2);
184      mat2x4 matrixCompMult(mat2x4, mat2x4);
185      mat4x2 matrixCompMult(mat4x2, mat4x2);
186      mat3x4 matrixCompMult(mat3x4, mat3x4);
187      mat4x3 matrixCompMult(mat4x3, mat4x3);
188      mat2 outerProduct(vec2, vec2);
189      mat3 outerProduct(vec3, vec3);
190      mat4 outerProduct(vec4, vec4);
191      mat2x3 outerProduct(vec3, vec2);
192      mat3x2 outerProduct(vec2, vec3);
193      mat2x4 outerProduct(vec4, vec2);
194      mat4x2 outerProduct(vec2, vec4);
195      mat3x4 outerProduct(vec4, vec3);
196      mat4x3 outerProduct(vec3, vec4);
197      mat2 transpose(mat2);
198      mat3 transpose(mat3);
199      mat4 transpose(mat4);
200      mat2x3 transpose(mat3x2);
201      mat3x2 transpose(mat2x3);
202      mat2x4 transpose(mat4x2);
203      mat4x2 transpose(mat2x4);
204      mat3x4 transpose(mat4x3);
205      mat4x3 transpose(mat3x4);
206      float determinant(mat2);
207      float determinant(mat3);
208      float determinant(mat4);
209      mat2 inverse(mat2);
210      mat3 inverse(mat3);
211      mat4 inverse(mat4);
212  GROUP END Matrix
213
214  GROUP BEGIN Vector
215    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS", "opSuffix": "ComponentWise"}
216      bvec lessThan(vec, vec);
217      bvec lessThan(ivec, ivec);
218    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "opSuffix": "ComponentWise"}
219      bvec lessThan(uvec, uvec);
220    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS", "opSuffix": "ComponentWise"}
221      bvec lessThanEqual(vec, vec);
222      bvec lessThanEqual(ivec, ivec);
223    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "opSuffix": "ComponentWise"}
224      bvec lessThanEqual(uvec, uvec);
225    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS", "opSuffix": "ComponentWise"}
226      bvec greaterThan(vec, vec);
227      bvec greaterThan(ivec, ivec);
228    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "opSuffix": "ComponentWise"}
229      bvec greaterThan(uvec, uvec);
230    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS", "opSuffix": "ComponentWise"}
231      bvec greaterThanEqual(vec, vec);
232      bvec greaterThanEqual(ivec, ivec);
233    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "opSuffix": "ComponentWise"}
234      bvec greaterThanEqual(uvec, uvec);
235    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS", "opSuffix": "ComponentWise"}
236      bvec equal(vec, vec);
237      bvec equal(ivec, ivec);
238    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "opSuffix": "ComponentWise"}
239      bvec equal(uvec, uvec);
240    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS", "opSuffix": "ComponentWise"}
241      bvec equal(bvec, bvec);
242      bvec notEqual(vec, vec);
243      bvec notEqual(ivec, ivec);
244    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "opSuffix": "ComponentWise"}
245      bvec notEqual(uvec, uvec);
246    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS", "opSuffix": "ComponentWise"}
247      bvec notEqual(bvec, bvec);
248    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS"}
249      bool any(bvec);
250      bool all(bvec);
251    DEFAULT METADATA {"essl_level": "COMMON_BUILTINS", "opSuffix": "ComponentWise", "suffix": "Func"}
252      bvec not(bvec);
253  GROUP END Vector
254
255  GROUP BEGIN Integer
256    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
257      genIType bitfieldExtract(genIType, int, int);
258      genUType bitfieldExtract(genUType, int, int);
259      genIType bitfieldInsert(genIType, genIType, int, int);
260      genUType bitfieldInsert(genUType, genUType, int, int);
261      genIType bitfieldReverse(genIType);
262      genUType bitfieldReverse(genUType);
263      genIType bitCount(genIType);
264      genIType bitCount(genUType);
265      genIType findLSB(genIType);
266      genIType findLSB(genUType);
267      genIType findMSB(genIType);
268      genIType findMSB(genUType);
269      genUType uaddCarry(genUType, genUType, out genUType);
270      genUType usubBorrow(genUType, genUType, out genUType);
271      void umulExtended(genUType, genUType, out genUType, out genUType);
272      void imulExtended(genIType, genIType, out genIType, out genIType);
273  GROUP END Integer
274GROUP END Math
275
276GROUP BEGIN Texture {"queryFunction": true}
277  GROUP BEGIN FirstVersions
278    DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS"}
279      vec4 texture2D(sampler2D, vec2);
280      vec4 texture2DProj(sampler2D, vec3);
281      vec4 texture2DProj(sampler2D, vec4);
282      vec4 textureCube(samplerCube, vec3);
283    DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS", "essl_extension": "OES_texture_3D"}
284      vec4 texture3D(sampler3D, vec3);
285      vec4 texture3DProj(sampler3D, vec4);
286    DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS", "essl_extension": "EXT_shadow_samplers"}
287      float shadow2DEXT(sampler2DShadow, vec3);
288      float shadow2DProjEXT(sampler2DShadow, vec4);
289    DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS", "essl_extension": "OES_EGL_image_external, NV_EGL_stream_consumer_external"}
290      vec4 texture2D(samplerExternalOES, vec2);
291      vec4 texture2DProj(samplerExternalOES, vec3);
292      vec4 texture2DProj(samplerExternalOES, vec4);
293    DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS", "essl_extension": "ARB_texture_rectangle"}
294      vec4 texture2DRect(sampler2DRect, vec2);
295      vec4 texture2DRectProj(sampler2DRect, vec3);
296      vec4 texture2DRectProj(sampler2DRect, vec4);
297    // The *Grad* variants are new to both vertex and fragment shaders; the fragment
298    // shader specific pieces are added separately below.
299    DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS", "essl_extension": "EXT_shader_texture_lod"}
300      vec4 texture2DGradEXT(sampler2D, vec2, vec2, vec2);
301      vec4 texture2DProjGradEXT(sampler2D, vec3, vec2, vec2);
302      vec4 texture2DProjGradEXT(sampler2D, vec4, vec2, vec2);
303      vec4 textureCubeGradEXT(samplerCube, vec3, vec3, vec3);
304    DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS", "extension": "WEBGL_video_texture"}
305        vec4 textureVideoWEBGL(samplerVideoWEBGL, vec2);
306
307    // Variants with bias are limited to fragment shaders
308    GROUP BEGIN Bias {"shader_type": "FRAGMENT", "opSuffix": "Bias"}
309      DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS"}
310        vec4 texture2D(sampler2D, vec2, float);
311        vec4 texture2DProj(sampler2D, vec3, float);
312        vec4 texture2DProj(sampler2D, vec4, float);
313        vec4 textureCube(samplerCube, vec3, float);
314      DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS", "essl_extension": "OES_texture_3D"}
315        vec4 texture3D(sampler3D, vec3, float);
316        vec4 texture3DProj(sampler3D, vec4, float);
317    GROUP END Bias
318
319    GROUP BEGIN Lod
320      // The GLES spec mentioning that lod variants are limited to vertex shaders, and the
321      // OES_texture_3D spec doesn't mention otherwise.  However, these functions are used in tests
322      // and seem to be expected to be available in fragment shaders too.
323      DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS", "essl_extension": "OES_texture_3D"}
324        vec4 texture3DLod(sampler3D, vec3, float);
325        vec4 texture3DProjLod(sampler3D, vec4, float);
326    GROUP END Lod
327
328    // Variants with lod are limited to vertex shaders in GLES
329    GROUP BEGIN LodVS {"shader_type": "VERTEX", "opSuffix": "VS"}
330      DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS"}
331        vec4 texture2DLod(sampler2D, vec2, float);
332        vec4 texture2DProjLod(sampler2D, vec3, float);
333        vec4 texture2DProjLod(sampler2D, vec4, float);
334        vec4 textureCubeLod(samplerCube, vec3, float);
335    GROUP END LodVS
336
337    // EXT_shader_texture_lod brings some lod variants to fragment shaders
338    GROUP BEGIN LodFS {"shader_type": "FRAGMENT", "opSuffix": "FS"}
339      DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS", "essl_extension": "EXT_shader_texture_lod"}
340        vec4 texture2DLodEXT(sampler2D, vec2, float);
341        vec4 texture2DProjLodEXT(sampler2D, vec3, float);
342        vec4 texture2DProjLodEXT(sampler2D, vec4, float);
343        vec4 textureCubeLodEXT(samplerCube, vec3, float);
344    GROUP END LodFS
345
346  GROUP END FirstVersions
347
348  GROUP BEGIN NoBias
349    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
350      gvec4 texture(gsampler2D, vec2);
351      gvec4 texture(gsampler3D, vec3);
352      gvec4 texture(gsamplerCube, vec3);
353      gvec4 texture(gsampler2DArray, vec3);
354      float texture(sampler2DShadow, vec3);
355      float texture(samplerCubeShadow, vec4);
356      float texture(sampler2DArrayShadow, vec4);
357    DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
358      gvec4 texture(gsamplerCubeArray, vec4);
359      float texture(samplerCubeArrayShadow, vec4, float);
360    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_cube_map_array, EXT_texture_cube_map_array", "suffix": "Ext"}
361      gvec4 texture(gsamplerCubeArray, vec4);
362      float texture(samplerCubeArrayShadow, vec4, float);
363    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "OES_EGL_image_external_essl3"}
364      vec4 texture(samplerExternalOES, vec2);
365    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_YUV_target"}
366      vec4 texture(samplerExternal2DY2YEXT, vec2);
367    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "ARB_texture_rectangle"}
368      // We don't have a rectangle texture essl_extension for OpenGL ES however based on the behavior of
369      // rectangle texture in desktop OpenGL, they should be sampled with a "texture" overload in
370      // GLSL version that have such an overload. This is the case for ESSL3 and above.
371      vec4 texture(sampler2DRect, vec2);
372    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "extension": "WEBGL_video_texture"}
373      vec4 texture(samplerVideoWEBGL, vec2);
374    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
375      gvec4 textureProj(gsampler2D, vec3);
376      gvec4 textureProj(gsampler2D, vec4);
377      gvec4 textureProj(gsampler3D, vec4);
378      float textureProj(sampler2DShadow, vec4);
379    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "OES_EGL_image_external_essl3"}
380      vec4 textureProj(samplerExternalOES, vec3);
381      vec4 textureProj(samplerExternalOES, vec4);
382    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_YUV_target"}
383      vec4 textureProj(samplerExternal2DY2YEXT, vec3);
384      vec4 textureProj(samplerExternal2DY2YEXT, vec4);
385    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "ARB_texture_rectangle"}
386      vec4 textureProj(sampler2DRect, vec3);
387      vec4 textureProj(sampler2DRect, vec4);
388    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
389      gvec4 textureLod(gsampler2D, vec2, float);
390      gvec4 textureLod(gsampler3D, vec3, float);
391      gvec4 textureLod(gsamplerCube, vec3, float);
392      gvec4 textureLod(gsampler2DArray, vec3, float);
393      float textureLod(sampler2DShadow, vec3, float);
394    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_texture_shadow_lod"}
395      float textureLod(samplerCubeShadow, vec4, float);
396      float textureLod(sampler2DArrayShadow, vec4, float);
397    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "EXT_texture_shadow_lod"}
398      float textureLod(samplerCubeArrayShadow, vec4, float, float);
399    DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
400      gvec4 textureLod(gsamplerCubeArray, vec4, float);
401    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_cube_map_array, EXT_texture_cube_map_array", "suffix": "Ext"}
402      gvec4 textureLod(gsamplerCubeArray, vec4, float);
403    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
404      ivec2 textureSize(gsampler2D, int);
405      ivec3 textureSize(gsampler3D, int);
406      ivec2 textureSize(gsamplerCube, int);
407      ivec3 textureSize(gsampler2DArray, int);
408      ivec2 textureSize(sampler2DShadow, int);
409      ivec2 textureSize(samplerCubeShadow, int);
410      ivec3 textureSize(sampler2DArrayShadow, int);
411    DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
412      ivec3 textureSize(gsamplerCubeArray, int);
413      ivec3 textureSize(samplerCubeArrayShadow, int);
414    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_cube_map_array, EXT_texture_cube_map_array", "suffix": "Ext"}
415      ivec3 textureSize(gsamplerCubeArray, int);
416      ivec3 textureSize(samplerCubeArrayShadow, int);
417    DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
418      int textureSize(gsamplerBuffer);
419    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_buffer, EXT_texture_buffer", "suffix": "Ext"}
420      int textureSize(gsamplerBuffer);
421    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
422      ivec2 textureSize(gsampler2DMS);
423    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "ANGLE_texture_multisample", "suffix": "Ext"}
424      ivec2 textureSize(gsampler2DMS);
425    DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
426      ivec3 textureSize(gsampler2DMSArray);
427    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_storage_multisample_2d_array", "suffix": "Ext"}
428      ivec3 textureSize(gsampler2DMSArray);
429    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "OES_EGL_image_external_essl3"}
430      ivec2 textureSize(samplerExternalOES, int);
431    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_YUV_target"}
432      ivec2 textureSize(samplerExternal2DY2YEXT, int);
433    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
434      gvec4 textureProjLod(gsampler2D, vec3, float);
435      gvec4 textureProjLod(gsampler2D, vec4, float);
436      gvec4 textureProjLod(gsampler3D, vec4, float);
437      float textureProjLod(sampler2DShadow, vec4, float);
438      gvec4 texelFetch(gsampler2D, ivec2, int);
439      gvec4 texelFetch(gsampler3D, ivec3, int);
440      gvec4 texelFetch(gsampler2DArray, ivec3, int);
441    DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
442      gvec4 texelFetch(gsamplerBuffer, int);
443    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_buffer, EXT_texture_buffer", "suffix": "Ext"}
444      gvec4 texelFetch(gsamplerBuffer, int);
445    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
446      gvec4 texelFetch(gsampler2DMS, ivec2, int);
447    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "ANGLE_texture_multisample", "suffix": "Ext"}
448      gvec4 texelFetch(gsampler2DMS, ivec2, int);
449    DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
450      gvec4 texelFetch(gsampler2DMSArray, ivec3, int);
451    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_storage_multisample_2d_array", "suffix": "Ext"}
452      gvec4 texelFetch(gsampler2DMSArray, ivec3, int);
453    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "OES_EGL_image_external_essl3"}
454      vec4 texelFetch(samplerExternalOES, ivec2, int);
455    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_YUV_target"}
456      vec4 texelFetch(samplerExternal2DY2YEXT, ivec2, int);
457    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
458      gvec4 textureGrad(gsampler2D, vec2, vec2, vec2);
459      gvec4 textureGrad(gsampler3D, vec3, vec3, vec3);
460      gvec4 textureGrad(gsamplerCube, vec3, vec3, vec3);
461      float textureGrad(sampler2DShadow, vec3, vec2, vec2);
462      float textureGrad(samplerCubeShadow, vec4, vec3, vec3);
463      gvec4 textureGrad(gsampler2DArray, vec3, vec2, vec2);
464      float textureGrad(sampler2DArrayShadow, vec4, vec2, vec2);
465    DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
466      gvec4 textureGrad(gsamplerCubeArray, vec4, vec3, vec3);
467    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_cube_map_array, EXT_texture_cube_map_array", "suffix": "Ext"}
468      gvec4 textureGrad(gsamplerCubeArray, vec4, vec3, vec3);
469    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
470      gvec4 textureProjGrad(gsampler2D, vec3, vec2, vec2);
471      gvec4 textureProjGrad(gsampler2D, vec4, vec2, vec2);
472      gvec4 textureProjGrad(gsampler3D, vec4, vec3, vec3);
473      float textureProjGrad(sampler2DShadow, vec4, vec2, vec2);
474  GROUP END NoBias
475
476  GROUP BEGIN Bias {"shader_type": "FRAGMENT", "opSuffix": "Bias"}
477    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
478      gvec4 texture(gsampler2D, vec2, float);
479      gvec4 texture(gsampler3D, vec3, float);
480      gvec4 texture(gsamplerCube, vec3, float);
481      gvec4 texture(gsampler2DArray, vec3, float);
482      gvec4 textureProj(gsampler2D, vec3, float);
483      gvec4 textureProj(gsampler2D, vec4, float);
484      gvec4 textureProj(gsampler3D, vec4, float);
485      float texture(sampler2DShadow, vec3, float);
486      float texture(samplerCubeShadow, vec4, float);
487      float textureProj(sampler2DShadow, vec4, float);
488    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_texture_shadow_lod"}
489      float texture(sampler2DArrayShadow, vec4, float);
490    DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
491      gvec4 texture(gsamplerCubeArray, vec4, float);
492    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_cube_map_array, EXT_texture_cube_map_array", "suffix": "Ext"}
493      gvec4 texture(gsamplerCubeArray, vec4, float);
494    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "EXT_texture_shadow_lod"}
495      float texture(samplerCubeArrayShadow, vec4, float, float);
496    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "OES_EGL_image_external_essl3"}
497      vec4 texture(samplerExternalOES, vec2, float);
498      vec4 textureProj(samplerExternalOES, vec3, float);
499      vec4 textureProj(samplerExternalOES, vec4, float);
500    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_YUV_target"}
501      vec4 texture(samplerExternal2DY2YEXT, vec2, float);
502      vec4 textureProj(samplerExternal2DY2YEXT, vec3, float);
503      vec4 textureProj(samplerExternal2DY2YEXT, vec4, float);
504  GROUP END Bias
505
506  GROUP BEGIN OffsetNoBias {"queryFunction": true}
507    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
508      gvec4 textureOffset(gsampler2D, vec2, ivec2);
509      gvec4 textureOffset(gsampler3D, vec3, ivec3);
510      float textureOffset(sampler2DShadow, vec3, ivec2);
511      gvec4 textureOffset(gsampler2DArray, vec3, ivec2);
512    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_texture_shadow_lod"}
513      float textureOffset(sampler2DArrayShadow, vec4, ivec2);
514    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
515      gvec4 textureProjOffset(gsampler2D, vec3, ivec2);
516      gvec4 textureProjOffset(gsampler2D, vec4, ivec2);
517      gvec4 textureProjOffset(gsampler3D, vec4, ivec3);
518      float textureProjOffset(sampler2DShadow, vec4, ivec2);
519      gvec4 textureLodOffset(gsampler2D, vec2, float, ivec2);
520      gvec4 textureLodOffset(gsampler3D, vec3, float, ivec3);
521      float textureLodOffset(sampler2DShadow, vec3, float, ivec2);
522      gvec4 textureLodOffset(gsampler2DArray, vec3, float, ivec2);
523    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_texture_shadow_lod"}
524      float textureLodOffset(sampler2DArrayShadow, vec4, float, ivec2);
525    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
526      gvec4 textureProjLodOffset(gsampler2D, vec3, float, ivec2);
527      gvec4 textureProjLodOffset(gsampler2D, vec4, float, ivec2);
528      gvec4 textureProjLodOffset(gsampler3D, vec4, float, ivec3);
529      float textureProjLodOffset(sampler2DShadow, vec4, float, ivec2);
530      gvec4 texelFetchOffset(gsampler2D, ivec2, int, ivec2);
531      gvec4 texelFetchOffset(gsampler3D, ivec3, int, ivec3);
532      gvec4 texelFetchOffset(gsampler2DArray, ivec3, int, ivec2);
533      gvec4 textureGradOffset(gsampler2D, vec2, vec2, vec2, ivec2);
534      gvec4 textureGradOffset(gsampler3D, vec3, vec3, vec3, ivec3);
535      float textureGradOffset(sampler2DShadow, vec3, vec2, vec2, ivec2);
536      gvec4 textureGradOffset(gsampler2DArray, vec3, vec2, vec2, ivec2);
537      float textureGradOffset(sampler2DArrayShadow, vec4, vec2, vec2, ivec2);
538      gvec4 textureProjGradOffset(gsampler2D, vec3, vec2, vec2, ivec2);
539      gvec4 textureProjGradOffset(gsampler2D, vec4, vec2, vec2, ivec2);
540      gvec4 textureProjGradOffset(gsampler3D, vec4, vec3, vec3, ivec3);
541      float textureProjGradOffset(sampler2DShadow, vec4, vec2, vec2, ivec2);
542  GROUP END OffsetNoBias
543
544  GROUP BEGIN OffsetBias {"queryFunction": true, "shader_type": "FRAGMENT", "opSuffix": "Bias"}
545    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
546      gvec4 textureOffset(gsampler2D, vec2, ivec2, float);
547      gvec4 textureOffset(gsampler3D, vec3, ivec3, float);
548      float textureOffset(sampler2DShadow, vec3, ivec2, float);
549      gvec4 textureOffset(gsampler2DArray, vec3, ivec2, float);
550    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_texture_shadow_lod"}
551      float textureOffset(sampler2DArrayShadow, vec4, ivec2, float);
552    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
553      gvec4 textureProjOffset(gsampler2D, vec3, ivec2, float);
554      gvec4 textureProjOffset(gsampler2D, vec4, ivec2, float);
555      gvec4 textureProjOffset(gsampler3D, vec4, ivec3, float);
556      float textureProjOffset(sampler2DShadow, vec4, ivec2, float);
557  GROUP END OffsetBias
558
559  GROUP BEGIN Gather {"queryFunction": true}
560    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
561      gvec4 textureGather(gsampler2D, vec2);
562      gvec4 textureGather(gsampler2D, vec2, int);
563      gvec4 textureGather(gsampler2DArray, vec3);
564      gvec4 textureGather(gsampler2DArray, vec3, int);
565      gvec4 textureGather(gsamplerCube, vec3);
566      gvec4 textureGather(gsamplerCube, vec3, int);
567    DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
568      gvec4 textureGather(gsamplerCubeArray, vec4);
569      gvec4 textureGather(gsamplerCubeArray, vec4, int);
570      vec4 textureGather(samplerCubeArrayShadow, vec4, float);
571    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_cube_map_array, EXT_texture_cube_map_array", "suffix": "Ext"}
572      gvec4 textureGather(gsamplerCubeArray, vec4);
573      gvec4 textureGather(gsamplerCubeArray, vec4, int);
574      vec4 textureGather(samplerCubeArrayShadow, vec4, float);
575    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
576      vec4 textureGather(sampler2DShadow, vec2);
577      vec4 textureGather(sampler2DShadow, vec2, float);
578      vec4 textureGather(sampler2DArrayShadow, vec3);
579      vec4 textureGather(sampler2DArrayShadow, vec3, float);
580      vec4 textureGather(samplerCubeShadow, vec3);
581      vec4 textureGather(samplerCubeShadow, vec3, float);
582
583      GROUP BEGIN Offset {"queryFunction": true}
584        GROUP BEGIN NoComp {"queryFunction": true}
585          DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
586            gvec4 textureGatherOffset(gsampler2D, vec2, ivec2);
587            gvec4 textureGatherOffset(gsampler2DArray, vec3, ivec2);
588            vec4 textureGatherOffset(sampler2DShadow, vec2, float, ivec2);
589            vec4 textureGatherOffset(sampler2DArrayShadow, vec3, float, ivec2);
590        GROUP END NoComp
591        GROUP BEGIN Comp {"queryFunction": true, "opSuffix": "Comp"}
592          DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
593            gvec4 textureGatherOffset(gsampler2D, vec2, ivec2, int);
594            gvec4 textureGatherOffset(gsampler2DArray, vec3, ivec2, int);
595        GROUP END Comp
596      GROUP END Offset
597      GROUP BEGIN Offsets {"queryFunction": true}
598        GROUP BEGIN NoComp {"queryFunction": true}
599          DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
600            gvec4 textureGatherOffsets(gsampler2D, vec2, ivec2[4]);
601            gvec4 textureGatherOffsets(gsampler2DArray, vec3, ivec2[4]);
602            vec4 textureGatherOffsets(sampler2DShadow, vec2, float, ivec2[4]);
603            vec4 textureGatherOffsets(sampler2DArrayShadow, vec3, float, ivec2[4]);
604          DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "EXT_gpu_shader5, OES_gpu_shader5", "suffix": "Ext"}
605            gvec4 textureGatherOffsets(gsampler2D, vec2, ivec2[4]);
606            gvec4 textureGatherOffsets(gsampler2DArray, vec3, ivec2[4]);
607            vec4 textureGatherOffsets(sampler2DShadow, vec2, float, ivec2[4]);
608            vec4 textureGatherOffsets(sampler2DArrayShadow, vec3, float, ivec2[4]);
609        GROUP END NoComp
610        GROUP BEGIN Comp {"queryFunction": true, "opSuffix": "Comp"}
611          DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
612            gvec4 textureGatherOffsets(gsampler2D, vec2, ivec2[4], int);
613            gvec4 textureGatherOffsets(gsampler2DArray, vec3, ivec2[4], int);
614          DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "EXT_gpu_shader5, OES_gpu_shader5", "suffix": "Ext"}
615            gvec4 textureGatherOffsets(gsampler2D, vec2, ivec2[4], int);
616            gvec4 textureGatherOffsets(gsampler2DArray, vec3, ivec2[4], int);
617        GROUP END Comp
618      GROUP END Offsets
619  GROUP END Gather
620
621  GROUP BEGIN QueryLod {"shader_type": "FRAGMENT"}
622    DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_texture_query_lod"}
623      vec2 textureQueryLOD(gsampler2D, vec2);
624      vec2 textureQueryLOD(gsampler3D, vec3);
625      vec2 textureQueryLOD(gsamplerCube, vec3);
626      vec2 textureQueryLOD(gsampler2DArray, vec2);
627      vec2 textureQueryLOD(sampler2DShadow, vec2);
628      vec2 textureQueryLOD(samplerCubeShadow, vec3);
629      vec2 textureQueryLOD(sampler2DArrayShadow, vec2);
630    DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "EXT_texture_query_lod"}
631      vec2 textureQueryLOD(gsamplerCubeArray, vec3);
632      vec2 textureQueryLOD(samplerCubeArrayShadow, vec3);
633  GROUP END QueryLod
634GROUP END Texture
635
636GROUP BEGIN EXT_YUV_target
637  DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "EXT_YUV_target"}
638    vec3 rgb_2_yuv(vec3, yuvCscStandardEXT);
639    vec3 yuv_2_rgb(vec3, yuvCscStandardEXT);
640GROUP END EXT_YUV_target
641
642GROUP BEGIN DerivativesFS {"queryFunction": true, "shader_type": "FRAGMENT"}
643  DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS", "essl_extension": "OES_standard_derivatives", "suffix": "Ext"}
644    genType dFdx(genType);
645    genType dFdy(genType);
646    genType fwidth(genType);
647  DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS"}
648    genType dFdx(genType);
649    genType dFdy(genType);
650    genType fwidth(genType);
651GROUP END DerivativesFS
652
653GROUP BEGIN InterpolationFS {"queryFunction": true, "shader_type": "FRAGMENT"}
654  DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
655    float interpolateAtCentroid(float);
656    vec2 interpolateAtCentroid(vec2);
657    vec3 interpolateAtCentroid(vec3);
658    vec4 interpolateAtCentroid(vec4);
659    float interpolateAtSample(float, int);
660    vec2 interpolateAtSample(vec2, int);
661    vec3 interpolateAtSample(vec3, int);
662    vec4 interpolateAtSample(vec4, int);
663    float interpolateAtOffset(float, vec2);
664    vec2 interpolateAtOffset(vec2, vec2);
665    vec3 interpolateAtOffset(vec3, vec2);
666    vec4 interpolateAtOffset(vec4, vec2);
667  DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "OES_shader_multisample_interpolation", "suffix": "Ext"}
668    float interpolateAtCentroid(float);
669    vec2 interpolateAtCentroid(vec2);
670    vec3 interpolateAtCentroid(vec3);
671    vec4 interpolateAtCentroid(vec4);
672    float interpolateAtSample(float, int);
673    vec2 interpolateAtSample(vec2, int);
674    vec3 interpolateAtSample(vec3, int);
675    vec4 interpolateAtSample(vec4, int);
676    float interpolateAtOffset(float, vec2);
677    vec2 interpolateAtOffset(vec2, vec2);
678    vec3 interpolateAtOffset(vec3, vec2);
679    vec4 interpolateAtOffset(vec4, vec2);
680GROUP END InterpolationFS
681
682GROUP BEGIN AtomicCounter {"queryFunction": true}
683  DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "hasSideEffects": true}
684    uint atomicCounter(atomic_uint);
685    uint atomicCounterIncrement(atomic_uint);
686    uint atomicCounterDecrement(atomic_uint);
687GROUP END AtomicCounter
688
689GROUP BEGIN AtomicMemory {"queryFunction": true}
690  DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
691    uint atomicAdd(inout uint, uint);
692    int atomicAdd(inout int, int);
693    uint atomicMin(inout uint, uint);
694    int atomicMin(inout int, int);
695    uint atomicMax(inout uint, uint);
696    int atomicMax(inout int, int);
697    uint atomicAnd(inout uint, uint);
698    int atomicAnd(inout int, int);
699    uint atomicOr(inout uint, uint);
700    int atomicOr(inout int, int);
701    uint atomicXor(inout uint, uint);
702    int atomicXor(inout int, int);
703    uint atomicExchange(inout uint, uint);
704    int atomicExchange(inout int, int);
705    uint atomicCompSwap(inout uint, uint, uint);
706    int atomicCompSwap(inout int, int, int);
707GROUP END AtomicMemory
708
709GROUP BEGIN Image {"queryFunction": true}
710    GROUP BEGIN Store {"queryFunction": true}
711      DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "hasSideEffects": true}
712        void imageStore(gimage2D, ivec2, gvec4);
713        void imageStore(gimage3D, ivec3, gvec4);
714        void imageStore(gimage2DArray, ivec3, gvec4);
715        void imageStore(gimageCube, ivec3, gvec4);
716
717      DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS", "hasSideEffects": true}
718        void imageStore(gimageCubeArray, ivec3, gvec4);
719      DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "hasSideEffects": true, "essl_extension": "OES_texture_cube_map_array, EXT_texture_cube_map_array", "suffix": "Ext"}
720        void imageStore(gimageCubeArray, ivec3, gvec4);
721
722      DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS", "hasSideEffects": true}
723        void imageStore(gimageBuffer, int, gvec4);
724      DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "hasSideEffects": true, "essl_extension": "OES_texture_buffer, EXT_texture_buffer", "suffix": "Ext"}
725        void imageStore(gimageBuffer, int, gvec4);
726    GROUP END Store
727    GROUP BEGIN Load {"queryFunction": true}
728      DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
729        gvec4 imageLoad(gimage2D, ivec2);
730        gvec4 imageLoad(gimage3D, ivec3);
731        gvec4 imageLoad(gimage2DArray, ivec3);
732        gvec4 imageLoad(gimageCube, ivec3);
733
734      DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
735        gvec4 imageLoad(gimageCubeArray, ivec3);
736      DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_cube_map_array, EXT_texture_cube_map_array", "suffix": "Ext"}
737        gvec4 imageLoad(gimageCubeArray, ivec3);
738
739      DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
740        gvec4 imageLoad(gimageBuffer, int);
741      DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_buffer, EXT_texture_buffer", "suffix": "Ext"}
742        gvec4 imageLoad(gimageBuffer, int);
743    GROUP END Load
744  DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS"}
745    ivec2 imageSize(gimage2D);
746    ivec3 imageSize(gimage3D);
747    ivec3 imageSize(gimage2DArray);
748    ivec2 imageSize(gimageCube);
749
750  DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
751    ivec3 imageSize(gimageCubeArray);
752  DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_cube_map_array, EXT_texture_cube_map_array", "suffix": "Ext"}
753    ivec3 imageSize(gimageCubeArray);
754
755  DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS"}
756    int imageSize(gimageBuffer);
757  DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "OES_texture_buffer, EXT_texture_buffer", "suffix": "Ext"}
758    int imageSize(gimageBuffer);
759
760  GROUP BEGIN Atomic {"queryFunction": true}
761      DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS", "hasSideEffects": true}
762        uint imageAtomicAdd(IMAGE_PARAMS, uint);
763        int imageAtomicAdd(IMAGE_PARAMS, int);
764        uint imageAtomicMin(IMAGE_PARAMS, uint);
765        int imageAtomicMin(IMAGE_PARAMS, int);
766        uint imageAtomicMax(IMAGE_PARAMS, uint);
767        int imageAtomicMax(IMAGE_PARAMS, int);
768        uint imageAtomicAnd(IMAGE_PARAMS, uint);
769        int imageAtomicAnd(IMAGE_PARAMS, int);
770        uint imageAtomicOr(IMAGE_PARAMS, uint);
771        int imageAtomicOr(IMAGE_PARAMS, int);
772        uint imageAtomicXor(IMAGE_PARAMS, uint);
773        int imageAtomicXor(IMAGE_PARAMS, int);
774        uint imageAtomicExchange(IMAGE_PARAMS, uint);
775        int imageAtomicExchange(IMAGE_PARAMS, int);
776        float imageAtomicExchange(IMAGE_PARAMS, float);
777        uint imageAtomicCompSwap(IMAGE_PARAMS, uint, uint);
778        int imageAtomicCompSwap(IMAGE_PARAMS, int, int);
779      DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "hasSideEffects": true, "essl_extension": "OES_shader_image_atomic", "suffix": "Ext"}
780        uint imageAtomicAdd(readonly writeonly IMAGE_PARAMS, uint);
781        int imageAtomicAdd(readonly writeonly IMAGE_PARAMS, int);
782        uint imageAtomicMin(readonly writeonly IMAGE_PARAMS, uint);
783        int imageAtomicMin(readonly writeonly IMAGE_PARAMS, int);
784        uint imageAtomicMax(readonly writeonly IMAGE_PARAMS, uint);
785        int imageAtomicMax(readonly writeonly IMAGE_PARAMS, int);
786        uint imageAtomicAnd(readonly writeonly IMAGE_PARAMS, uint);
787        int imageAtomicAnd(readonly writeonly IMAGE_PARAMS, int);
788        uint imageAtomicOr(readonly writeonly IMAGE_PARAMS, uint);
789        int imageAtomicOr(readonly writeonly IMAGE_PARAMS, int);
790        uint imageAtomicXor(readonly writeonly IMAGE_PARAMS, uint);
791        int imageAtomicXor(readonly writeonly IMAGE_PARAMS, int);
792        uint imageAtomicExchange(readonly writeonly IMAGE_PARAMS, uint);
793        int imageAtomicExchange(readonly writeonly IMAGE_PARAMS, int);
794        float imageAtomicExchange(readonly writeonly IMAGE_PARAMS, float);
795        uint imageAtomicCompSwap(readonly writeonly IMAGE_PARAMS, uint, uint);
796        int imageAtomicCompSwap(readonly writeonly IMAGE_PARAMS, int, int);
797  GROUP END Atomic
798GROUP END Image
799
800GROUP BEGIN PixelLocal {"queryFunction": true}
801    GROUP BEGIN Load {"queryFunction": true}
802      DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "ANGLE_shader_pixel_local_storage", "hasSideEffects": false}
803        gvec4 pixelLocalLoadANGLE(gpixelLocalANGLE);
804    GROUP END Load
805    GROUP BEGIN Store {"queryFunction": true}
806      DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "essl_extension": "ANGLE_shader_pixel_local_storage", "hasSideEffects": true}
807        void pixelLocalStoreANGLE(gpixelLocalANGLE, gvec4);
808    GROUP END Store
809GROUP END PixelLocal
810
811// Desktop GLSL-only fragment synchronization functions. These are injected internally by the
812// compiler to make pixel local storage coherent.
813GROUP BEGIN FragmentSynchronization
814  DEFAULT METADATA {"essl_level": "ESSL_INTERNAL_BACKEND_BUILTINS", "hasSideEffects": true}
815    void beginInvocationInterlockNV();
816    void endInvocationInterlockNV();
817    void beginFragmentShaderOrderingINTEL();
818    void beginInvocationInterlockARB();
819    void endInvocationInterlockARB();
820GROUP END FragmentSynchronization
821
822GROUP BEGIN Barrier
823  DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "hasSideEffects": true}
824    void memoryBarrier();
825    void memoryBarrierAtomicCounter();
826    void memoryBarrierBuffer();
827    void memoryBarrierImage();
828GROUP END Barrier
829
830GROUP BEGIN ESSL310CS {"shader_type": "COMPUTE"}
831  DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "hasSideEffects": true}
832    void barrier();
833    void memoryBarrierShared();
834    void groupMemoryBarrier();
835GROUP END ESSL310CS
836
837GROUP BEGIN ESSL310TCS {"shader_type": "TESS_CONTROL_EXT"}
838  DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "EXT_tessellation_shader, OES_tessellation_shader", "essl_extension_becomes_core_in": "ESSL3_2_BUILTINS", "opSuffix": "TCS", "hasSideEffects": true, "suffix": "TCS"}
839    void barrier();
840GROUP END ESSL310TCS
841
842GROUP BEGIN GS {"shader_type": "GEOMETRY"}
843  DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "EXT_geometry_shader, OES_geometry_shader", "essl_extension_becomes_core_in": "ESSL3_2_BUILTINS", "hasSideEffects": true}
844    void EmitVertex();
845    void EndPrimitive();
846GROUP END GS
847
848GROUP BEGIN SubpassInput
849  DEFAULT METADATA {"essl_level": "ESSL_INTERNAL_BACKEND_BUILTINS"}
850    gvec4 subpassLoad(gsubpassInput);
851GROUP END SubpassInput
852
853// MSL fragment functions
854GROUP BEGIN MetalFragmentSample {"shader_type": "FRAGMENT"}
855  DEFAULT METADATA {"essl_level": "ESSL_INTERNAL_BACKEND_BUILTINS"}
856    uint numSamples();
857    vec2 samplePosition(uint);
858    genType interpolateAtCenter(genType);
859GROUP END MetalFragmentSample
860
861// MSL common functions
862GROUP BEGIN MetalCommon
863  DEFAULT METADATA {"essl_level": "ESSL_INTERNAL_BACKEND_BUILTINS"}
864    genType saturate(genType);
865GROUP END MetalCommon
866