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"
41 * Declarations of type flyweights (glsl_type::_foo_type) and
42 * convenience pointers (glsl_type::foo_type).
45 #define DECL_TYPE(NAME, ...) \
46 const glsl_type glsl_type::_##NAME##_type = glsl_type(__VA_ARGS__, #NAME); \
47 const glsl_type *const glsl_type::NAME##_type = &glsl_type::_##NAME##_type;
49 #define STRUCT_TYPE(NAME) \
50 const glsl_type glsl_type::_struct_##NAME##_type = \
51 glsl_type(NAME##_fields, Elements(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_type::float_type
, "near", false, -1 },
57 { glsl_type::float_type
, "far", false, -1 },
58 { glsl_type::float_type
, "diff", false, -1 },
61 static const struct glsl_struct_field gl_PointParameters_fields
[] = {
62 { glsl_type::float_type
, "size", false, -1 },
63 { glsl_type::float_type
, "sizeMin", false, -1 },
64 { glsl_type::float_type
, "sizeMax", false, -1 },
65 { glsl_type::float_type
, "fadeThresholdSize", false, -1 },
66 { glsl_type::float_type
, "distanceConstantAttenuation", false, -1 },
67 { glsl_type::float_type
, "distanceLinearAttenuation", false, -1 },
68 { glsl_type::float_type
, "distanceQuadraticAttenuation", false, -1 },
71 static const struct glsl_struct_field gl_MaterialParameters_fields
[] = {
72 { glsl_type::vec4_type
, "emission", false, -1 },
73 { glsl_type::vec4_type
, "ambient", false, -1 },
74 { glsl_type::vec4_type
, "diffuse", false, -1 },
75 { glsl_type::vec4_type
, "specular", false, -1 },
76 { glsl_type::float_type
, "shininess", false, -1 },
79 static const struct glsl_struct_field gl_LightSourceParameters_fields
[] = {
80 { glsl_type::vec4_type
, "ambient", false, -1 },
81 { glsl_type::vec4_type
, "diffuse", false, -1 },
82 { glsl_type::vec4_type
, "specular", false, -1 },
83 { glsl_type::vec4_type
, "position", false, -1 },
84 { glsl_type::vec4_type
, "halfVector", false, -1 },
85 { glsl_type::vec3_type
, "spotDirection", false, -1 },
86 { glsl_type::float_type
, "spotExponent", false, -1 },
87 { glsl_type::float_type
, "spotCutoff", false, -1 },
88 { glsl_type::float_type
, "spotCosCutoff", false, -1 },
89 { glsl_type::float_type
, "constantAttenuation", false, -1 },
90 { glsl_type::float_type
, "linearAttenuation", false, -1 },
91 { glsl_type::float_type
, "quadraticAttenuation", false, -1 },
94 static const struct glsl_struct_field gl_LightModelParameters_fields
[] = {
95 { glsl_type::vec4_type
, "ambient", false, -1 },
98 static const struct glsl_struct_field gl_LightModelProducts_fields
[] = {
99 { glsl_type::vec4_type
, "sceneColor", false, -1 },
102 static const struct glsl_struct_field gl_LightProducts_fields
[] = {
103 { glsl_type::vec4_type
, "ambient", false, -1 },
104 { glsl_type::vec4_type
, "diffuse", false, -1 },
105 { glsl_type::vec4_type
, "specular", false, -1 },
108 static const struct glsl_struct_field gl_FogParameters_fields
[] = {
109 { glsl_type::vec4_type
, "color", false, -1 },
110 { glsl_type::float_type
, "density", false, -1 },
111 { glsl_type::float_type
, "start", false, -1 },
112 { glsl_type::float_type
, "end", false, -1 },
113 { glsl_type::float_type
, "scale", false, -1 },
116 #include "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 const static struct builtin_type_versions
{
130 const glsl_type
*const type
;
133 } builtin_type_versions
[] = {
161 T(sampler1D
, 110, 999)
162 T(sampler2D
, 110, 100)
163 T(sampler3D
, 110, 300)
164 T(samplerCube
, 110, 100)
165 T(sampler1DArray
, 130, 999)
166 T(sampler2DArray
, 130, 300)
167 T(samplerCubeArray
, 400, 999)
168 T(sampler2DRect
, 140, 999)
169 T(samplerBuffer
, 140, 999)
170 T(sampler2DMS
, 150, 999)
171 T(sampler2DMSArray
, 150, 999)
173 T(isampler1D
, 130, 999)
174 T(isampler2D
, 130, 300)
175 T(isampler3D
, 130, 300)
176 T(isamplerCube
, 130, 300)
177 T(isampler1DArray
, 130, 999)
178 T(isampler2DArray
, 130, 300)
179 T(isamplerCubeArray
, 400, 999)
180 T(isampler2DRect
, 140, 999)
181 T(isamplerBuffer
, 140, 999)
182 T(isampler2DMS
, 150, 999)
183 T(isampler2DMSArray
, 150, 999)
185 T(usampler1D
, 130, 999)
186 T(usampler2D
, 130, 300)
187 T(usampler3D
, 130, 300)
188 T(usamplerCube
, 130, 300)
189 T(usampler1DArray
, 130, 999)
190 T(usampler2DArray
, 130, 300)
191 T(usamplerCubeArray
, 400, 999)
192 T(usampler2DRect
, 140, 999)
193 T(usamplerBuffer
, 140, 999)
194 T(usampler2DMS
, 150, 999)
195 T(usampler2DMSArray
, 150, 999)
197 T(sampler1DShadow
, 110, 999)
198 T(sampler2DShadow
, 110, 300)
199 T(samplerCubeShadow
, 130, 300)
200 T(sampler1DArrayShadow
, 130, 999)
201 T(sampler2DArrayShadow
, 130, 300)
202 T(samplerCubeArrayShadow
, 400, 999)
203 T(sampler2DRectShadow
, 140, 999)
205 T(struct_gl_DepthRangeParameters
, 110, 100)
210 T(image2DRect
, 420, 999)
211 T(imageCube
, 420, 999)
212 T(imageBuffer
, 420, 999)
213 T(image1DArray
, 420, 999)
214 T(image2DArray
, 420, 999)
215 T(imageCubeArray
, 420, 999)
216 T(image2DMS
, 420, 999)
217 T(image2DMSArray
, 420, 999)
218 T(iimage1D
, 420, 999)
219 T(iimage2D
, 420, 999)
220 T(iimage3D
, 420, 999)
221 T(iimage2DRect
, 420, 999)
222 T(iimageCube
, 420, 999)
223 T(iimageBuffer
, 420, 999)
224 T(iimage1DArray
, 420, 999)
225 T(iimage2DArray
, 420, 999)
226 T(iimageCubeArray
, 420, 999)
227 T(iimage2DMS
, 420, 999)
228 T(iimage2DMSArray
, 420, 999)
229 T(uimage1D
, 420, 999)
230 T(uimage2D
, 420, 999)
231 T(uimage3D
, 420, 999)
232 T(uimage2DRect
, 420, 999)
233 T(uimageCube
, 420, 999)
234 T(uimageBuffer
, 420, 999)
235 T(uimage1DArray
, 420, 999)
236 T(uimage2DArray
, 420, 999)
237 T(uimageCubeArray
, 420, 999)
238 T(uimage2DMS
, 420, 999)
239 T(uimage2DMSArray
, 420, 999)
241 T(atomic_uint
, 420, 999)
244 static const glsl_type
*const deprecated_types
[] = {
245 glsl_type::struct_gl_PointParameters_type
,
246 glsl_type::struct_gl_MaterialParameters_type
,
247 glsl_type::struct_gl_LightSourceParameters_type
,
248 glsl_type::struct_gl_LightModelParameters_type
,
249 glsl_type::struct_gl_LightModelProducts_type
,
250 glsl_type::struct_gl_LightProducts_type
,
251 glsl_type::struct_gl_FogParameters_type
,
255 add_type(glsl_symbol_table
*symbols
, const glsl_type
*const type
)
257 symbols
->add_type(type
->name
, type
);
261 * Populate the symbol table with available built-in types.
264 _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state
*state
)
266 struct glsl_symbol_table
*symbols
= state
->symbols
;
268 for (unsigned i
= 0; i
< Elements(builtin_type_versions
); i
++) {
269 const struct builtin_type_versions
*const t
= &builtin_type_versions
[i
];
270 if (state
->is_version(t
->min_gl
, t
->min_es
)) {
271 add_type(symbols
, t
->type
);
275 /* Add deprecated structure types. While these were deprecated in 1.30,
276 * they're still present. We've removed them in 1.40+ (OpenGL 3.1+).
278 if (!state
->es_shader
&& state
->language_version
< 140) {
279 for (unsigned i
= 0; i
< Elements(deprecated_types
); i
++) {
280 add_type(symbols
, deprecated_types
[i
]);
284 /* Add types for enabled extensions. They may have already been added
285 * by the version-based loop, but attempting to add them a second time
288 if (state
->ARB_texture_cube_map_array_enable
) {
289 add_type(symbols
, glsl_type::samplerCubeArray_type
);
290 add_type(symbols
, glsl_type::samplerCubeArrayShadow_type
);
291 add_type(symbols
, glsl_type::isamplerCubeArray_type
);
292 add_type(symbols
, glsl_type::usamplerCubeArray_type
);
295 if (state
->ARB_texture_multisample_enable
) {
296 add_type(symbols
, glsl_type::sampler2DMS_type
);
297 add_type(symbols
, glsl_type::isampler2DMS_type
);
298 add_type(symbols
, glsl_type::usampler2DMS_type
);
299 add_type(symbols
, glsl_type::sampler2DMSArray_type
);
300 add_type(symbols
, glsl_type::isampler2DMSArray_type
);
301 add_type(symbols
, glsl_type::usampler2DMSArray_type
);
304 if (state
->ARB_texture_rectangle_enable
) {
305 add_type(symbols
, glsl_type::sampler2DRect_type
);
306 add_type(symbols
, glsl_type::sampler2DRectShadow_type
);
309 if (state
->EXT_texture_array_enable
) {
310 add_type(symbols
, glsl_type::sampler1DArray_type
);
311 add_type(symbols
, glsl_type::sampler2DArray_type
);
312 add_type(symbols
, glsl_type::sampler1DArrayShadow_type
);
313 add_type(symbols
, glsl_type::sampler2DArrayShadow_type
);
316 if (state
->OES_EGL_image_external_enable
) {
317 add_type(symbols
, glsl_type::samplerExternalOES_type
);
320 if (state
->OES_texture_3D_enable
) {
321 add_type(symbols
, glsl_type::sampler3D_type
);
324 if (state
->ARB_shader_image_load_store_enable
) {
325 add_type(symbols
, glsl_type::image1D_type
);
326 add_type(symbols
, glsl_type::image2D_type
);
327 add_type(symbols
, glsl_type::image3D_type
);
328 add_type(symbols
, glsl_type::image2DRect_type
);
329 add_type(symbols
, glsl_type::imageCube_type
);
330 add_type(symbols
, glsl_type::imageBuffer_type
);
331 add_type(symbols
, glsl_type::image1DArray_type
);
332 add_type(symbols
, glsl_type::image2DArray_type
);
333 add_type(symbols
, glsl_type::imageCubeArray_type
);
334 add_type(symbols
, glsl_type::image2DMS_type
);
335 add_type(symbols
, glsl_type::image2DMSArray_type
);
336 add_type(symbols
, glsl_type::iimage1D_type
);
337 add_type(symbols
, glsl_type::iimage2D_type
);
338 add_type(symbols
, glsl_type::iimage3D_type
);
339 add_type(symbols
, glsl_type::iimage2DRect_type
);
340 add_type(symbols
, glsl_type::iimageCube_type
);
341 add_type(symbols
, glsl_type::iimageBuffer_type
);
342 add_type(symbols
, glsl_type::iimage1DArray_type
);
343 add_type(symbols
, glsl_type::iimage2DArray_type
);
344 add_type(symbols
, glsl_type::iimageCubeArray_type
);
345 add_type(symbols
, glsl_type::iimage2DMS_type
);
346 add_type(symbols
, glsl_type::iimage2DMSArray_type
);
347 add_type(symbols
, glsl_type::uimage1D_type
);
348 add_type(symbols
, glsl_type::uimage2D_type
);
349 add_type(symbols
, glsl_type::uimage3D_type
);
350 add_type(symbols
, glsl_type::uimage2DRect_type
);
351 add_type(symbols
, glsl_type::uimageCube_type
);
352 add_type(symbols
, glsl_type::uimageBuffer_type
);
353 add_type(symbols
, glsl_type::uimage1DArray_type
);
354 add_type(symbols
, glsl_type::uimage2DArray_type
);
355 add_type(symbols
, glsl_type::uimageCubeArray_type
);
356 add_type(symbols
, glsl_type::uimage2DMS_type
);
357 add_type(symbols
, glsl_type::uimage2DMSArray_type
);
360 if (state
->ARB_shader_atomic_counters_enable
) {
361 add_type(symbols
, glsl_type::atomic_uint_type
);