• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2008, 2009 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 #include <inttypes.h> /* for PRIx64 macro */
24 #include <stdio.h>
25 #include <stdarg.h>
26 #include <string.h>
27 #include <assert.h>
28 
29 #include "main/core.h" /* for struct gl_context */
30 #include "main/context.h"
31 #include "main/debug_output.h"
32 #include "main/formats.h"
33 #include "main/shaderobj.h"
34 #include "util/u_atomic.h" /* for p_atomic_cmpxchg */
35 #include "util/ralloc.h"
36 #include "util/disk_cache.h"
37 #include "util/mesa-sha1.h"
38 #include "ast.h"
39 #include "glsl_parser_extras.h"
40 #include "glsl_parser.h"
41 #include "ir_optimization.h"
42 #include "loop_analysis.h"
43 #include "builtin_functions.h"
44 
45 /**
46  * Format a short human-readable description of the given GLSL version.
47  */
48 const char *
glsl_compute_version_string(void * mem_ctx,bool is_es,unsigned version)49 glsl_compute_version_string(void *mem_ctx, bool is_es, unsigned version)
50 {
51    return ralloc_asprintf(mem_ctx, "GLSL%s %d.%02d", is_es ? " ES" : "",
52                           version / 100, version % 100);
53 }
54 
55 
56 static const unsigned known_desktop_glsl_versions[] =
57    { 110, 120, 130, 140, 150, 330, 400, 410, 420, 430, 440, 450, 460 };
58 static const unsigned known_desktop_gl_versions[] =
59    {  20,  21,  30,  31,  32,  33,  40,  41,  42,  43,  44,  45, 46 };
60 
61 
_mesa_glsl_parse_state(struct gl_context * _ctx,gl_shader_stage stage,void * mem_ctx)62 _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
63 					       gl_shader_stage stage,
64                                                void *mem_ctx)
65    : ctx(_ctx), cs_input_local_size_specified(false), cs_input_local_size(),
66      switch_state()
67 {
68    assert(stage < MESA_SHADER_STAGES);
69    this->stage = stage;
70 
71    this->scanner = NULL;
72    this->translation_unit.make_empty();
73    this->symbols = new(mem_ctx) glsl_symbol_table;
74 
75    this->linalloc = linear_alloc_parent(this, 0);
76 
77    this->info_log = ralloc_strdup(mem_ctx, "");
78    this->error = false;
79    this->loop_nesting_ast = NULL;
80 
81    this->uses_builtin_functions = false;
82 
83    /* Set default language version and extensions */
84    this->language_version = 110;
85    this->forced_language_version = ctx->Const.ForceGLSLVersion;
86    this->zero_init = ctx->Const.GLSLZeroInit;
87    this->gl_version = 20;
88    this->compat_shader = true;
89    this->es_shader = false;
90    this->ARB_texture_rectangle_enable = true;
91 
92    /* OpenGL ES 2.0 has different defaults from desktop GL. */
93    if (ctx->API == API_OPENGLES2) {
94       this->language_version = 100;
95       this->es_shader = true;
96       this->ARB_texture_rectangle_enable = false;
97    }
98 
99    this->extensions = &ctx->Extensions;
100 
101    this->Const.MaxLights = ctx->Const.MaxLights;
102    this->Const.MaxClipPlanes = ctx->Const.MaxClipPlanes;
103    this->Const.MaxTextureUnits = ctx->Const.MaxTextureUnits;
104    this->Const.MaxTextureCoords = ctx->Const.MaxTextureCoordUnits;
105    this->Const.MaxVertexAttribs = ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs;
106    this->Const.MaxVertexUniformComponents = ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents;
107    this->Const.MaxVertexTextureImageUnits = ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits;
108    this->Const.MaxCombinedTextureImageUnits = ctx->Const.MaxCombinedTextureImageUnits;
109    this->Const.MaxTextureImageUnits = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits;
110    this->Const.MaxFragmentUniformComponents = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents;
111    this->Const.MinProgramTexelOffset = ctx->Const.MinProgramTexelOffset;
112    this->Const.MaxProgramTexelOffset = ctx->Const.MaxProgramTexelOffset;
113 
114    this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers;
115 
116    this->Const.MaxDualSourceDrawBuffers = ctx->Const.MaxDualSourceDrawBuffers;
117 
118    /* 1.50 constants */
119    this->Const.MaxVertexOutputComponents = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
120    this->Const.MaxGeometryInputComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxInputComponents;
121    this->Const.MaxGeometryOutputComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents;
122    this->Const.MaxFragmentInputComponents = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents;
123    this->Const.MaxGeometryTextureImageUnits = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits;
124    this->Const.MaxGeometryOutputVertices = ctx->Const.MaxGeometryOutputVertices;
125    this->Const.MaxGeometryTotalOutputComponents = ctx->Const.MaxGeometryTotalOutputComponents;
126    this->Const.MaxGeometryUniformComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxUniformComponents;
127 
128    this->Const.MaxVertexAtomicCounters = ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicCounters;
129    this->Const.MaxTessControlAtomicCounters = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxAtomicCounters;
130    this->Const.MaxTessEvaluationAtomicCounters = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxAtomicCounters;
131    this->Const.MaxGeometryAtomicCounters = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicCounters;
132    this->Const.MaxFragmentAtomicCounters = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters;
133    this->Const.MaxComputeAtomicCounters = ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicCounters;
134    this->Const.MaxCombinedAtomicCounters = ctx->Const.MaxCombinedAtomicCounters;
135    this->Const.MaxAtomicBufferBindings = ctx->Const.MaxAtomicBufferBindings;
136    this->Const.MaxVertexAtomicCounterBuffers =
137       ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicBuffers;
138    this->Const.MaxTessControlAtomicCounterBuffers =
139       ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxAtomicBuffers;
140    this->Const.MaxTessEvaluationAtomicCounterBuffers =
141       ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxAtomicBuffers;
142    this->Const.MaxGeometryAtomicCounterBuffers =
143       ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers;
144    this->Const.MaxFragmentAtomicCounterBuffers =
145       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers;
146    this->Const.MaxComputeAtomicCounterBuffers =
147       ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers;
148    this->Const.MaxCombinedAtomicCounterBuffers =
149       ctx->Const.MaxCombinedAtomicBuffers;
150    this->Const.MaxAtomicCounterBufferSize =
151       ctx->Const.MaxAtomicBufferSize;
152 
153    /* ARB_enhanced_layouts constants */
154    this->Const.MaxTransformFeedbackBuffers = ctx->Const.MaxTransformFeedbackBuffers;
155    this->Const.MaxTransformFeedbackInterleavedComponents = ctx->Const.MaxTransformFeedbackInterleavedComponents;
156 
157    /* Compute shader constants */
158    for (unsigned i = 0; i < ARRAY_SIZE(this->Const.MaxComputeWorkGroupCount); i++)
159       this->Const.MaxComputeWorkGroupCount[i] = ctx->Const.MaxComputeWorkGroupCount[i];
160    for (unsigned i = 0; i < ARRAY_SIZE(this->Const.MaxComputeWorkGroupSize); i++)
161       this->Const.MaxComputeWorkGroupSize[i] = ctx->Const.MaxComputeWorkGroupSize[i];
162 
163    this->Const.MaxComputeTextureImageUnits = ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits;
164    this->Const.MaxComputeUniformComponents = ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents;
165 
166    this->Const.MaxImageUnits = ctx->Const.MaxImageUnits;
167    this->Const.MaxCombinedShaderOutputResources = ctx->Const.MaxCombinedShaderOutputResources;
168    this->Const.MaxImageSamples = ctx->Const.MaxImageSamples;
169    this->Const.MaxVertexImageUniforms = ctx->Const.Program[MESA_SHADER_VERTEX].MaxImageUniforms;
170    this->Const.MaxTessControlImageUniforms = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxImageUniforms;
171    this->Const.MaxTessEvaluationImageUniforms = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxImageUniforms;
172    this->Const.MaxGeometryImageUniforms = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxImageUniforms;
173    this->Const.MaxFragmentImageUniforms = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxImageUniforms;
174    this->Const.MaxComputeImageUniforms = ctx->Const.Program[MESA_SHADER_COMPUTE].MaxImageUniforms;
175    this->Const.MaxCombinedImageUniforms = ctx->Const.MaxCombinedImageUniforms;
176 
177    /* ARB_viewport_array */
178    this->Const.MaxViewports = ctx->Const.MaxViewports;
179 
180    /* tessellation shader constants */
181    this->Const.MaxPatchVertices = ctx->Const.MaxPatchVertices;
182    this->Const.MaxTessGenLevel = ctx->Const.MaxTessGenLevel;
183    this->Const.MaxTessControlInputComponents = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxInputComponents;
184    this->Const.MaxTessControlOutputComponents = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxOutputComponents;
185    this->Const.MaxTessControlTextureImageUnits = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits;
186    this->Const.MaxTessEvaluationInputComponents = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxInputComponents;
187    this->Const.MaxTessEvaluationOutputComponents = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxOutputComponents;
188    this->Const.MaxTessEvaluationTextureImageUnits = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits;
189    this->Const.MaxTessPatchComponents = ctx->Const.MaxTessPatchComponents;
190    this->Const.MaxTessControlTotalOutputComponents = ctx->Const.MaxTessControlTotalOutputComponents;
191    this->Const.MaxTessControlUniformComponents = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxUniformComponents;
192    this->Const.MaxTessEvaluationUniformComponents = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxUniformComponents;
193 
194    /* GL 4.5 / OES_sample_variables */
195    this->Const.MaxSamples = ctx->Const.MaxSamples;
196 
197    this->current_function = NULL;
198    this->toplevel_ir = NULL;
199    this->found_return = false;
200    this->all_invariant = false;
201    this->user_structures = NULL;
202    this->num_user_structures = 0;
203    this->num_subroutines = 0;
204    this->subroutines = NULL;
205    this->num_subroutine_types = 0;
206    this->subroutine_types = NULL;
207 
208    /* supported_versions should be large enough to support the known desktop
209     * GLSL versions plus 4 GLES versions (ES 1.00, ES 3.00, ES 3.10, ES 3.20)
210     */
211    STATIC_ASSERT((ARRAY_SIZE(known_desktop_glsl_versions) + 4) ==
212                  ARRAY_SIZE(this->supported_versions));
213 
214    /* Populate the list of supported GLSL versions */
215    /* FINISHME: Once the OpenGL 3.0 'forward compatible' context or
216     * the OpenGL 3.2 Core context is supported, this logic will need
217     * change.  Older versions of GLSL are no longer supported
218     * outside the compatibility contexts of 3.x.
219     */
220    this->num_supported_versions = 0;
221    if (_mesa_is_desktop_gl(ctx)) {
222       for (unsigned i = 0; i < ARRAY_SIZE(known_desktop_glsl_versions); i++) {
223          if (known_desktop_glsl_versions[i] <= ctx->Const.GLSLVersion) {
224             this->supported_versions[this->num_supported_versions].ver
225                = known_desktop_glsl_versions[i];
226             this->supported_versions[this->num_supported_versions].gl_ver
227                = known_desktop_gl_versions[i];
228             this->supported_versions[this->num_supported_versions].es = false;
229             this->num_supported_versions++;
230          }
231       }
232    }
233    if (ctx->API == API_OPENGLES2 || ctx->Extensions.ARB_ES2_compatibility) {
234       this->supported_versions[this->num_supported_versions].ver = 100;
235       this->supported_versions[this->num_supported_versions].gl_ver = 20;
236       this->supported_versions[this->num_supported_versions].es = true;
237       this->num_supported_versions++;
238    }
239    if (_mesa_is_gles3(ctx) || ctx->Extensions.ARB_ES3_compatibility) {
240       this->supported_versions[this->num_supported_versions].ver = 300;
241       this->supported_versions[this->num_supported_versions].gl_ver = 30;
242       this->supported_versions[this->num_supported_versions].es = true;
243       this->num_supported_versions++;
244    }
245    if (_mesa_is_gles31(ctx) || ctx->Extensions.ARB_ES3_1_compatibility) {
246       this->supported_versions[this->num_supported_versions].ver = 310;
247       this->supported_versions[this->num_supported_versions].gl_ver = 31;
248       this->supported_versions[this->num_supported_versions].es = true;
249       this->num_supported_versions++;
250    }
251    if ((ctx->API == API_OPENGLES2 && ctx->Version >= 32) ||
252        ctx->Extensions.ARB_ES3_2_compatibility) {
253       this->supported_versions[this->num_supported_versions].ver = 320;
254       this->supported_versions[this->num_supported_versions].gl_ver = 32;
255       this->supported_versions[this->num_supported_versions].es = true;
256       this->num_supported_versions++;
257    }
258 
259    /* Create a string for use in error messages to tell the user which GLSL
260     * versions are supported.
261     */
262    char *supported = ralloc_strdup(this, "");
263    for (unsigned i = 0; i < this->num_supported_versions; i++) {
264       unsigned ver = this->supported_versions[i].ver;
265       const char *const prefix = (i == 0)
266 	 ? ""
267 	 : ((i == this->num_supported_versions - 1) ? ", and " : ", ");
268       const char *const suffix = (this->supported_versions[i].es) ? " ES" : "";
269 
270       ralloc_asprintf_append(& supported, "%s%u.%02u%s",
271 			     prefix,
272 			     ver / 100, ver % 100,
273 			     suffix);
274    }
275 
276    this->supported_version_string = supported;
277 
278    if (ctx->Const.ForceGLSLExtensionsWarn)
279       _mesa_glsl_process_extension("all", NULL, "warn", NULL, this);
280 
281    this->default_uniform_qualifier = new(this) ast_type_qualifier();
282    this->default_uniform_qualifier->flags.q.shared = 1;
283    this->default_uniform_qualifier->flags.q.column_major = 1;
284 
285    this->default_shader_storage_qualifier = new(this) ast_type_qualifier();
286    this->default_shader_storage_qualifier->flags.q.shared = 1;
287    this->default_shader_storage_qualifier->flags.q.column_major = 1;
288 
289    this->fs_uses_gl_fragcoord = false;
290    this->fs_redeclares_gl_fragcoord = false;
291    this->fs_origin_upper_left = false;
292    this->fs_pixel_center_integer = false;
293    this->fs_redeclares_gl_fragcoord_with_no_layout_qualifiers = false;
294 
295    this->gs_input_prim_type_specified = false;
296    this->tcs_output_vertices_specified = false;
297    this->gs_input_size = 0;
298    this->in_qualifier = new(this) ast_type_qualifier();
299    this->out_qualifier = new(this) ast_type_qualifier();
300    this->fs_early_fragment_tests = false;
301    this->fs_inner_coverage = false;
302    this->fs_post_depth_coverage = false;
303    this->fs_blend_support = 0;
304    memset(this->atomic_counter_offsets, 0,
305           sizeof(this->atomic_counter_offsets));
306    this->allow_extension_directive_midshader =
307       ctx->Const.AllowGLSLExtensionDirectiveMidShader;
308    this->allow_builtin_variable_redeclaration =
309       ctx->Const.AllowGLSLBuiltinVariableRedeclaration;
310 
311    this->cs_input_local_size_variable_specified = false;
312 
313    /* ARB_bindless_texture */
314    this->bindless_sampler_specified = false;
315    this->bindless_image_specified = false;
316    this->bound_sampler_specified = false;
317    this->bound_image_specified = false;
318 }
319 
320 /**
321  * Determine whether the current GLSL version is sufficiently high to support
322  * a certain feature, and generate an error message if it isn't.
323  *
324  * \param required_glsl_version and \c required_glsl_es_version are
325  * interpreted as they are in _mesa_glsl_parse_state::is_version().
326  *
327  * \param locp is the parser location where the error should be reported.
328  *
329  * \param fmt (and additional arguments) constitute a printf-style error
330  * message to report if the version check fails.  Information about the
331  * current and required GLSL versions will be appended.  So, for example, if
332  * the GLSL version being compiled is 1.20, and check_version(130, 300, locp,
333  * "foo unsupported") is called, the error message will be "foo unsupported in
334  * GLSL 1.20 (GLSL 1.30 or GLSL 3.00 ES required)".
335  */
336 bool
check_version(unsigned required_glsl_version,unsigned required_glsl_es_version,YYLTYPE * locp,const char * fmt,...)337 _mesa_glsl_parse_state::check_version(unsigned required_glsl_version,
338                                       unsigned required_glsl_es_version,
339                                       YYLTYPE *locp, const char *fmt, ...)
340 {
341    if (this->is_version(required_glsl_version, required_glsl_es_version))
342       return true;
343 
344    va_list args;
345    va_start(args, fmt);
346    char *problem = ralloc_vasprintf(this, fmt, args);
347    va_end(args);
348    const char *glsl_version_string
349       = glsl_compute_version_string(this, false, required_glsl_version);
350    const char *glsl_es_version_string
351       = glsl_compute_version_string(this, true, required_glsl_es_version);
352    const char *requirement_string = "";
353    if (required_glsl_version && required_glsl_es_version) {
354       requirement_string = ralloc_asprintf(this, " (%s or %s required)",
355                                            glsl_version_string,
356                                            glsl_es_version_string);
357    } else if (required_glsl_version) {
358       requirement_string = ralloc_asprintf(this, " (%s required)",
359                                            glsl_version_string);
360    } else if (required_glsl_es_version) {
361       requirement_string = ralloc_asprintf(this, " (%s required)",
362                                            glsl_es_version_string);
363    }
364    _mesa_glsl_error(locp, this, "%s in %s%s",
365                     problem, this->get_version_string(),
366                     requirement_string);
367 
368    return false;
369 }
370 
371 /**
372  * Process a GLSL #version directive.
373  *
374  * \param version is the integer that follows the #version token.
375  *
376  * \param ident is a string identifier that follows the integer, if any is
377  * present.  Otherwise NULL.
378  */
379 void
process_version_directive(YYLTYPE * locp,int version,const char * ident)380 _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version,
381                                                   const char *ident)
382 {
383    bool es_token_present = false;
384    bool compat_token_present = false;
385    if (ident) {
386       if (strcmp(ident, "es") == 0) {
387          es_token_present = true;
388       } else if (version >= 150) {
389          if (strcmp(ident, "core") == 0) {
390             /* Accept the token.  There's no need to record that this is
391              * a core profile shader since that's the only profile we support.
392              */
393          } else if (strcmp(ident, "compatibility") == 0) {
394             compat_token_present = true;
395 
396             if (this->ctx->API != API_OPENGL_COMPAT) {
397                _mesa_glsl_error(locp, this,
398                                 "the compatibility profile is not supported");
399             }
400          } else {
401             _mesa_glsl_error(locp, this,
402                              "\"%s\" is not a valid shading language profile; "
403                              "if present, it must be \"core\"", ident);
404          }
405       } else {
406          _mesa_glsl_error(locp, this,
407                           "illegal text following version number");
408       }
409    }
410 
411    this->es_shader = es_token_present;
412    if (version == 100) {
413       if (es_token_present) {
414          _mesa_glsl_error(locp, this,
415                           "GLSL 1.00 ES should be selected using "
416                           "`#version 100'");
417       } else {
418          this->es_shader = true;
419       }
420    }
421 
422    if (this->es_shader) {
423       this->ARB_texture_rectangle_enable = false;
424    }
425 
426    if (this->forced_language_version)
427       this->language_version = this->forced_language_version;
428    else
429       this->language_version = version;
430 
431    this->compat_shader = compat_token_present ||
432                          (!this->es_shader && this->language_version < 140);
433 
434    bool supported = false;
435    for (unsigned i = 0; i < this->num_supported_versions; i++) {
436       if (this->supported_versions[i].ver == this->language_version
437           && this->supported_versions[i].es == this->es_shader) {
438          this->gl_version = this->supported_versions[i].gl_ver;
439          supported = true;
440          break;
441       }
442    }
443 
444    if (!supported) {
445       _mesa_glsl_error(locp, this, "%s is not supported. "
446                        "Supported versions are: %s",
447                        this->get_version_string(),
448                        this->supported_version_string);
449 
450       /* On exit, the language_version must be set to a valid value.
451        * Later calls to _mesa_glsl_initialize_types will misbehave if
452        * the version is invalid.
453        */
454       switch (this->ctx->API) {
455       case API_OPENGL_COMPAT:
456       case API_OPENGL_CORE:
457 	 this->language_version = this->ctx->Const.GLSLVersion;
458 	 break;
459 
460       case API_OPENGLES:
461 	 assert(!"Should not get here.");
462 	 /* FALLTHROUGH */
463 
464       case API_OPENGLES2:
465 	 this->language_version = 100;
466 	 break;
467       }
468    }
469 }
470 
471 
472 /* This helper function will append the given message to the shader's
473    info log and report it via GL_ARB_debug_output. Per that extension,
474    'type' is one of the enum values classifying the message, and
475    'id' is the implementation-defined ID of the given message. */
476 static void
_mesa_glsl_msg(const YYLTYPE * locp,_mesa_glsl_parse_state * state,GLenum type,const char * fmt,va_list ap)477 _mesa_glsl_msg(const YYLTYPE *locp, _mesa_glsl_parse_state *state,
478                GLenum type, const char *fmt, va_list ap)
479 {
480    bool error = (type == MESA_DEBUG_TYPE_ERROR);
481    GLuint msg_id = 0;
482 
483    assert(state->info_log != NULL);
484 
485    /* Get the offset that the new message will be written to. */
486    int msg_offset = strlen(state->info_log);
487 
488    ralloc_asprintf_append(&state->info_log, "%u:%u(%u): %s: ",
489 					    locp->source,
490 					    locp->first_line,
491 					    locp->first_column,
492 					    error ? "error" : "warning");
493    ralloc_vasprintf_append(&state->info_log, fmt, ap);
494 
495    const char *const msg = &state->info_log[msg_offset];
496    struct gl_context *ctx = state->ctx;
497 
498    /* Report the error via GL_ARB_debug_output. */
499    _mesa_shader_debug(ctx, type, &msg_id, msg);
500 
501    ralloc_strcat(&state->info_log, "\n");
502 }
503 
504 void
_mesa_glsl_error(YYLTYPE * locp,_mesa_glsl_parse_state * state,const char * fmt,...)505 _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
506 		 const char *fmt, ...)
507 {
508    va_list ap;
509 
510    state->error = true;
511 
512    va_start(ap, fmt);
513    _mesa_glsl_msg(locp, state, MESA_DEBUG_TYPE_ERROR, fmt, ap);
514    va_end(ap);
515 }
516 
517 
518 void
_mesa_glsl_warning(const YYLTYPE * locp,_mesa_glsl_parse_state * state,const char * fmt,...)519 _mesa_glsl_warning(const YYLTYPE *locp, _mesa_glsl_parse_state *state,
520 		   const char *fmt, ...)
521 {
522    va_list ap;
523 
524    va_start(ap, fmt);
525    _mesa_glsl_msg(locp, state, MESA_DEBUG_TYPE_OTHER, fmt, ap);
526    va_end(ap);
527 }
528 
529 
530 /**
531  * Enum representing the possible behaviors that can be specified in
532  * an #extension directive.
533  */
534 enum ext_behavior {
535    extension_disable,
536    extension_enable,
537    extension_require,
538    extension_warn
539 };
540 
541 /**
542  * Element type for _mesa_glsl_supported_extensions
543  */
544 struct _mesa_glsl_extension {
545    /**
546     * Name of the extension when referred to in a GLSL extension
547     * statement
548     */
549    const char *name;
550 
551    /**
552     * Whether this extension is a part of AEP
553     */
554    bool aep;
555 
556    /**
557     * Predicate that checks whether the relevant extension is available for
558     * this context.
559     */
560    bool (*available_pred)(const struct gl_context *,
561                           gl_api api, uint8_t version);
562 
563    /**
564     * Flag in the _mesa_glsl_parse_state struct that should be set
565     * when this extension is enabled.
566     *
567     * See note in _mesa_glsl_extension::supported_flag about "pointer
568     * to member" types.
569     */
570    bool _mesa_glsl_parse_state::* enable_flag;
571 
572    /**
573     * Flag in the _mesa_glsl_parse_state struct that should be set
574     * when the shader requests "warn" behavior for this extension.
575     *
576     * See note in _mesa_glsl_extension::supported_flag about "pointer
577     * to member" types.
578     */
579    bool _mesa_glsl_parse_state::* warn_flag;
580 
581 
582    bool compatible_with_state(const _mesa_glsl_parse_state *state,
583                               gl_api api, uint8_t gl_version) const;
584    void set_flags(_mesa_glsl_parse_state *state, ext_behavior behavior) const;
585 };
586 
587 /** Checks if the context supports a user-facing extension */
588 #define EXT(name_str, driver_cap, ...) \
589 static MAYBE_UNUSED bool \
590 has_##name_str(const struct gl_context *ctx, gl_api api, uint8_t version) \
591 { \
592    return ctx->Extensions.driver_cap && (version >= \
593           _mesa_extension_table[MESA_EXTENSION_##name_str].version[api]); \
594 }
595 #include "main/extensions_table.h"
596 #undef EXT
597 
598 #define EXT(NAME)                                           \
599    { "GL_" #NAME, false, has_##NAME,                        \
600      &_mesa_glsl_parse_state::NAME##_enable,                \
601      &_mesa_glsl_parse_state::NAME##_warn }
602 
603 #define EXT_AEP(NAME)                                       \
604    { "GL_" #NAME, true, has_##NAME,                         \
605      &_mesa_glsl_parse_state::NAME##_enable,                \
606      &_mesa_glsl_parse_state::NAME##_warn }
607 
608 /**
609  * Table of extensions that can be enabled/disabled within a shader,
610  * and the conditions under which they are supported.
611  */
612 static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
613    /* ARB extensions go here, sorted alphabetically.
614     */
615    EXT(ARB_ES3_1_compatibility),
616    EXT(ARB_ES3_2_compatibility),
617    EXT(ARB_arrays_of_arrays),
618    EXT(ARB_bindless_texture),
619    EXT(ARB_compute_shader),
620    EXT(ARB_compute_variable_group_size),
621    EXT(ARB_conservative_depth),
622    EXT(ARB_cull_distance),
623    EXT(ARB_derivative_control),
624    EXT(ARB_draw_buffers),
625    EXT(ARB_draw_instanced),
626    EXT(ARB_enhanced_layouts),
627    EXT(ARB_explicit_attrib_location),
628    EXT(ARB_explicit_uniform_location),
629    EXT(ARB_fragment_coord_conventions),
630    EXT(ARB_fragment_layer_viewport),
631    EXT(ARB_gpu_shader5),
632    EXT(ARB_gpu_shader_fp64),
633    EXT(ARB_gpu_shader_int64),
634    EXT(ARB_post_depth_coverage),
635    EXT(ARB_sample_shading),
636    EXT(ARB_separate_shader_objects),
637    EXT(ARB_shader_atomic_counter_ops),
638    EXT(ARB_shader_atomic_counters),
639    EXT(ARB_shader_ballot),
640    EXT(ARB_shader_bit_encoding),
641    EXT(ARB_shader_clock),
642    EXT(ARB_shader_draw_parameters),
643    EXT(ARB_shader_group_vote),
644    EXT(ARB_shader_image_load_store),
645    EXT(ARB_shader_image_size),
646    EXT(ARB_shader_precision),
647    EXT(ARB_shader_stencil_export),
648    EXT(ARB_shader_storage_buffer_object),
649    EXT(ARB_shader_subroutine),
650    EXT(ARB_shader_texture_image_samples),
651    EXT(ARB_shader_texture_lod),
652    EXT(ARB_shader_viewport_layer_array),
653    EXT(ARB_shading_language_420pack),
654    EXT(ARB_shading_language_packing),
655    EXT(ARB_tessellation_shader),
656    EXT(ARB_texture_cube_map_array),
657    EXT(ARB_texture_gather),
658    EXT(ARB_texture_multisample),
659    EXT(ARB_texture_query_levels),
660    EXT(ARB_texture_query_lod),
661    EXT(ARB_texture_rectangle),
662    EXT(ARB_uniform_buffer_object),
663    EXT(ARB_vertex_attrib_64bit),
664    EXT(ARB_viewport_array),
665 
666    /* KHR extensions go here, sorted alphabetically.
667     */
668    EXT_AEP(KHR_blend_equation_advanced),
669 
670    /* OES extensions go here, sorted alphabetically.
671     */
672    EXT(OES_EGL_image_external),
673    EXT(OES_geometry_point_size),
674    EXT(OES_geometry_shader),
675    EXT(OES_gpu_shader5),
676    EXT(OES_primitive_bounding_box),
677    EXT_AEP(OES_sample_variables),
678    EXT_AEP(OES_shader_image_atomic),
679    EXT(OES_shader_io_blocks),
680    EXT_AEP(OES_shader_multisample_interpolation),
681    EXT(OES_standard_derivatives),
682    EXT(OES_tessellation_point_size),
683    EXT(OES_tessellation_shader),
684    EXT(OES_texture_3D),
685    EXT(OES_texture_buffer),
686    EXT(OES_texture_cube_map_array),
687    EXT_AEP(OES_texture_storage_multisample_2d_array),
688    EXT(OES_viewport_array),
689 
690    /* All other extensions go here, sorted alphabetically.
691     */
692    EXT(AMD_conservative_depth),
693    EXT(AMD_shader_stencil_export),
694    EXT(AMD_shader_trinary_minmax),
695    EXT(AMD_vertex_shader_layer),
696    EXT(AMD_vertex_shader_viewport_index),
697    EXT(ANDROID_extension_pack_es31a),
698    EXT(EXT_blend_func_extended),
699    EXT(EXT_frag_depth),
700    EXT(EXT_draw_buffers),
701    EXT(EXT_clip_cull_distance),
702    EXT(EXT_geometry_point_size),
703    EXT_AEP(EXT_geometry_shader),
704    EXT_AEP(EXT_gpu_shader5),
705    EXT_AEP(EXT_primitive_bounding_box),
706    EXT(EXT_separate_shader_objects),
707    EXT(EXT_shader_framebuffer_fetch),
708    EXT(EXT_shader_integer_mix),
709    EXT_AEP(EXT_shader_io_blocks),
710    EXT(EXT_shader_samples_identical),
711    EXT(EXT_tessellation_point_size),
712    EXT_AEP(EXT_tessellation_shader),
713    EXT(EXT_texture_array),
714    EXT_AEP(EXT_texture_buffer),
715    EXT_AEP(EXT_texture_cube_map_array),
716    EXT(INTEL_conservative_rasterization),
717    EXT(MESA_shader_integer_functions),
718    EXT(NV_image_formats),
719 };
720 
721 #undef EXT
722 
723 
724 /**
725  * Determine whether a given extension is compatible with the target,
726  * API, and extension information in the current parser state.
727  */
compatible_with_state(const _mesa_glsl_parse_state * state,gl_api api,uint8_t gl_version) const728 bool _mesa_glsl_extension::compatible_with_state(
729       const _mesa_glsl_parse_state *state, gl_api api, uint8_t gl_version) const
730 {
731    return this->available_pred(state->ctx, api, gl_version);
732 }
733 
734 /**
735  * Set the appropriate flags in the parser state to establish the
736  * given behavior for this extension.
737  */
set_flags(_mesa_glsl_parse_state * state,ext_behavior behavior) const738 void _mesa_glsl_extension::set_flags(_mesa_glsl_parse_state *state,
739                                      ext_behavior behavior) const
740 {
741    /* Note: the ->* operator indexes into state by the
742     * offsets this->enable_flag and this->warn_flag.  See
743     * _mesa_glsl_extension::supported_flag for more info.
744     */
745    state->*(this->enable_flag) = (behavior != extension_disable);
746    state->*(this->warn_flag)   = (behavior == extension_warn);
747 }
748 
749 /**
750  * Find an extension by name in _mesa_glsl_supported_extensions.  If
751  * the name is not found, return NULL.
752  */
find_extension(const char * name)753 static const _mesa_glsl_extension *find_extension(const char *name)
754 {
755    for (unsigned i = 0; i < ARRAY_SIZE(_mesa_glsl_supported_extensions); ++i) {
756       if (strcmp(name, _mesa_glsl_supported_extensions[i].name) == 0) {
757          return &_mesa_glsl_supported_extensions[i];
758       }
759    }
760    return NULL;
761 }
762 
763 bool
_mesa_glsl_process_extension(const char * name,YYLTYPE * name_locp,const char * behavior_string,YYLTYPE * behavior_locp,_mesa_glsl_parse_state * state)764 _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
765 			     const char *behavior_string, YYLTYPE *behavior_locp,
766 			     _mesa_glsl_parse_state *state)
767 {
768    uint8_t gl_version = state->ctx->Extensions.Version;
769    gl_api api = state->ctx->API;
770    ext_behavior behavior;
771    if (strcmp(behavior_string, "warn") == 0) {
772       behavior = extension_warn;
773    } else if (strcmp(behavior_string, "require") == 0) {
774       behavior = extension_require;
775    } else if (strcmp(behavior_string, "enable") == 0) {
776       behavior = extension_enable;
777    } else if (strcmp(behavior_string, "disable") == 0) {
778       behavior = extension_disable;
779    } else {
780       _mesa_glsl_error(behavior_locp, state,
781 		       "unknown extension behavior `%s'",
782 		       behavior_string);
783       return false;
784    }
785 
786    /* If we're in a desktop context but with an ES shader, use an ES API enum
787     * to verify extension availability.
788     */
789    if (state->es_shader && api != API_OPENGLES2)
790       api = API_OPENGLES2;
791    /* Use the language-version derived GL version to extension checks, unless
792     * we're using meta, which sets the version to the max.
793     */
794    if (gl_version != 0xff)
795       gl_version = state->gl_version;
796 
797    if (strcmp(name, "all") == 0) {
798       if ((behavior == extension_enable) || (behavior == extension_require)) {
799 	 _mesa_glsl_error(name_locp, state, "cannot %s all extensions",
800 			  (behavior == extension_enable)
801 			  ? "enable" : "require");
802 	 return false;
803       } else {
804          for (unsigned i = 0;
805               i < ARRAY_SIZE(_mesa_glsl_supported_extensions); ++i) {
806             const _mesa_glsl_extension *extension
807                = &_mesa_glsl_supported_extensions[i];
808             if (extension->compatible_with_state(state, api, gl_version)) {
809                _mesa_glsl_supported_extensions[i].set_flags(state, behavior);
810             }
811          }
812       }
813    } else {
814       const _mesa_glsl_extension *extension = find_extension(name);
815       if (extension && extension->compatible_with_state(state, api, gl_version)) {
816          extension->set_flags(state, behavior);
817          if (extension->available_pred == has_ANDROID_extension_pack_es31a) {
818             for (unsigned i = 0;
819                  i < ARRAY_SIZE(_mesa_glsl_supported_extensions); ++i) {
820                const _mesa_glsl_extension *extension =
821                   &_mesa_glsl_supported_extensions[i];
822 
823                if (!extension->aep)
824                   continue;
825                /* AEP should not be enabled if all of the sub-extensions can't
826                 * also be enabled. This is not the proper layer to do such
827                 * error-checking though.
828                 */
829                assert(extension->compatible_with_state(state, api, gl_version));
830                extension->set_flags(state, behavior);
831             }
832          }
833       } else {
834          static const char fmt[] = "extension `%s' unsupported in %s shader";
835 
836          if (behavior == extension_require) {
837             _mesa_glsl_error(name_locp, state, fmt,
838                              name, _mesa_shader_stage_to_string(state->stage));
839             return false;
840          } else {
841             _mesa_glsl_warning(name_locp, state, fmt,
842                                name, _mesa_shader_stage_to_string(state->stage));
843          }
844       }
845    }
846 
847    return true;
848 }
849 
850 
851 /**
852  * Recurses through <type> and <expr> if <expr> is an aggregate initializer
853  * and sets <expr>'s <constructor_type> field to <type>. Gives later functions
854  * (process_array_constructor, et al) sufficient information to do type
855  * checking.
856  *
857  * Operates on assignments involving an aggregate initializer. E.g.,
858  *
859  * vec4 pos = {1.0, -1.0, 0.0, 1.0};
860  *
861  * or more ridiculously,
862  *
863  * struct S {
864  *     vec4 v[2];
865  * };
866  *
867  * struct {
868  *     S a[2], b;
869  *     int c;
870  * } aggregate = {
871  *     {
872  *         {
873  *             {
874  *                 {1.0, 2.0, 3.0, 4.0}, // a[0].v[0]
875  *                 {5.0, 6.0, 7.0, 8.0}  // a[0].v[1]
876  *             } // a[0].v
877  *         }, // a[0]
878  *         {
879  *             {
880  *                 {1.0, 2.0, 3.0, 4.0}, // a[1].v[0]
881  *                 {5.0, 6.0, 7.0, 8.0}  // a[1].v[1]
882  *             } // a[1].v
883  *         } // a[1]
884  *     }, // a
885  *     {
886  *         {
887  *             {1.0, 2.0, 3.0, 4.0}, // b.v[0]
888  *             {5.0, 6.0, 7.0, 8.0}  // b.v[1]
889  *         } // b.v
890  *     }, // b
891  *     4 // c
892  * };
893  *
894  * This pass is necessary because the right-hand side of <type> e = { ... }
895  * doesn't contain sufficient information to determine if the types match.
896  */
897 void
_mesa_ast_set_aggregate_type(const glsl_type * type,ast_expression * expr)898 _mesa_ast_set_aggregate_type(const glsl_type *type,
899                              ast_expression *expr)
900 {
901    ast_aggregate_initializer *ai = (ast_aggregate_initializer *)expr;
902    ai->constructor_type = type;
903 
904    /* If the aggregate is an array, recursively set its elements' types. */
905    if (type->is_array()) {
906       /* Each array element has the type type->fields.array.
907        *
908        * E.g., if <type> if struct S[2] we want to set each element's type to
909        * struct S.
910        */
911       for (exec_node *expr_node = ai->expressions.get_head_raw();
912            !expr_node->is_tail_sentinel();
913            expr_node = expr_node->next) {
914          ast_expression *expr = exec_node_data(ast_expression, expr_node,
915                                                link);
916 
917          if (expr->oper == ast_aggregate)
918             _mesa_ast_set_aggregate_type(type->fields.array, expr);
919       }
920 
921    /* If the aggregate is a struct, recursively set its fields' types. */
922    } else if (type->is_record()) {
923       exec_node *expr_node = ai->expressions.get_head_raw();
924 
925       /* Iterate through the struct's fields. */
926       for (unsigned i = 0; !expr_node->is_tail_sentinel() && i < type->length;
927            i++, expr_node = expr_node->next) {
928          ast_expression *expr = exec_node_data(ast_expression, expr_node,
929                                                link);
930 
931          if (expr->oper == ast_aggregate) {
932             _mesa_ast_set_aggregate_type(type->fields.structure[i].type, expr);
933          }
934       }
935    /* If the aggregate is a matrix, set its columns' types. */
936    } else if (type->is_matrix()) {
937       for (exec_node *expr_node = ai->expressions.get_head_raw();
938            !expr_node->is_tail_sentinel();
939            expr_node = expr_node->next) {
940          ast_expression *expr = exec_node_data(ast_expression, expr_node,
941                                                link);
942 
943          if (expr->oper == ast_aggregate)
944             _mesa_ast_set_aggregate_type(type->column_type(), expr);
945       }
946    }
947 }
948 
949 void
_mesa_ast_process_interface_block(YYLTYPE * locp,_mesa_glsl_parse_state * state,ast_interface_block * const block,const struct ast_type_qualifier & q)950 _mesa_ast_process_interface_block(YYLTYPE *locp,
951                                   _mesa_glsl_parse_state *state,
952                                   ast_interface_block *const block,
953                                   const struct ast_type_qualifier &q)
954 {
955    if (q.flags.q.buffer) {
956       if (!state->has_shader_storage_buffer_objects()) {
957          _mesa_glsl_error(locp, state,
958                           "#version 430 / GL_ARB_shader_storage_buffer_object "
959                           "required for defining shader storage blocks");
960       } else if (state->ARB_shader_storage_buffer_object_warn) {
961          _mesa_glsl_warning(locp, state,
962                             "#version 430 / GL_ARB_shader_storage_buffer_object "
963                             "required for defining shader storage blocks");
964       }
965    } else if (q.flags.q.uniform) {
966       if (!state->has_uniform_buffer_objects()) {
967          _mesa_glsl_error(locp, state,
968                           "#version 140 / GL_ARB_uniform_buffer_object "
969                           "required for defining uniform blocks");
970       } else if (state->ARB_uniform_buffer_object_warn) {
971          _mesa_glsl_warning(locp, state,
972                             "#version 140 / GL_ARB_uniform_buffer_object "
973                             "required for defining uniform blocks");
974       }
975    } else {
976       if (!state->has_shader_io_blocks()) {
977          if (state->es_shader) {
978             _mesa_glsl_error(locp, state,
979                              "GL_OES_shader_io_blocks or #version 320 "
980                              "required for using interface blocks");
981          } else {
982             _mesa_glsl_error(locp, state,
983                              "#version 150 required for using "
984                              "interface blocks");
985          }
986       }
987    }
988 
989    /* From the GLSL 1.50.11 spec, section 4.3.7 ("Interface Blocks"):
990     * "It is illegal to have an input block in a vertex shader
991     *  or an output block in a fragment shader"
992     */
993    if ((state->stage == MESA_SHADER_VERTEX) && q.flags.q.in) {
994       _mesa_glsl_error(locp, state,
995                        "`in' interface block is not allowed for "
996                        "a vertex shader");
997    } else if ((state->stage == MESA_SHADER_FRAGMENT) && q.flags.q.out) {
998       _mesa_glsl_error(locp, state,
999                        "`out' interface block is not allowed for "
1000                        "a fragment shader");
1001    }
1002 
1003    /* Since block arrays require names, and both features are added in
1004     * the same language versions, we don't have to explicitly
1005     * version-check both things.
1006     */
1007    if (block->instance_name != NULL) {
1008       state->check_version(150, 300, locp, "interface blocks with "
1009                            "an instance name are not allowed");
1010    }
1011 
1012    uint64_t interface_type_mask;
1013    struct ast_type_qualifier temp_type_qualifier;
1014 
1015    /* Get a bitmask containing only the in/out/uniform/buffer
1016     * flags, allowing us to ignore other irrelevant flags like
1017     * interpolation qualifiers.
1018     */
1019    temp_type_qualifier.flags.i = 0;
1020    temp_type_qualifier.flags.q.uniform = true;
1021    temp_type_qualifier.flags.q.in = true;
1022    temp_type_qualifier.flags.q.out = true;
1023    temp_type_qualifier.flags.q.buffer = true;
1024    temp_type_qualifier.flags.q.patch = true;
1025    interface_type_mask = temp_type_qualifier.flags.i;
1026 
1027    /* Get the block's interface qualifier.  The interface_qualifier
1028     * production rule guarantees that only one bit will be set (and
1029     * it will be in/out/uniform).
1030     */
1031    uint64_t block_interface_qualifier = q.flags.i;
1032 
1033    block->default_layout.flags.i |= block_interface_qualifier;
1034 
1035    if (state->stage == MESA_SHADER_GEOMETRY &&
1036        state->has_explicit_attrib_stream() &&
1037        block->default_layout.flags.q.out) {
1038       /* Assign global layout's stream value. */
1039       block->default_layout.flags.q.stream = 1;
1040       block->default_layout.flags.q.explicit_stream = 0;
1041       block->default_layout.stream = state->out_qualifier->stream;
1042    }
1043 
1044    if (state->has_enhanced_layouts() && block->default_layout.flags.q.out) {
1045       /* Assign global layout's xfb_buffer value. */
1046       block->default_layout.flags.q.xfb_buffer = 1;
1047       block->default_layout.flags.q.explicit_xfb_buffer = 0;
1048       block->default_layout.xfb_buffer = state->out_qualifier->xfb_buffer;
1049    }
1050 
1051    foreach_list_typed (ast_declarator_list, member, link, &block->declarations) {
1052       ast_type_qualifier& qualifier = member->type->qualifier;
1053       if ((qualifier.flags.i & interface_type_mask) == 0) {
1054          /* GLSLangSpec.1.50.11, 4.3.7 (Interface Blocks):
1055           * "If no optional qualifier is used in a member declaration, the
1056           *  qualifier of the variable is just in, out, or uniform as declared
1057           *  by interface-qualifier."
1058           */
1059          qualifier.flags.i |= block_interface_qualifier;
1060       } else if ((qualifier.flags.i & interface_type_mask) !=
1061                  block_interface_qualifier) {
1062          /* GLSLangSpec.1.50.11, 4.3.7 (Interface Blocks):
1063           * "If optional qualifiers are used, they can include interpolation
1064           *  and storage qualifiers and they must declare an input, output,
1065           *  or uniform variable consistent with the interface qualifier of
1066           *  the block."
1067           */
1068          _mesa_glsl_error(locp, state,
1069                           "uniform/in/out qualifier on "
1070                           "interface block member does not match "
1071                           "the interface block");
1072       }
1073 
1074       if (!(q.flags.q.in || q.flags.q.out) && qualifier.flags.q.invariant)
1075          _mesa_glsl_error(locp, state,
1076                           "invariant qualifiers can be used only "
1077                           "in interface block members for shader "
1078                           "inputs or outputs");
1079    }
1080 }
1081 
1082 static void
_mesa_ast_type_qualifier_print(const struct ast_type_qualifier * q)1083 _mesa_ast_type_qualifier_print(const struct ast_type_qualifier *q)
1084 {
1085    if (q->is_subroutine_decl())
1086       printf("subroutine ");
1087 
1088    if (q->subroutine_list) {
1089       printf("subroutine (");
1090       q->subroutine_list->print();
1091       printf(")");
1092    }
1093 
1094    if (q->flags.q.constant)
1095       printf("const ");
1096 
1097    if (q->flags.q.invariant)
1098       printf("invariant ");
1099 
1100    if (q->flags.q.attribute)
1101       printf("attribute ");
1102 
1103    if (q->flags.q.varying)
1104       printf("varying ");
1105 
1106    if (q->flags.q.in && q->flags.q.out)
1107       printf("inout ");
1108    else {
1109       if (q->flags.q.in)
1110 	 printf("in ");
1111 
1112       if (q->flags.q.out)
1113 	 printf("out ");
1114    }
1115 
1116    if (q->flags.q.centroid)
1117       printf("centroid ");
1118    if (q->flags.q.sample)
1119       printf("sample ");
1120    if (q->flags.q.patch)
1121       printf("patch ");
1122    if (q->flags.q.uniform)
1123       printf("uniform ");
1124    if (q->flags.q.buffer)
1125       printf("buffer ");
1126    if (q->flags.q.smooth)
1127       printf("smooth ");
1128    if (q->flags.q.flat)
1129       printf("flat ");
1130    if (q->flags.q.noperspective)
1131       printf("noperspective ");
1132 }
1133 
1134 
1135 void
print(void) const1136 ast_node::print(void) const
1137 {
1138    printf("unhandled node ");
1139 }
1140 
1141 
ast_node(void)1142 ast_node::ast_node(void)
1143 {
1144    this->location.source = 0;
1145    this->location.first_line = 0;
1146    this->location.first_column = 0;
1147    this->location.last_line = 0;
1148    this->location.last_column = 0;
1149 }
1150 
1151 
1152 static void
ast_opt_array_dimensions_print(const ast_array_specifier * array_specifier)1153 ast_opt_array_dimensions_print(const ast_array_specifier *array_specifier)
1154 {
1155    if (array_specifier)
1156       array_specifier->print();
1157 }
1158 
1159 
1160 void
print(void) const1161 ast_compound_statement::print(void) const
1162 {
1163    printf("{\n");
1164 
1165    foreach_list_typed(ast_node, ast, link, &this->statements) {
1166       ast->print();
1167    }
1168 
1169    printf("}\n");
1170 }
1171 
1172 
ast_compound_statement(int new_scope,ast_node * statements)1173 ast_compound_statement::ast_compound_statement(int new_scope,
1174 					       ast_node *statements)
1175 {
1176    this->new_scope = new_scope;
1177 
1178    if (statements != NULL) {
1179       this->statements.push_degenerate_list_at_head(&statements->link);
1180    }
1181 }
1182 
1183 
1184 void
print(void) const1185 ast_expression::print(void) const
1186 {
1187    switch (oper) {
1188    case ast_assign:
1189    case ast_mul_assign:
1190    case ast_div_assign:
1191    case ast_mod_assign:
1192    case ast_add_assign:
1193    case ast_sub_assign:
1194    case ast_ls_assign:
1195    case ast_rs_assign:
1196    case ast_and_assign:
1197    case ast_xor_assign:
1198    case ast_or_assign:
1199       subexpressions[0]->print();
1200       printf("%s ", operator_string(oper));
1201       subexpressions[1]->print();
1202       break;
1203 
1204    case ast_field_selection:
1205       subexpressions[0]->print();
1206       printf(". %s ", primary_expression.identifier);
1207       break;
1208 
1209    case ast_plus:
1210    case ast_neg:
1211    case ast_bit_not:
1212    case ast_logic_not:
1213    case ast_pre_inc:
1214    case ast_pre_dec:
1215       printf("%s ", operator_string(oper));
1216       subexpressions[0]->print();
1217       break;
1218 
1219    case ast_post_inc:
1220    case ast_post_dec:
1221       subexpressions[0]->print();
1222       printf("%s ", operator_string(oper));
1223       break;
1224 
1225    case ast_conditional:
1226       subexpressions[0]->print();
1227       printf("? ");
1228       subexpressions[1]->print();
1229       printf(": ");
1230       subexpressions[2]->print();
1231       break;
1232 
1233    case ast_array_index:
1234       subexpressions[0]->print();
1235       printf("[ ");
1236       subexpressions[1]->print();
1237       printf("] ");
1238       break;
1239 
1240    case ast_function_call: {
1241       subexpressions[0]->print();
1242       printf("( ");
1243 
1244       foreach_list_typed (ast_node, ast, link, &this->expressions) {
1245 	 if (&ast->link != this->expressions.get_head())
1246 	    printf(", ");
1247 
1248 	 ast->print();
1249       }
1250 
1251       printf(") ");
1252       break;
1253    }
1254 
1255    case ast_identifier:
1256       printf("%s ", primary_expression.identifier);
1257       break;
1258 
1259    case ast_int_constant:
1260       printf("%d ", primary_expression.int_constant);
1261       break;
1262 
1263    case ast_uint_constant:
1264       printf("%u ", primary_expression.uint_constant);
1265       break;
1266 
1267    case ast_float_constant:
1268       printf("%f ", primary_expression.float_constant);
1269       break;
1270 
1271    case ast_double_constant:
1272       printf("%f ", primary_expression.double_constant);
1273       break;
1274 
1275    case ast_int64_constant:
1276       printf("%" PRId64 " ", primary_expression.int64_constant);
1277       break;
1278 
1279    case ast_uint64_constant:
1280       printf("%" PRIu64 " ", primary_expression.uint64_constant);
1281       break;
1282 
1283    case ast_bool_constant:
1284       printf("%s ",
1285 	     primary_expression.bool_constant
1286 	     ? "true" : "false");
1287       break;
1288 
1289    case ast_sequence: {
1290       printf("( ");
1291       foreach_list_typed (ast_node, ast, link, & this->expressions) {
1292 	 if (&ast->link != this->expressions.get_head())
1293 	    printf(", ");
1294 
1295 	 ast->print();
1296       }
1297       printf(") ");
1298       break;
1299    }
1300 
1301    case ast_aggregate: {
1302       printf("{ ");
1303       foreach_list_typed (ast_node, ast, link, & this->expressions) {
1304 	 if (&ast->link != this->expressions.get_head())
1305 	    printf(", ");
1306 
1307 	 ast->print();
1308       }
1309       printf("} ");
1310       break;
1311    }
1312 
1313    default:
1314       assert(0);
1315       break;
1316    }
1317 }
1318 
ast_expression(int oper,ast_expression * ex0,ast_expression * ex1,ast_expression * ex2)1319 ast_expression::ast_expression(int oper,
1320 			       ast_expression *ex0,
1321 			       ast_expression *ex1,
1322 			       ast_expression *ex2) :
1323    primary_expression()
1324 {
1325    this->oper = ast_operators(oper);
1326    this->subexpressions[0] = ex0;
1327    this->subexpressions[1] = ex1;
1328    this->subexpressions[2] = ex2;
1329    this->non_lvalue_description = NULL;
1330    this->is_lhs = false;
1331 }
1332 
1333 
1334 void
print(void) const1335 ast_expression_statement::print(void) const
1336 {
1337    if (expression)
1338       expression->print();
1339 
1340    printf("; ");
1341 }
1342 
1343 
ast_expression_statement(ast_expression * ex)1344 ast_expression_statement::ast_expression_statement(ast_expression *ex) :
1345    expression(ex)
1346 {
1347    /* empty */
1348 }
1349 
1350 
1351 void
print(void) const1352 ast_function::print(void) const
1353 {
1354    return_type->print();
1355    printf(" %s (", identifier);
1356 
1357    foreach_list_typed(ast_node, ast, link, & this->parameters) {
1358       ast->print();
1359    }
1360 
1361    printf(")");
1362 }
1363 
1364 
ast_function(void)1365 ast_function::ast_function(void)
1366    : return_type(NULL), identifier(NULL), is_definition(false),
1367      signature(NULL)
1368 {
1369    /* empty */
1370 }
1371 
1372 
1373 void
print(void) const1374 ast_fully_specified_type::print(void) const
1375 {
1376    _mesa_ast_type_qualifier_print(& qualifier);
1377    specifier->print();
1378 }
1379 
1380 
1381 void
print(void) const1382 ast_parameter_declarator::print(void) const
1383 {
1384    type->print();
1385    if (identifier)
1386       printf("%s ", identifier);
1387    ast_opt_array_dimensions_print(array_specifier);
1388 }
1389 
1390 
1391 void
print(void) const1392 ast_function_definition::print(void) const
1393 {
1394    prototype->print();
1395    body->print();
1396 }
1397 
1398 
1399 void
print(void) const1400 ast_declaration::print(void) const
1401 {
1402    printf("%s ", identifier);
1403    ast_opt_array_dimensions_print(array_specifier);
1404 
1405    if (initializer) {
1406       printf("= ");
1407       initializer->print();
1408    }
1409 }
1410 
1411 
ast_declaration(const char * identifier,ast_array_specifier * array_specifier,ast_expression * initializer)1412 ast_declaration::ast_declaration(const char *identifier,
1413 				 ast_array_specifier *array_specifier,
1414 				 ast_expression *initializer)
1415 {
1416    this->identifier = identifier;
1417    this->array_specifier = array_specifier;
1418    this->initializer = initializer;
1419 }
1420 
1421 
1422 void
print(void) const1423 ast_declarator_list::print(void) const
1424 {
1425    assert(type || invariant);
1426 
1427    if (type)
1428       type->print();
1429    else if (invariant)
1430       printf("invariant ");
1431    else
1432       printf("precise ");
1433 
1434    foreach_list_typed (ast_node, ast, link, & this->declarations) {
1435       if (&ast->link != this->declarations.get_head())
1436 	 printf(", ");
1437 
1438       ast->print();
1439    }
1440 
1441    printf("; ");
1442 }
1443 
1444 
ast_declarator_list(ast_fully_specified_type * type)1445 ast_declarator_list::ast_declarator_list(ast_fully_specified_type *type)
1446 {
1447    this->type = type;
1448    this->invariant = false;
1449    this->precise = false;
1450 }
1451 
1452 void
print(void) const1453 ast_jump_statement::print(void) const
1454 {
1455    switch (mode) {
1456    case ast_continue:
1457       printf("continue; ");
1458       break;
1459    case ast_break:
1460       printf("break; ");
1461       break;
1462    case ast_return:
1463       printf("return ");
1464       if (opt_return_value)
1465 	 opt_return_value->print();
1466 
1467       printf("; ");
1468       break;
1469    case ast_discard:
1470       printf("discard; ");
1471       break;
1472    }
1473 }
1474 
1475 
ast_jump_statement(int mode,ast_expression * return_value)1476 ast_jump_statement::ast_jump_statement(int mode, ast_expression *return_value)
1477    : opt_return_value(NULL)
1478 {
1479    this->mode = ast_jump_modes(mode);
1480 
1481    if (mode == ast_return)
1482       opt_return_value = return_value;
1483 }
1484 
1485 
1486 void
print(void) const1487 ast_selection_statement::print(void) const
1488 {
1489    printf("if ( ");
1490    condition->print();
1491    printf(") ");
1492 
1493    then_statement->print();
1494 
1495    if (else_statement) {
1496       printf("else ");
1497       else_statement->print();
1498    }
1499 }
1500 
1501 
ast_selection_statement(ast_expression * condition,ast_node * then_statement,ast_node * else_statement)1502 ast_selection_statement::ast_selection_statement(ast_expression *condition,
1503 						 ast_node *then_statement,
1504 						 ast_node *else_statement)
1505 {
1506    this->condition = condition;
1507    this->then_statement = then_statement;
1508    this->else_statement = else_statement;
1509 }
1510 
1511 
1512 void
print(void) const1513 ast_switch_statement::print(void) const
1514 {
1515    printf("switch ( ");
1516    test_expression->print();
1517    printf(") ");
1518 
1519    body->print();
1520 }
1521 
1522 
ast_switch_statement(ast_expression * test_expression,ast_node * body)1523 ast_switch_statement::ast_switch_statement(ast_expression *test_expression,
1524 					   ast_node *body)
1525 {
1526    this->test_expression = test_expression;
1527    this->body = body;
1528 }
1529 
1530 
1531 void
print(void) const1532 ast_switch_body::print(void) const
1533 {
1534    printf("{\n");
1535    if (stmts != NULL) {
1536       stmts->print();
1537    }
1538    printf("}\n");
1539 }
1540 
1541 
ast_switch_body(ast_case_statement_list * stmts)1542 ast_switch_body::ast_switch_body(ast_case_statement_list *stmts)
1543 {
1544    this->stmts = stmts;
1545 }
1546 
1547 
print(void) const1548 void ast_case_label::print(void) const
1549 {
1550    if (test_value != NULL) {
1551       printf("case ");
1552       test_value->print();
1553       printf(": ");
1554    } else {
1555       printf("default: ");
1556    }
1557 }
1558 
1559 
ast_case_label(ast_expression * test_value)1560 ast_case_label::ast_case_label(ast_expression *test_value)
1561 {
1562    this->test_value = test_value;
1563 }
1564 
1565 
print(void) const1566 void ast_case_label_list::print(void) const
1567 {
1568    foreach_list_typed(ast_node, ast, link, & this->labels) {
1569       ast->print();
1570    }
1571    printf("\n");
1572 }
1573 
1574 
ast_case_label_list(void)1575 ast_case_label_list::ast_case_label_list(void)
1576 {
1577 }
1578 
1579 
print(void) const1580 void ast_case_statement::print(void) const
1581 {
1582    labels->print();
1583    foreach_list_typed(ast_node, ast, link, & this->stmts) {
1584       ast->print();
1585       printf("\n");
1586    }
1587 }
1588 
1589 
ast_case_statement(ast_case_label_list * labels)1590 ast_case_statement::ast_case_statement(ast_case_label_list *labels)
1591 {
1592    this->labels = labels;
1593 }
1594 
1595 
print(void) const1596 void ast_case_statement_list::print(void) const
1597 {
1598    foreach_list_typed(ast_node, ast, link, & this->cases) {
1599       ast->print();
1600    }
1601 }
1602 
1603 
ast_case_statement_list(void)1604 ast_case_statement_list::ast_case_statement_list(void)
1605 {
1606 }
1607 
1608 
1609 void
print(void) const1610 ast_iteration_statement::print(void) const
1611 {
1612    switch (mode) {
1613    case ast_for:
1614       printf("for( ");
1615       if (init_statement)
1616 	 init_statement->print();
1617       printf("; ");
1618 
1619       if (condition)
1620 	 condition->print();
1621       printf("; ");
1622 
1623       if (rest_expression)
1624 	 rest_expression->print();
1625       printf(") ");
1626 
1627       body->print();
1628       break;
1629 
1630    case ast_while:
1631       printf("while ( ");
1632       if (condition)
1633 	 condition->print();
1634       printf(") ");
1635       body->print();
1636       break;
1637 
1638    case ast_do_while:
1639       printf("do ");
1640       body->print();
1641       printf("while ( ");
1642       if (condition)
1643 	 condition->print();
1644       printf("); ");
1645       break;
1646    }
1647 }
1648 
1649 
ast_iteration_statement(int mode,ast_node * init,ast_node * condition,ast_expression * rest_expression,ast_node * body)1650 ast_iteration_statement::ast_iteration_statement(int mode,
1651 						 ast_node *init,
1652 						 ast_node *condition,
1653 						 ast_expression *rest_expression,
1654 						 ast_node *body)
1655 {
1656    this->mode = ast_iteration_modes(mode);
1657    this->init_statement = init;
1658    this->condition = condition;
1659    this->rest_expression = rest_expression;
1660    this->body = body;
1661 }
1662 
1663 
1664 void
print(void) const1665 ast_struct_specifier::print(void) const
1666 {
1667    printf("struct %s { ", name);
1668    foreach_list_typed(ast_node, ast, link, &this->declarations) {
1669       ast->print();
1670    }
1671    printf("} ");
1672 }
1673 
1674 
ast_struct_specifier(const char * identifier,ast_declarator_list * declarator_list)1675 ast_struct_specifier::ast_struct_specifier(const char *identifier,
1676 					   ast_declarator_list *declarator_list)
1677    : name(identifier), layout(NULL), declarations(), is_declaration(true),
1678      type(NULL)
1679 {
1680    this->declarations.push_degenerate_list_at_head(&declarator_list->link);
1681 }
1682 
print(void) const1683 void ast_subroutine_list::print(void) const
1684 {
1685    foreach_list_typed (ast_node, ast, link, & this->declarations) {
1686       if (&ast->link != this->declarations.get_head())
1687          printf(", ");
1688       ast->print();
1689    }
1690 }
1691 
1692 static void
set_shader_inout_layout(struct gl_shader * shader,struct _mesa_glsl_parse_state * state)1693 set_shader_inout_layout(struct gl_shader *shader,
1694 		     struct _mesa_glsl_parse_state *state)
1695 {
1696    /* Should have been prevented by the parser. */
1697    if (shader->Stage == MESA_SHADER_TESS_CTRL ||
1698        shader->Stage == MESA_SHADER_VERTEX) {
1699       assert(!state->in_qualifier->flags.i);
1700    } else if (shader->Stage != MESA_SHADER_GEOMETRY &&
1701               shader->Stage != MESA_SHADER_TESS_EVAL) {
1702       assert(!state->in_qualifier->flags.i);
1703    }
1704 
1705    if (shader->Stage != MESA_SHADER_COMPUTE) {
1706       /* Should have been prevented by the parser. */
1707       assert(!state->cs_input_local_size_specified);
1708       assert(!state->cs_input_local_size_variable_specified);
1709    }
1710 
1711    if (shader->Stage != MESA_SHADER_FRAGMENT) {
1712       /* Should have been prevented by the parser. */
1713       assert(!state->fs_uses_gl_fragcoord);
1714       assert(!state->fs_redeclares_gl_fragcoord);
1715       assert(!state->fs_pixel_center_integer);
1716       assert(!state->fs_origin_upper_left);
1717       assert(!state->fs_early_fragment_tests);
1718       assert(!state->fs_inner_coverage);
1719       assert(!state->fs_post_depth_coverage);
1720    }
1721 
1722    for (unsigned i = 0; i < MAX_FEEDBACK_BUFFERS; i++) {
1723       if (state->out_qualifier->out_xfb_stride[i]) {
1724          unsigned xfb_stride;
1725          if (state->out_qualifier->out_xfb_stride[i]->
1726                 process_qualifier_constant(state, "xfb_stride", &xfb_stride,
1727                 true)) {
1728             shader->TransformFeedbackBufferStride[i] = xfb_stride;
1729          }
1730       }
1731    }
1732 
1733    switch (shader->Stage) {
1734    case MESA_SHADER_TESS_CTRL:
1735       shader->info.TessCtrl.VerticesOut = 0;
1736       if (state->tcs_output_vertices_specified) {
1737          unsigned vertices;
1738          if (state->out_qualifier->vertices->
1739                process_qualifier_constant(state, "vertices", &vertices,
1740                                           false)) {
1741 
1742             YYLTYPE loc = state->out_qualifier->vertices->get_location();
1743             if (vertices > state->Const.MaxPatchVertices) {
1744                _mesa_glsl_error(&loc, state, "vertices (%d) exceeds "
1745                                 "GL_MAX_PATCH_VERTICES", vertices);
1746             }
1747             shader->info.TessCtrl.VerticesOut = vertices;
1748          }
1749       }
1750       break;
1751    case MESA_SHADER_TESS_EVAL:
1752       shader->info.TessEval.PrimitiveMode = PRIM_UNKNOWN;
1753       if (state->in_qualifier->flags.q.prim_type)
1754          shader->info.TessEval.PrimitiveMode = state->in_qualifier->prim_type;
1755 
1756       shader->info.TessEval.Spacing = TESS_SPACING_UNSPECIFIED;
1757       if (state->in_qualifier->flags.q.vertex_spacing)
1758          shader->info.TessEval.Spacing = state->in_qualifier->vertex_spacing;
1759 
1760       shader->info.TessEval.VertexOrder = 0;
1761       if (state->in_qualifier->flags.q.ordering)
1762          shader->info.TessEval.VertexOrder = state->in_qualifier->ordering;
1763 
1764       shader->info.TessEval.PointMode = -1;
1765       if (state->in_qualifier->flags.q.point_mode)
1766          shader->info.TessEval.PointMode = state->in_qualifier->point_mode;
1767       break;
1768    case MESA_SHADER_GEOMETRY:
1769       shader->info.Geom.VerticesOut = -1;
1770       if (state->out_qualifier->flags.q.max_vertices) {
1771          unsigned qual_max_vertices;
1772          if (state->out_qualifier->max_vertices->
1773                process_qualifier_constant(state, "max_vertices",
1774                                           &qual_max_vertices, true)) {
1775 
1776             if (qual_max_vertices > state->Const.MaxGeometryOutputVertices) {
1777                YYLTYPE loc = state->out_qualifier->max_vertices->get_location();
1778                _mesa_glsl_error(&loc, state,
1779                                 "maximum output vertices (%d) exceeds "
1780                                 "GL_MAX_GEOMETRY_OUTPUT_VERTICES",
1781                                 qual_max_vertices);
1782             }
1783             shader->info.Geom.VerticesOut = qual_max_vertices;
1784          }
1785       }
1786 
1787       if (state->gs_input_prim_type_specified) {
1788          shader->info.Geom.InputType = state->in_qualifier->prim_type;
1789       } else {
1790          shader->info.Geom.InputType = PRIM_UNKNOWN;
1791       }
1792 
1793       if (state->out_qualifier->flags.q.prim_type) {
1794          shader->info.Geom.OutputType = state->out_qualifier->prim_type;
1795       } else {
1796          shader->info.Geom.OutputType = PRIM_UNKNOWN;
1797       }
1798 
1799       shader->info.Geom.Invocations = 0;
1800       if (state->in_qualifier->flags.q.invocations) {
1801          unsigned invocations;
1802          if (state->in_qualifier->invocations->
1803                process_qualifier_constant(state, "invocations",
1804                                           &invocations, false)) {
1805 
1806             YYLTYPE loc = state->in_qualifier->invocations->get_location();
1807             if (invocations > MAX_GEOMETRY_SHADER_INVOCATIONS) {
1808                _mesa_glsl_error(&loc, state,
1809                                 "invocations (%d) exceeds "
1810                                 "GL_MAX_GEOMETRY_SHADER_INVOCATIONS",
1811                                 invocations);
1812             }
1813             shader->info.Geom.Invocations = invocations;
1814          }
1815       }
1816       break;
1817 
1818    case MESA_SHADER_COMPUTE:
1819       if (state->cs_input_local_size_specified) {
1820          for (int i = 0; i < 3; i++)
1821             shader->info.Comp.LocalSize[i] = state->cs_input_local_size[i];
1822       } else {
1823          for (int i = 0; i < 3; i++)
1824             shader->info.Comp.LocalSize[i] = 0;
1825       }
1826 
1827       shader->info.Comp.LocalSizeVariable =
1828          state->cs_input_local_size_variable_specified;
1829       break;
1830 
1831    case MESA_SHADER_FRAGMENT:
1832       shader->redeclares_gl_fragcoord = state->fs_redeclares_gl_fragcoord;
1833       shader->uses_gl_fragcoord = state->fs_uses_gl_fragcoord;
1834       shader->pixel_center_integer = state->fs_pixel_center_integer;
1835       shader->origin_upper_left = state->fs_origin_upper_left;
1836       shader->ARB_fragment_coord_conventions_enable =
1837          state->ARB_fragment_coord_conventions_enable;
1838       shader->EarlyFragmentTests = state->fs_early_fragment_tests;
1839       shader->InnerCoverage = state->fs_inner_coverage;
1840       shader->PostDepthCoverage = state->fs_post_depth_coverage;
1841       shader->BlendSupport = state->fs_blend_support;
1842       break;
1843 
1844    default:
1845       /* Nothing to do. */
1846       break;
1847    }
1848 
1849    shader->bindless_sampler = state->bindless_sampler_specified;
1850    shader->bindless_image = state->bindless_image_specified;
1851    shader->bound_sampler = state->bound_sampler_specified;
1852    shader->bound_image = state->bound_image_specified;
1853 }
1854 
1855 /* src can be NULL if only the symbols found in the exec_list should be
1856  * copied
1857  */
1858 void
_mesa_glsl_copy_symbols_from_table(struct exec_list * shader_ir,struct glsl_symbol_table * src,struct glsl_symbol_table * dest)1859 _mesa_glsl_copy_symbols_from_table(struct exec_list *shader_ir,
1860                                    struct glsl_symbol_table *src,
1861                                    struct glsl_symbol_table *dest)
1862 {
1863    foreach_in_list (ir_instruction, ir, shader_ir) {
1864       switch (ir->ir_type) {
1865       case ir_type_function:
1866          dest->add_function((ir_function *) ir);
1867          break;
1868       case ir_type_variable: {
1869          ir_variable *const var = (ir_variable *) ir;
1870 
1871          if (var->data.mode != ir_var_temporary)
1872             dest->add_variable(var);
1873          break;
1874       }
1875       default:
1876          break;
1877       }
1878    }
1879 
1880    if (src != NULL) {
1881       /* Explicitly copy the gl_PerVertex interface definitions because these
1882        * are needed to check they are the same during the interstage link.
1883        * They can’t necessarily be found via the exec_list because the members
1884        * might not be referenced. The GL spec still requires that they match
1885        * in that case.
1886        */
1887       const glsl_type *iface =
1888          src->get_interface("gl_PerVertex", ir_var_shader_in);
1889       if (iface)
1890          dest->add_interface(iface->name, iface, ir_var_shader_in);
1891 
1892       iface = src->get_interface("gl_PerVertex", ir_var_shader_out);
1893       if (iface)
1894          dest->add_interface(iface->name, iface, ir_var_shader_out);
1895    }
1896 }
1897 
1898 extern "C" {
1899 
1900 static void
assign_subroutine_indexes(struct _mesa_glsl_parse_state * state)1901 assign_subroutine_indexes(struct _mesa_glsl_parse_state *state)
1902 {
1903    int j, k;
1904    int index = 0;
1905 
1906    for (j = 0; j < state->num_subroutines; j++) {
1907       while (state->subroutines[j]->subroutine_index == -1) {
1908          for (k = 0; k < state->num_subroutines; k++) {
1909             if (state->subroutines[k]->subroutine_index == index)
1910                break;
1911             else if (k == state->num_subroutines - 1) {
1912                state->subroutines[j]->subroutine_index = index;
1913             }
1914          }
1915          index++;
1916       }
1917    }
1918 }
1919 
1920 static void
add_builtin_defines(struct _mesa_glsl_parse_state * state,void (* add_builtin_define)(struct glcpp_parser *,const char *,int),struct glcpp_parser * data,unsigned version,bool es)1921 add_builtin_defines(struct _mesa_glsl_parse_state *state,
1922                     void (*add_builtin_define)(struct glcpp_parser *, const char *, int),
1923                     struct glcpp_parser *data,
1924                     unsigned version,
1925                     bool es)
1926 {
1927    unsigned gl_version = state->ctx->Extensions.Version;
1928    gl_api api = state->ctx->API;
1929 
1930    if (gl_version != 0xff) {
1931       unsigned i;
1932       for (i = 0; i < state->num_supported_versions; i++) {
1933          if (state->supported_versions[i].ver == version &&
1934              state->supported_versions[i].es == es) {
1935             gl_version = state->supported_versions[i].gl_ver;
1936             break;
1937          }
1938       }
1939 
1940       if (i == state->num_supported_versions)
1941          return;
1942    }
1943 
1944    if (es)
1945       api = API_OPENGLES2;
1946 
1947    for (unsigned i = 0;
1948         i < ARRAY_SIZE(_mesa_glsl_supported_extensions); ++i) {
1949       const _mesa_glsl_extension *extension
1950          = &_mesa_glsl_supported_extensions[i];
1951       if (extension->compatible_with_state(state, api, gl_version)) {
1952          add_builtin_define(data, extension->name, 1);
1953       }
1954    }
1955 }
1956 
1957 /* Implements parsing checks that we can't do during parsing */
1958 static void
do_late_parsing_checks(struct _mesa_glsl_parse_state * state)1959 do_late_parsing_checks(struct _mesa_glsl_parse_state *state)
1960 {
1961    if (state->stage == MESA_SHADER_COMPUTE && !state->has_compute_shader()) {
1962       YYLTYPE loc;
1963       memset(&loc, 0, sizeof(loc));
1964       _mesa_glsl_error(&loc, state, "Compute shaders require "
1965                        "GLSL 4.30 or GLSL ES 3.10");
1966    }
1967 }
1968 
1969 static void
opt_shader_and_create_symbol_table(struct gl_context * ctx,struct glsl_symbol_table * source_symbols,struct gl_shader * shader)1970 opt_shader_and_create_symbol_table(struct gl_context *ctx,
1971                                    struct glsl_symbol_table *source_symbols,
1972                                    struct gl_shader *shader)
1973 {
1974    assert(shader->CompileStatus != compile_failure &&
1975           !shader->ir->is_empty());
1976 
1977    struct gl_shader_compiler_options *options =
1978       &ctx->Const.ShaderCompilerOptions[shader->Stage];
1979 
1980    /* Do some optimization at compile time to reduce shader IR size
1981     * and reduce later work if the same shader is linked multiple times
1982     */
1983    if (ctx->Const.GLSLOptimizeConservatively) {
1984       /* Run it just once. */
1985       do_common_optimization(shader->ir, false, false, options,
1986                              ctx->Const.NativeIntegers);
1987    } else {
1988       /* Repeat it until it stops making changes. */
1989       while (do_common_optimization(shader->ir, false, false, options,
1990                                     ctx->Const.NativeIntegers))
1991          ;
1992    }
1993 
1994    validate_ir_tree(shader->ir);
1995 
1996    enum ir_variable_mode other;
1997    switch (shader->Stage) {
1998    case MESA_SHADER_VERTEX:
1999       other = ir_var_shader_in;
2000       break;
2001    case MESA_SHADER_FRAGMENT:
2002       other = ir_var_shader_out;
2003       break;
2004    default:
2005       /* Something invalid to ensure optimize_dead_builtin_uniforms
2006        * doesn't remove anything other than uniforms or constants.
2007        */
2008       other = ir_var_mode_count;
2009       break;
2010    }
2011 
2012    optimize_dead_builtin_variables(shader->ir, other);
2013 
2014    validate_ir_tree(shader->ir);
2015 
2016    /* Retain any live IR, but trash the rest. */
2017    reparent_ir(shader->ir, shader->ir);
2018 
2019    /* Destroy the symbol table.  Create a new symbol table that contains only
2020     * the variables and functions that still exist in the IR.  The symbol
2021     * table will be used later during linking.
2022     *
2023     * There must NOT be any freed objects still referenced by the symbol
2024     * table.  That could cause the linker to dereference freed memory.
2025     *
2026     * We don't have to worry about types or interface-types here because those
2027     * are fly-weights that are looked up by glsl_type.
2028     */
2029    _mesa_glsl_copy_symbols_from_table(shader->ir, source_symbols,
2030                                       shader->symbols);
2031 }
2032 
2033 void
_mesa_glsl_compile_shader(struct gl_context * ctx,struct gl_shader * shader,bool dump_ast,bool dump_hir,bool force_recompile)2034 _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
2035                           bool dump_ast, bool dump_hir, bool force_recompile)
2036 {
2037    const char *source = force_recompile && shader->FallbackSource ?
2038       shader->FallbackSource : shader->Source;
2039 
2040    if (!force_recompile) {
2041       if (ctx->Cache) {
2042          char buf[41];
2043          disk_cache_compute_key(ctx->Cache, source, strlen(source),
2044                                 shader->sha1);
2045          if (disk_cache_has_key(ctx->Cache, shader->sha1)) {
2046             /* We've seen this shader before and know it compiles */
2047             if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
2048                _mesa_sha1_format(buf, shader->sha1);
2049                fprintf(stderr, "deferring compile of shader: %s\n", buf);
2050             }
2051             shader->CompileStatus = compile_skipped;
2052 
2053             free((void *)shader->FallbackSource);
2054             shader->FallbackSource = NULL;
2055             return;
2056          }
2057       }
2058    } else {
2059       /* We should only ever end up here if a re-compile has been forced by a
2060        * shader cache miss. In which case we can skip the compile if its
2061        * already be done by a previous fallback or the initial compile call.
2062        */
2063       if (shader->CompileStatus == compile_success)
2064          return;
2065 
2066       if (shader->CompileStatus == compiled_no_opts) {
2067          opt_shader_and_create_symbol_table(ctx,
2068                                             NULL, /* source_symbols */
2069                                             shader);
2070          shader->CompileStatus = compile_success;
2071          return;
2072       }
2073    }
2074 
2075    struct _mesa_glsl_parse_state *state =
2076       new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader);
2077 
2078    if (ctx->Const.GenerateTemporaryNames)
2079       (void) p_atomic_cmpxchg(&ir_variable::temporaries_allocate_names,
2080                               false, true);
2081 
2082    state->error = glcpp_preprocess(state, &source, &state->info_log,
2083                                    add_builtin_defines, state, ctx);
2084 
2085    if (!state->error) {
2086      _mesa_glsl_lexer_ctor(state, source);
2087      _mesa_glsl_parse(state);
2088      _mesa_glsl_lexer_dtor(state);
2089      do_late_parsing_checks(state);
2090    }
2091 
2092    if (dump_ast) {
2093       foreach_list_typed(ast_node, ast, link, &state->translation_unit) {
2094          ast->print();
2095       }
2096       printf("\n\n");
2097    }
2098 
2099    ralloc_free(shader->ir);
2100    shader->ir = new(shader) exec_list;
2101    if (!state->error && !state->translation_unit.is_empty())
2102       _mesa_ast_to_hir(shader->ir, state);
2103 
2104    if (!state->error) {
2105       validate_ir_tree(shader->ir);
2106 
2107       /* Print out the unoptimized IR. */
2108       if (dump_hir) {
2109          _mesa_print_ir(stdout, shader->ir, state);
2110       }
2111    }
2112 
2113    if (shader->InfoLog)
2114       ralloc_free(shader->InfoLog);
2115 
2116    if (!state->error)
2117       set_shader_inout_layout(shader, state);
2118 
2119    shader->symbols = new(shader->ir) glsl_symbol_table;
2120    shader->CompileStatus = state->error ? compile_failure : compile_success;
2121    shader->InfoLog = state->info_log;
2122    shader->Version = state->language_version;
2123    shader->IsES = state->es_shader;
2124 
2125    if (!state->error && !shader->ir->is_empty()) {
2126       assign_subroutine_indexes(state);
2127       lower_subroutine(shader->ir, state);
2128 
2129       if (!ctx->Cache || force_recompile)
2130          opt_shader_and_create_symbol_table(ctx, state->symbols, shader);
2131       else {
2132          reparent_ir(shader->ir, shader->ir);
2133          shader->CompileStatus = compiled_no_opts;
2134       }
2135    }
2136 
2137    if (!force_recompile) {
2138       free((void *)shader->FallbackSource);
2139       shader->FallbackSource = NULL;
2140    }
2141 
2142    delete state->symbols;
2143    ralloc_free(state);
2144 }
2145 
2146 } /* extern "C" */
2147 /**
2148  * Do the set of common optimizations passes
2149  *
2150  * \param ir                          List of instructions to be optimized
2151  * \param linked                      Is the shader linked?  This enables
2152  *                                    optimizations passes that remove code at
2153  *                                    global scope and could cause linking to
2154  *                                    fail.
2155  * \param uniform_locations_assigned  Have locations already been assigned for
2156  *                                    uniforms?  This prevents the declarations
2157  *                                    of unused uniforms from being removed.
2158  *                                    The setting of this flag only matters if
2159  *                                    \c linked is \c true.
2160  * \param options                     The driver's preferred shader options.
2161  * \param native_integers             Selects optimizations that depend on the
2162  *                                    implementations supporting integers
2163  *                                    natively (as opposed to supporting
2164  *                                    integers in floating point registers).
2165  */
2166 bool
do_common_optimization(exec_list * ir,bool linked,bool uniform_locations_assigned,const struct gl_shader_compiler_options * options,bool native_integers)2167 do_common_optimization(exec_list *ir, bool linked,
2168 		       bool uniform_locations_assigned,
2169                        const struct gl_shader_compiler_options *options,
2170                        bool native_integers)
2171 {
2172    const bool debug = false;
2173    GLboolean progress = GL_FALSE;
2174 
2175 #define OPT(PASS, ...) do {                                             \
2176       if (debug) {                                                      \
2177          fprintf(stderr, "START GLSL optimization %s\n", #PASS);        \
2178          const bool opt_progress = PASS(__VA_ARGS__);                   \
2179          progress = opt_progress || progress;                           \
2180          if (opt_progress)                                              \
2181             _mesa_print_ir(stderr, ir, NULL);                           \
2182          fprintf(stderr, "GLSL optimization %s: %s progress\n",         \
2183                  #PASS, opt_progress ? "made" : "no");                  \
2184       } else {                                                          \
2185          progress = PASS(__VA_ARGS__) || progress;                      \
2186       }                                                                 \
2187    } while (false)
2188 
2189    OPT(lower_instructions, ir, SUB_TO_ADD_NEG);
2190 
2191    if (linked) {
2192       OPT(do_function_inlining, ir);
2193       OPT(do_dead_functions, ir);
2194       OPT(do_structure_splitting, ir);
2195    }
2196    propagate_invariance(ir);
2197    OPT(do_if_simplification, ir);
2198    OPT(opt_flatten_nested_if_blocks, ir);
2199    OPT(opt_conditional_discard, ir);
2200    OPT(do_copy_propagation, ir);
2201    OPT(do_copy_propagation_elements, ir);
2202 
2203    if (options->OptimizeForAOS && !linked)
2204       OPT(opt_flip_matrices, ir);
2205 
2206    if (linked && options->OptimizeForAOS) {
2207       OPT(do_vectorize, ir);
2208    }
2209 
2210    if (linked)
2211       OPT(do_dead_code, ir, uniform_locations_assigned);
2212    else
2213       OPT(do_dead_code_unlinked, ir);
2214    OPT(do_dead_code_local, ir);
2215    OPT(do_tree_grafting, ir);
2216    OPT(do_constant_propagation, ir);
2217    if (linked)
2218       OPT(do_constant_variable, ir);
2219    else
2220       OPT(do_constant_variable_unlinked, ir);
2221    OPT(do_constant_folding, ir);
2222    OPT(do_minmax_prune, ir);
2223    OPT(do_rebalance_tree, ir);
2224    OPT(do_algebraic, ir, native_integers, options);
2225    OPT(do_lower_jumps, ir, true, true, options->EmitNoMainReturn,
2226        options->EmitNoCont, options->EmitNoLoops);
2227    OPT(do_vec_index_to_swizzle, ir);
2228    OPT(lower_vector_insert, ir, false);
2229    OPT(optimize_swizzles, ir);
2230 
2231    OPT(optimize_split_arrays, ir, linked);
2232    OPT(optimize_redundant_jumps, ir);
2233 
2234    if (options->MaxUnrollIterations) {
2235       loop_state *ls = analyze_loop_variables(ir);
2236       if (ls->loop_found) {
2237          bool loop_progress = unroll_loops(ir, ls, options);
2238          while (loop_progress) {
2239             loop_progress = false;
2240             loop_progress |= do_constant_propagation(ir);
2241             loop_progress |= do_if_simplification(ir);
2242 
2243             /* Some drivers only call do_common_optimization() once rather
2244              * than in a loop. So we must call do_lower_jumps() after
2245              * unrolling a loop because for drivers that use LLVM validation
2246              * will fail if a jump is not the last instruction in the block.
2247              * For example the following will fail LLVM validation:
2248              *
2249              *   (loop (
2250              *      ...
2251              *   break
2252              *   (assign  (x) (var_ref v124)  (expression int + (var_ref v124)
2253              *      (constant int (1)) ) )
2254              *   ))
2255              */
2256             loop_progress |= do_lower_jumps(ir, true, true,
2257                                             options->EmitNoMainReturn,
2258                                             options->EmitNoCont,
2259                                             options->EmitNoLoops);
2260          }
2261          progress |= loop_progress;
2262       }
2263       delete ls;
2264    }
2265 
2266 #undef OPT
2267 
2268    return progress;
2269 }
2270 
2271 extern "C" {
2272 
2273 /**
2274  * To be called at GL teardown time, this frees compiler datastructures.
2275  *
2276  * After calling this, any previously compiled shaders and shader
2277  * programs would be invalid.  So this should happen at approximately
2278  * program exit.
2279  */
2280 void
_mesa_destroy_shader_compiler(void)2281 _mesa_destroy_shader_compiler(void)
2282 {
2283    _mesa_destroy_shader_compiler_caches();
2284 
2285    _mesa_glsl_release_types();
2286 }
2287 
2288 /**
2289  * Releases compiler caches to trade off performance for memory.
2290  *
2291  * Intended to be used with glReleaseShaderCompiler().
2292  */
2293 void
_mesa_destroy_shader_compiler_caches(void)2294 _mesa_destroy_shader_compiler_caches(void)
2295 {
2296    _mesa_glsl_release_builtin_functions();
2297 }
2298 
2299 }
2300