• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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