Home | History | Annotate | Download | only in glsl
      1 /*
      2  * Copyright  2010 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     21  * DEALINGS IN THE SOFTWARE.
     22  */
     23 
     24 #include "ir.h"
     25 #include "ir_builder.h"
     26 #include "linker.h"
     27 #include "glsl_parser_extras.h"
     28 #include "glsl_symbol_table.h"
     29 #include "main/core.h"
     30 #include "main/uniforms.h"
     31 #include "program/prog_statevars.h"
     32 #include "program/prog_instruction.h"
     33 
     34 using namespace ir_builder;
     35 
     36 static const struct gl_builtin_uniform_element gl_NumSamples_elements[] = {
     37    {NULL, {STATE_NUM_SAMPLES, 0, 0}, SWIZZLE_XXXX}
     38 };
     39 
     40 /* only for TCS */
     41 static const struct gl_builtin_uniform_element gl_PatchVerticesIn_elements[] = {
     42    {NULL, {STATE_INTERNAL, STATE_TCS_PATCH_VERTICES_IN}, SWIZZLE_XXXX}
     43 };
     44 
     45 static const struct gl_builtin_uniform_element gl_DepthRange_elements[] = {
     46    {"near", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_XXXX},
     47    {"far", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_YYYY},
     48    {"diff", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_ZZZZ},
     49 };
     50 
     51 static const struct gl_builtin_uniform_element gl_ClipPlane_elements[] = {
     52    {NULL, {STATE_CLIPPLANE, 0, 0}, SWIZZLE_XYZW}
     53 };
     54 
     55 static const struct gl_builtin_uniform_element gl_Point_elements[] = {
     56    {"size", {STATE_POINT_SIZE}, SWIZZLE_XXXX},
     57    {"sizeMin", {STATE_POINT_SIZE}, SWIZZLE_YYYY},
     58    {"sizeMax", {STATE_POINT_SIZE}, SWIZZLE_ZZZZ},
     59    {"fadeThresholdSize", {STATE_POINT_SIZE}, SWIZZLE_WWWW},
     60    {"distanceConstantAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_XXXX},
     61    {"distanceLinearAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_YYYY},
     62    {"distanceQuadraticAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_ZZZZ},
     63 };
     64 
     65 static const struct gl_builtin_uniform_element gl_FrontMaterial_elements[] = {
     66    {"emission", {STATE_MATERIAL, 0, STATE_EMISSION}, SWIZZLE_XYZW},
     67    {"ambient", {STATE_MATERIAL, 0, STATE_AMBIENT}, SWIZZLE_XYZW},
     68    {"diffuse", {STATE_MATERIAL, 0, STATE_DIFFUSE}, SWIZZLE_XYZW},
     69    {"specular", {STATE_MATERIAL, 0, STATE_SPECULAR}, SWIZZLE_XYZW},
     70    {"shininess", {STATE_MATERIAL, 0, STATE_SHININESS}, SWIZZLE_XXXX},
     71 };
     72 
     73 static const struct gl_builtin_uniform_element gl_BackMaterial_elements[] = {
     74    {"emission", {STATE_MATERIAL, 1, STATE_EMISSION}, SWIZZLE_XYZW},
     75    {"ambient", {STATE_MATERIAL, 1, STATE_AMBIENT}, SWIZZLE_XYZW},
     76    {"diffuse", {STATE_MATERIAL, 1, STATE_DIFFUSE}, SWIZZLE_XYZW},
     77    {"specular", {STATE_MATERIAL, 1, STATE_SPECULAR}, SWIZZLE_XYZW},
     78    {"shininess", {STATE_MATERIAL, 1, STATE_SHININESS}, SWIZZLE_XXXX},
     79 };
     80 
     81 static const struct gl_builtin_uniform_element gl_LightSource_elements[] = {
     82    {"ambient", {STATE_LIGHT, 0, STATE_AMBIENT}, SWIZZLE_XYZW},
     83    {"diffuse", {STATE_LIGHT, 0, STATE_DIFFUSE}, SWIZZLE_XYZW},
     84    {"specular", {STATE_LIGHT, 0, STATE_SPECULAR}, SWIZZLE_XYZW},
     85    {"position", {STATE_LIGHT, 0, STATE_POSITION}, SWIZZLE_XYZW},
     86    {"halfVector", {STATE_LIGHT, 0, STATE_HALF_VECTOR}, SWIZZLE_XYZW},
     87    {"spotDirection", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION},
     88     MAKE_SWIZZLE4(SWIZZLE_X,
     89 		  SWIZZLE_Y,
     90 		  SWIZZLE_Z,
     91 		  SWIZZLE_Z)},
     92    {"spotCosCutoff", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION}, SWIZZLE_WWWW},
     93    {"spotCutoff", {STATE_LIGHT, 0, STATE_SPOT_CUTOFF}, SWIZZLE_XXXX},
     94    {"spotExponent", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_WWWW},
     95    {"constantAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_XXXX},
     96    {"linearAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_YYYY},
     97    {"quadraticAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_ZZZZ},
     98 };
     99 
    100 static const struct gl_builtin_uniform_element gl_LightModel_elements[] = {
    101    {"ambient", {STATE_LIGHTMODEL_AMBIENT, 0}, SWIZZLE_XYZW},
    102 };
    103 
    104 static const struct gl_builtin_uniform_element gl_FrontLightModelProduct_elements[] = {
    105    {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 0}, SWIZZLE_XYZW},
    106 };
    107 
    108 static const struct gl_builtin_uniform_element gl_BackLightModelProduct_elements[] = {
    109    {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 1}, SWIZZLE_XYZW},
    110 };
    111 
    112 static const struct gl_builtin_uniform_element gl_FrontLightProduct_elements[] = {
    113    {"ambient", {STATE_LIGHTPROD, 0, 0, STATE_AMBIENT}, SWIZZLE_XYZW},
    114    {"diffuse", {STATE_LIGHTPROD, 0, 0, STATE_DIFFUSE}, SWIZZLE_XYZW},
    115    {"specular", {STATE_LIGHTPROD, 0, 0, STATE_SPECULAR}, SWIZZLE_XYZW},
    116 };
    117 
    118 static const struct gl_builtin_uniform_element gl_BackLightProduct_elements[] = {
    119    {"ambient", {STATE_LIGHTPROD, 0, 1, STATE_AMBIENT}, SWIZZLE_XYZW},
    120    {"diffuse", {STATE_LIGHTPROD, 0, 1, STATE_DIFFUSE}, SWIZZLE_XYZW},
    121    {"specular", {STATE_LIGHTPROD, 0, 1, STATE_SPECULAR}, SWIZZLE_XYZW},
    122 };
    123 
    124 static const struct gl_builtin_uniform_element gl_TextureEnvColor_elements[] = {
    125    {NULL, {STATE_TEXENV_COLOR, 0}, SWIZZLE_XYZW},
    126 };
    127 
    128 static const struct gl_builtin_uniform_element gl_EyePlaneS_elements[] = {
    129    {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_S}, SWIZZLE_XYZW},
    130 };
    131 
    132 static const struct gl_builtin_uniform_element gl_EyePlaneT_elements[] = {
    133    {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_T}, SWIZZLE_XYZW},
    134 };
    135 
    136 static const struct gl_builtin_uniform_element gl_EyePlaneR_elements[] = {
    137    {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_R}, SWIZZLE_XYZW},
    138 };
    139 
    140 static const struct gl_builtin_uniform_element gl_EyePlaneQ_elements[] = {
    141    {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_Q}, SWIZZLE_XYZW},
    142 };
    143 
    144 static const struct gl_builtin_uniform_element gl_ObjectPlaneS_elements[] = {
    145    {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_S}, SWIZZLE_XYZW},
    146 };
    147 
    148 static const struct gl_builtin_uniform_element gl_ObjectPlaneT_elements[] = {
    149    {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_T}, SWIZZLE_XYZW},
    150 };
    151 
    152 static const struct gl_builtin_uniform_element gl_ObjectPlaneR_elements[] = {
    153    {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_R}, SWIZZLE_XYZW},
    154 };
    155 
    156 static const struct gl_builtin_uniform_element gl_ObjectPlaneQ_elements[] = {
    157    {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_Q}, SWIZZLE_XYZW},
    158 };
    159 
    160 static const struct gl_builtin_uniform_element gl_Fog_elements[] = {
    161    {"color", {STATE_FOG_COLOR}, SWIZZLE_XYZW},
    162    {"density", {STATE_FOG_PARAMS}, SWIZZLE_XXXX},
    163    {"start", {STATE_FOG_PARAMS}, SWIZZLE_YYYY},
    164    {"end", {STATE_FOG_PARAMS}, SWIZZLE_ZZZZ},
    165    {"scale", {STATE_FOG_PARAMS}, SWIZZLE_WWWW},
    166 };
    167 
    168 static const struct gl_builtin_uniform_element gl_NormalScale_elements[] = {
    169    {NULL, {STATE_NORMAL_SCALE}, SWIZZLE_XXXX},
    170 };
    171 
    172 static const struct gl_builtin_uniform_element gl_FogParamsOptimizedMESA_elements[] = {
    173    {NULL, {STATE_INTERNAL, STATE_FOG_PARAMS_OPTIMIZED}, SWIZZLE_XYZW},
    174 };
    175 
    176 static const struct gl_builtin_uniform_element gl_CurrentAttribVertMESA_elements[] = {
    177    {NULL, {STATE_INTERNAL, STATE_CURRENT_ATTRIB, 0}, SWIZZLE_XYZW},
    178 };
    179 
    180 static const struct gl_builtin_uniform_element gl_CurrentAttribFragMESA_elements[] = {
    181    {NULL, {STATE_INTERNAL, STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, 0}, SWIZZLE_XYZW},
    182 };
    183 
    184 #define MATRIX(name, statevar, modifier)				\
    185    static const struct gl_builtin_uniform_element name ## _elements[] = { \
    186       { NULL, { statevar, 0, 0, 0, modifier}, SWIZZLE_XYZW },		\
    187       { NULL, { statevar, 0, 1, 1, modifier}, SWIZZLE_XYZW },		\
    188       { NULL, { statevar, 0, 2, 2, modifier}, SWIZZLE_XYZW },		\
    189       { NULL, { statevar, 0, 3, 3, modifier}, SWIZZLE_XYZW },		\
    190    }
    191 
    192 MATRIX(gl_ModelViewMatrix,
    193        STATE_MODELVIEW_MATRIX, STATE_MATRIX_TRANSPOSE);
    194 MATRIX(gl_ModelViewMatrixInverse,
    195        STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVTRANS);
    196 MATRIX(gl_ModelViewMatrixTranspose,
    197        STATE_MODELVIEW_MATRIX, 0);
    198 MATRIX(gl_ModelViewMatrixInverseTranspose,
    199        STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVERSE);
    200 
    201 MATRIX(gl_ProjectionMatrix,
    202        STATE_PROJECTION_MATRIX, STATE_MATRIX_TRANSPOSE);
    203 MATRIX(gl_ProjectionMatrixInverse,
    204        STATE_PROJECTION_MATRIX, STATE_MATRIX_INVTRANS);
    205 MATRIX(gl_ProjectionMatrixTranspose,
    206        STATE_PROJECTION_MATRIX, 0);
    207 MATRIX(gl_ProjectionMatrixInverseTranspose,
    208        STATE_PROJECTION_MATRIX, STATE_MATRIX_INVERSE);
    209 
    210 MATRIX(gl_ModelViewProjectionMatrix,
    211        STATE_MVP_MATRIX, STATE_MATRIX_TRANSPOSE);
    212 MATRIX(gl_ModelViewProjectionMatrixInverse,
    213        STATE_MVP_MATRIX, STATE_MATRIX_INVTRANS);
    214 MATRIX(gl_ModelViewProjectionMatrixTranspose,
    215        STATE_MVP_MATRIX, 0);
    216 MATRIX(gl_ModelViewProjectionMatrixInverseTranspose,
    217        STATE_MVP_MATRIX, STATE_MATRIX_INVERSE);
    218 
    219 MATRIX(gl_TextureMatrix,
    220        STATE_TEXTURE_MATRIX, STATE_MATRIX_TRANSPOSE);
    221 MATRIX(gl_TextureMatrixInverse,
    222        STATE_TEXTURE_MATRIX, STATE_MATRIX_INVTRANS);
    223 MATRIX(gl_TextureMatrixTranspose,
    224        STATE_TEXTURE_MATRIX, 0);
    225 MATRIX(gl_TextureMatrixInverseTranspose,
    226        STATE_TEXTURE_MATRIX, STATE_MATRIX_INVERSE);
    227 
    228 static const struct gl_builtin_uniform_element gl_NormalMatrix_elements[] = {
    229    { NULL, { STATE_MODELVIEW_MATRIX, 0, 0, 0, STATE_MATRIX_INVERSE},
    230      MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
    231    { NULL, { STATE_MODELVIEW_MATRIX, 0, 1, 1, STATE_MATRIX_INVERSE},
    232      MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
    233    { NULL, { STATE_MODELVIEW_MATRIX, 0, 2, 2, STATE_MATRIX_INVERSE},
    234      MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
    235 };
    236 
    237 #undef MATRIX
    238 
    239 #define STATEVAR(name) {#name, name ## _elements, ARRAY_SIZE(name ## _elements)}
    240 
    241 static const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[] = {
    242    STATEVAR(gl_PatchVerticesIn),
    243    STATEVAR(gl_NumSamples),
    244    STATEVAR(gl_DepthRange),
    245    STATEVAR(gl_ClipPlane),
    246    STATEVAR(gl_Point),
    247    STATEVAR(gl_FrontMaterial),
    248    STATEVAR(gl_BackMaterial),
    249    STATEVAR(gl_LightSource),
    250    STATEVAR(gl_LightModel),
    251    STATEVAR(gl_FrontLightModelProduct),
    252    STATEVAR(gl_BackLightModelProduct),
    253    STATEVAR(gl_FrontLightProduct),
    254    STATEVAR(gl_BackLightProduct),
    255    STATEVAR(gl_TextureEnvColor),
    256    STATEVAR(gl_EyePlaneS),
    257    STATEVAR(gl_EyePlaneT),
    258    STATEVAR(gl_EyePlaneR),
    259    STATEVAR(gl_EyePlaneQ),
    260    STATEVAR(gl_ObjectPlaneS),
    261    STATEVAR(gl_ObjectPlaneT),
    262    STATEVAR(gl_ObjectPlaneR),
    263    STATEVAR(gl_ObjectPlaneQ),
    264    STATEVAR(gl_Fog),
    265 
    266    STATEVAR(gl_ModelViewMatrix),
    267    STATEVAR(gl_ModelViewMatrixInverse),
    268    STATEVAR(gl_ModelViewMatrixTranspose),
    269    STATEVAR(gl_ModelViewMatrixInverseTranspose),
    270 
    271    STATEVAR(gl_ProjectionMatrix),
    272    STATEVAR(gl_ProjectionMatrixInverse),
    273    STATEVAR(gl_ProjectionMatrixTranspose),
    274    STATEVAR(gl_ProjectionMatrixInverseTranspose),
    275 
    276    STATEVAR(gl_ModelViewProjectionMatrix),
    277    STATEVAR(gl_ModelViewProjectionMatrixInverse),
    278    STATEVAR(gl_ModelViewProjectionMatrixTranspose),
    279    STATEVAR(gl_ModelViewProjectionMatrixInverseTranspose),
    280 
    281    STATEVAR(gl_TextureMatrix),
    282    STATEVAR(gl_TextureMatrixInverse),
    283    STATEVAR(gl_TextureMatrixTranspose),
    284    STATEVAR(gl_TextureMatrixInverseTranspose),
    285 
    286    STATEVAR(gl_NormalMatrix),
    287    STATEVAR(gl_NormalScale),
    288 
    289    STATEVAR(gl_FogParamsOptimizedMESA),
    290    STATEVAR(gl_CurrentAttribVertMESA),
    291    STATEVAR(gl_CurrentAttribFragMESA),
    292 
    293    {NULL, NULL, 0}
    294 };
    295 
    296 
    297 namespace {
    298 
    299 /**
    300  * Data structure that accumulates fields for the gl_PerVertex interface
    301  * block.
    302  */
    303 class per_vertex_accumulator
    304 {
    305 public:
    306    per_vertex_accumulator();
    307    void add_field(int slot, const glsl_type *type, const char *name);
    308    const glsl_type *construct_interface_instance() const;
    309 
    310 private:
    311    glsl_struct_field fields[11];
    312    unsigned num_fields;
    313 };
    314 
    315 
    316 per_vertex_accumulator::per_vertex_accumulator()
    317    : fields(),
    318      num_fields(0)
    319 {
    320 }
    321 
    322 
    323 void
    324 per_vertex_accumulator::add_field(int slot, const glsl_type *type,
    325                                   const char *name)
    326 {
    327    assert(this->num_fields < ARRAY_SIZE(this->fields));
    328    this->fields[this->num_fields].type = type;
    329    this->fields[this->num_fields].name = name;
    330    this->fields[this->num_fields].matrix_layout = GLSL_MATRIX_LAYOUT_INHERITED;
    331    this->fields[this->num_fields].location = slot;
    332    this->fields[this->num_fields].offset = -1;
    333    this->fields[this->num_fields].interpolation = INTERP_MODE_NONE;
    334    this->fields[this->num_fields].centroid = 0;
    335    this->fields[this->num_fields].sample = 0;
    336    this->fields[this->num_fields].patch = 0;
    337    this->fields[this->num_fields].precision = GLSL_PRECISION_NONE;
    338    this->fields[this->num_fields].image_read_only = 0;
    339    this->fields[this->num_fields].image_write_only = 0;
    340    this->fields[this->num_fields].image_coherent = 0;
    341    this->fields[this->num_fields].image_volatile = 0;
    342    this->fields[this->num_fields].image_restrict = 0;
    343    this->fields[this->num_fields].explicit_xfb_buffer = 0;
    344    this->fields[this->num_fields].xfb_buffer = -1;
    345    this->fields[this->num_fields].xfb_stride = -1;
    346    this->num_fields++;
    347 }
    348 
    349 
    350 const glsl_type *
    351 per_vertex_accumulator::construct_interface_instance() const
    352 {
    353    return glsl_type::get_interface_instance(this->fields, this->num_fields,
    354                                             GLSL_INTERFACE_PACKING_STD140,
    355                                             false,
    356                                             "gl_PerVertex");
    357 }
    358 
    359 
    360 class builtin_variable_generator
    361 {
    362 public:
    363    builtin_variable_generator(exec_list *instructions,
    364                               struct _mesa_glsl_parse_state *state);
    365    void generate_constants();
    366    void generate_uniforms();
    367    void generate_vs_special_vars();
    368    void generate_tcs_special_vars();
    369    void generate_tes_special_vars();
    370    void generate_gs_special_vars();
    371    void generate_fs_special_vars();
    372    void generate_cs_special_vars();
    373    void generate_varyings();
    374 
    375 private:
    376    const glsl_type *array(const glsl_type *base, unsigned elements)
    377    {
    378       return glsl_type::get_array_instance(base, elements);
    379    }
    380 
    381    const glsl_type *type(const char *name)
    382    {
    383       return symtab->get_type(name);
    384    }
    385 
    386    ir_variable *add_input(int slot, const glsl_type *type, const char *name)
    387    {
    388       return add_variable(name, type, ir_var_shader_in, slot);
    389    }
    390 
    391    ir_variable *add_output(int slot, const glsl_type *type, const char *name)
    392    {
    393       return add_variable(name, type, ir_var_shader_out, slot);
    394    }
    395 
    396    ir_variable *add_index_output(int slot, int index, const glsl_type *type, const char *name)
    397    {
    398       return add_index_variable(name, type, ir_var_shader_out, slot, index);
    399    }
    400 
    401    ir_variable *add_system_value(int slot, const glsl_type *type,
    402                                  const char *name)
    403    {
    404       return add_variable(name, type, ir_var_system_value, slot);
    405    }
    406 
    407    ir_variable *add_variable(const char *name, const glsl_type *type,
    408                              enum ir_variable_mode mode, int slot);
    409    ir_variable *add_index_variable(const char *name, const glsl_type *type,
    410                              enum ir_variable_mode mode, int slot, int index);
    411    ir_variable *add_uniform(const glsl_type *type, const char *name);
    412    ir_variable *add_const(const char *name, int value);
    413    ir_variable *add_const_ivec3(const char *name, int x, int y, int z);
    414    void add_varying(int slot, const glsl_type *type, const char *name);
    415 
    416    exec_list * const instructions;
    417    struct _mesa_glsl_parse_state * const state;
    418    glsl_symbol_table * const symtab;
    419 
    420    /**
    421     * True if compatibility-profile-only variables should be included.  (In
    422     * desktop GL, these are always included when the GLSL version is 1.30 and
    423     * or below).
    424     */
    425    const bool compatibility;
    426 
    427    const glsl_type * const bool_t;
    428    const glsl_type * const int_t;
    429    const glsl_type * const uint_t;
    430    const glsl_type * const float_t;
    431    const glsl_type * const vec2_t;
    432    const glsl_type * const vec3_t;
    433    const glsl_type * const vec4_t;
    434    const glsl_type * const uvec3_t;
    435    const glsl_type * const mat3_t;
    436    const glsl_type * const mat4_t;
    437 
    438    per_vertex_accumulator per_vertex_in;
    439    per_vertex_accumulator per_vertex_out;
    440 };
    441 
    442 
    443 builtin_variable_generator::builtin_variable_generator(
    444    exec_list *instructions, struct _mesa_glsl_parse_state *state)
    445    : instructions(instructions), state(state), symtab(state->symbols),
    446      compatibility(!state->is_version(140, 100)),
    447      bool_t(glsl_type::bool_type), int_t(glsl_type::int_type),
    448      uint_t(glsl_type::uint_type),
    449      float_t(glsl_type::float_type), vec2_t(glsl_type::vec2_type),
    450      vec3_t(glsl_type::vec3_type), vec4_t(glsl_type::vec4_type),
    451      uvec3_t(glsl_type::uvec3_type),
    452      mat3_t(glsl_type::mat3_type), mat4_t(glsl_type::mat4_type)
    453 {
    454 }
    455 
    456 ir_variable *
    457 builtin_variable_generator::add_index_variable(const char *name,
    458                                          const glsl_type *type,
    459                                          enum ir_variable_mode mode, int slot, int index)
    460 {
    461    ir_variable *var = new(symtab) ir_variable(type, name, mode);
    462    var->data.how_declared = ir_var_declared_implicitly;
    463 
    464    switch (var->data.mode) {
    465    case ir_var_auto:
    466    case ir_var_shader_in:
    467    case ir_var_uniform:
    468    case ir_var_system_value:
    469       var->data.read_only = true;
    470       break;
    471    case ir_var_shader_out:
    472    case ir_var_shader_storage:
    473       break;
    474    default:
    475       /* The only variables that are added using this function should be
    476        * uniforms, shader storage, shader inputs, and shader outputs, constants
    477        * (which use ir_var_auto), and system values.
    478        */
    479       assert(0);
    480       break;
    481    }
    482 
    483    var->data.location = slot;
    484    var->data.explicit_location = (slot >= 0);
    485    var->data.explicit_index = 1;
    486    var->data.index = index;
    487 
    488    /* Once the variable is created an initialized, add it to the symbol table
    489     * and add the declaration to the IR stream.
    490     */
    491    instructions->push_tail(var);
    492 
    493    symtab->add_variable(var);
    494    return var;
    495 }
    496 
    497 ir_variable *
    498 builtin_variable_generator::add_variable(const char *name,
    499                                          const glsl_type *type,
    500                                          enum ir_variable_mode mode, int slot)
    501 {
    502    ir_variable *var = new(symtab) ir_variable(type, name, mode);
    503    var->data.how_declared = ir_var_declared_implicitly;
    504 
    505    switch (var->data.mode) {
    506    case ir_var_auto:
    507    case ir_var_shader_in:
    508    case ir_var_uniform:
    509    case ir_var_system_value:
    510       var->data.read_only = true;
    511       break;
    512    case ir_var_shader_out:
    513    case ir_var_shader_storage:
    514       break;
    515    default:
    516       /* The only variables that are added using this function should be
    517        * uniforms, shader storage, shader inputs, and shader outputs, constants
    518        * (which use ir_var_auto), and system values.
    519        */
    520       assert(0);
    521       break;
    522    }
    523 
    524    var->data.location = slot;
    525    var->data.explicit_location = (slot >= 0);
    526    var->data.explicit_index = 0;
    527 
    528    /* Once the variable is created an initialized, add it to the symbol table
    529     * and add the declaration to the IR stream.
    530     */
    531    instructions->push_tail(var);
    532 
    533    symtab->add_variable(var);
    534    return var;
    535 }
    536 
    537 extern "C" const struct gl_builtin_uniform_desc *
    538 _mesa_glsl_get_builtin_uniform_desc(const char *name)
    539 {
    540    for (unsigned i = 0; _mesa_builtin_uniform_desc[i].name != NULL; i++) {
    541       if (strcmp(_mesa_builtin_uniform_desc[i].name, name) == 0) {
    542          return &_mesa_builtin_uniform_desc[i];
    543       }
    544    }
    545    return NULL;
    546 }
    547 
    548 ir_variable *
    549 builtin_variable_generator::add_uniform(const glsl_type *type,
    550                                         const char *name)
    551 {
    552    ir_variable *const uni = add_variable(name, type, ir_var_uniform, -1);
    553 
    554    const struct gl_builtin_uniform_desc* const statevar =
    555       _mesa_glsl_get_builtin_uniform_desc(name);
    556    assert(statevar != NULL);
    557 
    558    const unsigned array_count = type->is_array() ? type->length : 1;
    559 
    560    ir_state_slot *slots =
    561       uni->allocate_state_slots(array_count * statevar->num_elements);
    562 
    563    for (unsigned a = 0; a < array_count; a++) {
    564       for (unsigned j = 0; j < statevar->num_elements; j++) {
    565 	 const struct gl_builtin_uniform_element *element =
    566 	    &statevar->elements[j];
    567 
    568 	 memcpy(slots->tokens, element->tokens, sizeof(element->tokens));
    569 	 if (type->is_array()) {
    570 	    if (strcmp(name, "gl_CurrentAttribVertMESA") == 0 ||
    571 		strcmp(name, "gl_CurrentAttribFragMESA") == 0) {
    572 	       slots->tokens[2] = a;
    573 	    } else {
    574 	       slots->tokens[1] = a;
    575 	    }
    576 	 }
    577 
    578 	 slots->swizzle = element->swizzle;
    579 	 slots++;
    580       }
    581    }
    582 
    583    return uni;
    584 }
    585 
    586 
    587 ir_variable *
    588 builtin_variable_generator::add_const(const char *name, int value)
    589 {
    590    ir_variable *const var = add_variable(name, glsl_type::int_type,
    591 					 ir_var_auto, -1);
    592    var->constant_value = new(var) ir_constant(value);
    593    var->constant_initializer = new(var) ir_constant(value);
    594    var->data.has_initializer = true;
    595    return var;
    596 }
    597 
    598 
    599 ir_variable *
    600 builtin_variable_generator::add_const_ivec3(const char *name, int x, int y,
    601                                             int z)
    602 {
    603    ir_variable *const var = add_variable(name, glsl_type::ivec3_type,
    604                                          ir_var_auto, -1);
    605    ir_constant_data data;
    606    memset(&data, 0, sizeof(data));
    607    data.i[0] = x;
    608    data.i[1] = y;
    609    data.i[2] = z;
    610    var->constant_value = new(var) ir_constant(glsl_type::ivec3_type, &data);
    611    var->constant_initializer =
    612       new(var) ir_constant(glsl_type::ivec3_type, &data);
    613    var->data.has_initializer = true;
    614    return var;
    615 }
    616 
    617 
    618 void
    619 builtin_variable_generator::generate_constants()
    620 {
    621    add_const("gl_MaxVertexAttribs", state->Const.MaxVertexAttribs);
    622    add_const("gl_MaxVertexTextureImageUnits",
    623              state->Const.MaxVertexTextureImageUnits);
    624    add_const("gl_MaxCombinedTextureImageUnits",
    625              state->Const.MaxCombinedTextureImageUnits);
    626    add_const("gl_MaxTextureImageUnits", state->Const.MaxTextureImageUnits);
    627    add_const("gl_MaxDrawBuffers", state->Const.MaxDrawBuffers);
    628 
    629    /* Max uniforms/varyings: GLSL ES counts these in units of vectors; desktop
    630     * GL counts them in units of "components" or "floats".
    631     */
    632    if (state->is_version(410, 100)) {
    633       add_const("gl_MaxVertexUniformVectors",
    634                 state->Const.MaxVertexUniformComponents / 4);
    635       add_const("gl_MaxFragmentUniformVectors",
    636                 state->Const.MaxFragmentUniformComponents / 4);
    637 
    638       /* In GLSL ES 3.00, gl_MaxVaryingVectors was split out to separate
    639        * vertex and fragment shader constants.
    640        */
    641       if (state->is_version(0, 300)) {
    642          add_const("gl_MaxVertexOutputVectors",
    643                    state->ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4);
    644          add_const("gl_MaxFragmentInputVectors",
    645                    state->ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents / 4);
    646       } else {
    647          add_const("gl_MaxVaryingVectors",
    648                    state->ctx->Const.MaxVarying);
    649       }
    650 
    651       /* EXT_blend_func_extended brings a built in constant
    652        * for determining number of dual source draw buffers
    653        */
    654       if (state->EXT_blend_func_extended_enable) {
    655          add_const("gl_MaxDualSourceDrawBuffersEXT",
    656                    state->Const.MaxDualSourceDrawBuffers);
    657       }
    658    } else {
    659       add_const("gl_MaxVertexUniformComponents",
    660                 state->Const.MaxVertexUniformComponents);
    661 
    662       /* Note: gl_MaxVaryingFloats was deprecated in GLSL 1.30+, but not
    663        * removed
    664        */
    665       add_const("gl_MaxVaryingFloats", state->ctx->Const.MaxVarying * 4);
    666 
    667       add_const("gl_MaxFragmentUniformComponents",
    668                 state->Const.MaxFragmentUniformComponents);
    669    }
    670 
    671    /* Texel offsets were introduced in ARB_shading_language_420pack (which
    672     * requires desktop GLSL version 130), and adopted into desktop GLSL
    673     * version 4.20 and GLSL ES version 3.00.
    674     */
    675    if ((state->is_version(130, 0) &&
    676         state->ARB_shading_language_420pack_enable) ||
    677       state->is_version(420, 300)) {
    678       add_const("gl_MinProgramTexelOffset",
    679                 state->Const.MinProgramTexelOffset);
    680       add_const("gl_MaxProgramTexelOffset",
    681                 state->Const.MaxProgramTexelOffset);
    682    }
    683 
    684    if (state->has_clip_distance()) {
    685       add_const("gl_MaxClipDistances", state->Const.MaxClipPlanes);
    686    }
    687    if (state->is_version(130, 0)) {
    688       add_const("gl_MaxVaryingComponents", state->ctx->Const.MaxVarying * 4);
    689    }
    690    if (state->has_cull_distance()) {
    691       add_const("gl_MaxCullDistances", state->Const.MaxClipPlanes);
    692       add_const("gl_MaxCombinedClipAndCullDistances",
    693                 state->Const.MaxClipPlanes);
    694    }
    695 
    696    if (state->has_geometry_shader()) {
    697       add_const("gl_MaxVertexOutputComponents",
    698                 state->Const.MaxVertexOutputComponents);
    699       add_const("gl_MaxGeometryInputComponents",
    700                 state->Const.MaxGeometryInputComponents);
    701       add_const("gl_MaxGeometryOutputComponents",
    702                 state->Const.MaxGeometryOutputComponents);
    703       add_const("gl_MaxFragmentInputComponents",
    704                 state->Const.MaxFragmentInputComponents);
    705       add_const("gl_MaxGeometryTextureImageUnits",
    706                 state->Const.MaxGeometryTextureImageUnits);
    707       add_const("gl_MaxGeometryOutputVertices",
    708                 state->Const.MaxGeometryOutputVertices);
    709       add_const("gl_MaxGeometryTotalOutputComponents",
    710                 state->Const.MaxGeometryTotalOutputComponents);
    711       add_const("gl_MaxGeometryUniformComponents",
    712                 state->Const.MaxGeometryUniformComponents);
    713 
    714       /* Note: the GLSL 1.50-4.40 specs require
    715        * gl_MaxGeometryVaryingComponents to be present, and to be at least 64.
    716        * But they do not define what it means (and there does not appear to be
    717        * any corresponding constant in the GL specs).  However,
    718        * ARB_geometry_shader4 defines MAX_GEOMETRY_VARYING_COMPONENTS_ARB to
    719        * be the maximum number of components available for use as geometry
    720        * outputs.  So we assume this is a synonym for
    721        * gl_MaxGeometryOutputComponents.
    722        */
    723       add_const("gl_MaxGeometryVaryingComponents",
    724                 state->Const.MaxGeometryOutputComponents);
    725    }
    726 
    727    if (compatibility) {
    728       /* Note: gl_MaxLights stopped being listed as an explicit constant in
    729        * GLSL 1.30, however it continues to be referred to (as a minimum size
    730        * for compatibility-mode uniforms) all the way up through GLSL 4.30, so
    731        * this seems like it was probably an oversight.
    732        */
    733       add_const("gl_MaxLights", state->Const.MaxLights);
    734 
    735       add_const("gl_MaxClipPlanes", state->Const.MaxClipPlanes);
    736 
    737       /* Note: gl_MaxTextureUnits wasn't made compatibility-only until GLSL
    738        * 1.50, however this seems like it was probably an oversight.
    739        */
    740       add_const("gl_MaxTextureUnits", state->Const.MaxTextureUnits);
    741 
    742       /* Note: gl_MaxTextureCoords was left out of GLSL 1.40, but it was
    743        * re-introduced in GLSL 1.50, so this seems like it was probably an
    744        * oversight.
    745        */
    746       add_const("gl_MaxTextureCoords", state->Const.MaxTextureCoords);
    747    }
    748 
    749    if (state->has_atomic_counters()) {
    750       add_const("gl_MaxVertexAtomicCounters",
    751                 state->Const.MaxVertexAtomicCounters);
    752       add_const("gl_MaxFragmentAtomicCounters",
    753                 state->Const.MaxFragmentAtomicCounters);
    754       add_const("gl_MaxCombinedAtomicCounters",
    755                 state->Const.MaxCombinedAtomicCounters);
    756       add_const("gl_MaxAtomicCounterBindings",
    757                 state->Const.MaxAtomicBufferBindings);
    758 
    759       if (state->has_geometry_shader()) {
    760          add_const("gl_MaxGeometryAtomicCounters",
    761                    state->Const.MaxGeometryAtomicCounters);
    762       }
    763       if (state->is_version(110, 320)) {
    764          add_const("gl_MaxTessControlAtomicCounters",
    765                    state->Const.MaxTessControlAtomicCounters);
    766          add_const("gl_MaxTessEvaluationAtomicCounters",
    767                    state->Const.MaxTessEvaluationAtomicCounters);
    768       }
    769    }
    770 
    771    if (state->is_version(420, 310)) {
    772       add_const("gl_MaxVertexAtomicCounterBuffers",
    773                 state->Const.MaxVertexAtomicCounterBuffers);
    774       add_const("gl_MaxFragmentAtomicCounterBuffers",
    775                 state->Const.MaxFragmentAtomicCounterBuffers);
    776       add_const("gl_MaxCombinedAtomicCounterBuffers",
    777                 state->Const.MaxCombinedAtomicCounterBuffers);
    778       add_const("gl_MaxAtomicCounterBufferSize",
    779                 state->Const.MaxAtomicCounterBufferSize);
    780 
    781       if (state->has_geometry_shader()) {
    782          add_const("gl_MaxGeometryAtomicCounterBuffers",
    783                    state->Const.MaxGeometryAtomicCounterBuffers);
    784       }
    785       if (state->is_version(110, 320)) {
    786          add_const("gl_MaxTessControlAtomicCounterBuffers",
    787                    state->Const.MaxTessControlAtomicCounterBuffers);
    788          add_const("gl_MaxTessEvaluationAtomicCounterBuffers",
    789                    state->Const.MaxTessEvaluationAtomicCounterBuffers);
    790       }
    791    }
    792 
    793    if (state->is_version(430, 310) || state->ARB_compute_shader_enable) {
    794       add_const("gl_MaxComputeAtomicCounterBuffers",
    795                 state->Const.MaxComputeAtomicCounterBuffers);
    796       add_const("gl_MaxComputeAtomicCounters",
    797                 state->Const.MaxComputeAtomicCounters);
    798       add_const("gl_MaxComputeImageUniforms",
    799                 state->Const.MaxComputeImageUniforms);
    800       add_const("gl_MaxComputeTextureImageUnits",
    801                 state->Const.MaxComputeTextureImageUnits);
    802       add_const("gl_MaxComputeUniformComponents",
    803                 state->Const.MaxComputeUniformComponents);
    804 
    805       add_const_ivec3("gl_MaxComputeWorkGroupCount",
    806                       state->Const.MaxComputeWorkGroupCount[0],
    807                       state->Const.MaxComputeWorkGroupCount[1],
    808                       state->Const.MaxComputeWorkGroupCount[2]);
    809       add_const_ivec3("gl_MaxComputeWorkGroupSize",
    810                       state->Const.MaxComputeWorkGroupSize[0],
    811                       state->Const.MaxComputeWorkGroupSize[1],
    812                       state->Const.MaxComputeWorkGroupSize[2]);
    813 
    814       /* From the GLSL 4.40 spec, section 7.1 (Built-In Language Variables):
    815        *
    816        *     The built-in constant gl_WorkGroupSize is a compute-shader
    817        *     constant containing the local work-group size of the shader.  The
    818        *     size of the work group in the X, Y, and Z dimensions is stored in
    819        *     the x, y, and z components.  The constants values in
    820        *     gl_WorkGroupSize will match those specified in the required
    821        *     local_size_x, local_size_y, and local_size_z layout qualifiers
    822        *     for the current shader.  This is a constant so that it can be
    823        *     used to size arrays of memory that can be shared within the local
    824        *     work group.  It is a compile-time error to use gl_WorkGroupSize
    825        *     in a shader that does not declare a fixed local group size, or
    826        *     before that shader has declared a fixed local group size, using
    827        *     local_size_x, local_size_y, and local_size_z.
    828        *
    829        * To prevent the shader from trying to refer to gl_WorkGroupSize before
    830        * the layout declaration, we don't define it here.  Intead we define it
    831        * in ast_cs_input_layout::hir().
    832        */
    833    }
    834 
    835    if (state->has_enhanced_layouts()) {
    836       add_const("gl_MaxTransformFeedbackBuffers",
    837                 state->Const.MaxTransformFeedbackBuffers);
    838       add_const("gl_MaxTransformFeedbackInterleavedComponents",
    839                 state->Const.MaxTransformFeedbackInterleavedComponents);
    840    }
    841 
    842    if (state->is_version(420, 310) ||
    843        state->ARB_shader_image_load_store_enable) {
    844       add_const("gl_MaxImageUnits",
    845                 state->Const.MaxImageUnits);
    846       add_const("gl_MaxVertexImageUniforms",
    847                 state->Const.MaxVertexImageUniforms);
    848       add_const("gl_MaxFragmentImageUniforms",
    849                 state->Const.MaxFragmentImageUniforms);
    850       add_const("gl_MaxCombinedImageUniforms",
    851                 state->Const.MaxCombinedImageUniforms);
    852 
    853       if (state->has_geometry_shader()) {
    854          add_const("gl_MaxGeometryImageUniforms",
    855                    state->Const.MaxGeometryImageUniforms);
    856       }
    857 
    858       if (!state->es_shader) {
    859          add_const("gl_MaxCombinedImageUnitsAndFragmentOutputs",
    860                    state->Const.MaxCombinedShaderOutputResources);
    861          add_const("gl_MaxImageSamples",
    862                    state->Const.MaxImageSamples);
    863       }
    864 
    865       if (state->has_tessellation_shader()) {
    866          add_const("gl_MaxTessControlImageUniforms",
    867                    state->Const.MaxTessControlImageUniforms);
    868          add_const("gl_MaxTessEvaluationImageUniforms",
    869                    state->Const.MaxTessEvaluationImageUniforms);
    870       }
    871    }
    872 
    873    if (state->is_version(440, 310) ||
    874        state->ARB_ES3_1_compatibility_enable) {
    875       add_const("gl_MaxCombinedShaderOutputResources",
    876                 state->Const.MaxCombinedShaderOutputResources);
    877    }
    878 
    879    if (state->is_version(410, 0) ||
    880        state->ARB_viewport_array_enable ||
    881        state->OES_viewport_array_enable)
    882       add_const("gl_MaxViewports", state->Const.MaxViewports);
    883 
    884    if (state->has_tessellation_shader()) {
    885       add_const("gl_MaxPatchVertices", state->Const.MaxPatchVertices);
    886       add_const("gl_MaxTessGenLevel", state->Const.MaxTessGenLevel);
    887       add_const("gl_MaxTessControlInputComponents", state->Const.MaxTessControlInputComponents);
    888       add_const("gl_MaxTessControlOutputComponents", state->Const.MaxTessControlOutputComponents);
    889       add_const("gl_MaxTessControlTextureImageUnits", state->Const.MaxTessControlTextureImageUnits);
    890       add_const("gl_MaxTessEvaluationInputComponents", state->Const.MaxTessEvaluationInputComponents);
    891       add_const("gl_MaxTessEvaluationOutputComponents", state->Const.MaxTessEvaluationOutputComponents);
    892       add_const("gl_MaxTessEvaluationTextureImageUnits", state->Const.MaxTessEvaluationTextureImageUnits);
    893       add_const("gl_MaxTessPatchComponents", state->Const.MaxTessPatchComponents);
    894       add_const("gl_MaxTessControlTotalOutputComponents", state->Const.MaxTessControlTotalOutputComponents);
    895       add_const("gl_MaxTessControlUniformComponents", state->Const.MaxTessControlUniformComponents);
    896       add_const("gl_MaxTessEvaluationUniformComponents", state->Const.MaxTessEvaluationUniformComponents);
    897    }
    898 
    899    if (state->is_version(450, 320) ||
    900        state->OES_sample_variables_enable ||
    901        state->ARB_ES3_1_compatibility_enable)
    902       add_const("gl_MaxSamples", state->Const.MaxSamples);
    903 }
    904 
    905 
    906 /**
    907  * Generate uniform variables (which exist in all types of shaders).
    908  */
    909 void
    910 builtin_variable_generator::generate_uniforms()
    911 {
    912    if (state->is_version(400, 320) ||
    913        state->ARB_sample_shading_enable ||
    914        state->OES_sample_variables_enable)
    915       add_uniform(int_t, "gl_NumSamples");
    916    add_uniform(type("gl_DepthRangeParameters"), "gl_DepthRange");
    917    add_uniform(array(vec4_t, VERT_ATTRIB_MAX), "gl_CurrentAttribVertMESA");
    918    add_uniform(array(vec4_t, VARYING_SLOT_MAX), "gl_CurrentAttribFragMESA");
    919 
    920    if (compatibility) {
    921       add_uniform(mat4_t, "gl_ModelViewMatrix");
    922       add_uniform(mat4_t, "gl_ProjectionMatrix");
    923       add_uniform(mat4_t, "gl_ModelViewProjectionMatrix");
    924       add_uniform(mat3_t, "gl_NormalMatrix");
    925       add_uniform(mat4_t, "gl_ModelViewMatrixInverse");
    926       add_uniform(mat4_t, "gl_ProjectionMatrixInverse");
    927       add_uniform(mat4_t, "gl_ModelViewProjectionMatrixInverse");
    928       add_uniform(mat4_t, "gl_ModelViewMatrixTranspose");
    929       add_uniform(mat4_t, "gl_ProjectionMatrixTranspose");
    930       add_uniform(mat4_t, "gl_ModelViewProjectionMatrixTranspose");
    931       add_uniform(mat4_t, "gl_ModelViewMatrixInverseTranspose");
    932       add_uniform(mat4_t, "gl_ProjectionMatrixInverseTranspose");
    933       add_uniform(mat4_t, "gl_ModelViewProjectionMatrixInverseTranspose");
    934       add_uniform(float_t, "gl_NormalScale");
    935       add_uniform(type("gl_LightModelParameters"), "gl_LightModel");
    936       add_uniform(vec4_t, "gl_FogParamsOptimizedMESA");
    937 
    938       const glsl_type *const mat4_array_type =
    939 	 array(mat4_t, state->Const.MaxTextureCoords);
    940       add_uniform(mat4_array_type, "gl_TextureMatrix");
    941       add_uniform(mat4_array_type, "gl_TextureMatrixInverse");
    942       add_uniform(mat4_array_type, "gl_TextureMatrixTranspose");
    943       add_uniform(mat4_array_type, "gl_TextureMatrixInverseTranspose");
    944 
    945       add_uniform(array(vec4_t, state->Const.MaxClipPlanes), "gl_ClipPlane");
    946       add_uniform(type("gl_PointParameters"), "gl_Point");
    947 
    948       const glsl_type *const material_parameters_type =
    949 	 type("gl_MaterialParameters");
    950       add_uniform(material_parameters_type, "gl_FrontMaterial");
    951       add_uniform(material_parameters_type, "gl_BackMaterial");
    952 
    953       add_uniform(array(type("gl_LightSourceParameters"),
    954                         state->Const.MaxLights),
    955                   "gl_LightSource");
    956 
    957       const glsl_type *const light_model_products_type =
    958          type("gl_LightModelProducts");
    959       add_uniform(light_model_products_type, "gl_FrontLightModelProduct");
    960       add_uniform(light_model_products_type, "gl_BackLightModelProduct");
    961 
    962       const glsl_type *const light_products_type =
    963          array(type("gl_LightProducts"), state->Const.MaxLights);
    964       add_uniform(light_products_type, "gl_FrontLightProduct");
    965       add_uniform(light_products_type, "gl_BackLightProduct");
    966 
    967       add_uniform(array(vec4_t, state->Const.MaxTextureUnits),
    968                   "gl_TextureEnvColor");
    969 
    970       const glsl_type *const texcoords_vec4 =
    971 	 array(vec4_t, state->Const.MaxTextureCoords);
    972       add_uniform(texcoords_vec4, "gl_EyePlaneS");
    973       add_uniform(texcoords_vec4, "gl_EyePlaneT");
    974       add_uniform(texcoords_vec4, "gl_EyePlaneR");
    975       add_uniform(texcoords_vec4, "gl_EyePlaneQ");
    976       add_uniform(texcoords_vec4, "gl_ObjectPlaneS");
    977       add_uniform(texcoords_vec4, "gl_ObjectPlaneT");
    978       add_uniform(texcoords_vec4, "gl_ObjectPlaneR");
    979       add_uniform(texcoords_vec4, "gl_ObjectPlaneQ");
    980 
    981       add_uniform(type("gl_FogParameters"), "gl_Fog");
    982    }
    983 }
    984 
    985 
    986 /**
    987  * Generate variables which only exist in vertex shaders.
    988  */
    989 void
    990 builtin_variable_generator::generate_vs_special_vars()
    991 {
    992    ir_variable *var;
    993 
    994    if (state->is_version(130, 300))
    995       add_system_value(SYSTEM_VALUE_VERTEX_ID, int_t, "gl_VertexID");
    996    if (state->ARB_draw_instanced_enable)
    997       add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, "gl_InstanceIDARB");
    998    if (state->ARB_draw_instanced_enable || state->is_version(140, 300))
    999       add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, "gl_InstanceID");
   1000    if (state->ARB_shader_draw_parameters_enable) {
   1001       add_system_value(SYSTEM_VALUE_BASE_VERTEX, int_t, "gl_BaseVertexARB");
   1002       add_system_value(SYSTEM_VALUE_BASE_INSTANCE, int_t, "gl_BaseInstanceARB");
   1003       add_system_value(SYSTEM_VALUE_DRAW_ID, int_t, "gl_DrawIDARB");
   1004    }
   1005    if (state->AMD_vertex_shader_layer_enable ||
   1006        state->ARB_shader_viewport_layer_array_enable) {
   1007       var = add_output(VARYING_SLOT_LAYER, int_t, "gl_Layer");
   1008       var->data.interpolation = INTERP_MODE_FLAT;
   1009    }
   1010    if (state->AMD_vertex_shader_viewport_index_enable ||
   1011        state->ARB_shader_viewport_layer_array_enable) {
   1012       var = add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
   1013       var->data.interpolation = INTERP_MODE_FLAT;
   1014    }
   1015    if (compatibility) {
   1016       add_input(VERT_ATTRIB_POS, vec4_t, "gl_Vertex");
   1017       add_input(VERT_ATTRIB_NORMAL, vec3_t, "gl_Normal");
   1018       add_input(VERT_ATTRIB_COLOR0, vec4_t, "gl_Color");
   1019       add_input(VERT_ATTRIB_COLOR1, vec4_t, "gl_SecondaryColor");
   1020       add_input(VERT_ATTRIB_TEX0, vec4_t, "gl_MultiTexCoord0");
   1021       add_input(VERT_ATTRIB_TEX1, vec4_t, "gl_MultiTexCoord1");
   1022       add_input(VERT_ATTRIB_TEX2, vec4_t, "gl_MultiTexCoord2");
   1023       add_input(VERT_ATTRIB_TEX3, vec4_t, "gl_MultiTexCoord3");
   1024       add_input(VERT_ATTRIB_TEX4, vec4_t, "gl_MultiTexCoord4");
   1025       add_input(VERT_ATTRIB_TEX5, vec4_t, "gl_MultiTexCoord5");
   1026       add_input(VERT_ATTRIB_TEX6, vec4_t, "gl_MultiTexCoord6");
   1027       add_input(VERT_ATTRIB_TEX7, vec4_t, "gl_MultiTexCoord7");
   1028       add_input(VERT_ATTRIB_FOG, float_t, "gl_FogCoord");
   1029    }
   1030 }
   1031 
   1032 
   1033 /**
   1034  * Generate variables which only exist in tessellation control shaders.
   1035  */
   1036 void
   1037 builtin_variable_generator::generate_tcs_special_vars()
   1038 {
   1039    add_system_value(SYSTEM_VALUE_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
   1040    add_system_value(SYSTEM_VALUE_INVOCATION_ID, int_t, "gl_InvocationID");
   1041 
   1042    if (state->ctx->Const.LowerTCSPatchVerticesIn) {
   1043       add_uniform(int_t, "gl_PatchVerticesIn");
   1044    } else {
   1045       add_system_value(SYSTEM_VALUE_VERTICES_IN, int_t, "gl_PatchVerticesIn");
   1046    }
   1047 
   1048    add_output(VARYING_SLOT_TESS_LEVEL_OUTER, array(float_t, 4),
   1049               "gl_TessLevelOuter")->data.patch = 1;
   1050    add_output(VARYING_SLOT_TESS_LEVEL_INNER, array(float_t, 2),
   1051               "gl_TessLevelInner")->data.patch = 1;
   1052    /* XXX What to do if multiple are flipped on? */
   1053    int bbox_slot = state->ctx->Const.NoPrimitiveBoundingBoxOutput ? -1 :
   1054       VARYING_SLOT_BOUNDING_BOX0;
   1055    if (state->EXT_primitive_bounding_box_enable)
   1056       add_output(bbox_slot, array(vec4_t, 2), "gl_BoundingBoxEXT")
   1057          ->data.patch = 1;
   1058    if (state->OES_primitive_bounding_box_enable)
   1059       add_output(bbox_slot, array(vec4_t, 2), "gl_BoundingBoxOES")
   1060          ->data.patch = 1;
   1061    if (state->is_version(0, 320) || state->ARB_ES3_2_compatibility_enable)
   1062       add_output(bbox_slot, array(vec4_t, 2), "gl_BoundingBox")
   1063          ->data.patch = 1;
   1064 }
   1065 
   1066 
   1067 /**
   1068  * Generate variables which only exist in tessellation evaluation shaders.
   1069  */
   1070 void
   1071 builtin_variable_generator::generate_tes_special_vars()
   1072 {
   1073    ir_variable *var;
   1074 
   1075    add_system_value(SYSTEM_VALUE_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
   1076    add_system_value(SYSTEM_VALUE_VERTICES_IN, int_t, "gl_PatchVerticesIn");
   1077    add_system_value(SYSTEM_VALUE_TESS_COORD, vec3_t, "gl_TessCoord");
   1078    if (this->state->ctx->Const.GLSLTessLevelsAsInputs) {
   1079       add_input(VARYING_SLOT_TESS_LEVEL_OUTER, array(float_t, 4),
   1080                 "gl_TessLevelOuter")->data.patch = 1;
   1081       add_input(VARYING_SLOT_TESS_LEVEL_INNER, array(float_t, 2),
   1082                 "gl_TessLevelInner")->data.patch = 1;
   1083    } else {
   1084       add_system_value(SYSTEM_VALUE_TESS_LEVEL_OUTER, array(float_t, 4),
   1085                        "gl_TessLevelOuter");
   1086       add_system_value(SYSTEM_VALUE_TESS_LEVEL_INNER, array(float_t, 2),
   1087                        "gl_TessLevelInner");
   1088    }
   1089    if (state->ARB_shader_viewport_layer_array_enable) {
   1090       var = add_output(VARYING_SLOT_LAYER, int_t, "gl_Layer");
   1091       var->data.interpolation = INTERP_MODE_FLAT;
   1092       var = add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
   1093       var->data.interpolation = INTERP_MODE_FLAT;
   1094    }
   1095 }
   1096 
   1097 
   1098 /**
   1099  * Generate variables which only exist in geometry shaders.
   1100  */
   1101 void
   1102 builtin_variable_generator::generate_gs_special_vars()
   1103 {
   1104    ir_variable *var;
   1105 
   1106    var = add_output(VARYING_SLOT_LAYER, int_t, "gl_Layer");
   1107    var->data.interpolation = INTERP_MODE_FLAT;
   1108    if (state->is_version(410, 0) || state->ARB_viewport_array_enable ||
   1109        state->OES_viewport_array_enable) {
   1110       var = add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
   1111       var->data.interpolation = INTERP_MODE_FLAT;
   1112    }
   1113    if (state->is_version(400, 320) || state->ARB_gpu_shader5_enable ||
   1114        state->OES_geometry_shader_enable || state->EXT_geometry_shader_enable) {
   1115       add_system_value(SYSTEM_VALUE_INVOCATION_ID, int_t, "gl_InvocationID");
   1116    }
   1117 
   1118    /* Although gl_PrimitiveID appears in tessellation control and tessellation
   1119     * evaluation shaders, it has a different function there than it has in
   1120     * geometry shaders, so we treat it (and its counterpart gl_PrimitiveIDIn)
   1121     * as special geometry shader variables.
   1122     *
   1123     * Note that although the general convention of suffixing geometry shader
   1124     * input varyings with "In" was not adopted into GLSL 1.50, it is used in
   1125     * the specific case of gl_PrimitiveIDIn.  So we don't need to treat
   1126     * gl_PrimitiveIDIn as an {ARB,EXT}_geometry_shader4-only variable.
   1127     */
   1128    var = add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveIDIn");
   1129    var->data.interpolation = INTERP_MODE_FLAT;
   1130    var = add_output(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
   1131    var->data.interpolation = INTERP_MODE_FLAT;
   1132 }
   1133 
   1134 
   1135 /**
   1136  * Generate variables which only exist in fragment shaders.
   1137  */
   1138 void
   1139 builtin_variable_generator::generate_fs_special_vars()
   1140 {
   1141    ir_variable *var;
   1142 
   1143    if (this->state->ctx->Const.GLSLFragCoordIsSysVal)
   1144       add_system_value(SYSTEM_VALUE_FRAG_COORD, vec4_t, "gl_FragCoord");
   1145    else
   1146       add_input(VARYING_SLOT_POS, vec4_t, "gl_FragCoord");
   1147 
   1148    if (this->state->ctx->Const.GLSLFrontFacingIsSysVal)
   1149       add_system_value(SYSTEM_VALUE_FRONT_FACE, bool_t, "gl_FrontFacing");
   1150    else
   1151       add_input(VARYING_SLOT_FACE, bool_t, "gl_FrontFacing");
   1152 
   1153    if (state->is_version(120, 100))
   1154       add_input(VARYING_SLOT_PNTC, vec2_t, "gl_PointCoord");
   1155 
   1156    if (state->has_geometry_shader()) {
   1157       var = add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
   1158       var->data.interpolation = INTERP_MODE_FLAT;
   1159    }
   1160 
   1161    /* gl_FragColor and gl_FragData were deprecated starting in desktop GLSL
   1162     * 1.30, and were relegated to the compatibility profile in GLSL 4.20.
   1163     * They were removed from GLSL ES 3.00.
   1164     */
   1165    if (compatibility || !state->is_version(420, 300)) {
   1166       add_output(FRAG_RESULT_COLOR, vec4_t, "gl_FragColor");
   1167       add_output(FRAG_RESULT_DATA0,
   1168                  array(vec4_t, state->Const.MaxDrawBuffers), "gl_FragData");
   1169    }
   1170 
   1171    if (state->has_framebuffer_fetch() && !state->is_version(130, 300)) {
   1172       ir_variable *const var =
   1173          add_output(FRAG_RESULT_DATA0,
   1174                     array(vec4_t, state->Const.MaxDrawBuffers),
   1175                     "gl_LastFragData");
   1176       var->data.precision = GLSL_PRECISION_MEDIUM;
   1177       var->data.read_only = 1;
   1178       var->data.fb_fetch_output = 1;
   1179    }
   1180 
   1181    if (state->es_shader && state->language_version == 100 && state->EXT_blend_func_extended_enable) {
   1182       add_index_output(FRAG_RESULT_COLOR, 1, vec4_t,
   1183                        "gl_SecondaryFragColorEXT");
   1184       add_index_output(FRAG_RESULT_DATA0, 1,
   1185                        array(vec4_t, state->Const.MaxDualSourceDrawBuffers),
   1186                        "gl_SecondaryFragDataEXT");
   1187    }
   1188 
   1189    /* gl_FragDepth has always been in desktop GLSL, but did not appear in GLSL
   1190     * ES 1.00.
   1191     */
   1192    if (state->is_version(110, 300))
   1193       add_output(FRAG_RESULT_DEPTH, float_t, "gl_FragDepth");
   1194 
   1195    if (state->ARB_shader_stencil_export_enable) {
   1196       ir_variable *const var =
   1197          add_output(FRAG_RESULT_STENCIL, int_t, "gl_FragStencilRefARB");
   1198       if (state->ARB_shader_stencil_export_warn)
   1199          var->enable_extension_warning("GL_ARB_shader_stencil_export");
   1200    }
   1201 
   1202    if (state->AMD_shader_stencil_export_enable) {
   1203       ir_variable *const var =
   1204          add_output(FRAG_RESULT_STENCIL, int_t, "gl_FragStencilRefAMD");
   1205       if (state->AMD_shader_stencil_export_warn)
   1206          var->enable_extension_warning("GL_AMD_shader_stencil_export");
   1207    }
   1208 
   1209    if (state->is_version(400, 320) ||
   1210        state->ARB_sample_shading_enable ||
   1211        state->OES_sample_variables_enable) {
   1212       add_system_value(SYSTEM_VALUE_SAMPLE_ID, int_t, "gl_SampleID");
   1213       add_system_value(SYSTEM_VALUE_SAMPLE_POS, vec2_t, "gl_SamplePosition");
   1214       /* From the ARB_sample_shading specification:
   1215        *    "The number of elements in the array is ceil(<s>/32), where
   1216        *    <s> is the maximum number of color samples supported by the
   1217        *    implementation."
   1218        * Since no drivers expose more than 32x MSAA, we can simply set
   1219        * the array size to 1 rather than computing it.
   1220        */
   1221       add_output(FRAG_RESULT_SAMPLE_MASK, array(int_t, 1), "gl_SampleMask");
   1222    }
   1223 
   1224    if (state->is_version(400, 320) ||
   1225        state->ARB_gpu_shader5_enable ||
   1226        state->OES_sample_variables_enable) {
   1227       add_system_value(SYSTEM_VALUE_SAMPLE_MASK_IN, array(int_t, 1), "gl_SampleMaskIn");
   1228    }
   1229 
   1230    if (state->is_version(430, 320) ||
   1231        state->ARB_fragment_layer_viewport_enable ||
   1232        state->OES_geometry_shader_enable ||
   1233        state->EXT_geometry_shader_enable) {
   1234       var = add_input(VARYING_SLOT_LAYER, int_t, "gl_Layer");
   1235       var->data.interpolation = INTERP_MODE_FLAT;
   1236    }
   1237 
   1238    if (state->is_version(430, 0) ||
   1239        state->ARB_fragment_layer_viewport_enable ||
   1240        state->OES_viewport_array_enable) {
   1241       var = add_input(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
   1242       var->data.interpolation = INTERP_MODE_FLAT;
   1243    }
   1244 
   1245    if (state->is_version(450, 310) || state->ARB_ES3_1_compatibility_enable)
   1246       add_system_value(SYSTEM_VALUE_HELPER_INVOCATION, bool_t, "gl_HelperInvocation");
   1247 }
   1248 
   1249 
   1250 /**
   1251  * Generate variables which only exist in compute shaders.
   1252  */
   1253 void
   1254 builtin_variable_generator::generate_cs_special_vars()
   1255 {
   1256    add_system_value(SYSTEM_VALUE_LOCAL_INVOCATION_ID, uvec3_t,
   1257                     "gl_LocalInvocationID");
   1258    add_system_value(SYSTEM_VALUE_WORK_GROUP_ID, uvec3_t, "gl_WorkGroupID");
   1259    add_system_value(SYSTEM_VALUE_NUM_WORK_GROUPS, uvec3_t, "gl_NumWorkGroups");
   1260 
   1261    if (state->ARB_compute_variable_group_size_enable) {
   1262       add_system_value(SYSTEM_VALUE_LOCAL_GROUP_SIZE,
   1263                        uvec3_t, "gl_LocalGroupSizeARB");
   1264    }
   1265 
   1266    if (state->ctx->Const.LowerCsDerivedVariables) {
   1267       add_variable("gl_GlobalInvocationID", uvec3_t, ir_var_auto, 0);
   1268       add_variable("gl_LocalInvocationIndex", uint_t, ir_var_auto, 0);
   1269    } else {
   1270       add_system_value(SYSTEM_VALUE_GLOBAL_INVOCATION_ID,
   1271                        uvec3_t, "gl_GlobalInvocationID");
   1272       add_system_value(SYSTEM_VALUE_LOCAL_INVOCATION_INDEX,
   1273                        uint_t, "gl_LocalInvocationIndex");
   1274    }
   1275 }
   1276 
   1277 
   1278 /**
   1279  * Add a single "varying" variable.  The variable's type and direction (input
   1280  * or output) are adjusted as appropriate for the type of shader being
   1281  * compiled.
   1282  */
   1283 void
   1284 builtin_variable_generator::add_varying(int slot, const glsl_type *type,
   1285                                         const char *name)
   1286 {
   1287    switch (state->stage) {
   1288    case MESA_SHADER_TESS_CTRL:
   1289    case MESA_SHADER_TESS_EVAL:
   1290    case MESA_SHADER_GEOMETRY:
   1291       this->per_vertex_in.add_field(slot, type, name);
   1292       /* FALLTHROUGH */
   1293    case MESA_SHADER_VERTEX:
   1294       this->per_vertex_out.add_field(slot, type, name);
   1295       break;
   1296    case MESA_SHADER_FRAGMENT:
   1297       add_input(slot, type, name);
   1298       break;
   1299    case MESA_SHADER_COMPUTE:
   1300       /* Compute shaders don't have varyings. */
   1301       break;
   1302    }
   1303 }
   1304 
   1305 
   1306 /**
   1307  * Generate variables that are used to communicate data from one shader stage
   1308  * to the next ("varyings").
   1309  */
   1310 void
   1311 builtin_variable_generator::generate_varyings()
   1312 {
   1313    /* gl_Position and gl_PointSize are not visible from fragment shaders. */
   1314    if (state->stage != MESA_SHADER_FRAGMENT) {
   1315       add_varying(VARYING_SLOT_POS, vec4_t, "gl_Position");
   1316       if (!state->es_shader ||
   1317           state->stage == MESA_SHADER_VERTEX ||
   1318           (state->stage == MESA_SHADER_GEOMETRY &&
   1319            (state->OES_geometry_point_size_enable ||
   1320             state->EXT_geometry_point_size_enable)) ||
   1321           ((state->stage == MESA_SHADER_TESS_CTRL ||
   1322             state->stage == MESA_SHADER_TESS_EVAL) &&
   1323            (state->OES_tessellation_point_size_enable ||
   1324             state->EXT_tessellation_point_size_enable))) {
   1325          add_varying(VARYING_SLOT_PSIZ, float_t, "gl_PointSize");
   1326       }
   1327    }
   1328 
   1329    if (state->has_clip_distance()) {
   1330        add_varying(VARYING_SLOT_CLIP_DIST0, array(float_t, 0),
   1331                    "gl_ClipDistance");
   1332    }
   1333    if (state->has_cull_distance()) {
   1334       add_varying(VARYING_SLOT_CULL_DIST0, array(float_t, 0),
   1335                    "gl_CullDistance");
   1336    }
   1337 
   1338    if (compatibility) {
   1339       add_varying(VARYING_SLOT_TEX0, array(vec4_t, 0), "gl_TexCoord");
   1340       add_varying(VARYING_SLOT_FOGC, float_t, "gl_FogFragCoord");
   1341       if (state->stage == MESA_SHADER_FRAGMENT) {
   1342          add_varying(VARYING_SLOT_COL0, vec4_t, "gl_Color");
   1343          add_varying(VARYING_SLOT_COL1, vec4_t, "gl_SecondaryColor");
   1344       } else {
   1345          add_varying(VARYING_SLOT_CLIP_VERTEX, vec4_t, "gl_ClipVertex");
   1346          add_varying(VARYING_SLOT_COL0, vec4_t, "gl_FrontColor");
   1347          add_varying(VARYING_SLOT_BFC0, vec4_t, "gl_BackColor");
   1348          add_varying(VARYING_SLOT_COL1, vec4_t, "gl_FrontSecondaryColor");
   1349          add_varying(VARYING_SLOT_BFC1, vec4_t, "gl_BackSecondaryColor");
   1350       }
   1351    }
   1352 
   1353    /* Section 7.1 (Built-In Language Variables) of the GLSL 4.00 spec
   1354     * says:
   1355     *
   1356     *    "In the tessellation control language, built-in variables are
   1357     *    intrinsically declared as:
   1358     *
   1359     *        in gl_PerVertex {
   1360     *            vec4 gl_Position;
   1361     *            float gl_PointSize;
   1362     *            float gl_ClipDistance[];
   1363     *        } gl_in[gl_MaxPatchVertices];"
   1364     */
   1365    if (state->stage == MESA_SHADER_TESS_CTRL ||
   1366        state->stage == MESA_SHADER_TESS_EVAL) {
   1367       const glsl_type *per_vertex_in_type =
   1368          this->per_vertex_in.construct_interface_instance();
   1369       add_variable("gl_in", array(per_vertex_in_type, state->Const.MaxPatchVertices),
   1370                    ir_var_shader_in, -1);
   1371    }
   1372    if (state->stage == MESA_SHADER_GEOMETRY) {
   1373       const glsl_type *per_vertex_in_type =
   1374          this->per_vertex_in.construct_interface_instance();
   1375       add_variable("gl_in", array(per_vertex_in_type, 0),
   1376                    ir_var_shader_in, -1);
   1377    }
   1378    if (state->stage == MESA_SHADER_TESS_CTRL) {
   1379       const glsl_type *per_vertex_out_type =
   1380          this->per_vertex_out.construct_interface_instance();
   1381       add_variable("gl_out", array(per_vertex_out_type, 0),
   1382                    ir_var_shader_out, -1);
   1383    }
   1384    if (state->stage == MESA_SHADER_VERTEX ||
   1385        state->stage == MESA_SHADER_TESS_EVAL ||
   1386        state->stage == MESA_SHADER_GEOMETRY) {
   1387       const glsl_type *per_vertex_out_type =
   1388          this->per_vertex_out.construct_interface_instance();
   1389       const glsl_struct_field *fields = per_vertex_out_type->fields.structure;
   1390       for (unsigned i = 0; i < per_vertex_out_type->length; i++) {
   1391          ir_variable *var =
   1392             add_variable(fields[i].name, fields[i].type, ir_var_shader_out,
   1393                          fields[i].location);
   1394          var->data.interpolation = fields[i].interpolation;
   1395          var->data.centroid = fields[i].centroid;
   1396          var->data.sample = fields[i].sample;
   1397          var->data.patch = fields[i].patch;
   1398          var->data.precision = fields[i].precision;
   1399          var->init_interface_type(per_vertex_out_type);
   1400       }
   1401    }
   1402 }
   1403 
   1404 
   1405 }; /* Anonymous namespace */
   1406 
   1407 
   1408 void
   1409 _mesa_glsl_initialize_variables(exec_list *instructions,
   1410 				struct _mesa_glsl_parse_state *state)
   1411 {
   1412    builtin_variable_generator gen(instructions, state);
   1413 
   1414    gen.generate_constants();
   1415    gen.generate_uniforms();
   1416 
   1417    gen.generate_varyings();
   1418 
   1419    switch (state->stage) {
   1420    case MESA_SHADER_VERTEX:
   1421       gen.generate_vs_special_vars();
   1422       break;
   1423    case MESA_SHADER_TESS_CTRL:
   1424       gen.generate_tcs_special_vars();
   1425       break;
   1426    case MESA_SHADER_TESS_EVAL:
   1427       gen.generate_tes_special_vars();
   1428       break;
   1429    case MESA_SHADER_GEOMETRY:
   1430       gen.generate_gs_special_vars();
   1431       break;
   1432    case MESA_SHADER_FRAGMENT:
   1433       gen.generate_fs_special_vars();
   1434       break;
   1435    case MESA_SHADER_COMPUTE:
   1436       gen.generate_cs_special_vars();
   1437       break;
   1438    }
   1439 }
   1440 
   1441 
   1442 /**
   1443  * Initialize compute shader variables with values that are derived from other
   1444  * compute shader variable.
   1445  */
   1446 static void
   1447 initialize_cs_derived_variables(gl_shader *shader,
   1448                                 ir_function_signature *const main_sig)
   1449 {
   1450    assert(shader->Stage == MESA_SHADER_COMPUTE);
   1451 
   1452    ir_variable *gl_GlobalInvocationID =
   1453       shader->symbols->get_variable("gl_GlobalInvocationID");
   1454    assert(gl_GlobalInvocationID);
   1455    ir_variable *gl_WorkGroupID =
   1456       shader->symbols->get_variable("gl_WorkGroupID");
   1457    assert(gl_WorkGroupID);
   1458    ir_variable *gl_WorkGroupSize =
   1459       shader->symbols->get_variable("gl_WorkGroupSize");
   1460    if (gl_WorkGroupSize == NULL) {
   1461       void *const mem_ctx = ralloc_parent(shader->ir);
   1462       gl_WorkGroupSize = new(mem_ctx) ir_variable(glsl_type::uvec3_type,
   1463                                                   "gl_WorkGroupSize",
   1464                                                   ir_var_auto);
   1465       gl_WorkGroupSize->data.how_declared = ir_var_declared_implicitly;
   1466       gl_WorkGroupSize->data.read_only = true;
   1467       shader->ir->push_head(gl_WorkGroupSize);
   1468    }
   1469    ir_variable *gl_LocalInvocationID =
   1470       shader->symbols->get_variable("gl_LocalInvocationID");
   1471    assert(gl_LocalInvocationID);
   1472 
   1473    /* gl_GlobalInvocationID =
   1474     *    gl_WorkGroupID * gl_WorkGroupSize + gl_LocalInvocationID
   1475     */
   1476    ir_instruction *inst =
   1477       assign(gl_GlobalInvocationID,
   1478              add(mul(gl_WorkGroupID, gl_WorkGroupSize),
   1479                  gl_LocalInvocationID));
   1480    main_sig->body.push_head(inst);
   1481 
   1482    /* gl_LocalInvocationIndex =
   1483     *    gl_LocalInvocationID.z * gl_WorkGroupSize.x * gl_WorkGroupSize.y +
   1484     *    gl_LocalInvocationID.y * gl_WorkGroupSize.x +
   1485     *    gl_LocalInvocationID.x;
   1486     */
   1487    ir_expression *index_z =
   1488       mul(mul(swizzle_z(gl_LocalInvocationID), swizzle_x(gl_WorkGroupSize)),
   1489           swizzle_y(gl_WorkGroupSize));
   1490    ir_expression *index_y =
   1491       mul(swizzle_y(gl_LocalInvocationID), swizzle_x(gl_WorkGroupSize));
   1492    ir_expression *index_y_plus_z = add(index_y, index_z);
   1493    operand index_x(swizzle_x(gl_LocalInvocationID));
   1494    ir_expression *index_x_plus_y_plus_z = add(index_y_plus_z, index_x);
   1495    ir_variable *gl_LocalInvocationIndex =
   1496       shader->symbols->get_variable("gl_LocalInvocationIndex");
   1497    assert(gl_LocalInvocationIndex);
   1498    inst = assign(gl_LocalInvocationIndex, index_x_plus_y_plus_z);
   1499    main_sig->body.push_head(inst);
   1500 }
   1501 
   1502 
   1503 /**
   1504  * Initialize builtin variables with values based on other builtin variables.
   1505  * These are initialized in the main function.
   1506  */
   1507 void
   1508 _mesa_glsl_initialize_derived_variables(struct gl_context *ctx,
   1509                                         gl_shader *shader)
   1510 {
   1511    /* We only need to set CS variables currently. */
   1512    if (shader->Stage == MESA_SHADER_COMPUTE &&
   1513        ctx->Const.LowerCsDerivedVariables) {
   1514       ir_function_signature *const main_sig =
   1515          _mesa_get_main_function_signature(shader->symbols);
   1516 
   1517       if (main_sig != NULL)
   1518          initialize_cs_derived_variables(shader, main_sig);
   1519    }
   1520 }
   1521