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