Home | History | Annotate | Download | only in glsl
      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 *
     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 
     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
    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
    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
    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
    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
    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  */
    703 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  */
    713 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  */
    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
    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
    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
    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
   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
   1111 ast_node::print(void) const
   1112 {
   1113    printf("unhandled node ");
   1114 }
   1115 
   1116 
   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
   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
   1136 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 
   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
   1160 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 
   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
   1302 ast_expression_statement::print(void) const
   1303 {
   1304    if (expression)
   1305       expression->print();
   1306 
   1307    printf("; ");
   1308 }
   1309 
   1310 
   1311 ast_expression_statement::ast_expression_statement(ast_expression *ex) :
   1312    expression(ex)
   1313 {
   1314    /* empty */
   1315 }
   1316 
   1317 
   1318 void
   1319 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 
   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
   1341 ast_fully_specified_type::print(void) const
   1342 {
   1343    _mesa_ast_type_qualifier_print(& qualifier);
   1344    specifier->print();
   1345 }
   1346 
   1347 
   1348 void
   1349 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
   1359 ast_function_definition::print(void) const
   1360 {
   1361    prototype->print();
   1362    body->print();
   1363 }
   1364 
   1365 
   1366 void
   1367 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 
   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
   1390 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 
   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
   1420 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 
   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
   1454 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 
   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
   1480 ast_switch_statement::print(void) const
   1481 {
   1482    printf("switch ( ");
   1483    test_expression->print();
   1484    printf(") ");
   1485 
   1486    body->print();
   1487 }
   1488 
   1489 
   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
   1499 ast_switch_body::print(void) const
   1500 {
   1501    printf("{\n");
   1502    if (stmts != NULL) {
   1503       stmts->print();
   1504    }
   1505    printf("}\n");
   1506 }
   1507 
   1508 
   1509 ast_switch_body::ast_switch_body(ast_case_statement_list *stmts)
   1510 {
   1511    this->stmts = stmts;
   1512 }
   1513 
   1514 
   1515 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 
   1527 ast_case_label::ast_case_label(ast_expression *test_value)
   1528 {
   1529    this->test_value = test_value;
   1530 }
   1531 
   1532 
   1533 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 
   1542 ast_case_label_list::ast_case_label_list(void)
   1543 {
   1544 }
   1545 
   1546 
   1547 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 
   1557 ast_case_statement::ast_case_statement(ast_case_label_list *labels)
   1558 {
   1559    this->labels = labels;
   1560 }
   1561 
   1562 
   1563 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 
   1571 ast_case_statement_list::ast_case_statement_list(void)
   1572 {
   1573 }
   1574 
   1575 
   1576 void
   1577 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 
   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
   1632 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 
   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 
   1662 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
   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
   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
   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
   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
   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
   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
   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
   2164 _mesa_destroy_shader_compiler_caches(void)
   2165 {
   2166    _mesa_glsl_release_builtin_functions();
   2167 }
   2168 
   2169 }
   2170