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 "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, ...) \
47 const glsl_type glsl_type::_##NAME##_type = glsl_type(__VA_ARGS__, #NAME); \
48 const glsl_type *const glsl_type::NAME##_type = &glsl_type::_##NAME##_type;
50 #define STRUCT_TYPE(NAME) \
51 const glsl_type glsl_type::_struct_##NAME##_type = \
52 glsl_type(NAME##_fields, ARRAY_SIZE(NAME##_fields), #NAME); \
53 const glsl_type *const glsl_type::struct_##NAME##_type = \
54 &glsl_type::_struct_##NAME##_type;
56 static const struct glsl_struct_field gl_DepthRangeParameters_fields
[] = {
57 glsl_struct_field(glsl_type::float_type
, "near"),
58 glsl_struct_field(glsl_type::float_type
, "far"),
59 glsl_struct_field(glsl_type::float_type
, "diff"),
62 static const struct glsl_struct_field gl_PointParameters_fields
[] = {
63 glsl_struct_field(glsl_type::float_type
, "size"),
64 glsl_struct_field(glsl_type::float_type
, "sizeMin"),
65 glsl_struct_field(glsl_type::float_type
, "sizeMax"),
66 glsl_struct_field(glsl_type::float_type
, "fadeThresholdSize"),
67 glsl_struct_field(glsl_type::float_type
, "distanceConstantAttenuation"),
68 glsl_struct_field(glsl_type::float_type
, "distanceLinearAttenuation"),
69 glsl_struct_field(glsl_type::float_type
, "distanceQuadraticAttenuation"),
72 static const struct glsl_struct_field gl_MaterialParameters_fields
[] = {
73 glsl_struct_field(glsl_type::vec4_type
, "emission"),
74 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
75 glsl_struct_field(glsl_type::vec4_type
, "diffuse"),
76 glsl_struct_field(glsl_type::vec4_type
, "specular"),
77 glsl_struct_field(glsl_type::float_type
, "shininess"),
80 static const struct glsl_struct_field gl_LightSourceParameters_fields
[] = {
81 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
82 glsl_struct_field(glsl_type::vec4_type
, "diffuse"),
83 glsl_struct_field(glsl_type::vec4_type
, "specular"),
84 glsl_struct_field(glsl_type::vec4_type
, "position"),
85 glsl_struct_field(glsl_type::vec4_type
, "halfVector"),
86 glsl_struct_field(glsl_type::vec3_type
, "spotDirection"),
87 glsl_struct_field(glsl_type::float_type
, "spotExponent"),
88 glsl_struct_field(glsl_type::float_type
, "spotCutoff"),
89 glsl_struct_field(glsl_type::float_type
, "spotCosCutoff"),
90 glsl_struct_field(glsl_type::float_type
, "constantAttenuation"),
91 glsl_struct_field(glsl_type::float_type
, "linearAttenuation"),
92 glsl_struct_field(glsl_type::float_type
, "quadraticAttenuation"),
95 static const struct glsl_struct_field gl_LightModelParameters_fields
[] = {
96 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
99 static const struct glsl_struct_field gl_LightModelProducts_fields
[] = {
100 glsl_struct_field(glsl_type::vec4_type
, "sceneColor"),
103 static const struct glsl_struct_field gl_LightProducts_fields
[] = {
104 glsl_struct_field(glsl_type::vec4_type
, "ambient"),
105 glsl_struct_field(glsl_type::vec4_type
, "diffuse"),
106 glsl_struct_field(glsl_type::vec4_type
, "specular"),
109 static const struct glsl_struct_field gl_FogParameters_fields
[] = {
110 glsl_struct_field(glsl_type::vec4_type
, "color"),
111 glsl_struct_field(glsl_type::float_type
, "density"),
112 glsl_struct_field(glsl_type::float_type
, "start"),
113 glsl_struct_field(glsl_type::float_type
, "end"),
114 glsl_struct_field(glsl_type::float_type
, "scale"),
117 #include "builtin_type_macros.h"
121 * Code to populate a symbol table with the built-in types available in a
122 * particular shading language version. The table below contains tags every
123 * type with the GLSL/GLSL ES versions where it was introduced.
127 #define T(TYPE, MIN_GL, MIN_ES) \
128 { glsl_type::TYPE##_type, MIN_GL, MIN_ES },
130 static const struct builtin_type_versions
{
131 const glsl_type
*const type
;
134 } builtin_type_versions
[] = {
176 T(sampler1D
, 110, 999)
177 T(sampler2D
, 110, 100)
178 T(sampler3D
, 110, 300)
179 T(samplerCube
, 110, 100)
180 T(sampler1DArray
, 130, 999)
181 T(sampler2DArray
, 130, 300)
182 T(samplerCubeArray
, 400, 999)
183 T(sampler2DRect
, 140, 999)
184 T(samplerBuffer
, 140, 999)
185 T(sampler2DMS
, 150, 310)
186 T(sampler2DMSArray
, 150, 999)
188 T(isampler1D
, 130, 999)
189 T(isampler2D
, 130, 300)
190 T(isampler3D
, 130, 300)
191 T(isamplerCube
, 130, 300)
192 T(isampler1DArray
, 130, 999)
193 T(isampler2DArray
, 130, 300)
194 T(isamplerCubeArray
, 400, 999)
195 T(isampler2DRect
, 140, 999)
196 T(isamplerBuffer
, 140, 999)
197 T(isampler2DMS
, 150, 310)
198 T(isampler2DMSArray
, 150, 999)
200 T(usampler1D
, 130, 999)
201 T(usampler2D
, 130, 300)
202 T(usampler3D
, 130, 300)
203 T(usamplerCube
, 130, 300)
204 T(usampler1DArray
, 130, 999)
205 T(usampler2DArray
, 130, 300)
206 T(usamplerCubeArray
, 400, 999)
207 T(usampler2DRect
, 140, 999)
208 T(usamplerBuffer
, 140, 999)
209 T(usampler2DMS
, 150, 310)
210 T(usampler2DMSArray
, 150, 999)
212 T(sampler1DShadow
, 110, 999)
213 T(sampler2DShadow
, 110, 300)
214 T(samplerCubeShadow
, 130, 300)
215 T(sampler1DArrayShadow
, 130, 999)
216 T(sampler2DArrayShadow
, 130, 300)
217 T(samplerCubeArrayShadow
, 400, 999)
218 T(sampler2DRectShadow
, 140, 999)
220 T(struct_gl_DepthRangeParameters
, 110, 100)
225 T(image2DRect
, 420, 999)
226 T(imageCube
, 420, 310)
227 T(imageBuffer
, 420, 999)
228 T(image1DArray
, 420, 999)
229 T(image2DArray
, 420, 310)
230 T(imageCubeArray
, 420, 999)
231 T(image2DMS
, 420, 999)
232 T(image2DMSArray
, 420, 999)
233 T(iimage1D
, 420, 999)
234 T(iimage2D
, 420, 310)
235 T(iimage3D
, 420, 310)
236 T(iimage2DRect
, 420, 999)
237 T(iimageCube
, 420, 310)
238 T(iimageBuffer
, 420, 999)
239 T(iimage1DArray
, 420, 999)
240 T(iimage2DArray
, 420, 310)
241 T(iimageCubeArray
, 420, 999)
242 T(iimage2DMS
, 420, 999)
243 T(iimage2DMSArray
, 420, 999)
244 T(uimage1D
, 420, 999)
245 T(uimage2D
, 420, 310)
246 T(uimage3D
, 420, 310)
247 T(uimage2DRect
, 420, 999)
248 T(uimageCube
, 420, 310)
249 T(uimageBuffer
, 420, 999)
250 T(uimage1DArray
, 420, 999)
251 T(uimage2DArray
, 420, 310)
252 T(uimageCubeArray
, 420, 999)
253 T(uimage2DMS
, 420, 999)
254 T(uimage2DMSArray
, 420, 999)
256 T(atomic_uint
, 420, 310)
259 static const glsl_type
*const deprecated_types
[] = {
260 glsl_type::struct_gl_PointParameters_type
,
261 glsl_type::struct_gl_MaterialParameters_type
,
262 glsl_type::struct_gl_LightSourceParameters_type
,
263 glsl_type::struct_gl_LightModelParameters_type
,
264 glsl_type::struct_gl_LightModelProducts_type
,
265 glsl_type::struct_gl_LightProducts_type
,
266 glsl_type::struct_gl_FogParameters_type
,
270 add_type(glsl_symbol_table
*symbols
, const glsl_type
*const type
)
272 symbols
->add_type(type
->name
, type
);
276 * Populate the symbol table with available built-in types.
279 _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state
*state
)
281 struct glsl_symbol_table
*symbols
= state
->symbols
;
283 for (unsigned i
= 0; i
< ARRAY_SIZE(builtin_type_versions
); i
++) {
284 const struct builtin_type_versions
*const t
= &builtin_type_versions
[i
];
285 if (state
->is_version(t
->min_gl
, t
->min_es
)) {
286 add_type(symbols
, t
->type
);
290 /* Add deprecated structure types. While these were deprecated in 1.30,
291 * they're still present. We've removed them in 1.40+ (OpenGL 3.1+).
293 if (!state
->es_shader
&& state
->language_version
< 140) {
294 for (unsigned i
= 0; i
< ARRAY_SIZE(deprecated_types
); i
++) {
295 add_type(symbols
, deprecated_types
[i
]);
299 /* Add types for enabled extensions. They may have already been added
300 * by the version-based loop, but attempting to add them a second time
303 if (state
->ARB_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 state
->OES_texture_storage_multisample_2d_array_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
);
315 add_type(symbols
, glsl_type::sampler2DMSArray_type
);
316 add_type(symbols
, glsl_type::isampler2DMSArray_type
);
317 add_type(symbols
, glsl_type::usampler2DMSArray_type
);
320 if (state
->ARB_texture_rectangle_enable
) {
321 add_type(symbols
, glsl_type::sampler2DRect_type
);
322 add_type(symbols
, glsl_type::sampler2DRectShadow_type
);
325 if (state
->EXT_texture_array_enable
) {
326 add_type(symbols
, glsl_type::sampler1DArray_type
);
327 add_type(symbols
, glsl_type::sampler2DArray_type
);
328 add_type(symbols
, glsl_type::sampler1DArrayShadow_type
);
329 add_type(symbols
, glsl_type::sampler2DArrayShadow_type
);
332 if (state
->OES_EGL_image_external_enable
) {
333 add_type(symbols
, glsl_type::samplerExternalOES_type
);
336 if (state
->OES_texture_3D_enable
) {
337 add_type(symbols
, glsl_type::sampler3D_type
);
340 if (state
->ARB_shader_image_load_store_enable
) {
341 add_type(symbols
, glsl_type::image1D_type
);
342 add_type(symbols
, glsl_type::image2D_type
);
343 add_type(symbols
, glsl_type::image3D_type
);
344 add_type(symbols
, glsl_type::image2DRect_type
);
345 add_type(symbols
, glsl_type::imageCube_type
);
346 add_type(symbols
, glsl_type::imageBuffer_type
);
347 add_type(symbols
, glsl_type::image1DArray_type
);
348 add_type(symbols
, glsl_type::image2DArray_type
);
349 add_type(symbols
, glsl_type::imageCubeArray_type
);
350 add_type(symbols
, glsl_type::image2DMS_type
);
351 add_type(symbols
, glsl_type::image2DMSArray_type
);
352 add_type(symbols
, glsl_type::iimage1D_type
);
353 add_type(symbols
, glsl_type::iimage2D_type
);
354 add_type(symbols
, glsl_type::iimage3D_type
);
355 add_type(symbols
, glsl_type::iimage2DRect_type
);
356 add_type(symbols
, glsl_type::iimageCube_type
);
357 add_type(symbols
, glsl_type::iimageBuffer_type
);
358 add_type(symbols
, glsl_type::iimage1DArray_type
);
359 add_type(symbols
, glsl_type::iimage2DArray_type
);
360 add_type(symbols
, glsl_type::iimageCubeArray_type
);
361 add_type(symbols
, glsl_type::iimage2DMS_type
);
362 add_type(symbols
, glsl_type::iimage2DMSArray_type
);
363 add_type(symbols
, glsl_type::uimage1D_type
);
364 add_type(symbols
, glsl_type::uimage2D_type
);
365 add_type(symbols
, glsl_type::uimage3D_type
);
366 add_type(symbols
, glsl_type::uimage2DRect_type
);
367 add_type(symbols
, glsl_type::uimageCube_type
);
368 add_type(symbols
, glsl_type::uimageBuffer_type
);
369 add_type(symbols
, glsl_type::uimage1DArray_type
);
370 add_type(symbols
, glsl_type::uimage2DArray_type
);
371 add_type(symbols
, glsl_type::uimageCubeArray_type
);
372 add_type(symbols
, glsl_type::uimage2DMS_type
);
373 add_type(symbols
, glsl_type::uimage2DMSArray_type
);
376 if (state
->has_atomic_counters()) {
377 add_type(symbols
, glsl_type::atomic_uint_type
);
380 if (state
->ARB_gpu_shader_fp64_enable
) {
381 add_type(symbols
, glsl_type::double_type
);
382 add_type(symbols
, glsl_type::dvec2_type
);
383 add_type(symbols
, glsl_type::dvec3_type
);
384 add_type(symbols
, glsl_type::dvec4_type
);
385 add_type(symbols
, glsl_type::dmat2_type
);
386 add_type(symbols
, glsl_type::dmat3_type
);
387 add_type(symbols
, glsl_type::dmat4_type
);
388 add_type(symbols
, glsl_type::dmat2x3_type
);
389 add_type(symbols
, glsl_type::dmat2x4_type
);
390 add_type(symbols
, glsl_type::dmat3x2_type
);
391 add_type(symbols
, glsl_type::dmat3x4_type
);
392 add_type(symbols
, glsl_type::dmat4x2_type
);
393 add_type(symbols
, glsl_type::dmat4x3_type
);