2 * Copyright © 2013 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
25 * \file builtin_types.cpp
27 * The glsl_type class has static members to represent all the built-in types
28 * (such as the glsl_type::_float_type flyweight) as well as convenience pointer
29 * accessors (such as glsl_type::float_type). Those global variables are
30 * declared and initialized in this file.
32 * This also contains _mesa_glsl_initialize_types(), a function which populates
33 * a symbol table with the available built-in types for a particular language
34 * version and set of enabled extensions.
37 #include "compiler/glsl_types.h"
38 #include "glsl_parser_extras.h"
39 #include "util/macros.h"
40 #include "main/mtypes.h"
43 * Declarations of type flyweights (glsl_type::_foo_type) and
44 * convenience pointers (glsl_type::foo_type).
47 #define DECL_TYPE(NAME, ...)
49 #define STRUCT_TYPE(NAME) \
50 const glsl_type glsl_type::_struct_##NAME##_type = \
51 glsl_type(NAME##_fields, ARRAY_SIZE(NAME##_fields), #NAME); \
52 const glsl_type *const glsl_type::struct_##NAME##_type = \
53 &glsl_type::_struct_##NAME##_type;
55 static const struct glsl_struct_field gl_DepthRangeParameters_fields
[] = {
56 glsl_struct_field(glsl_type::float_type
, GLSL_PRECISION_HIGH
, "near"),
57 glsl_struct_field(glsl_type::float_type
, GLSL_PRECISION_HIGH
, "far"),
58 glsl_struct_field(glsl_type::float_type
, GLSL_PRECISION_HIGH
, "diff"),
61 static const struct glsl_struct_field gl_PointParameters_fields
[] = {
62 glsl_struct_field(glsl_type::float_type
, "size"),
63 glsl_struct_field(glsl_type::float_type
, "sizeMin"),
64 glsl_struct_field(glsl_type::float_type
, "sizeMax"),
65 glsl_struct_field(glsl_type::float_type
, "fadeThresholdSize"),
66 glsl_struct_field(glsl_type::float_type
, "distanceConstantAttenuation"),
67 glsl_struct_field(glsl_type::float_type
, "distanceLinearAttenuation"),
68 glsl_struct_field(glsl_type::float_type
, "distanceQuadraticAttenuation"),
71 static const struct glsl_struct_field gl_MaterialParameters_fields
[] = {
72 glsl_struct_field(glsl_type::vec4_type
, "emission"),
73 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
74 glsl_struct_field(glsl_type::vec4_type
, "diffuse"),
75 glsl_struct_field(glsl_type::vec4_type
, "specular"),
76 glsl_struct_field(glsl_type::float_type
, "shininess"),
79 static const struct glsl_struct_field gl_LightSourceParameters_fields
[] = {
80 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
81 glsl_struct_field(glsl_type::vec4_type
, "diffuse"),
82 glsl_struct_field(glsl_type::vec4_type
, "specular"),
83 glsl_struct_field(glsl_type::vec4_type
, "position"),
84 glsl_struct_field(glsl_type::vec4_type
, "halfVector"),
85 glsl_struct_field(glsl_type::vec3_type
, "spotDirection"),
86 glsl_struct_field(glsl_type::float_type
, "spotExponent"),
87 glsl_struct_field(glsl_type::float_type
, "spotCutoff"),
88 glsl_struct_field(glsl_type::float_type
, "spotCosCutoff"),
89 glsl_struct_field(glsl_type::float_type
, "constantAttenuation"),
90 glsl_struct_field(glsl_type::float_type
, "linearAttenuation"),
91 glsl_struct_field(glsl_type::float_type
, "quadraticAttenuation"),
94 static const struct glsl_struct_field gl_LightModelParameters_fields
[] = {
95 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
98 static const struct glsl_struct_field gl_LightModelProducts_fields
[] = {
99 glsl_struct_field(glsl_type::vec4_type
, "sceneColor"),
102 static const struct glsl_struct_field gl_LightProducts_fields
[] = {
103 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
104 glsl_struct_field(glsl_type::vec4_type
, "diffuse"),
105 glsl_struct_field(glsl_type::vec4_type
, "specular"),
108 static const struct glsl_struct_field gl_FogParameters_fields
[] = {
109 glsl_struct_field(glsl_type::vec4_type
, "color"),
110 glsl_struct_field(glsl_type::float_type
, "density"),
111 glsl_struct_field(glsl_type::float_type
, "start"),
112 glsl_struct_field(glsl_type::float_type
, "end"),
113 glsl_struct_field(glsl_type::float_type
, "scale"),
116 #include "compiler/builtin_type_macros.h"
120 * Code to populate a symbol table with the built-in types available in a
121 * particular shading language version. The table below contains tags every
122 * type with the GLSL/GLSL ES versions where it was introduced.
126 #define T(TYPE, MIN_GL, MIN_ES) \
127 { glsl_type::TYPE##_type, MIN_GL, MIN_ES },
129 static const struct builtin_type_versions
{
130 const glsl_type
*const type
;
133 } builtin_type_versions
[] = {
175 T(sampler1D
, 110, 999)
176 T(sampler2D
, 110, 100)
177 T(sampler3D
, 110, 300)
178 T(samplerCube
, 110, 100)
179 T(sampler1DArray
, 130, 999)
180 T(sampler2DArray
, 130, 300)
181 T(samplerCubeArray
, 400, 320)
182 T(sampler2DRect
, 140, 999)
183 T(samplerBuffer
, 140, 320)
184 T(sampler2DMS
, 150, 310)
185 T(sampler2DMSArray
, 150, 320)
187 T(isampler1D
, 130, 999)
188 T(isampler2D
, 130, 300)
189 T(isampler3D
, 130, 300)
190 T(isamplerCube
, 130, 300)
191 T(isampler1DArray
, 130, 999)
192 T(isampler2DArray
, 130, 300)
193 T(isamplerCubeArray
, 400, 320)
194 T(isampler2DRect
, 140, 999)
195 T(isamplerBuffer
, 140, 320)
196 T(isampler2DMS
, 150, 310)
197 T(isampler2DMSArray
, 150, 320)
199 T(usampler1D
, 130, 999)
200 T(usampler2D
, 130, 300)
201 T(usampler3D
, 130, 300)
202 T(usamplerCube
, 130, 300)
203 T(usampler1DArray
, 130, 999)
204 T(usampler2DArray
, 130, 300)
205 T(usamplerCubeArray
, 400, 320)
206 T(usampler2DRect
, 140, 999)
207 T(usamplerBuffer
, 140, 320)
208 T(usampler2DMS
, 150, 310)
209 T(usampler2DMSArray
, 150, 320)
211 T(sampler1DShadow
, 110, 999)
212 T(sampler2DShadow
, 110, 300)
213 T(samplerCubeShadow
, 130, 300)
214 T(sampler1DArrayShadow
, 130, 999)
215 T(sampler2DArrayShadow
, 130, 300)
216 T(samplerCubeArrayShadow
, 400, 320)
217 T(sampler2DRectShadow
, 140, 999)
219 T(struct_gl_DepthRangeParameters
, 110, 100)
224 T(image2DRect
, 420, 999)
225 T(imageCube
, 420, 310)
226 T(imageBuffer
, 420, 320)
227 T(image1DArray
, 420, 999)
228 T(image2DArray
, 420, 310)
229 T(imageCubeArray
, 420, 320)
230 T(image2DMS
, 420, 999)
231 T(image2DMSArray
, 420, 999)
232 T(iimage1D
, 420, 999)
233 T(iimage2D
, 420, 310)
234 T(iimage3D
, 420, 310)
235 T(iimage2DRect
, 420, 999)
236 T(iimageCube
, 420, 310)
237 T(iimageBuffer
, 420, 320)
238 T(iimage1DArray
, 420, 999)
239 T(iimage2DArray
, 420, 310)
240 T(iimageCubeArray
, 420, 320)
241 T(iimage2DMS
, 420, 999)
242 T(iimage2DMSArray
, 420, 999)
243 T(uimage1D
, 420, 999)
244 T(uimage2D
, 420, 310)
245 T(uimage3D
, 420, 310)
246 T(uimage2DRect
, 420, 999)
247 T(uimageCube
, 420, 310)
248 T(uimageBuffer
, 420, 320)
249 T(uimage1DArray
, 420, 999)
250 T(uimage2DArray
, 420, 310)
251 T(uimageCubeArray
, 420, 320)
252 T(uimage2DMS
, 420, 999)
253 T(uimage2DMSArray
, 420, 999)
255 T(atomic_uint
, 420, 310)
258 static const glsl_type
*const deprecated_types
[] = {
259 glsl_type::struct_gl_PointParameters_type
,
260 glsl_type::struct_gl_MaterialParameters_type
,
261 glsl_type::struct_gl_LightSourceParameters_type
,
262 glsl_type::struct_gl_LightModelParameters_type
,
263 glsl_type::struct_gl_LightModelProducts_type
,
264 glsl_type::struct_gl_LightProducts_type
,
265 glsl_type::struct_gl_FogParameters_type
,
269 add_type(glsl_symbol_table
*symbols
, const glsl_type
*const type
)
271 symbols
->add_type(type
->name
, type
);
275 * Populate the symbol table with available built-in types.
278 _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state
*state
)
280 struct glsl_symbol_table
*symbols
= state
->symbols
;
282 for (unsigned i
= 0; i
< ARRAY_SIZE(builtin_type_versions
); i
++) {
283 const struct builtin_type_versions
*const t
= &builtin_type_versions
[i
];
284 if (state
->is_version(t
->min_gl
, t
->min_es
)) {
285 add_type(symbols
, t
->type
);
289 /* Add deprecated structure types. While these were deprecated in 1.30,
290 * they're still present. We've removed them in 1.40+ (OpenGL 3.1+).
292 if (state
->compat_shader
|| state
->ARB_compatibility_enable
) {
293 for (unsigned i
= 0; i
< ARRAY_SIZE(deprecated_types
); i
++) {
294 add_type(symbols
, deprecated_types
[i
]);
298 /* Add types for enabled extensions. They may have already been added
299 * by the version-based loop, but attempting to add them a second time
302 if (state
->ARB_texture_cube_map_array_enable
||
303 state
->EXT_texture_cube_map_array_enable
||
304 state
->OES_texture_cube_map_array_enable
) {
305 add_type(symbols
, glsl_type::samplerCubeArray_type
);
306 add_type(symbols
, glsl_type::samplerCubeArrayShadow_type
);
307 add_type(symbols
, glsl_type::isamplerCubeArray_type
);
308 add_type(symbols
, glsl_type::usamplerCubeArray_type
);
311 if (state
->ARB_texture_multisample_enable
) {
312 add_type(symbols
, glsl_type::sampler2DMS_type
);
313 add_type(symbols
, glsl_type::isampler2DMS_type
);
314 add_type(symbols
, glsl_type::usampler2DMS_type
);
316 if (state
->ARB_texture_multisample_enable
||
317 state
->OES_texture_storage_multisample_2d_array_enable
) {
318 add_type(symbols
, glsl_type::sampler2DMSArray_type
);
319 add_type(symbols
, glsl_type::isampler2DMSArray_type
);
320 add_type(symbols
, glsl_type::usampler2DMSArray_type
);
323 if (state
->ARB_texture_rectangle_enable
) {
324 add_type(symbols
, glsl_type::sampler2DRect_type
);
325 add_type(symbols
, glsl_type::sampler2DRectShadow_type
);
328 if (state
->EXT_gpu_shader4_enable
) {
329 add_type(symbols
, glsl_type::uint_type
);
330 add_type(symbols
, glsl_type::uvec2_type
);
331 add_type(symbols
, glsl_type::uvec3_type
);
332 add_type(symbols
, glsl_type::uvec4_type
);
334 add_type(symbols
, glsl_type::samplerCubeShadow_type
);
336 if (state
->ctx
->Extensions
.EXT_texture_array
) {
337 add_type(symbols
, glsl_type::sampler1DArray_type
);
338 add_type(symbols
, glsl_type::sampler2DArray_type
);
339 add_type(symbols
, glsl_type::sampler1DArrayShadow_type
);
340 add_type(symbols
, glsl_type::sampler2DArrayShadow_type
);
342 if (state
->ctx
->Extensions
.EXT_texture_buffer_object
) {
343 add_type(symbols
, glsl_type::samplerBuffer_type
);
346 if (state
->ctx
->Extensions
.EXT_texture_integer
) {
347 add_type(symbols
, glsl_type::isampler1D_type
);
348 add_type(symbols
, glsl_type::isampler2D_type
);
349 add_type(symbols
, glsl_type::isampler3D_type
);
350 add_type(symbols
, glsl_type::isamplerCube_type
);
352 add_type(symbols
, glsl_type::usampler1D_type
);
353 add_type(symbols
, glsl_type::usampler2D_type
);
354 add_type(symbols
, glsl_type::usampler3D_type
);
355 add_type(symbols
, glsl_type::usamplerCube_type
);
357 if (state
->ctx
->Extensions
.NV_texture_rectangle
) {
358 add_type(symbols
, glsl_type::isampler2DRect_type
);
359 add_type(symbols
, glsl_type::usampler2DRect_type
);
361 if (state
->ctx
->Extensions
.EXT_texture_array
) {
362 add_type(symbols
, glsl_type::isampler1DArray_type
);
363 add_type(symbols
, glsl_type::isampler2DArray_type
);
364 add_type(symbols
, glsl_type::usampler1DArray_type
);
365 add_type(symbols
, glsl_type::usampler2DArray_type
);
367 if (state
->ctx
->Extensions
.EXT_texture_buffer_object
) {
368 add_type(symbols
, glsl_type::isamplerBuffer_type
);
369 add_type(symbols
, glsl_type::usamplerBuffer_type
);
374 if (state
->EXT_texture_array_enable
) {
375 add_type(symbols
, glsl_type::sampler1DArray_type
);
376 add_type(symbols
, glsl_type::sampler2DArray_type
);
377 add_type(symbols
, glsl_type::sampler1DArrayShadow_type
);
378 add_type(symbols
, glsl_type::sampler2DArrayShadow_type
);
381 if (state
->OES_EGL_image_external_enable
||
382 state
->OES_EGL_image_external_essl3_enable
) {
383 add_type(symbols
, glsl_type::samplerExternalOES_type
);
386 if (state
->OES_texture_3D_enable
) {
387 add_type(symbols
, glsl_type::sampler3D_type
);
390 if (state
->ARB_shader_image_load_store_enable
||
391 state
->EXT_texture_cube_map_array_enable
||
392 state
->OES_texture_cube_map_array_enable
) {
393 add_type(symbols
, glsl_type::imageCubeArray_type
);
394 add_type(symbols
, glsl_type::iimageCubeArray_type
);
395 add_type(symbols
, glsl_type::uimageCubeArray_type
);
398 if (state
->ARB_shader_image_load_store_enable
) {
399 add_type(symbols
, glsl_type::image1D_type
);
400 add_type(symbols
, glsl_type::image2D_type
);
401 add_type(symbols
, glsl_type::image3D_type
);
402 add_type(symbols
, glsl_type::image2DRect_type
);
403 add_type(symbols
, glsl_type::imageCube_type
);
404 add_type(symbols
, glsl_type::imageBuffer_type
);
405 add_type(symbols
, glsl_type::image1DArray_type
);
406 add_type(symbols
, glsl_type::image2DArray_type
);
407 add_type(symbols
, glsl_type::image2DMS_type
);
408 add_type(symbols
, glsl_type::image2DMSArray_type
);
409 add_type(symbols
, glsl_type::iimage1D_type
);
410 add_type(symbols
, glsl_type::iimage2D_type
);
411 add_type(symbols
, glsl_type::iimage3D_type
);
412 add_type(symbols
, glsl_type::iimage2DRect_type
);
413 add_type(symbols
, glsl_type::iimageCube_type
);
414 add_type(symbols
, glsl_type::iimageBuffer_type
);
415 add_type(symbols
, glsl_type::iimage1DArray_type
);
416 add_type(symbols
, glsl_type::iimage2DArray_type
);
417 add_type(symbols
, glsl_type::iimage2DMS_type
);
418 add_type(symbols
, glsl_type::iimage2DMSArray_type
);
419 add_type(symbols
, glsl_type::uimage1D_type
);
420 add_type(symbols
, glsl_type::uimage2D_type
);
421 add_type(symbols
, glsl_type::uimage3D_type
);
422 add_type(symbols
, glsl_type::uimage2DRect_type
);
423 add_type(symbols
, glsl_type::uimageCube_type
);
424 add_type(symbols
, glsl_type::uimageBuffer_type
);
425 add_type(symbols
, glsl_type::uimage1DArray_type
);
426 add_type(symbols
, glsl_type::uimage2DArray_type
);
427 add_type(symbols
, glsl_type::uimage2DMS_type
);
428 add_type(symbols
, glsl_type::uimage2DMSArray_type
);
431 if (state
->EXT_texture_buffer_enable
|| state
->OES_texture_buffer_enable
) {
432 add_type(symbols
, glsl_type::samplerBuffer_type
);
433 add_type(symbols
, glsl_type::isamplerBuffer_type
);
434 add_type(symbols
, glsl_type::usamplerBuffer_type
);
436 add_type(symbols
, glsl_type::imageBuffer_type
);
437 add_type(symbols
, glsl_type::iimageBuffer_type
);
438 add_type(symbols
, glsl_type::uimageBuffer_type
);
441 if (state
->has_atomic_counters()) {
442 add_type(symbols
, glsl_type::atomic_uint_type
);
445 if (state
->ARB_gpu_shader_fp64_enable
) {
446 add_type(symbols
, glsl_type::double_type
);
447 add_type(symbols
, glsl_type::dvec2_type
);
448 add_type(symbols
, glsl_type::dvec3_type
);
449 add_type(symbols
, glsl_type::dvec4_type
);
450 add_type(symbols
, glsl_type::dmat2_type
);
451 add_type(symbols
, glsl_type::dmat3_type
);
452 add_type(symbols
, glsl_type::dmat4_type
);
453 add_type(symbols
, glsl_type::dmat2x3_type
);
454 add_type(symbols
, glsl_type::dmat2x4_type
);
455 add_type(symbols
, glsl_type::dmat3x2_type
);
456 add_type(symbols
, glsl_type::dmat3x4_type
);
457 add_type(symbols
, glsl_type::dmat4x2_type
);
458 add_type(symbols
, glsl_type::dmat4x3_type
);
461 if (state
->ARB_gpu_shader_int64_enable
||
462 state
->AMD_gpu_shader_int64_enable
) {
463 add_type(symbols
, glsl_type::int64_t_type
);
464 add_type(symbols
, glsl_type::i64vec2_type
);
465 add_type(symbols
, glsl_type::i64vec3_type
);
466 add_type(symbols
, glsl_type::i64vec4_type
);
468 add_type(symbols
, glsl_type::uint64_t_type
);
469 add_type(symbols
, glsl_type::u64vec2_type
);
470 add_type(symbols
, glsl_type::u64vec3_type
);
471 add_type(symbols
, glsl_type::u64vec4_type
);