glsl: enable types for EXT_gpu_shader4
[mesa.git] / src / compiler / glsl / builtin_types.cpp
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
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
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->compat_shader || state->ARB_compatibility_enable) {
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_gpu_shader4_enable) {
328 add_type(symbols, glsl_type::uint_type);
329 add_type(symbols, glsl_type::uvec2_type);
330 add_type(symbols, glsl_type::uvec3_type);
331 add_type(symbols, glsl_type::uvec4_type);
332
333 add_type(symbols, glsl_type::sampler1DArray_type);
334 add_type(symbols, glsl_type::sampler2DArray_type);
335 add_type(symbols, glsl_type::sampler1DArrayShadow_type);
336 add_type(symbols, glsl_type::sampler2DArrayShadow_type);
337 add_type(symbols, glsl_type::samplerCubeShadow_type);
338 add_type(symbols, glsl_type::samplerBuffer_type);
339
340 add_type(symbols, glsl_type::isampler1D_type);
341 add_type(symbols, glsl_type::isampler2D_type);
342 add_type(symbols, glsl_type::isampler3D_type);
343 add_type(symbols, glsl_type::isamplerCube_type);
344 add_type(symbols, glsl_type::isampler2DRect_type);
345 add_type(symbols, glsl_type::isampler1DArray_type);
346 add_type(symbols, glsl_type::isampler2DArray_type);
347 add_type(symbols, glsl_type::isamplerBuffer_type);
348
349 add_type(symbols, glsl_type::usampler1D_type);
350 add_type(symbols, glsl_type::usampler2D_type);
351 add_type(symbols, glsl_type::usampler3D_type);
352 add_type(symbols, glsl_type::usamplerCube_type);
353 add_type(symbols, glsl_type::usampler2DRect_type);
354 add_type(symbols, glsl_type::usampler1DArray_type);
355 add_type(symbols, glsl_type::usampler2DArray_type);
356 add_type(symbols, glsl_type::usamplerBuffer_type);
357 }
358
359 if (state->EXT_texture_array_enable) {
360 add_type(symbols, glsl_type::sampler1DArray_type);
361 add_type(symbols, glsl_type::sampler2DArray_type);
362 add_type(symbols, glsl_type::sampler1DArrayShadow_type);
363 add_type(symbols, glsl_type::sampler2DArrayShadow_type);
364 }
365
366 if (state->OES_EGL_image_external_enable ||
367 state->OES_EGL_image_external_essl3_enable) {
368 add_type(symbols, glsl_type::samplerExternalOES_type);
369 }
370
371 if (state->OES_texture_3D_enable) {
372 add_type(symbols, glsl_type::sampler3D_type);
373 }
374
375 if (state->ARB_shader_image_load_store_enable ||
376 state->EXT_texture_cube_map_array_enable ||
377 state->OES_texture_cube_map_array_enable) {
378 add_type(symbols, glsl_type::imageCubeArray_type);
379 add_type(symbols, glsl_type::iimageCubeArray_type);
380 add_type(symbols, glsl_type::uimageCubeArray_type);
381 }
382
383 if (state->ARB_shader_image_load_store_enable) {
384 add_type(symbols, glsl_type::image1D_type);
385 add_type(symbols, glsl_type::image2D_type);
386 add_type(symbols, glsl_type::image3D_type);
387 add_type(symbols, glsl_type::image2DRect_type);
388 add_type(symbols, glsl_type::imageCube_type);
389 add_type(symbols, glsl_type::imageBuffer_type);
390 add_type(symbols, glsl_type::image1DArray_type);
391 add_type(symbols, glsl_type::image2DArray_type);
392 add_type(symbols, glsl_type::image2DMS_type);
393 add_type(symbols, glsl_type::image2DMSArray_type);
394 add_type(symbols, glsl_type::iimage1D_type);
395 add_type(symbols, glsl_type::iimage2D_type);
396 add_type(symbols, glsl_type::iimage3D_type);
397 add_type(symbols, glsl_type::iimage2DRect_type);
398 add_type(symbols, glsl_type::iimageCube_type);
399 add_type(symbols, glsl_type::iimageBuffer_type);
400 add_type(symbols, glsl_type::iimage1DArray_type);
401 add_type(symbols, glsl_type::iimage2DArray_type);
402 add_type(symbols, glsl_type::iimage2DMS_type);
403 add_type(symbols, glsl_type::iimage2DMSArray_type);
404 add_type(symbols, glsl_type::uimage1D_type);
405 add_type(symbols, glsl_type::uimage2D_type);
406 add_type(symbols, glsl_type::uimage3D_type);
407 add_type(symbols, glsl_type::uimage2DRect_type);
408 add_type(symbols, glsl_type::uimageCube_type);
409 add_type(symbols, glsl_type::uimageBuffer_type);
410 add_type(symbols, glsl_type::uimage1DArray_type);
411 add_type(symbols, glsl_type::uimage2DArray_type);
412 add_type(symbols, glsl_type::uimage2DMS_type);
413 add_type(symbols, glsl_type::uimage2DMSArray_type);
414 }
415
416 if (state->EXT_texture_buffer_enable || state->OES_texture_buffer_enable) {
417 add_type(symbols, glsl_type::samplerBuffer_type);
418 add_type(symbols, glsl_type::isamplerBuffer_type);
419 add_type(symbols, glsl_type::usamplerBuffer_type);
420
421 add_type(symbols, glsl_type::imageBuffer_type);
422 add_type(symbols, glsl_type::iimageBuffer_type);
423 add_type(symbols, glsl_type::uimageBuffer_type);
424 }
425
426 if (state->has_atomic_counters()) {
427 add_type(symbols, glsl_type::atomic_uint_type);
428 }
429
430 if (state->ARB_gpu_shader_fp64_enable) {
431 add_type(symbols, glsl_type::double_type);
432 add_type(symbols, glsl_type::dvec2_type);
433 add_type(symbols, glsl_type::dvec3_type);
434 add_type(symbols, glsl_type::dvec4_type);
435 add_type(symbols, glsl_type::dmat2_type);
436 add_type(symbols, glsl_type::dmat3_type);
437 add_type(symbols, glsl_type::dmat4_type);
438 add_type(symbols, glsl_type::dmat2x3_type);
439 add_type(symbols, glsl_type::dmat2x4_type);
440 add_type(symbols, glsl_type::dmat3x2_type);
441 add_type(symbols, glsl_type::dmat3x4_type);
442 add_type(symbols, glsl_type::dmat4x2_type);
443 add_type(symbols, glsl_type::dmat4x3_type);
444 }
445
446 if (state->ARB_gpu_shader_int64_enable ||
447 state->AMD_gpu_shader_int64_enable) {
448 add_type(symbols, glsl_type::int64_t_type);
449 add_type(symbols, glsl_type::i64vec2_type);
450 add_type(symbols, glsl_type::i64vec3_type);
451 add_type(symbols, glsl_type::i64vec4_type);
452
453 add_type(symbols, glsl_type::uint64_t_type);
454 add_type(symbols, glsl_type::u64vec2_type);
455 add_type(symbols, glsl_type::u64vec3_type);
456 add_type(symbols, glsl_type::u64vec4_type);
457 }
458 }
459 /** @} */