/*
 * Copyright © 2010 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */


/**
 * Building this file with MinGW g++ 7.3 or 7.4 with:
 *   scons platform=windows toolchain=crossmingw machine=x86 build=profile
 * triggers an internal compiler error.
 * Overriding the optimization level to -O1 works around the issue.
 * MinGW 5.3.1 does not seem to have the bug, neither does 8.3.  So for now
 * we're simply testing for version 7.x here.
 */
#if defined(__MINGW32__) && __GNUC__ == 7
#warning "disabling optimizations for this file to work around compiler bug in MinGW gcc 7.x"
#pragma GCC optimize("O1")
#endif


#include "ir.h"
#include "ir_builder.h"
#include "glsl_parser_extras.h"
#include "glsl_symbol_table.h"
#include "main/consts_exts.h"
#include "main/uniforms.h"
#include "program/prog_statevars.h"
#include "program/prog_instruction.h"
#include "util/compiler.h"
#include "builtin_functions.h"

using namespace ir_builder;

static const struct gl_builtin_uniform_element gl_NumSamples_elements[] = {
   {NULL, {STATE_NUM_SAMPLES, 0, 0}, SWIZZLE_XXXX}
};

static const struct gl_builtin_uniform_element gl_DepthRange_elements[] = {
   {"near", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_XXXX},
   {"far", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_YYYY},
   {"diff", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_ZZZZ},
};

static const struct gl_builtin_uniform_element gl_ClipPlane_elements[] = {
   {NULL, {STATE_CLIPPLANE, 0, 0}, SWIZZLE_XYZW}
};

static const struct gl_builtin_uniform_element gl_Point_elements[] = {
   {"size", {STATE_POINT_SIZE}, SWIZZLE_XXXX},
   {"sizeMin", {STATE_POINT_SIZE}, SWIZZLE_YYYY},
   {"sizeMax", {STATE_POINT_SIZE}, SWIZZLE_ZZZZ},
   {"fadeThresholdSize", {STATE_POINT_SIZE}, SWIZZLE_WWWW},
   {"distanceConstantAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_XXXX},
   {"distanceLinearAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_YYYY},
   {"distanceQuadraticAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_ZZZZ},
};

static const struct gl_builtin_uniform_element gl_FrontMaterial_elements[] = {
   {"emission", {STATE_MATERIAL, MAT_ATTRIB_FRONT_EMISSION}, SWIZZLE_XYZW},
   {"ambient", {STATE_MATERIAL, MAT_ATTRIB_FRONT_AMBIENT}, SWIZZLE_XYZW},
   {"diffuse", {STATE_MATERIAL, MAT_ATTRIB_FRONT_DIFFUSE}, SWIZZLE_XYZW},
   {"specular", {STATE_MATERIAL, MAT_ATTRIB_FRONT_SPECULAR}, SWIZZLE_XYZW},
   {"shininess", {STATE_MATERIAL, MAT_ATTRIB_FRONT_SHININESS}, SWIZZLE_XXXX},
};

static const struct gl_builtin_uniform_element gl_BackMaterial_elements[] = {
   {"emission", {STATE_MATERIAL, MAT_ATTRIB_BACK_EMISSION}, SWIZZLE_XYZW},
   {"ambient", {STATE_MATERIAL, MAT_ATTRIB_BACK_AMBIENT}, SWIZZLE_XYZW},
   {"diffuse", {STATE_MATERIAL, MAT_ATTRIB_BACK_DIFFUSE}, SWIZZLE_XYZW},
   {"specular", {STATE_MATERIAL, MAT_ATTRIB_BACK_SPECULAR}, SWIZZLE_XYZW},
   {"shininess", {STATE_MATERIAL, MAT_ATTRIB_BACK_SHININESS}, SWIZZLE_XXXX},
};

static const struct gl_builtin_uniform_element gl_LightSource_elements[] = {
   {"ambient", {STATE_LIGHT, 0, STATE_AMBIENT}, SWIZZLE_XYZW},
   {"diffuse", {STATE_LIGHT, 0, STATE_DIFFUSE}, SWIZZLE_XYZW},
   {"specular", {STATE_LIGHT, 0, STATE_SPECULAR}, SWIZZLE_XYZW},
   {"position", {STATE_LIGHT, 0, STATE_POSITION}, SWIZZLE_XYZW},
   {"halfVector", {STATE_LIGHT, 0, STATE_HALF_VECTOR}, SWIZZLE_XYZW},
   {"spotDirection", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION},
    MAKE_SWIZZLE4(SWIZZLE_X,
		  SWIZZLE_Y,
		  SWIZZLE_Z,
		  SWIZZLE_Z)},
   {"spotCosCutoff", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION}, SWIZZLE_WWWW},
   {"constantAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_XXXX},
   {"linearAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_YYYY},
   {"quadraticAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_ZZZZ},
   {"spotExponent", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_WWWW},
   {"spotCutoff", {STATE_LIGHT, 0, STATE_SPOT_CUTOFF}, SWIZZLE_XXXX},
};

static const struct gl_builtin_uniform_element gl_LightModel_elements[] = {
   {"ambient", {STATE_LIGHTMODEL_AMBIENT, 0}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_FrontLightModelProduct_elements[] = {
   {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 0}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_BackLightModelProduct_elements[] = {
   {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 1}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_FrontLightProduct_elements[] = {
   {"ambient", {STATE_LIGHTPROD, 0, MAT_ATTRIB_FRONT_AMBIENT}, SWIZZLE_XYZW},
   {"diffuse", {STATE_LIGHTPROD, 0, MAT_ATTRIB_FRONT_DIFFUSE}, SWIZZLE_XYZW},
   {"specular", {STATE_LIGHTPROD, 0, MAT_ATTRIB_FRONT_SPECULAR}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_BackLightProduct_elements[] = {
   {"ambient", {STATE_LIGHTPROD, 0, MAT_ATTRIB_BACK_AMBIENT}, SWIZZLE_XYZW},
   {"diffuse", {STATE_LIGHTPROD, 0, MAT_ATTRIB_BACK_DIFFUSE}, SWIZZLE_XYZW},
   {"specular", {STATE_LIGHTPROD, 0, MAT_ATTRIB_BACK_SPECULAR}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_TextureEnvColor_elements[] = {
   {NULL, {STATE_TEXENV_COLOR, 0}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_EyePlaneS_elements[] = {
   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_S}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_EyePlaneT_elements[] = {
   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_T}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_EyePlaneR_elements[] = {
   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_R}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_EyePlaneQ_elements[] = {
   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_Q}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_ObjectPlaneS_elements[] = {
   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_S}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_ObjectPlaneT_elements[] = {
   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_T}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_ObjectPlaneR_elements[] = {
   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_R}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_ObjectPlaneQ_elements[] = {
   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_Q}, SWIZZLE_XYZW},
};

static const struct gl_builtin_uniform_element gl_Fog_elements[] = {
   {"color", {STATE_FOG_COLOR}, SWIZZLE_XYZW},
   {"density", {STATE_FOG_PARAMS}, SWIZZLE_XXXX},
   {"start", {STATE_FOG_PARAMS}, SWIZZLE_YYYY},
   {"end", {STATE_FOG_PARAMS}, SWIZZLE_ZZZZ},
   {"scale", {STATE_FOG_PARAMS}, SWIZZLE_WWWW},
};

static const struct gl_builtin_uniform_element gl_NormalScale_elements[] = {
   {NULL, {STATE_NORMAL_SCALE_EYESPACE}, SWIZZLE_XXXX},
};

static const struct gl_builtin_uniform_element gl_FogParamsOptimizedMESA_elements[] = {
   {NULL, {STATE_FOG_PARAMS_OPTIMIZED}, SWIZZLE_XYZW},
};

#define ATTRIB(i) \
   static const struct gl_builtin_uniform_element gl_CurrentAttribFrag##i##MESA_elements[] = { \
      {NULL, {STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, i}, SWIZZLE_XYZW}, \
   };

ATTRIB(0)
ATTRIB(1)
ATTRIB(2)
ATTRIB(3)
ATTRIB(4)
ATTRIB(5)
ATTRIB(6)
ATTRIB(7)
ATTRIB(8)
ATTRIB(9)
ATTRIB(10)
ATTRIB(11)
ATTRIB(12)
ATTRIB(13)
ATTRIB(14)
ATTRIB(15)
ATTRIB(16)
ATTRIB(17)
ATTRIB(18)
ATTRIB(19)
ATTRIB(20)
ATTRIB(21)
ATTRIB(22)
ATTRIB(23)
ATTRIB(24)
ATTRIB(25)
ATTRIB(26)
ATTRIB(27)
ATTRIB(28)
ATTRIB(29)
ATTRIB(30)
ATTRIB(31)

#define MATRIX(name, statevar)				\
   static const struct gl_builtin_uniform_element name ## _elements[] = { \
      { NULL, { statevar, 0, 0, 0}, SWIZZLE_XYZW },		\
      { NULL, { statevar, 0, 1, 1}, SWIZZLE_XYZW },		\
      { NULL, { statevar, 0, 2, 2}, SWIZZLE_XYZW },		\
      { NULL, { statevar, 0, 3, 3}, SWIZZLE_XYZW },		\
   }

MATRIX(gl_ModelViewMatrix, STATE_MODELVIEW_MATRIX_TRANSPOSE);
MATRIX(gl_ModelViewMatrixInverse, STATE_MODELVIEW_MATRIX_INVTRANS);
MATRIX(gl_ModelViewMatrixTranspose, STATE_MODELVIEW_MATRIX);
MATRIX(gl_ModelViewMatrixInverseTranspose, STATE_MODELVIEW_MATRIX_INVERSE);

MATRIX(gl_ProjectionMatrix, STATE_PROJECTION_MATRIX_TRANSPOSE);
MATRIX(gl_ProjectionMatrixInverse, STATE_PROJECTION_MATRIX_INVTRANS);
MATRIX(gl_ProjectionMatrixTranspose, STATE_PROJECTION_MATRIX);
MATRIX(gl_ProjectionMatrixInverseTranspose, STATE_PROJECTION_MATRIX_INVERSE);

MATRIX(gl_ModelViewProjectionMatrix, STATE_MVP_MATRIX_TRANSPOSE);
MATRIX(gl_ModelViewProjectionMatrixInverse, STATE_MVP_MATRIX_INVTRANS);
MATRIX(gl_ModelViewProjectionMatrixTranspose, STATE_MVP_MATRIX);
MATRIX(gl_ModelViewProjectionMatrixInverseTranspose, STATE_MVP_MATRIX_INVERSE);

MATRIX(gl_TextureMatrix, STATE_TEXTURE_MATRIX_TRANSPOSE);
MATRIX(gl_TextureMatrixInverse, STATE_TEXTURE_MATRIX_INVTRANS);
MATRIX(gl_TextureMatrixTranspose, STATE_TEXTURE_MATRIX);
MATRIX(gl_TextureMatrixInverseTranspose, STATE_TEXTURE_MATRIX_INVERSE);

static const struct gl_builtin_uniform_element gl_NormalMatrix_elements[] = {
   { NULL, { STATE_MODELVIEW_MATRIX_INVERSE, 0, 0, 0},
     MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
   { NULL, { STATE_MODELVIEW_MATRIX_INVERSE, 0, 1, 1},
     MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
   { NULL, { STATE_MODELVIEW_MATRIX_INVERSE, 0, 2, 2},
     MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
};

#undef MATRIX

#define STATEVAR(name) {#name, name ## _elements, ARRAY_SIZE(name ## _elements)}

static const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[] = {
   STATEVAR(gl_NumSamples),
   STATEVAR(gl_DepthRange),
   STATEVAR(gl_ClipPlane),
   STATEVAR(gl_Point),
   STATEVAR(gl_FrontMaterial),
   STATEVAR(gl_BackMaterial),
   STATEVAR(gl_LightSource),
   STATEVAR(gl_LightModel),
   STATEVAR(gl_FrontLightModelProduct),
   STATEVAR(gl_BackLightModelProduct),
   STATEVAR(gl_FrontLightProduct),
   STATEVAR(gl_BackLightProduct),
   STATEVAR(gl_TextureEnvColor),
   STATEVAR(gl_EyePlaneS),
   STATEVAR(gl_EyePlaneT),
   STATEVAR(gl_EyePlaneR),
   STATEVAR(gl_EyePlaneQ),
   STATEVAR(gl_ObjectPlaneS),
   STATEVAR(gl_ObjectPlaneT),
   STATEVAR(gl_ObjectPlaneR),
   STATEVAR(gl_ObjectPlaneQ),
   STATEVAR(gl_Fog),

   STATEVAR(gl_ModelViewMatrix),
   STATEVAR(gl_ModelViewMatrixInverse),
   STATEVAR(gl_ModelViewMatrixTranspose),
   STATEVAR(gl_ModelViewMatrixInverseTranspose),

   STATEVAR(gl_ProjectionMatrix),
   STATEVAR(gl_ProjectionMatrixInverse),
   STATEVAR(gl_ProjectionMatrixTranspose),
   STATEVAR(gl_ProjectionMatrixInverseTranspose),

   STATEVAR(gl_ModelViewProjectionMatrix),
   STATEVAR(gl_ModelViewProjectionMatrixInverse),
   STATEVAR(gl_ModelViewProjectionMatrixTranspose),
   STATEVAR(gl_ModelViewProjectionMatrixInverseTranspose),

   STATEVAR(gl_TextureMatrix),
   STATEVAR(gl_TextureMatrixInverse),
   STATEVAR(gl_TextureMatrixTranspose),
   STATEVAR(gl_TextureMatrixInverseTranspose),

   STATEVAR(gl_NormalMatrix),
   STATEVAR(gl_NormalScale),

   STATEVAR(gl_FogParamsOptimizedMESA),

   STATEVAR(gl_CurrentAttribFrag0MESA),
   STATEVAR(gl_CurrentAttribFrag1MESA),
   STATEVAR(gl_CurrentAttribFrag2MESA),
   STATEVAR(gl_CurrentAttribFrag3MESA),
   STATEVAR(gl_CurrentAttribFrag4MESA),
   STATEVAR(gl_CurrentAttribFrag5MESA),
   STATEVAR(gl_CurrentAttribFrag6MESA),
   STATEVAR(gl_CurrentAttribFrag7MESA),
   STATEVAR(gl_CurrentAttribFrag8MESA),
   STATEVAR(gl_CurrentAttribFrag9MESA),
   STATEVAR(gl_CurrentAttribFrag10MESA),
   STATEVAR(gl_CurrentAttribFrag11MESA),
   STATEVAR(gl_CurrentAttribFrag12MESA),
   STATEVAR(gl_CurrentAttribFrag13MESA),
   STATEVAR(gl_CurrentAttribFrag14MESA),
   STATEVAR(gl_CurrentAttribFrag15MESA),
   STATEVAR(gl_CurrentAttribFrag16MESA),
   STATEVAR(gl_CurrentAttribFrag17MESA),
   STATEVAR(gl_CurrentAttribFrag18MESA),
   STATEVAR(gl_CurrentAttribFrag19MESA),
   STATEVAR(gl_CurrentAttribFrag20MESA),
   STATEVAR(gl_CurrentAttribFrag21MESA),
   STATEVAR(gl_CurrentAttribFrag22MESA),
   STATEVAR(gl_CurrentAttribFrag23MESA),
   STATEVAR(gl_CurrentAttribFrag24MESA),
   STATEVAR(gl_CurrentAttribFrag25MESA),
   STATEVAR(gl_CurrentAttribFrag26MESA),
   STATEVAR(gl_CurrentAttribFrag27MESA),
   STATEVAR(gl_CurrentAttribFrag28MESA),
   STATEVAR(gl_CurrentAttribFrag29MESA),
   STATEVAR(gl_CurrentAttribFrag30MESA),
   STATEVAR(gl_CurrentAttribFrag31MESA),

   {NULL, NULL, 0}
};


namespace {

/**
 * Data structure that accumulates fields for the gl_PerVertex interface
 * block.
 */
class per_vertex_accumulator
{
public:
   per_vertex_accumulator();
   void add_field(int slot, const glsl_type *type, int precision,
                  const char *name, enum glsl_interp_mode interp);
   const glsl_type *construct_interface_instance() const;

private:
   glsl_struct_field fields[14];
   unsigned num_fields;
};


per_vertex_accumulator::per_vertex_accumulator()
   : fields(),
     num_fields(0)
{
}


void
per_vertex_accumulator::add_field(int slot, const glsl_type *type,
                                  int precision, const char *name,
                                  enum glsl_interp_mode interp)
{
   assert(this->num_fields < ARRAY_SIZE(this->fields));
   this->fields[this->num_fields].type = type;
   this->fields[this->num_fields].name = name;
   this->fields[this->num_fields].matrix_layout = GLSL_MATRIX_LAYOUT_INHERITED;
   this->fields[this->num_fields].location = slot;
   this->fields[this->num_fields].offset = -1;
   this->fields[this->num_fields].interpolation = interp;
   this->fields[this->num_fields].centroid = 0;
   this->fields[this->num_fields].sample = 0;
   this->fields[this->num_fields].patch = 0;
   this->fields[this->num_fields].precision = precision;
   this->fields[this->num_fields].memory_read_only = 0;
   this->fields[this->num_fields].memory_write_only = 0;
   this->fields[this->num_fields].memory_coherent = 0;
   this->fields[this->num_fields].memory_volatile = 0;
   this->fields[this->num_fields].memory_restrict = 0;
   this->fields[this->num_fields].image_format = PIPE_FORMAT_NONE;
   this->fields[this->num_fields].explicit_xfb_buffer = 0;
   this->fields[this->num_fields].xfb_buffer = -1;
   this->fields[this->num_fields].xfb_stride = -1;
   this->num_fields++;
}


const glsl_type *
per_vertex_accumulator::construct_interface_instance() const
{
   return glsl_interface_type(this->fields, this->num_fields,
                              GLSL_INTERFACE_PACKING_STD140,
                              false,
                              "gl_PerVertex");
}


class builtin_variable_generator
{
public:
   builtin_variable_generator(exec_list *instructions,
                              struct _mesa_glsl_parse_state *state);
   void generate_constants();
   void generate_uniforms();
   void generate_special_vars();
   void generate_vs_special_vars();
   void generate_tcs_special_vars();
   void generate_tes_special_vars();
   void generate_gs_special_vars();
   void generate_fs_special_vars();
   void generate_cs_special_vars();
   void generate_varyings();

private:
   const glsl_type *array(const glsl_type *base, unsigned elements)
   {
      return glsl_array_type(base, elements, 0);
   }

   const glsl_type *type(const char *name)
   {
      return symtab->get_type(name);
   }

   ir_variable *add_input(int slot, const glsl_type *type, int precision,
                          const char *name,
                          enum glsl_interp_mode interp = INTERP_MODE_NONE)
   {
      return add_variable(name, type, precision, ir_var_shader_in, slot, interp);
   }

   ir_variable *add_input(int slot, const glsl_type *type, const char *name,
                          enum glsl_interp_mode interp = INTERP_MODE_NONE)
   {
      return add_input(slot, type, GLSL_PRECISION_NONE, name, interp);
   }

   ir_variable *add_output(int slot, const glsl_type *type, int precision,
                           const char *name)
   {
      return add_variable(name, type, precision, ir_var_shader_out, slot);
   }

   ir_variable *add_output(int slot, const glsl_type *type, const char *name)
   {
      return add_output(slot, type, GLSL_PRECISION_NONE, name);
   }

   ir_variable *add_index_output(int slot, int index, const glsl_type *type,
                                 int precision, const char *name)
   {
      return add_index_variable(name, type, precision, ir_var_shader_out, slot,
                                index);
   }

   ir_variable *add_system_value(int slot, const glsl_type *type, int precision,
                                 const char *name)
   {
      return add_variable(name, type, precision, ir_var_system_value, slot);
   }
   ir_variable *add_system_value(int slot, const glsl_type *type,
                                 const char *name)
   {
      return add_system_value(slot, type, GLSL_PRECISION_NONE, name);
   }

   ir_variable *add_variable(const char *name, const glsl_type *type,
                             int precision, enum ir_variable_mode mode,
                             int slot, enum glsl_interp_mode interp = INTERP_MODE_NONE);
   ir_variable *add_index_variable(const char *name, const glsl_type *type,
                                   int precision, enum ir_variable_mode mode,
                                   int slot, int index);
   ir_variable *add_uniform(const glsl_type *type, int precision,
                            const char *name);
   ir_variable *add_uniform(const glsl_type *type, const char *name)
   {
      return add_uniform(type, GLSL_PRECISION_NONE, name);
   }
   ir_variable *add_const(const char *name, int precision, int value);
   ir_variable *add_const(const char *name, int value)
   {
      return add_const(name, GLSL_PRECISION_MEDIUM, value);
   }
   ir_variable *add_const_ivec3(const char *name, int x, int y, int z);
   void add_varying(int slot, const glsl_type *type, int precision,
                    const char *name,
                    enum glsl_interp_mode interp  = INTERP_MODE_NONE);
   void add_varying(int slot, const glsl_type *type, const char *name,
                    enum glsl_interp_mode interp = INTERP_MODE_NONE)
   {
      add_varying(slot, type, GLSL_PRECISION_NONE, name, interp);
   }

   exec_list * const instructions;
   struct _mesa_glsl_parse_state * const state;
   glsl_symbol_table * const symtab;

   /**
    * True if compatibility-profile-only variables should be included.  (In
    * desktop GL, these are always included when the GLSL version is 1.30 and
    * or below).
    */
   const bool compatibility;

   const glsl_type * const bool_t;
   const glsl_type * const int_t;
   const glsl_type * const uint_t;
   const glsl_type * const uint64_t;
   const glsl_type * const float_t;
   const glsl_type * const vec2_t;
   const glsl_type * const vec3_t;
   const glsl_type * const vec4_t;
   const glsl_type * const uvec3_t;
   const glsl_type * const uvec4_t;
   const glsl_type * const mat3_t;
   const glsl_type * const mat4_t;

   per_vertex_accumulator per_vertex_in;
   per_vertex_accumulator per_vertex_out;
};


builtin_variable_generator::builtin_variable_generator(
   exec_list *instructions, struct _mesa_glsl_parse_state *state)
   : instructions(instructions), state(state), symtab(state->symbols),
     compatibility(state->compat_shader || state->ARB_compatibility_enable),
     bool_t(&glsl_type_builtin_bool), int_t(&glsl_type_builtin_int),
     uint_t(&glsl_type_builtin_uint),
     uint64_t(&glsl_type_builtin_uint64_t),
     float_t(&glsl_type_builtin_float), vec2_t(&glsl_type_builtin_vec2),
     vec3_t(&glsl_type_builtin_vec3), vec4_t(&glsl_type_builtin_vec4),
     uvec3_t(&glsl_type_builtin_uvec3), uvec4_t(&glsl_type_builtin_uvec4),
     mat3_t(&glsl_type_builtin_mat3), mat4_t(&glsl_type_builtin_mat4)
{
}

ir_variable *
builtin_variable_generator::add_index_variable(const char *name,
                                               const glsl_type *type,
                                               int precision,
                                               enum ir_variable_mode mode,
                                               int slot, int index)
{
   ir_variable *var = new(symtab) ir_variable(type, name, mode);
   var->data.how_declared = ir_var_declared_implicitly;

   switch (var->data.mode) {
   case ir_var_auto:
   case ir_var_shader_in:
   case ir_var_uniform:
   case ir_var_system_value:
      var->data.read_only = true;
      break;
   case ir_var_shader_out:
   case ir_var_shader_storage:
      break;
   default:
      /* The only variables that are added using this function should be
       * uniforms, shader storage, shader inputs, and shader outputs, constants
       * (which use ir_var_auto), and system values.
       */
      assert(0);
      break;
   }

   var->data.location = slot;
   var->data.explicit_location = (slot >= 0);
   var->data.explicit_index = 1;
   var->data.index = index;

   if (state->es_shader)
      var->data.precision = precision;

   /* Once the variable is created an initialized, add it to the symbol table
    * and add the declaration to the IR stream.
    */
   instructions->push_tail(var);

   symtab->add_variable(var);
   return var;
}

ir_variable *
builtin_variable_generator::add_variable(const char *name,
                                         const glsl_type *type,
                                         int precision,
                                         enum ir_variable_mode mode, int slot,
                                         enum glsl_interp_mode interp)
{
   ir_variable *var = new(symtab) ir_variable(type, name, mode);
   var->data.how_declared = ir_var_declared_implicitly;

   switch (var->data.mode) {
   case ir_var_auto:
   case ir_var_shader_in:
   case ir_var_uniform:
   case ir_var_system_value:
      var->data.read_only = true;
      break;
   case ir_var_shader_out:
   case ir_var_shader_storage:
      break;
   default:
      /* The only variables that are added using this function should be
       * uniforms, shader storage, shader inputs, and shader outputs, constants
       * (which use ir_var_auto), and system values.
       */
      assert(0);
      break;
   }

   var->data.location = slot;
   var->data.explicit_location = (slot >= 0);
   var->data.explicit_index = 0;
   var->data.interpolation = interp;

   if (state->es_shader)
      var->data.precision = precision;

   /* Once the variable is created an initialized, add it to the symbol table
    * and add the declaration to the IR stream.
    */
   instructions->push_tail(var);

   symtab->add_variable(var);
   return var;
}

extern "C" const struct gl_builtin_uniform_desc *
_mesa_glsl_get_builtin_uniform_desc(const char *name)
{
   for (unsigned i = 0; _mesa_builtin_uniform_desc[i].name != NULL; i++) {
      if (strcmp(_mesa_builtin_uniform_desc[i].name, name) == 0) {
         return &_mesa_builtin_uniform_desc[i];
      }
   }
   return NULL;
}

ir_variable *
builtin_variable_generator::add_uniform(const glsl_type *type,
                                        int precision,
                                        const char *name)
{
   ir_variable *const uni =
      add_variable(name, type, precision, ir_var_uniform, -1);

   const struct gl_builtin_uniform_desc* const statevar =
      _mesa_glsl_get_builtin_uniform_desc(name);
   assert(statevar != NULL);

   const unsigned array_count = glsl_type_is_array(type) ? type->length : 1;

   ir_state_slot *slots =
      uni->allocate_state_slots(array_count * statevar->num_elements);

   for (unsigned a = 0; a < array_count; a++) {
      for (unsigned j = 0; j < statevar->num_elements; j++) {
	 const struct gl_builtin_uniform_element *element =
	    &statevar->elements[j];

	 memcpy(slots->tokens, element->tokens, sizeof(element->tokens));
	 if (glsl_type_is_array(type))
            slots->tokens[1] = a;

	 slots++;
      }
   }

   return uni;
}


ir_variable *
builtin_variable_generator::add_const(const char *name, int precision,
                                      int value)
{
   ir_variable *const var = add_variable(name, &glsl_type_builtin_int,
                                         precision, ir_var_auto, -1);
   var->constant_value = new(var) ir_constant(value);
   var->constant_initializer = new(var) ir_constant(value);
   var->data.has_initializer = true;
   return var;
}


ir_variable *
builtin_variable_generator::add_const_ivec3(const char *name, int x, int y,
                                            int z)
{
   ir_variable *const var = add_variable(name, &glsl_type_builtin_ivec3,
                                         GLSL_PRECISION_HIGH,
                                         ir_var_auto, -1);
   ir_constant_data data;
   memset(&data, 0, sizeof(data));
   data.i[0] = x;
   data.i[1] = y;
   data.i[2] = z;
   var->constant_value = new(var) ir_constant(&glsl_type_builtin_ivec3, &data);
   var->constant_initializer =
      new(var) ir_constant(&glsl_type_builtin_ivec3, &data);
   var->data.has_initializer = true;
   return var;
}


void
builtin_variable_generator::generate_constants()
{
   add_const("gl_MaxVertexAttribs", state->Const.MaxVertexAttribs);
   add_const("gl_MaxVertexTextureImageUnits",
             state->Const.MaxVertexTextureImageUnits);
   add_const("gl_MaxCombinedTextureImageUnits",
             state->Const.MaxCombinedTextureImageUnits);
   add_const("gl_MaxTextureImageUnits", state->Const.MaxTextureImageUnits);
   add_const("gl_MaxDrawBuffers", state->Const.MaxDrawBuffers);

   /* Max uniforms/varyings: GLSL ES counts these in units of vectors; desktop
    * GL counts them in units of "components" or "floats" and also in units
    * of vectors since GL 4.1
    */
   if (!state->es_shader) {
      add_const("gl_MaxFragmentUniformComponents",
                state->Const.MaxFragmentUniformComponents);
      add_const("gl_MaxVertexUniformComponents",
                state->Const.MaxVertexUniformComponents);
   }

   if (state->is_version(410, 100)) {
      add_const("gl_MaxVertexUniformVectors",
                state->Const.MaxVertexUniformComponents / 4);
      add_const("gl_MaxFragmentUniformVectors",
                state->Const.MaxFragmentUniformComponents / 4);

      /* In GLSL ES 3.00, gl_MaxVaryingVectors was split out to separate
       * vertex and fragment shader constants.
       */
      if (state->is_version(0, 300)) {
         add_const("gl_MaxVertexOutputVectors",
                   state->consts->Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4);
         add_const("gl_MaxFragmentInputVectors",
                   state->consts->Program[MESA_SHADER_FRAGMENT].MaxInputComponents / 4);
      } else {
         add_const("gl_MaxVaryingVectors",
                   state->consts->MaxVarying);
      }

      /* EXT_blend_func_extended brings a built in constant
       * for determining number of dual source draw buffers
       */
      if (state->EXT_blend_func_extended_enable) {
         add_const("gl_MaxDualSourceDrawBuffersEXT",
                   state->Const.MaxDualSourceDrawBuffers);
      }
   }

   /* gl_MaxVaryingFloats was deprecated in GLSL 1.30+, and was moved to
    * compat profile in GLSL 4.20. GLSL ES never supported this constant.
    */
   if (compatibility || !state->is_version(420, 100))  {
      add_const("gl_MaxVaryingFloats", state->consts->MaxVarying * 4);
   }

   /* Texel offsets were introduced in ARB_shading_language_420pack (which
    * requires desktop GLSL version 130), and adopted into desktop GLSL
    * version 4.20 and GLSL ES version 3.00.
    */
   if ((state->is_version(130, 0) &&
        state->ARB_shading_language_420pack_enable) ||
      state->is_version(420, 300)) {
      add_const("gl_MinProgramTexelOffset",
                state->Const.MinProgramTexelOffset);
      add_const("gl_MaxProgramTexelOffset",
                state->Const.MaxProgramTexelOffset);
   }

   if (state->has_clip_distance()) {
      add_const("gl_MaxClipDistances", state->Const.MaxClipPlanes);
   }
   if (state->is_version(130, 0)) {
      add_const("gl_MaxVaryingComponents", state->consts->MaxVarying * 4);
   }
   if (state->has_cull_distance()) {
      add_const("gl_MaxCullDistances", state->Const.MaxClipPlanes);
      add_const("gl_MaxCombinedClipAndCullDistances",
                state->Const.MaxClipPlanes);
   }

   if (state->has_geometry_shader()) {
      add_const("gl_MaxVertexOutputComponents",
                state->Const.MaxVertexOutputComponents);
      add_const("gl_MaxGeometryInputComponents",
                state->Const.MaxGeometryInputComponents);
      add_const("gl_MaxGeometryOutputComponents",
                state->Const.MaxGeometryOutputComponents);
      add_const("gl_MaxFragmentInputComponents",
                state->Const.MaxFragmentInputComponents);
      add_const("gl_MaxGeometryTextureImageUnits",
                state->Const.MaxGeometryTextureImageUnits);
      add_const("gl_MaxGeometryOutputVertices",
                state->Const.MaxGeometryOutputVertices);
      add_const("gl_MaxGeometryTotalOutputComponents",
                state->Const.MaxGeometryTotalOutputComponents);
      add_const("gl_MaxGeometryUniformComponents",
                state->Const.MaxGeometryUniformComponents);

      /* Note: the GLSL 1.50-4.40 specs require
       * gl_MaxGeometryVaryingComponents to be present, and to be at least 64.
       * But they do not define what it means (and there does not appear to be
       * any corresponding constant in the GL specs).  However,
       * ARB_geometry_shader4 defines MAX_GEOMETRY_VARYING_COMPONENTS_ARB to
       * be the maximum number of components available for use as geometry
       * outputs.  So we assume this is a synonym for
       * gl_MaxGeometryOutputComponents.
       */
      add_const("gl_MaxGeometryVaryingComponents",
                state->Const.MaxGeometryOutputComponents);
   }

   if (compatibility) {
      /* Note: gl_MaxLights stopped being listed as an explicit constant in
       * GLSL 1.30, however it continues to be referred to (as a minimum size
       * for compatibility-mode uniforms) all the way up through GLSL 4.30, so
       * this seems like it was probably an oversight.
       */
      add_const("gl_MaxLights", state->Const.MaxLights);

      add_const("gl_MaxClipPlanes", state->Const.MaxClipPlanes);

      /* Note: gl_MaxTextureUnits wasn't made compatibility-only until GLSL
       * 1.50, however this seems like it was probably an oversight.
       */
      add_const("gl_MaxTextureUnits", state->Const.MaxTextureUnits);

      /* Note: gl_MaxTextureCoords was left out of GLSL 1.40, but it was
       * re-introduced in GLSL 1.50, so this seems like it was probably an
       * oversight.
       */
      add_const("gl_MaxTextureCoords", state->Const.MaxTextureCoords);
   }

   if (state->has_atomic_counters()) {
      add_const("gl_MaxVertexAtomicCounters",
                state->Const.MaxVertexAtomicCounters);
      add_const("gl_MaxFragmentAtomicCounters",
                state->Const.MaxFragmentAtomicCounters);
      add_const("gl_MaxCombinedAtomicCounters",
                state->Const.MaxCombinedAtomicCounters);
      add_const("gl_MaxAtomicCounterBindings",
                state->Const.MaxAtomicBufferBindings);

      if (state->has_geometry_shader()) {
         add_const("gl_MaxGeometryAtomicCounters",
                   state->Const.MaxGeometryAtomicCounters);
      }
      if (state->is_version(110, 320)) {
         add_const("gl_MaxTessControlAtomicCounters",
                   state->Const.MaxTessControlAtomicCounters);
         add_const("gl_MaxTessEvaluationAtomicCounters",
                   state->Const.MaxTessEvaluationAtomicCounters);
      }
   }

   if (state->is_version(420, 310)) {
      add_const("gl_MaxVertexAtomicCounterBuffers",
                state->Const.MaxVertexAtomicCounterBuffers);
      add_const("gl_MaxFragmentAtomicCounterBuffers",
                state->Const.MaxFragmentAtomicCounterBuffers);
      add_const("gl_MaxCombinedAtomicCounterBuffers",
                state->Const.MaxCombinedAtomicCounterBuffers);
      add_const("gl_MaxAtomicCounterBufferSize",
                state->Const.MaxAtomicCounterBufferSize);

      if (state->has_geometry_shader()) {
         add_const("gl_MaxGeometryAtomicCounterBuffers",
                   state->Const.MaxGeometryAtomicCounterBuffers);
      }
      if (state->is_version(110, 320)) {
         add_const("gl_MaxTessControlAtomicCounterBuffers",
                   state->Const.MaxTessControlAtomicCounterBuffers);
         add_const("gl_MaxTessEvaluationAtomicCounterBuffers",
                   state->Const.MaxTessEvaluationAtomicCounterBuffers);
      }
   }

   if (state->is_version(430, 310) || state->ARB_compute_shader_enable) {
      add_const("gl_MaxComputeAtomicCounterBuffers",
                state->Const.MaxComputeAtomicCounterBuffers);
      add_const("gl_MaxComputeAtomicCounters",
                state->Const.MaxComputeAtomicCounters);
      add_const("gl_MaxComputeImageUniforms",
                state->Const.MaxComputeImageUniforms);
      add_const("gl_MaxComputeTextureImageUnits",
                state->Const.MaxComputeTextureImageUnits);
      add_const("gl_MaxComputeUniformComponents",
                state->Const.MaxComputeUniformComponents);

      add_const_ivec3("gl_MaxComputeWorkGroupCount",
                      state->Const.MaxComputeWorkGroupCount[0],
                      state->Const.MaxComputeWorkGroupCount[1],
                      state->Const.MaxComputeWorkGroupCount[2]);
      add_const_ivec3("gl_MaxComputeWorkGroupSize",
                      state->Const.MaxComputeWorkGroupSize[0],
                      state->Const.MaxComputeWorkGroupSize[1],
                      state->Const.MaxComputeWorkGroupSize[2]);

      /* From the GLSL 4.40 spec, section 7.1 (Built-In Language Variables):
       *
       *     The built-in constant gl_WorkGroupSize is a compute-shader
       *     constant containing the local work-group size of the shader.  The
       *     size of the work group in the X, Y, and Z dimensions is stored in
       *     the x, y, and z components.  The constants values in
       *     gl_WorkGroupSize will match those specified in the required
       *     local_size_x, local_size_y, and local_size_z layout qualifiers
       *     for the current shader.  This is a constant so that it can be
       *     used to size arrays of memory that can be shared within the local
       *     work group.  It is a compile-time error to use gl_WorkGroupSize
       *     in a shader that does not declare a fixed local group size, or
       *     before that shader has declared a fixed local group size, using
       *     local_size_x, local_size_y, and local_size_z.
       *
       * To prevent the shader from trying to refer to gl_WorkGroupSize before
       * the layout declaration, we don't define it here.  Intead we define it
       * in ast_cs_input_layout::hir().
       */
   }

   if (state->has_enhanced_layouts()) {
      add_const("gl_MaxTransformFeedbackBuffers",
                state->Const.MaxTransformFeedbackBuffers);
      add_const("gl_MaxTransformFeedbackInterleavedComponents",
                state->Const.MaxTransformFeedbackInterleavedComponents);
   }

   if (state->has_shader_image_load_store()) {
      add_const("gl_MaxImageUnits",
                state->Const.MaxImageUnits);
      add_const("gl_MaxVertexImageUniforms",
                state->Const.MaxVertexImageUniforms);
      add_const("gl_MaxFragmentImageUniforms",
                state->Const.MaxFragmentImageUniforms);
      add_const("gl_MaxCombinedImageUniforms",
                state->Const.MaxCombinedImageUniforms);

      if (state->has_geometry_shader()) {
         add_const("gl_MaxGeometryImageUniforms",
                   state->Const.MaxGeometryImageUniforms);
      }

      if (!state->es_shader) {
         add_const("gl_MaxCombinedImageUnitsAndFragmentOutputs",
                   state->Const.MaxCombinedShaderOutputResources);
         add_const("gl_MaxImageSamples",
                   state->Const.MaxImageSamples);
      }

      if (state->has_tessellation_shader()) {
         add_const("gl_MaxTessControlImageUniforms",
                   state->Const.MaxTessControlImageUniforms);
         add_const("gl_MaxTessEvaluationImageUniforms",
                   state->Const.MaxTessEvaluationImageUniforms);
      }
   }

   if (state->is_version(440, 310) ||
       state->ARB_ES3_1_compatibility_enable) {
      add_const("gl_MaxCombinedShaderOutputResources",
                state->Const.MaxCombinedShaderOutputResources);
   }

   if (state->is_version(410, 0) ||
       state->ARB_viewport_array_enable ||
       state->OES_viewport_array_enable) {
      add_const("gl_MaxViewports", GLSL_PRECISION_HIGH,
                state->Const.MaxViewports);
   }

   if (state->has_tessellation_shader()) {
      add_const("gl_MaxPatchVertices", state->Const.MaxPatchVertices);
      add_const("gl_MaxTessGenLevel", state->Const.MaxTessGenLevel);
      add_const("gl_MaxTessControlInputComponents", state->Const.MaxTessControlInputComponents);
      add_const("gl_MaxTessControlOutputComponents", state->Const.MaxTessControlOutputComponents);
      add_const("gl_MaxTessControlTextureImageUnits", state->Const.MaxTessControlTextureImageUnits);
      add_const("gl_MaxTessEvaluationInputComponents", state->Const.MaxTessEvaluationInputComponents);
      add_const("gl_MaxTessEvaluationOutputComponents", state->Const.MaxTessEvaluationOutputComponents);
      add_const("gl_MaxTessEvaluationTextureImageUnits", state->Const.MaxTessEvaluationTextureImageUnits);
      add_const("gl_MaxTessPatchComponents", state->Const.MaxTessPatchComponents);
      add_const("gl_MaxTessControlTotalOutputComponents", state->Const.MaxTessControlTotalOutputComponents);
      add_const("gl_MaxTessControlUniformComponents", state->Const.MaxTessControlUniformComponents);
      add_const("gl_MaxTessEvaluationUniformComponents", state->Const.MaxTessEvaluationUniformComponents);
   }

   if (state->is_version(450, 320) ||
       state->OES_sample_variables_enable ||
       state->ARB_ES3_1_compatibility_enable)
      add_const("gl_MaxSamples", state->Const.MaxSamples);
}


/**
 * Generate uniform variables (which exist in all types of shaders).
 */
void
builtin_variable_generator::generate_uniforms()
{
   if (state->is_version(400, 320) ||
       state->ARB_sample_shading_enable ||
       state->OES_sample_variables_enable)
      add_uniform(int_t, GLSL_PRECISION_LOW, "gl_NumSamples");
   add_uniform(type("gl_DepthRangeParameters"), "gl_DepthRange");

   for (unsigned i = 0; i < VARYING_SLOT_VAR0; i++) {
      char name[128];

      snprintf(name, sizeof(name), "gl_CurrentAttribFrag%uMESA", i);
      add_uniform(vec4_t, name);
   }

   if (compatibility) {
      add_uniform(mat4_t, "gl_ModelViewMatrix");
      add_uniform(mat4_t, "gl_ProjectionMatrix");
      add_uniform(mat4_t, "gl_ModelViewProjectionMatrix");
      add_uniform(mat3_t, "gl_NormalMatrix");
      add_uniform(mat4_t, "gl_ModelViewMatrixInverse");
      add_uniform(mat4_t, "gl_ProjectionMatrixInverse");
      add_uniform(mat4_t, "gl_ModelViewProjectionMatrixInverse");
      add_uniform(mat4_t, "gl_ModelViewMatrixTranspose");
      add_uniform(mat4_t, "gl_ProjectionMatrixTranspose");
      add_uniform(mat4_t, "gl_ModelViewProjectionMatrixTranspose");
      add_uniform(mat4_t, "gl_ModelViewMatrixInverseTranspose");
      add_uniform(mat4_t, "gl_ProjectionMatrixInverseTranspose");
      add_uniform(mat4_t, "gl_ModelViewProjectionMatrixInverseTranspose");
      add_uniform(float_t, "gl_NormalScale");
      add_uniform(type("gl_LightModelParameters"), "gl_LightModel");
      add_uniform(vec4_t, "gl_FogParamsOptimizedMESA");

      const glsl_type *const mat4_array_type =
	 array(mat4_t, state->Const.MaxTextureCoords);
      add_uniform(mat4_array_type, "gl_TextureMatrix");
      add_uniform(mat4_array_type, "gl_TextureMatrixInverse");
      add_uniform(mat4_array_type, "gl_TextureMatrixTranspose");
      add_uniform(mat4_array_type, "gl_TextureMatrixInverseTranspose");

      add_uniform(array(vec4_t, state->Const.MaxClipPlanes), "gl_ClipPlane");
      add_uniform(type("gl_PointParameters"), "gl_Point");

      const glsl_type *const material_parameters_type =
	 type("gl_MaterialParameters");
      add_uniform(material_parameters_type, "gl_FrontMaterial");
      add_uniform(material_parameters_type, "gl_BackMaterial");

      add_uniform(array(type("gl_LightSourceParameters"),
                        state->Const.MaxLights),
                  "gl_LightSource");

      const glsl_type *const light_model_products_type =
         type("gl_LightModelProducts");
      add_uniform(light_model_products_type, "gl_FrontLightModelProduct");
      add_uniform(light_model_products_type, "gl_BackLightModelProduct");

      const glsl_type *const light_products_type =
         array(type("gl_LightProducts"), state->Const.MaxLights);
      add_uniform(light_products_type, "gl_FrontLightProduct");
      add_uniform(light_products_type, "gl_BackLightProduct");

      add_uniform(array(vec4_t, state->Const.MaxTextureUnits),
                  "gl_TextureEnvColor");

      const glsl_type *const texcoords_vec4 =
	 array(vec4_t, state->Const.MaxTextureCoords);
      add_uniform(texcoords_vec4, "gl_EyePlaneS");
      add_uniform(texcoords_vec4, "gl_EyePlaneT");
      add_uniform(texcoords_vec4, "gl_EyePlaneR");
      add_uniform(texcoords_vec4, "gl_EyePlaneQ");
      add_uniform(texcoords_vec4, "gl_ObjectPlaneS");
      add_uniform(texcoords_vec4, "gl_ObjectPlaneT");
      add_uniform(texcoords_vec4, "gl_ObjectPlaneR");
      add_uniform(texcoords_vec4, "gl_ObjectPlaneQ");

      add_uniform(type("gl_FogParameters"), "gl_Fog");
   }
}


/**
 * Generate special variables which exist in all shaders.
 */
void
builtin_variable_generator::generate_special_vars()
{
   if (state->ARB_shader_ballot_enable) {
      add_system_value(SYSTEM_VALUE_SUBGROUP_SIZE, uint_t, "gl_SubGroupSizeARB");
      add_system_value(SYSTEM_VALUE_SUBGROUP_INVOCATION, uint_t, "gl_SubGroupInvocationARB");
      add_system_value(SYSTEM_VALUE_SUBGROUP_EQ_MASK, uint64_t, "gl_SubGroupEqMaskARB");
      add_system_value(SYSTEM_VALUE_SUBGROUP_GE_MASK, uint64_t, "gl_SubGroupGeMaskARB");
      add_system_value(SYSTEM_VALUE_SUBGROUP_GT_MASK, uint64_t, "gl_SubGroupGtMaskARB");
      add_system_value(SYSTEM_VALUE_SUBGROUP_LE_MASK, uint64_t, "gl_SubGroupLeMaskARB");
      add_system_value(SYSTEM_VALUE_SUBGROUP_LT_MASK, uint64_t, "gl_SubGroupLtMaskARB");
   }

   if (state->KHR_shader_subgroup_basic_enable) {
      add_system_value(SYSTEM_VALUE_SUBGROUP_SIZE, uint_t, "gl_SubgroupSize");
      add_system_value(SYSTEM_VALUE_SUBGROUP_INVOCATION, uint_t, "gl_SubgroupInvocationID");
   }

   if (state->KHR_shader_subgroup_ballot_enable) {
      add_system_value(SYSTEM_VALUE_SUBGROUP_EQ_MASK, uvec4_t, "gl_SubgroupEqMask");
      add_system_value(SYSTEM_VALUE_SUBGROUP_GE_MASK, uvec4_t, "gl_SubgroupGeMask");
      add_system_value(SYSTEM_VALUE_SUBGROUP_GT_MASK, uvec4_t, "gl_SubgroupGtMask");
      add_system_value(SYSTEM_VALUE_SUBGROUP_LE_MASK, uvec4_t, "gl_SubgroupLeMask");
      add_system_value(SYSTEM_VALUE_SUBGROUP_LT_MASK, uvec4_t, "gl_SubgroupLtMask");
   }
   if (state->is_version(130, 300) && state->OVR_multiview_enable) {
      add_system_value(SYSTEM_VALUE_VIEW_INDEX, uint_t, GLSL_PRECISION_MEDIUM,
                      "gl_ViewID_OVR");
   }
}


/**
 * Generate variables which only exist in vertex shaders.
 */
void
builtin_variable_generator::generate_vs_special_vars()
{
   if (state->is_version(130, 300) || state->EXT_gpu_shader4_enable) {
      add_system_value(SYSTEM_VALUE_VERTEX_ID, int_t, GLSL_PRECISION_HIGH,
                       "gl_VertexID");
   }
   if (state->is_version(460, 0)) {
      add_system_value(SYSTEM_VALUE_BASE_VERTEX, int_t, "gl_BaseVertex");
      add_system_value(SYSTEM_VALUE_BASE_INSTANCE, int_t, "gl_BaseInstance");
      add_system_value(SYSTEM_VALUE_DRAW_ID, int_t, "gl_DrawID");
   }
   if (state->EXT_draw_instanced_enable && state->is_version(0, 100))
      add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, GLSL_PRECISION_HIGH,
                       "gl_InstanceIDEXT");

   if (state->ARB_draw_instanced_enable)
      add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, "gl_InstanceIDARB");

   if (state->ARB_draw_instanced_enable || state->is_version(140, 300) ||
       state->EXT_gpu_shader4_enable) {
      add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, GLSL_PRECISION_HIGH,
                       "gl_InstanceID");
   }
   if (state->ARB_shader_draw_parameters_enable) {
      add_system_value(SYSTEM_VALUE_BASE_VERTEX, int_t, "gl_BaseVertexARB");
      add_system_value(SYSTEM_VALUE_BASE_INSTANCE, int_t, "gl_BaseInstanceARB");
      add_system_value(SYSTEM_VALUE_DRAW_ID, int_t, "gl_DrawIDARB");
   }
   if (compatibility) {
      add_input(VERT_ATTRIB_POS, vec4_t, "gl_Vertex");
      add_input(VERT_ATTRIB_NORMAL, vec3_t, "gl_Normal");
      add_input(VERT_ATTRIB_COLOR0, vec4_t, "gl_Color");
      add_input(VERT_ATTRIB_COLOR1, vec4_t, "gl_SecondaryColor");
      add_input(VERT_ATTRIB_TEX0, vec4_t, "gl_MultiTexCoord0");
      add_input(VERT_ATTRIB_TEX1, vec4_t, "gl_MultiTexCoord1");
      add_input(VERT_ATTRIB_TEX2, vec4_t, "gl_MultiTexCoord2");
      add_input(VERT_ATTRIB_TEX3, vec4_t, "gl_MultiTexCoord3");
      add_input(VERT_ATTRIB_TEX4, vec4_t, "gl_MultiTexCoord4");
      add_input(VERT_ATTRIB_TEX5, vec4_t, "gl_MultiTexCoord5");
      add_input(VERT_ATTRIB_TEX6, vec4_t, "gl_MultiTexCoord6");
      add_input(VERT_ATTRIB_TEX7, vec4_t, "gl_MultiTexCoord7");
      add_input(VERT_ATTRIB_FOG, float_t, "gl_FogCoord");
   }
}


/**
 * Generate variables which only exist in tessellation control shaders.
 */
void
builtin_variable_generator::generate_tcs_special_vars()
{
   add_system_value(SYSTEM_VALUE_PRIMITIVE_ID, int_t, GLSL_PRECISION_HIGH,
                    "gl_PrimitiveID");
   add_system_value(SYSTEM_VALUE_INVOCATION_ID, int_t, GLSL_PRECISION_HIGH,
                    "gl_InvocationID");
   add_system_value(SYSTEM_VALUE_VERTICES_IN, int_t, GLSL_PRECISION_HIGH,
                    "gl_PatchVerticesIn");

   add_output(VARYING_SLOT_TESS_LEVEL_OUTER, array(float_t, 4),
              GLSL_PRECISION_HIGH, "gl_TessLevelOuter")->data.patch = 1;
   add_output(VARYING_SLOT_TESS_LEVEL_INNER, array(float_t, 2),
              GLSL_PRECISION_HIGH, "gl_TessLevelInner")->data.patch = 1;
   /* XXX What to do if multiple are flipped on? */
   int bbox_slot = state->consts->NoPrimitiveBoundingBoxOutput ? -1 :
      VARYING_SLOT_BOUNDING_BOX0;
   if (state->EXT_primitive_bounding_box_enable)
      add_output(bbox_slot, array(vec4_t, 2), "gl_BoundingBoxEXT")
         ->data.patch = 1;
   if (state->OES_primitive_bounding_box_enable) {
      add_output(bbox_slot, array(vec4_t, 2), GLSL_PRECISION_HIGH,
                 "gl_BoundingBoxOES")->data.patch = 1;
   }
   if (state->is_version(0, 320) || state->ARB_ES3_2_compatibility_enable) {
      add_output(bbox_slot, array(vec4_t, 2), GLSL_PRECISION_HIGH,
                 "gl_BoundingBox")->data.patch = 1;
   }

   /* NOTE: These are completely pointless. Writing these will never go
    * anywhere. But the specs demands it. So we add them with a slot of -1,
    * which makes the data go nowhere.
    */
   if (state->NV_viewport_array2_enable) {
      add_output(-1, int_t, "gl_Layer");
      add_output(-1, int_t, "gl_ViewportIndex");
      add_output(-1, array(int_t, 1), "gl_ViewportMask");
   }

}


/**
 * Generate variables which only exist in tessellation evaluation shaders.
 */
void
builtin_variable_generator::generate_tes_special_vars()
{
   ir_variable *var;

   add_system_value(SYSTEM_VALUE_PRIMITIVE_ID, int_t, GLSL_PRECISION_HIGH,
                    "gl_PrimitiveID");
   add_system_value(SYSTEM_VALUE_VERTICES_IN, int_t, GLSL_PRECISION_HIGH,
                    "gl_PatchVerticesIn");
   add_system_value(SYSTEM_VALUE_TESS_COORD, vec3_t, GLSL_PRECISION_HIGH,
                    "gl_TessCoord");
   if (this->state->consts->GLSLTessLevelsAsInputs) {
      add_input(VARYING_SLOT_TESS_LEVEL_OUTER, array(float_t, 4),
                GLSL_PRECISION_HIGH, "gl_TessLevelOuter")->data.patch = 1;
      add_input(VARYING_SLOT_TESS_LEVEL_INNER, array(float_t, 2),
                GLSL_PRECISION_HIGH, "gl_TessLevelInner")->data.patch = 1;
   } else {
      add_system_value(SYSTEM_VALUE_TESS_LEVEL_OUTER, array(float_t, 4),
                       GLSL_PRECISION_HIGH, "gl_TessLevelOuter");
      add_system_value(SYSTEM_VALUE_TESS_LEVEL_INNER, array(float_t, 2),
                       GLSL_PRECISION_HIGH, "gl_TessLevelInner");
   }
   if (state->ARB_shader_viewport_layer_array_enable ||
       state->NV_viewport_array2_enable) {
      var = add_output(VARYING_SLOT_LAYER, int_t, "gl_Layer");
      var->data.interpolation = INTERP_MODE_FLAT;
      var = add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
      var->data.interpolation = INTERP_MODE_FLAT;
   }
   if (state->NV_viewport_array2_enable) {
      var = add_output(VARYING_SLOT_VIEWPORT_MASK, array(int_t, 1),
                       "gl_ViewportMask");
      var->data.interpolation = INTERP_MODE_FLAT;
   }
}


/**
 * Generate variables which only exist in geometry shaders.
 */
void
builtin_variable_generator::generate_gs_special_vars()
{
   ir_variable *var;

   var = add_output(VARYING_SLOT_LAYER, int_t, GLSL_PRECISION_HIGH, "gl_Layer");
   var->data.interpolation = INTERP_MODE_FLAT;
   if (state->is_version(410, 0) || state->ARB_viewport_array_enable ||
       state->OES_viewport_array_enable) {
      var = add_output(VARYING_SLOT_VIEWPORT, int_t, GLSL_PRECISION_HIGH,
                       "gl_ViewportIndex");
      var->data.interpolation = INTERP_MODE_FLAT;
   }
   if (state->NV_viewport_array2_enable) {
      var = add_output(VARYING_SLOT_VIEWPORT_MASK, array(int_t, 1),
                       "gl_ViewportMask");
      var->data.interpolation = INTERP_MODE_FLAT;
   }
   if (state->is_version(400, 320) || state->ARB_gpu_shader5_enable ||
       state->OES_geometry_shader_enable || state->EXT_geometry_shader_enable) {
      add_system_value(SYSTEM_VALUE_INVOCATION_ID, int_t, GLSL_PRECISION_HIGH,
                       "gl_InvocationID");
   }

   /* Although gl_PrimitiveID appears in tessellation control and tessellation
    * evaluation shaders, it has a different function there than it has in
    * geometry shaders, so we treat it (and its counterpart gl_PrimitiveIDIn)
    * as special geometry shader variables.
    *
    * Note that although the general convention of suffixing geometry shader
    * input varyings with "In" was not adopted into GLSL 1.50, it is used in
    * the specific case of gl_PrimitiveIDIn.  So we don't need to treat
    * gl_PrimitiveIDIn as an {ARB,EXT}_geometry_shader4-only variable.
    */
   var = add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, GLSL_PRECISION_HIGH,
                   "gl_PrimitiveIDIn");
   var->data.interpolation = INTERP_MODE_FLAT;
   var = add_output(VARYING_SLOT_PRIMITIVE_ID, int_t, GLSL_PRECISION_HIGH,
                    "gl_PrimitiveID");
   var->data.interpolation = INTERP_MODE_FLAT;
}


/**
 * Generate variables which only exist in fragment shaders.
 */
void
builtin_variable_generator::generate_fs_special_vars()
{
   ir_variable *var;

   int frag_coord_precision = (state->is_version(0, 300) ?
                               GLSL_PRECISION_HIGH :
                               GLSL_PRECISION_MEDIUM);

   if (this->state->consts->GLSLFragCoordIsSysVal) {
      add_system_value(SYSTEM_VALUE_FRAG_COORD, vec4_t, frag_coord_precision,
                       "gl_FragCoord");
   } else {
      add_input(VARYING_SLOT_POS, vec4_t, frag_coord_precision, "gl_FragCoord");
   }

   if (this->state->consts->GLSLFrontFacingIsSysVal) {
      var = add_system_value(SYSTEM_VALUE_FRONT_FACE, bool_t, "gl_FrontFacing");
      var->data.interpolation = INTERP_MODE_FLAT;
   } else {
      var = add_input(VARYING_SLOT_FACE, bool_t, "gl_FrontFacing");
      var->data.interpolation = INTERP_MODE_FLAT;
   }

   if (state->is_version(120, 100)) {
      if (this->state->consts->GLSLPointCoordIsSysVal)
         add_system_value(SYSTEM_VALUE_POINT_COORD, vec2_t,
                          GLSL_PRECISION_MEDIUM, "gl_PointCoord");
      else
         add_input(VARYING_SLOT_PNTC, vec2_t, GLSL_PRECISION_MEDIUM,
                   "gl_PointCoord");
   }

   if (state->has_geometry_shader() || state->EXT_gpu_shader4_enable) {
      var = add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, GLSL_PRECISION_HIGH,
                      "gl_PrimitiveID");
      var->data.interpolation = INTERP_MODE_FLAT;
   }

   /* gl_FragColor and gl_FragData were deprecated starting in desktop GLSL
    * 1.30, and were relegated to the compatibility profile in GLSL 4.20.
    * They were removed from GLSL ES 3.00.
    */
   if (compatibility || !state->is_version(420, 300)) {
      add_output(FRAG_RESULT_COLOR, vec4_t, GLSL_PRECISION_MEDIUM,
                 "gl_FragColor");
      add_output(FRAG_RESULT_DATA0,
                 array(vec4_t, state->Const.MaxDrawBuffers),
                 GLSL_PRECISION_MEDIUM,
                 "gl_FragData");
   }

   if (state->has_framebuffer_fetch() && !state->is_version(130, 300)) {
      ir_variable *const var =
         add_output(FRAG_RESULT_DATA0,
                    array(vec4_t, state->Const.MaxDrawBuffers),
                    "gl_LastFragData");
      var->data.precision = GLSL_PRECISION_MEDIUM;
      var->data.read_only = 1;
      var->data.fb_fetch_output = 1;
      var->data.memory_coherent = 1;
   }

   if (state->has_framebuffer_fetch_zs()) {
      ir_variable *const depth_var =
         add_output(FRAG_RESULT_DEPTH, float_t,
                    GLSL_PRECISION_HIGH, "gl_LastFragDepthARM");
      depth_var->data.read_only = 1;
      depth_var->data.fb_fetch_output = 1;
      depth_var->data.memory_coherent = 1;

      ir_variable *const stencil_var =
         add_output(FRAG_RESULT_STENCIL, int_t,
                    GLSL_PRECISION_LOW, "gl_LastFragStencilARM");
      stencil_var->data.read_only = 1;
      stencil_var->data.fb_fetch_output = 1;
      stencil_var->data.memory_coherent = 1;
   }

   if (state->es_shader && state->language_version == 100 && state->EXT_blend_func_extended_enable) {
      add_index_output(FRAG_RESULT_COLOR, 1, vec4_t,
                       GLSL_PRECISION_MEDIUM, "gl_SecondaryFragColorEXT");
      add_index_output(FRAG_RESULT_DATA0, 1,
                       array(vec4_t, state->Const.MaxDualSourceDrawBuffers),
                       GLSL_PRECISION_MEDIUM, "gl_SecondaryFragDataEXT");
   }

   /* gl_FragDepth has always been in desktop GLSL, but did not appear in GLSL
    * ES 1.00.
    */
   if (state->is_version(110, 300)) {
      add_output(FRAG_RESULT_DEPTH, float_t, GLSL_PRECISION_HIGH,
                 "gl_FragDepth");
   }

   if (state->EXT_frag_depth_enable)
      add_output(FRAG_RESULT_DEPTH, float_t, "gl_FragDepthEXT");

   if (state->ARB_shader_stencil_export_enable) {
      ir_variable *const var =
         add_output(FRAG_RESULT_STENCIL, int_t, "gl_FragStencilRefARB");
      if (state->ARB_shader_stencil_export_warn)
         var->enable_extension_warning("GL_ARB_shader_stencil_export");
   }

   if (state->AMD_shader_stencil_export_enable) {
      ir_variable *const var =
         add_output(FRAG_RESULT_STENCIL, int_t, "gl_FragStencilRefAMD");
      if (state->AMD_shader_stencil_export_warn)
         var->enable_extension_warning("GL_AMD_shader_stencil_export");
   }

   if (state->is_version(400, 320) ||
       state->ARB_sample_shading_enable ||
       state->OES_sample_variables_enable) {
      add_system_value(SYSTEM_VALUE_SAMPLE_ID, int_t, GLSL_PRECISION_LOW,
                       "gl_SampleID");
      add_system_value(SYSTEM_VALUE_SAMPLE_POS, vec2_t, GLSL_PRECISION_MEDIUM,
                       "gl_SamplePosition");
      /* From the ARB_sample_shading specification:
       *    "The number of elements in the array is ceil(<s>/32), where
       *    <s> is the maximum number of color samples supported by the
       *    implementation."
       * Since no drivers expose more than 32x MSAA, we can simply set
       * the array size to 1 rather than computing it.
       */
      add_output(FRAG_RESULT_SAMPLE_MASK, array(int_t, 1),
                 GLSL_PRECISION_HIGH, "gl_SampleMask");
   }

   if (state->is_version(400, 320) ||
       state->ARB_gpu_shader5_enable ||
       state->OES_sample_variables_enable) {
      add_system_value(SYSTEM_VALUE_SAMPLE_MASK_IN, array(int_t, 1),
                       GLSL_PRECISION_HIGH, "gl_SampleMaskIn");
   }

   if (state->is_version(430, 320) ||
       state->ARB_fragment_layer_viewport_enable ||
       state->OES_geometry_shader_enable ||
       state->EXT_geometry_shader_enable) {
      add_varying(VARYING_SLOT_LAYER, int_t, GLSL_PRECISION_HIGH,
                  "gl_Layer", INTERP_MODE_FLAT);
   }

   if (state->is_version(430, 0) ||
       state->ARB_fragment_layer_viewport_enable ||
       state->OES_viewport_array_enable) {
      add_varying(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex", INTERP_MODE_FLAT);
   }

   if (state->is_version(450, 310) || state->ARB_ES3_1_compatibility_enable)
      add_system_value(SYSTEM_VALUE_HELPER_INVOCATION, bool_t, "gl_HelperInvocation");
}


/**
 * Generate variables which only exist in compute shaders.
 */
void
builtin_variable_generator::generate_cs_special_vars()
{
   add_system_value(SYSTEM_VALUE_LOCAL_INVOCATION_ID, uvec3_t,
                    "gl_LocalInvocationID");
   add_system_value(SYSTEM_VALUE_WORKGROUP_ID, uvec3_t, "gl_WorkGroupID");
   add_system_value(SYSTEM_VALUE_NUM_WORKGROUPS, uvec3_t, "gl_NumWorkGroups");

   if (state->ARB_compute_variable_group_size_enable) {
      add_system_value(SYSTEM_VALUE_WORKGROUP_SIZE,
                       uvec3_t, "gl_LocalGroupSizeARB");
   }

   add_system_value(SYSTEM_VALUE_GLOBAL_INVOCATION_ID,
                    uvec3_t, "gl_GlobalInvocationID");
   add_system_value(SYSTEM_VALUE_LOCAL_INVOCATION_INDEX,
                    uint_t, "gl_LocalInvocationIndex");

   if (state->KHR_shader_subgroup_basic_enable) {
      add_system_value(SYSTEM_VALUE_NUM_SUBGROUPS, uint_t, "gl_NumSubgroups");
      add_system_value(SYSTEM_VALUE_SUBGROUP_ID, uint_t, "gl_SubgroupID");
   }
}


/**
 * Add a single "varying" variable.  The variable's type and direction (input
 * or output) are adjusted as appropriate for the type of shader being
 * compiled.
 */
void
builtin_variable_generator::add_varying(int slot, const glsl_type *type,
                                        int precision, const char *name,
                                        enum glsl_interp_mode interp)
{
   switch (state->stage) {
   case MESA_SHADER_TESS_CTRL:
   case MESA_SHADER_TESS_EVAL:
   case MESA_SHADER_GEOMETRY:
      this->per_vertex_in.add_field(slot, type, precision, name, interp);
      FALLTHROUGH;
   case MESA_SHADER_VERTEX:
      this->per_vertex_out.add_field(slot, type, precision, name, interp);
      break;
   case MESA_SHADER_FRAGMENT:
      add_input(slot, type, precision, name, interp);
      break;
   case MESA_SHADER_COMPUTE:
      /* Compute shaders don't have varyings. */
      break;
   default:
      break;
   }
}


/**
 * Generate variables that are used to communicate data from one shader stage
 * to the next ("varyings").
 */
void
builtin_variable_generator::generate_varyings()
{
   const struct gl_shader_compiler_options *options =
      &state->consts->ShaderCompilerOptions[state->stage];

   /* gl_Position and gl_PointSize are not visible from fragment shaders. */
   if (state->stage != MESA_SHADER_FRAGMENT) {
      add_varying(VARYING_SLOT_POS, vec4_t, GLSL_PRECISION_HIGH, "gl_Position");
      if (!state->es_shader ||
          state->stage == MESA_SHADER_VERTEX ||
          (state->stage == MESA_SHADER_GEOMETRY &&
           (state->OES_geometry_point_size_enable ||
            state->EXT_geometry_point_size_enable)) ||
          ((state->stage == MESA_SHADER_TESS_CTRL ||
            state->stage == MESA_SHADER_TESS_EVAL) &&
           (state->OES_tessellation_point_size_enable ||
            state->EXT_tessellation_point_size_enable))) {
         add_varying(VARYING_SLOT_PSIZ,
                     float_t,
                     state->is_version(0, 300) ?
                     GLSL_PRECISION_HIGH :
                     GLSL_PRECISION_MEDIUM,
                     "gl_PointSize");
      }
      if (state->stage == MESA_SHADER_VERTEX) {
         if (state->AMD_vertex_shader_viewport_index_enable ||
             state->ARB_shader_viewport_layer_array_enable ||
             state->NV_viewport_array2_enable) {
            add_varying(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex", INTERP_MODE_FLAT);
         }

         if (state->AMD_vertex_shader_layer_enable ||
             state->ARB_shader_viewport_layer_array_enable ||
             state->NV_viewport_array2_enable) {
            add_varying(VARYING_SLOT_LAYER, int_t, GLSL_PRECISION_HIGH,
                        "gl_Layer", INTERP_MODE_FLAT);
         }

         /* From the NV_viewport_array2 specification:
          *
          *    "The variable gl_ViewportMask[] is available as an output variable
          *    in the VTG languages. The array has ceil(v/32) elements where v is
          *    the maximum number of viewports supported by the implementation."
          *
          * Since no drivers expose more than 16 viewports, we can simply set the
          * array size to 1 rather than computing it and dealing with varying
          * slot complication.
          */
         if (state->NV_viewport_array2_enable)
            add_varying(VARYING_SLOT_VIEWPORT_MASK, array(int_t, 1),
                        "gl_ViewportMask", INTERP_MODE_FLAT);
        }
   }

   if (state->has_clip_distance()) {
       add_varying(VARYING_SLOT_CLIP_DIST0, array(float_t, 0),
                   GLSL_PRECISION_HIGH, "gl_ClipDistance");
   }
   if (state->has_cull_distance()) {
      add_varying(VARYING_SLOT_CULL_DIST0, array(float_t, 0),
                  GLSL_PRECISION_HIGH, "gl_CullDistance");
   }

   if (compatibility) {
      add_varying(VARYING_SLOT_TEX0, array(vec4_t, 0), "gl_TexCoord");
      add_varying(VARYING_SLOT_FOGC, float_t, "gl_FogFragCoord");
      if (state->stage == MESA_SHADER_FRAGMENT) {
         add_varying(VARYING_SLOT_COL0, vec4_t, "gl_Color");
         add_varying(VARYING_SLOT_COL1, vec4_t, "gl_SecondaryColor");
      } else {
         add_varying(VARYING_SLOT_CLIP_VERTEX, vec4_t, "gl_ClipVertex");
         add_varying(VARYING_SLOT_COL0, vec4_t, "gl_FrontColor");
         add_varying(VARYING_SLOT_BFC0, vec4_t, "gl_BackColor");
         add_varying(VARYING_SLOT_COL1, vec4_t, "gl_FrontSecondaryColor");
         add_varying(VARYING_SLOT_BFC1, vec4_t, "gl_BackSecondaryColor");
      }
   }

   /* Section 7.1 (Built-In Language Variables) of the GLSL 4.00 spec
    * says:
    *
    *    "In the tessellation control language, built-in variables are
    *    intrinsically declared as:
    *
    *        in gl_PerVertex {
    *            vec4 gl_Position;
    *            float gl_PointSize;
    *            float gl_ClipDistance[];
    *        } gl_in[gl_MaxPatchVertices];"
    */
   if (state->stage == MESA_SHADER_TESS_CTRL ||
       state->stage == MESA_SHADER_TESS_EVAL) {
      const glsl_type *per_vertex_in_type =
         this->per_vertex_in.construct_interface_instance();
      add_variable("gl_in", array(per_vertex_in_type, state->Const.MaxPatchVertices),
                   GLSL_PRECISION_NONE, ir_var_shader_in, -1);
   }
   if (state->stage == MESA_SHADER_GEOMETRY) {
      const glsl_type *per_vertex_in_type =
         this->per_vertex_in.construct_interface_instance();
      add_variable("gl_in", array(per_vertex_in_type, 0),
                   GLSL_PRECISION_NONE, ir_var_shader_in, -1);
   }
   if (state->stage == MESA_SHADER_TESS_CTRL) {
      const glsl_type *per_vertex_out_type =
         this->per_vertex_out.construct_interface_instance();
      add_variable("gl_out", array(per_vertex_out_type, 0),
                   GLSL_PRECISION_NONE, ir_var_shader_out, -1);
   }
   if (state->stage == MESA_SHADER_VERTEX ||
       state->stage == MESA_SHADER_TESS_EVAL ||
       state->stage == MESA_SHADER_GEOMETRY) {
      const glsl_type *per_vertex_out_type =
         this->per_vertex_out.construct_interface_instance();
      const glsl_struct_field *fields = per_vertex_out_type->fields.structure;
      for (unsigned i = 0; i < per_vertex_out_type->length; i++) {
         ir_variable *var =
            add_variable(fields[i].name, fields[i].type, fields[i].precision,
                         ir_var_shader_out, fields[i].location);
         var->data.interpolation = fields[i].interpolation;
         var->data.centroid = fields[i].centroid;
         var->data.sample = fields[i].sample;
         var->data.patch = fields[i].patch;
         var->init_interface_type(per_vertex_out_type);

         var->data.invariant = fields[i].location == VARYING_SLOT_POS &&
                               options->PositionAlwaysInvariant;

         var->data.precise = fields[i].location == VARYING_SLOT_POS &&
                               options->PositionAlwaysPrecise;
      }
   }
}


}; /* Anonymous namespace */


void
_mesa_glsl_initialize_variables(exec_list *instructions,
				struct _mesa_glsl_parse_state *state)
{
   builtin_variable_generator gen(instructions, state);

   gen.generate_constants();
   gen.generate_uniforms();
   gen.generate_special_vars();

   gen.generate_varyings();

   switch (state->stage) {
   case MESA_SHADER_VERTEX:
      gen.generate_vs_special_vars();
      break;
   case MESA_SHADER_TESS_CTRL:
      gen.generate_tcs_special_vars();
      break;
   case MESA_SHADER_TESS_EVAL:
      gen.generate_tes_special_vars();
      break;
   case MESA_SHADER_GEOMETRY:
      gen.generate_gs_special_vars();
      break;
   case MESA_SHADER_FRAGMENT:
      gen.generate_fs_special_vars();
      break;
   case MESA_SHADER_COMPUTE:
      gen.generate_cs_special_vars();
      break;
   default:
      break;
   }
}
