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"
42 * Declarations of type flyweights (glsl_type::_foo_type) and
43 * convenience pointers (glsl_type::foo_type).
46 #define DECL_TYPE(NAME, ...)
48 #define STRUCT_TYPE(NAME) \
49 const glsl_type glsl_type::_struct_##NAME##_type = \
50 glsl_type(NAME##_fields, ARRAY_SIZE(NAME##_fields), #NAME); \
51 const glsl_type *const glsl_type::struct_##NAME##_type = \
52 &glsl_type::_struct_##NAME##_type;
54 static const struct glsl_struct_field gl_DepthRangeParameters_fields
[] = {
55 glsl_struct_field(glsl_type::float_type
, "near"),
56 glsl_struct_field(glsl_type::float_type
, "far"),
57 glsl_struct_field(glsl_type::float_type
, "diff"),
60 static const struct glsl_struct_field gl_PointParameters_fields
[] = {
61 glsl_struct_field(glsl_type::float_type
, "size"),
62 glsl_struct_field(glsl_type::float_type
, "sizeMin"),
63 glsl_struct_field(glsl_type::float_type
, "sizeMax"),
64 glsl_struct_field(glsl_type::float_type
, "fadeThresholdSize"),
65 glsl_struct_field(glsl_type::float_type
, "distanceConstantAttenuation"),
66 glsl_struct_field(glsl_type::float_type
, "distanceLinearAttenuation"),
67 glsl_struct_field(glsl_type::float_type
, "distanceQuadraticAttenuation"),
70 static const struct glsl_struct_field gl_MaterialParameters_fields
[] = {
71 glsl_struct_field(glsl_type::vec4_type
, "emission"),
72 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
73 glsl_struct_field(glsl_type::vec4_type
, "diffuse"),
74 glsl_struct_field(glsl_type::vec4_type
, "specular"),
75 glsl_struct_field(glsl_type::float_type
, "shininess"),
78 static const struct glsl_struct_field gl_LightSourceParameters_fields
[] = {
79 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
80 glsl_struct_field(glsl_type::vec4_type
, "diffuse"),
81 glsl_struct_field(glsl_type::vec4_type
, "specular"),
82 glsl_struct_field(glsl_type::vec4_type
, "position"),
83 glsl_struct_field(glsl_type::vec4_type
, "halfVector"),
84 glsl_struct_field(glsl_type::vec3_type
, "spotDirection"),
85 glsl_struct_field(glsl_type::float_type
, "spotExponent"),
86 glsl_struct_field(glsl_type::float_type
, "spotCutoff"),
87 glsl_struct_field(glsl_type::float_type
, "spotCosCutoff"),
88 glsl_struct_field(glsl_type::float_type
, "constantAttenuation"),
89 glsl_struct_field(glsl_type::float_type
, "linearAttenuation"),
90 glsl_struct_field(glsl_type::float_type
, "quadraticAttenuation"),
93 static const struct glsl_struct_field gl_LightModelParameters_fields
[] = {
94 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
97 static const struct glsl_struct_field gl_LightModelProducts_fields
[] = {
98 glsl_struct_field(glsl_type::vec4_type
, "sceneColor"),
101 static const struct glsl_struct_field gl_LightProducts_fields
[] = {
102 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
103 glsl_struct_field(glsl_type::vec4_type
, "diffuse"),
104 glsl_struct_field(glsl_type::vec4_type
, "specular"),
107 static const struct glsl_struct_field gl_FogParameters_fields
[] = {
108 glsl_struct_field(glsl_type::vec4_type
, "color"),
109 glsl_struct_field(glsl_type::float_type
, "density"),
110 glsl_struct_field(glsl_type::float_type
, "start"),
111 glsl_struct_field(glsl_type::float_type
, "end"),
112 glsl_struct_field(glsl_type::float_type
, "scale"),
115 #include "compiler/builtin_type_macros.h"
119 * Code to populate a symbol table with the built-in types available in a
120 * particular shading language version. The table below contains tags every
121 * type with the GLSL/GLSL ES versions where it was introduced.
125 #define T(TYPE, MIN_GL, MIN_ES) \
126 { glsl_type::TYPE##_type, MIN_GL, MIN_ES },
128 static const struct builtin_type_versions
{
129 const glsl_type
*const type
;
132 } builtin_type_versions
[] = {
174 T(sampler1D
, 110, 999)
175 T(sampler2D
, 110, 100)
176 T(sampler3D
, 110, 300)
177 T(samplerCube
, 110, 100)
178 T(sampler1DArray
, 130, 999)
179 T(sampler2DArray
, 130, 300)
180 T(samplerCubeArray
, 400, 320)
181 T(sampler2DRect
, 140, 999)
182 T(samplerBuffer
, 140, 320)
183 T(sampler2DMS
, 150, 310)
184 T(sampler2DMSArray
, 150, 320)
186 T(isampler1D
, 130, 999)
187 T(isampler2D
, 130, 300)
188 T(isampler3D
, 130, 300)
189 T(isamplerCube
, 130, 300)
190 T(isampler1DArray
, 130, 999)
191 T(isampler2DArray
, 130, 300)
192 T(isamplerCubeArray
, 400, 320)
193 T(isampler2DRect
, 140, 999)
194 T(isamplerBuffer
, 140, 320)
195 T(isampler2DMS
, 150, 310)
196 T(isampler2DMSArray
, 150, 320)
198 T(usampler1D
, 130, 999)
199 T(usampler2D
, 130, 300)
200 T(usampler3D
, 130, 300)
201 T(usamplerCube
, 130, 300)
202 T(usampler1DArray
, 130, 999)
203 T(usampler2DArray
, 130, 300)
204 T(usamplerCubeArray
, 400, 320)
205 T(usampler2DRect
, 140, 999)
206 T(usamplerBuffer
, 140, 320)
207 T(usampler2DMS
, 150, 310)
208 T(usampler2DMSArray
, 150, 320)
210 T(sampler1DShadow
, 110, 999)
211 T(sampler2DShadow
, 110, 300)
212 T(samplerCubeShadow
, 130, 300)
213 T(sampler1DArrayShadow
, 130, 999)
214 T(sampler2DArrayShadow
, 130, 300)
215 T(samplerCubeArrayShadow
, 400, 320)
216 T(sampler2DRectShadow
, 140, 999)
218 T(struct_gl_DepthRangeParameters
, 110, 100)
223 T(image2DRect
, 420, 999)
224 T(imageCube
, 420, 310)
225 T(imageBuffer
, 420, 320)
226 T(image1DArray
, 420, 999)
227 T(image2DArray
, 420, 310)
228 T(imageCubeArray
, 420, 320)
229 T(image2DMS
, 420, 999)
230 T(image2DMSArray
, 420, 999)
231 T(iimage1D
, 420, 999)
232 T(iimage2D
, 420, 310)
233 T(iimage3D
, 420, 310)
234 T(iimage2DRect
, 420, 999)
235 T(iimageCube
, 420, 310)
236 T(iimageBuffer
, 420, 320)
237 T(iimage1DArray
, 420, 999)
238 T(iimage2DArray
, 420, 310)
239 T(iimageCubeArray
, 420, 320)
240 T(iimage2DMS
, 420, 999)
241 T(iimage2DMSArray
, 420, 999)
242 T(uimage1D
, 420, 999)
243 T(uimage2D
, 420, 310)
244 T(uimage3D
, 420, 310)
245 T(uimage2DRect
, 420, 999)
246 T(uimageCube
, 420, 310)
247 T(uimageBuffer
, 420, 320)
248 T(uimage1DArray
, 420, 999)
249 T(uimage2DArray
, 420, 310)
250 T(uimageCubeArray
, 420, 320)
251 T(uimage2DMS
, 420, 999)
252 T(uimage2DMSArray
, 420, 999)
254 T(atomic_uint
, 420, 310)
257 static const glsl_type
*const deprecated_types
[] = {
258 glsl_type::struct_gl_PointParameters_type
,
259 glsl_type::struct_gl_MaterialParameters_type
,
260 glsl_type::struct_gl_LightSourceParameters_type
,
261 glsl_type::struct_gl_LightModelParameters_type
,
262 glsl_type::struct_gl_LightModelProducts_type
,
263 glsl_type::struct_gl_LightProducts_type
,
264 glsl_type::struct_gl_FogParameters_type
,
268 add_type(glsl_symbol_table
*symbols
, const glsl_type
*const type
)
270 symbols
->add_type(type
->name
, type
);
274 * Populate the symbol table with available built-in types.
277 _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state
*state
)
279 struct glsl_symbol_table
*symbols
= state
->symbols
;
281 for (unsigned i
= 0; i
< ARRAY_SIZE(builtin_type_versions
); i
++) {
282 const struct builtin_type_versions
*const t
= &builtin_type_versions
[i
];
283 if (state
->is_version(t
->min_gl
, t
->min_es
)) {
284 add_type(symbols
, t
->type
);
288 /* Add deprecated structure types. While these were deprecated in 1.30,
289 * they're still present. We've removed them in 1.40+ (OpenGL 3.1+).
291 if (!state
->es_shader
&& state
->language_version
< 140) {
292 for (unsigned i
= 0; i
< ARRAY_SIZE(deprecated_types
); i
++) {
293 add_type(symbols
, deprecated_types
[i
]);
297 /* Add types for enabled extensions. They may have already been added
298 * by the version-based loop, but attempting to add them a second time
301 if (state
->ARB_texture_cube_map_array_enable
||
302 state
->EXT_texture_cube_map_array_enable
||
303 state
->OES_texture_cube_map_array_enable
) {
304 add_type(symbols
, glsl_type::samplerCubeArray_type
);
305 add_type(symbols
, glsl_type::samplerCubeArrayShadow_type
);
306 add_type(symbols
, glsl_type::isamplerCubeArray_type
);
307 add_type(symbols
, glsl_type::usamplerCubeArray_type
);
310 if (state
->ARB_texture_multisample_enable
) {
311 add_type(symbols
, glsl_type::sampler2DMS_type
);
312 add_type(symbols
, glsl_type::isampler2DMS_type
);
313 add_type(symbols
, glsl_type::usampler2DMS_type
);
315 if (state
->ARB_texture_multisample_enable
||
316 state
->OES_texture_storage_multisample_2d_array_enable
) {
317 add_type(symbols
, glsl_type::sampler2DMSArray_type
);
318 add_type(symbols
, glsl_type::isampler2DMSArray_type
);
319 add_type(symbols
, glsl_type::usampler2DMSArray_type
);
322 if (state
->ARB_texture_rectangle_enable
) {
323 add_type(symbols
, glsl_type::sampler2DRect_type
);
324 add_type(symbols
, glsl_type::sampler2DRectShadow_type
);
327 if (state
->EXT_texture_array_enable
) {
328 add_type(symbols
, glsl_type::sampler1DArray_type
);
329 add_type(symbols
, glsl_type::sampler2DArray_type
);
330 add_type(symbols
, glsl_type::sampler1DArrayShadow_type
);
331 add_type(symbols
, glsl_type::sampler2DArrayShadow_type
);
334 if (state
->OES_EGL_image_external_enable
) {
335 add_type(symbols
, glsl_type::samplerExternalOES_type
);
338 if (state
->OES_texture_3D_enable
) {
339 add_type(symbols
, glsl_type::sampler3D_type
);
342 if (state
->ARB_shader_image_load_store_enable
||
343 state
->EXT_texture_cube_map_array_enable
||
344 state
->OES_texture_cube_map_array_enable
) {
345 add_type(symbols
, glsl_type::imageCubeArray_type
);
346 add_type(symbols
, glsl_type::iimageCubeArray_type
);
347 add_type(symbols
, glsl_type::uimageCubeArray_type
);
350 if (state
->ARB_shader_image_load_store_enable
) {
351 add_type(symbols
, glsl_type::image1D_type
);
352 add_type(symbols
, glsl_type::image2D_type
);
353 add_type(symbols
, glsl_type::image3D_type
);
354 add_type(symbols
, glsl_type::image2DRect_type
);
355 add_type(symbols
, glsl_type::imageCube_type
);
356 add_type(symbols
, glsl_type::imageBuffer_type
);
357 add_type(symbols
, glsl_type::image1DArray_type
);
358 add_type(symbols
, glsl_type::image2DArray_type
);
359 add_type(symbols
, glsl_type::image2DMS_type
);
360 add_type(symbols
, glsl_type::image2DMSArray_type
);
361 add_type(symbols
, glsl_type::iimage1D_type
);
362 add_type(symbols
, glsl_type::iimage2D_type
);
363 add_type(symbols
, glsl_type::iimage3D_type
);
364 add_type(symbols
, glsl_type::iimage2DRect_type
);
365 add_type(symbols
, glsl_type::iimageCube_type
);
366 add_type(symbols
, glsl_type::iimageBuffer_type
);
367 add_type(symbols
, glsl_type::iimage1DArray_type
);
368 add_type(symbols
, glsl_type::iimage2DArray_type
);
369 add_type(symbols
, glsl_type::iimage2DMS_type
);
370 add_type(symbols
, glsl_type::iimage2DMSArray_type
);
371 add_type(symbols
, glsl_type::uimage1D_type
);
372 add_type(symbols
, glsl_type::uimage2D_type
);
373 add_type(symbols
, glsl_type::uimage3D_type
);
374 add_type(symbols
, glsl_type::uimage2DRect_type
);
375 add_type(symbols
, glsl_type::uimageCube_type
);
376 add_type(symbols
, glsl_type::uimageBuffer_type
);
377 add_type(symbols
, glsl_type::uimage1DArray_type
);
378 add_type(symbols
, glsl_type::uimage2DArray_type
);
379 add_type(symbols
, glsl_type::uimage2DMS_type
);
380 add_type(symbols
, glsl_type::uimage2DMSArray_type
);
383 if (state
->EXT_texture_buffer_enable
|| state
->OES_texture_buffer_enable
) {
384 add_type(symbols
, glsl_type::samplerBuffer_type
);
385 add_type(symbols
, glsl_type::isamplerBuffer_type
);
386 add_type(symbols
, glsl_type::usamplerBuffer_type
);
388 add_type(symbols
, glsl_type::imageBuffer_type
);
389 add_type(symbols
, glsl_type::iimageBuffer_type
);
390 add_type(symbols
, glsl_type::uimageBuffer_type
);
393 if (state
->has_atomic_counters()) {
394 add_type(symbols
, glsl_type::atomic_uint_type
);
397 if (state
->ARB_gpu_shader_fp64_enable
) {
398 add_type(symbols
, glsl_type::double_type
);
399 add_type(symbols
, glsl_type::dvec2_type
);
400 add_type(symbols
, glsl_type::dvec3_type
);
401 add_type(symbols
, glsl_type::dvec4_type
);
402 add_type(symbols
, glsl_type::dmat2_type
);
403 add_type(symbols
, glsl_type::dmat3_type
);
404 add_type(symbols
, glsl_type::dmat4_type
);
405 add_type(symbols
, glsl_type::dmat2x3_type
);
406 add_type(symbols
, glsl_type::dmat2x4_type
);
407 add_type(symbols
, glsl_type::dmat3x2_type
);
408 add_type(symbols
, glsl_type::dmat3x4_type
);
409 add_type(symbols
, glsl_type::dmat4x2_type
);
410 add_type(symbols
, glsl_type::dmat4x3_type
);