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)
207 T(atomic_uint
, 420, 999)
210 const glsl_type
*const deprecated_types
[] = {
211 glsl_type::struct_gl_PointParameters_type
,
212 glsl_type::struct_gl_MaterialParameters_type
,
213 glsl_type::struct_gl_LightSourceParameters_type
,
214 glsl_type::struct_gl_LightModelParameters_type
,
215 glsl_type::struct_gl_LightModelProducts_type
,
216 glsl_type::struct_gl_LightProducts_type
,
217 glsl_type::struct_gl_FogParameters_type
,
221 add_type(glsl_symbol_table
*symbols
, const glsl_type
*const type
)
223 symbols
->add_type(type
->name
, type
);
227 * Populate the symbol table with available built-in types.
230 _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state
*state
)
232 struct glsl_symbol_table
*symbols
= state
->symbols
;
234 for (unsigned i
= 0; i
< Elements(builtin_type_versions
); i
++) {
235 const struct builtin_type_versions
*const t
= &builtin_type_versions
[i
];
236 if (state
->is_version(t
->min_gl
, t
->min_es
)) {
237 add_type(symbols
, t
->type
);
241 /* Add deprecated structure types. While these were deprecated in 1.30,
242 * they're still present. We've removed them in 1.40+ (OpenGL 3.1+).
244 if (!state
->es_shader
&& state
->language_version
< 140) {
245 for (unsigned i
= 0; i
< Elements(deprecated_types
); i
++) {
246 add_type(symbols
, deprecated_types
[i
]);
250 /* Add types for enabled extensions. They may have already been added
251 * by the version-based loop, but attempting to add them a second time
254 if (state
->ARB_texture_cube_map_array_enable
) {
255 add_type(symbols
, glsl_type::samplerCubeArray_type
);
256 add_type(symbols
, glsl_type::samplerCubeArrayShadow_type
);
257 add_type(symbols
, glsl_type::isamplerCubeArray_type
);
258 add_type(symbols
, glsl_type::usamplerCubeArray_type
);
261 if (state
->ARB_texture_multisample_enable
) {
262 add_type(symbols
, glsl_type::sampler2DMS_type
);
263 add_type(symbols
, glsl_type::isampler2DMS_type
);
264 add_type(symbols
, glsl_type::usampler2DMS_type
);
265 add_type(symbols
, glsl_type::sampler2DMSArray_type
);
266 add_type(symbols
, glsl_type::isampler2DMSArray_type
);
267 add_type(symbols
, glsl_type::usampler2DMSArray_type
);
270 if (state
->ARB_texture_rectangle_enable
) {
271 add_type(symbols
, glsl_type::sampler2DRect_type
);
272 add_type(symbols
, glsl_type::sampler2DRectShadow_type
);
275 if (state
->EXT_texture_array_enable
) {
276 add_type(symbols
, glsl_type::sampler1DArray_type
);
277 add_type(symbols
, glsl_type::sampler2DArray_type
);
278 add_type(symbols
, glsl_type::sampler1DArrayShadow_type
);
279 add_type(symbols
, glsl_type::sampler2DArrayShadow_type
);
282 if (state
->OES_EGL_image_external_enable
) {
283 add_type(symbols
, glsl_type::samplerExternalOES_type
);
286 if (state
->OES_texture_3D_enable
) {
287 add_type(symbols
, glsl_type::sampler3D_type
);
290 if (state
->ARB_shader_atomic_counters_enable
) {
291 add_type(symbols
, glsl_type::atomic_uint_type
);