1 /*
2 * Copyright © 2013 Intel Corporation
3 *
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:
10 *
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
13 * Software.
14 *
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.
22 */
23
24 /**
25 * \file builtin_types.cpp
26 *
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.
31 *
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.
35 */
36
37 #include "compiler/glsl_types.h"
38 #include "glsl_parser_extras.h"
39 #include "util/macros.h"
40 #include "main/mtypes.h"
41
42 /**
43 * Declarations of type flyweights (glsl_type::_foo_type) and
44 * convenience pointers (glsl_type::foo_type).
45 * @{
46 */
47 #define DECL_TYPE(NAME, ...)
48
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;
54
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"),
59 };
60
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"),
69 };
70
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"),
77 };
78
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, "spotCosCutoff"),
87 glsl_struct_field(glsl_type::float_type, "constantAttenuation"),
88 glsl_struct_field(glsl_type::float_type, "linearAttenuation"),
89 glsl_struct_field(glsl_type::float_type, "quadraticAttenuation"),
90 glsl_struct_field(glsl_type::float_type, "spotExponent"),
91 glsl_struct_field(glsl_type::float_type, "spotCutoff"),
92 };
93
94 static const struct glsl_struct_field gl_LightModelParameters_fields[] = {
95 glsl_struct_field(glsl_type::vec4_type, "ambient"),
96 };
97
98 static const struct glsl_struct_field gl_LightModelProducts_fields[] = {
99 glsl_struct_field(glsl_type::vec4_type, "sceneColor"),
100 };
101
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"),
106 };
107
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"),
114 };
115
116 #include "compiler/builtin_type_macros.h"
117 /** @} */
118
119 /**
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.
123 *
124 * @{
125 */
126 #define T(TYPE, MIN_GL, MIN_ES) \
127 { glsl_type::TYPE##_type, MIN_GL, MIN_ES },
128
129 static const struct builtin_type_versions {
130 const glsl_type *const type;
131 int min_gl;
132 int min_es;
133 } builtin_type_versions[] = {
134 T(void, 110, 100)
135 T(bool, 110, 100)
136 T(bvec2, 110, 100)
137 T(bvec3, 110, 100)
138 T(bvec4, 110, 100)
139 T(int, 110, 100)
140 T(ivec2, 110, 100)
141 T(ivec3, 110, 100)
142 T(ivec4, 110, 100)
143 T(uint, 130, 300)
144 T(uvec2, 130, 300)
145 T(uvec3, 130, 300)
146 T(uvec4, 130, 300)
147 T(float, 110, 100)
148 T(vec2, 110, 100)
149 T(vec3, 110, 100)
150 T(vec4, 110, 100)
151 T(mat2, 110, 100)
152 T(mat3, 110, 100)
153 T(mat4, 110, 100)
154 T(mat2x3, 120, 300)
155 T(mat2x4, 120, 300)
156 T(mat3x2, 120, 300)
157 T(mat3x4, 120, 300)
158 T(mat4x2, 120, 300)
159 T(mat4x3, 120, 300)
160
161 T(double, 400, 999)
162 T(dvec2, 400, 999)
163 T(dvec3, 400, 999)
164 T(dvec4, 400, 999)
165 T(dmat2, 400, 999)
166 T(dmat3, 400, 999)
167 T(dmat4, 400, 999)
168 T(dmat2x3, 400, 999)
169 T(dmat2x4, 400, 999)
170 T(dmat3x2, 400, 999)
171 T(dmat3x4, 400, 999)
172 T(dmat4x2, 400, 999)
173 T(dmat4x3, 400, 999)
174
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)
186
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)
198
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)
210
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)
218
219 T(struct_gl_DepthRangeParameters, 110, 100)
220
221 T(image1D, 420, 999)
222 T(image2D, 420, 310)
223 T(image3D, 420, 310)
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)
254
255 T(atomic_uint, 420, 310)
256 };
257
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,
266 };
267
268 static inline void
add_type(glsl_symbol_table * symbols,const glsl_type * const type)269 add_type(glsl_symbol_table *symbols, const glsl_type *const type)
270 {
271 symbols->add_type(type->name, type);
272 }
273
274 /**
275 * Populate the symbol table with available built-in types.
276 */
277 void
_mesa_glsl_initialize_types(struct _mesa_glsl_parse_state * state)278 _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
279 {
280 struct glsl_symbol_table *symbols = state->symbols;
281
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);
286 }
287 }
288
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+).
291 */
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]);
295 }
296 }
297
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
300 * is harmless.
301 */
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);
309 }
310
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);
315 }
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);
321 }
322
323 if (state->ARB_texture_rectangle_enable) {
324 add_type(symbols, glsl_type::sampler2DRect_type);
325 add_type(symbols, glsl_type::sampler2DRectShadow_type);
326 }
327
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);
333
334 add_type(symbols, glsl_type::samplerCubeShadow_type);
335
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);
341 }
342 if (state->ctx->Extensions.EXT_texture_buffer_object) {
343 add_type(symbols, glsl_type::samplerBuffer_type);
344 }
345
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);
351
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);
356
357 if (state->ctx->Extensions.NV_texture_rectangle) {
358 add_type(symbols, glsl_type::isampler2DRect_type);
359 add_type(symbols, glsl_type::usampler2DRect_type);
360 }
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);
366 }
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);
370 }
371 }
372 }
373
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);
379 }
380
381 if (state->OES_EGL_image_external_enable ||
382 state->OES_EGL_image_external_essl3_enable) {
383 add_type(symbols, glsl_type::samplerExternalOES_type);
384 }
385
386 if (state->OES_texture_3D_enable) {
387 add_type(symbols, glsl_type::sampler3D_type);
388 }
389
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);
396 }
397
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);
429 }
430
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);
435
436 add_type(symbols, glsl_type::imageBuffer_type);
437 add_type(symbols, glsl_type::iimageBuffer_type);
438 add_type(symbols, glsl_type::uimageBuffer_type);
439 }
440
441 if (state->has_atomic_counters()) {
442 add_type(symbols, glsl_type::atomic_uint_type);
443 }
444
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);
459 }
460
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);
467
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);
472 }
473 }
474 /** @} */
475