• 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 
41 /**
42  * Declarations of type flyweights (glsl_type::_foo_type) and
43  * convenience pointers (glsl_type::foo_type).
44  * @{
45  */
46 #define DECL_TYPE(NAME, ...)
47 
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;
53 
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"),
58 };
59 
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"),
68 };
69 
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"),
76 };
77 
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"),
91 };
92 
93 static const struct glsl_struct_field gl_LightModelParameters_fields[] = {
94    glsl_struct_field(glsl_type::vec4_type, "ambient"),
95 };
96 
97 static const struct glsl_struct_field gl_LightModelProducts_fields[] = {
98    glsl_struct_field(glsl_type::vec4_type, "sceneColor"),
99 };
100 
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"),
105 };
106 
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"),
113 };
114 
115 #include "compiler/builtin_type_macros.h"
116 /** @} */
117 
118 /**
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.
122  *
123  * @{
124  */
125 #define T(TYPE, MIN_GL, MIN_ES) \
126    { glsl_type::TYPE##_type, MIN_GL, MIN_ES },
127 
128 static const struct builtin_type_versions {
129    const glsl_type *const type;
130    int min_gl;
131    int min_es;
132 } builtin_type_versions[] = {
133    T(void,                            110, 100)
134    T(bool,                            110, 100)
135    T(bvec2,                           110, 100)
136    T(bvec3,                           110, 100)
137    T(bvec4,                           110, 100)
138    T(int,                             110, 100)
139    T(ivec2,                           110, 100)
140    T(ivec3,                           110, 100)
141    T(ivec4,                           110, 100)
142    T(uint,                            130, 300)
143    T(uvec2,                           130, 300)
144    T(uvec3,                           130, 300)
145    T(uvec4,                           130, 300)
146    T(float,                           110, 100)
147    T(vec2,                            110, 100)
148    T(vec3,                            110, 100)
149    T(vec4,                            110, 100)
150    T(mat2,                            110, 100)
151    T(mat3,                            110, 100)
152    T(mat4,                            110, 100)
153    T(mat2x3,                          120, 300)
154    T(mat2x4,                          120, 300)
155    T(mat3x2,                          120, 300)
156    T(mat3x4,                          120, 300)
157    T(mat4x2,                          120, 300)
158    T(mat4x3,                          120, 300)
159 
160    T(double,                          400, 999)
161    T(dvec2,                           400, 999)
162    T(dvec3,                           400, 999)
163    T(dvec4,                           400, 999)
164    T(dmat2,                           400, 999)
165    T(dmat3,                           400, 999)
166    T(dmat4,                           400, 999)
167    T(dmat2x3,                         400, 999)
168    T(dmat2x4,                         400, 999)
169    T(dmat3x2,                         400, 999)
170    T(dmat3x4,                         400, 999)
171    T(dmat4x2,                         400, 999)
172    T(dmat4x3,                         400, 999)
173 
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)
185 
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)
197 
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)
209 
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)
217 
218    T(struct_gl_DepthRangeParameters,  110, 100)
219 
220    T(image1D,                         420, 999)
221    T(image2D,                         420, 310)
222    T(image3D,                         420, 310)
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)
253 
254    T(atomic_uint,                     420, 310)
255 };
256 
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,
265 };
266 
267 static inline void
add_type(glsl_symbol_table * symbols,const glsl_type * const type)268 add_type(glsl_symbol_table *symbols, const glsl_type *const type)
269 {
270    symbols->add_type(type->name, type);
271 }
272 
273 /**
274  * Populate the symbol table with available built-in types.
275  */
276 void
_mesa_glsl_initialize_types(struct _mesa_glsl_parse_state * state)277 _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
278 {
279    struct glsl_symbol_table *symbols = state->symbols;
280 
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);
285       }
286    }
287 
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+).
290     */
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]);
294       }
295    }
296 
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
299     * is harmless.
300     */
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);
308    }
309 
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);
314    }
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);
320    }
321 
322    if (state->ARB_texture_rectangle_enable) {
323       add_type(symbols, glsl_type::sampler2DRect_type);
324       add_type(symbols, glsl_type::sampler2DRectShadow_type);
325    }
326 
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);
332    }
333 
334    if (state->OES_EGL_image_external_enable) {
335       add_type(symbols, glsl_type::samplerExternalOES_type);
336    }
337 
338    if (state->OES_texture_3D_enable) {
339       add_type(symbols, glsl_type::sampler3D_type);
340    }
341 
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);
348    }
349 
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);
381    }
382 
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);
387 
388       add_type(symbols, glsl_type::imageBuffer_type);
389       add_type(symbols, glsl_type::iimageBuffer_type);
390       add_type(symbols, glsl_type::uimageBuffer_type);
391    }
392 
393    if (state->has_atomic_counters()) {
394       add_type(symbols, glsl_type::atomic_uint_type);
395    }
396 
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);
411    }
412 }
413 /** @} */
414