101e04c3fSmrg/*
201e04c3fSmrg * Copyright © 2010 Intel Corporation
301e04c3fSmrg *
401e04c3fSmrg * Permission is hereby granted, free of charge, to any person obtaining a
501e04c3fSmrg * copy of this software and associated documentation files (the "Software"),
601e04c3fSmrg * to deal in the Software without restriction, including without limitation
701e04c3fSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
801e04c3fSmrg * and/or sell copies of the Software, and to permit persons to whom the
901e04c3fSmrg * Software is furnished to do so, subject to the following conditions:
1001e04c3fSmrg *
1101e04c3fSmrg * The above copyright notice and this permission notice (including the next
1201e04c3fSmrg * paragraph) shall be included in all copies or substantial portions of the
1301e04c3fSmrg * Software.
1401e04c3fSmrg *
1501e04c3fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1601e04c3fSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1701e04c3fSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1801e04c3fSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1901e04c3fSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2001e04c3fSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2101e04c3fSmrg * DEALINGS IN THE SOFTWARE.
2201e04c3fSmrg */
2301e04c3fSmrg
247e102996Smaya
257e102996Smaya/**
267e102996Smaya * Building this file with MinGW g++ 7.3 or 7.4 with:
277e102996Smaya *   scons platform=windows toolchain=crossmingw machine=x86 build=profile
287e102996Smaya * triggers an internal compiler error.
297e102996Smaya * Overriding the optimization level to -O1 works around the issue.
307e102996Smaya * MinGW 5.3.1 does not seem to have the bug, neither does 8.3.  So for now
317e102996Smaya * we're simply testing for version 7.x here.
327e102996Smaya */
337e102996Smaya#if defined(__MINGW32__) && __GNUC__ == 7
347e102996Smaya#warning "disabling optimizations for this file to work around compiler bug in MinGW gcc 7.x"
357e102996Smaya#pragma GCC optimize("O1")
367e102996Smaya#endif
377e102996Smaya
387e102996Smaya
3901e04c3fSmrg#include "ir.h"
4001e04c3fSmrg#include "ir_builder.h"
4101e04c3fSmrg#include "linker.h"
4201e04c3fSmrg#include "glsl_parser_extras.h"
4301e04c3fSmrg#include "glsl_symbol_table.h"
4401e04c3fSmrg#include "main/mtypes.h"
4501e04c3fSmrg#include "main/uniforms.h"
4601e04c3fSmrg#include "program/prog_statevars.h"
4701e04c3fSmrg#include "program/prog_instruction.h"
4801e04c3fSmrg#include "builtin_functions.h"
4901e04c3fSmrg
5001e04c3fSmrgusing namespace ir_builder;
5101e04c3fSmrg
5201e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_NumSamples_elements[] = {
5301e04c3fSmrg   {NULL, {STATE_NUM_SAMPLES, 0, 0}, SWIZZLE_XXXX}
5401e04c3fSmrg};
5501e04c3fSmrg
5601e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_DepthRange_elements[] = {
5701e04c3fSmrg   {"near", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_XXXX},
5801e04c3fSmrg   {"far", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_YYYY},
5901e04c3fSmrg   {"diff", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_ZZZZ},
6001e04c3fSmrg};
6101e04c3fSmrg
6201e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_ClipPlane_elements[] = {
6301e04c3fSmrg   {NULL, {STATE_CLIPPLANE, 0, 0}, SWIZZLE_XYZW}
6401e04c3fSmrg};
6501e04c3fSmrg
6601e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_Point_elements[] = {
6701e04c3fSmrg   {"size", {STATE_POINT_SIZE}, SWIZZLE_XXXX},
6801e04c3fSmrg   {"sizeMin", {STATE_POINT_SIZE}, SWIZZLE_YYYY},
6901e04c3fSmrg   {"sizeMax", {STATE_POINT_SIZE}, SWIZZLE_ZZZZ},
7001e04c3fSmrg   {"fadeThresholdSize", {STATE_POINT_SIZE}, SWIZZLE_WWWW},
7101e04c3fSmrg   {"distanceConstantAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_XXXX},
7201e04c3fSmrg   {"distanceLinearAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_YYYY},
7301e04c3fSmrg   {"distanceQuadraticAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_ZZZZ},
7401e04c3fSmrg};
7501e04c3fSmrg
7601e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_FrontMaterial_elements[] = {
777ec681f3Smrg   {"emission", {STATE_MATERIAL, MAT_ATTRIB_FRONT_EMISSION}, SWIZZLE_XYZW},
787ec681f3Smrg   {"ambient", {STATE_MATERIAL, MAT_ATTRIB_FRONT_AMBIENT}, SWIZZLE_XYZW},
797ec681f3Smrg   {"diffuse", {STATE_MATERIAL, MAT_ATTRIB_FRONT_DIFFUSE}, SWIZZLE_XYZW},
807ec681f3Smrg   {"specular", {STATE_MATERIAL, MAT_ATTRIB_FRONT_SPECULAR}, SWIZZLE_XYZW},
817ec681f3Smrg   {"shininess", {STATE_MATERIAL, MAT_ATTRIB_FRONT_SHININESS}, SWIZZLE_XXXX},
8201e04c3fSmrg};
8301e04c3fSmrg
8401e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_BackMaterial_elements[] = {
857ec681f3Smrg   {"emission", {STATE_MATERIAL, MAT_ATTRIB_BACK_EMISSION}, SWIZZLE_XYZW},
867ec681f3Smrg   {"ambient", {STATE_MATERIAL, MAT_ATTRIB_BACK_AMBIENT}, SWIZZLE_XYZW},
877ec681f3Smrg   {"diffuse", {STATE_MATERIAL, MAT_ATTRIB_BACK_DIFFUSE}, SWIZZLE_XYZW},
887ec681f3Smrg   {"specular", {STATE_MATERIAL, MAT_ATTRIB_BACK_SPECULAR}, SWIZZLE_XYZW},
897ec681f3Smrg   {"shininess", {STATE_MATERIAL, MAT_ATTRIB_BACK_SHININESS}, SWIZZLE_XXXX},
9001e04c3fSmrg};
9101e04c3fSmrg
9201e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_LightSource_elements[] = {
9301e04c3fSmrg   {"ambient", {STATE_LIGHT, 0, STATE_AMBIENT}, SWIZZLE_XYZW},
9401e04c3fSmrg   {"diffuse", {STATE_LIGHT, 0, STATE_DIFFUSE}, SWIZZLE_XYZW},
9501e04c3fSmrg   {"specular", {STATE_LIGHT, 0, STATE_SPECULAR}, SWIZZLE_XYZW},
9601e04c3fSmrg   {"position", {STATE_LIGHT, 0, STATE_POSITION}, SWIZZLE_XYZW},
9701e04c3fSmrg   {"halfVector", {STATE_LIGHT, 0, STATE_HALF_VECTOR}, SWIZZLE_XYZW},
9801e04c3fSmrg   {"spotDirection", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION},
9901e04c3fSmrg    MAKE_SWIZZLE4(SWIZZLE_X,
10001e04c3fSmrg		  SWIZZLE_Y,
10101e04c3fSmrg		  SWIZZLE_Z,
10201e04c3fSmrg		  SWIZZLE_Z)},
10301e04c3fSmrg   {"spotCosCutoff", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION}, SWIZZLE_WWWW},
10401e04c3fSmrg   {"constantAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_XXXX},
10501e04c3fSmrg   {"linearAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_YYYY},
10601e04c3fSmrg   {"quadraticAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_ZZZZ},
1077ec681f3Smrg   {"spotExponent", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_WWWW},
1087ec681f3Smrg   {"spotCutoff", {STATE_LIGHT, 0, STATE_SPOT_CUTOFF}, SWIZZLE_XXXX},
10901e04c3fSmrg};
11001e04c3fSmrg
11101e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_LightModel_elements[] = {
11201e04c3fSmrg   {"ambient", {STATE_LIGHTMODEL_AMBIENT, 0}, SWIZZLE_XYZW},
11301e04c3fSmrg};
11401e04c3fSmrg
11501e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_FrontLightModelProduct_elements[] = {
11601e04c3fSmrg   {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 0}, SWIZZLE_XYZW},
11701e04c3fSmrg};
11801e04c3fSmrg
11901e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_BackLightModelProduct_elements[] = {
12001e04c3fSmrg   {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 1}, SWIZZLE_XYZW},
12101e04c3fSmrg};
12201e04c3fSmrg
12301e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_FrontLightProduct_elements[] = {
1247ec681f3Smrg   {"ambient", {STATE_LIGHTPROD, 0, MAT_ATTRIB_FRONT_AMBIENT}, SWIZZLE_XYZW},
1257ec681f3Smrg   {"diffuse", {STATE_LIGHTPROD, 0, MAT_ATTRIB_FRONT_DIFFUSE}, SWIZZLE_XYZW},
1267ec681f3Smrg   {"specular", {STATE_LIGHTPROD, 0, MAT_ATTRIB_FRONT_SPECULAR}, SWIZZLE_XYZW},
12701e04c3fSmrg};
12801e04c3fSmrg
12901e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_BackLightProduct_elements[] = {
1307ec681f3Smrg   {"ambient", {STATE_LIGHTPROD, 0, MAT_ATTRIB_BACK_AMBIENT}, SWIZZLE_XYZW},
1317ec681f3Smrg   {"diffuse", {STATE_LIGHTPROD, 0, MAT_ATTRIB_BACK_DIFFUSE}, SWIZZLE_XYZW},
1327ec681f3Smrg   {"specular", {STATE_LIGHTPROD, 0, MAT_ATTRIB_BACK_SPECULAR}, SWIZZLE_XYZW},
13301e04c3fSmrg};
13401e04c3fSmrg
13501e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_TextureEnvColor_elements[] = {
13601e04c3fSmrg   {NULL, {STATE_TEXENV_COLOR, 0}, SWIZZLE_XYZW},
13701e04c3fSmrg};
13801e04c3fSmrg
13901e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_EyePlaneS_elements[] = {
14001e04c3fSmrg   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_S}, SWIZZLE_XYZW},
14101e04c3fSmrg};
14201e04c3fSmrg
14301e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_EyePlaneT_elements[] = {
14401e04c3fSmrg   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_T}, SWIZZLE_XYZW},
14501e04c3fSmrg};
14601e04c3fSmrg
14701e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_EyePlaneR_elements[] = {
14801e04c3fSmrg   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_R}, SWIZZLE_XYZW},
14901e04c3fSmrg};
15001e04c3fSmrg
15101e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_EyePlaneQ_elements[] = {
15201e04c3fSmrg   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_Q}, SWIZZLE_XYZW},
15301e04c3fSmrg};
15401e04c3fSmrg
15501e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_ObjectPlaneS_elements[] = {
15601e04c3fSmrg   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_S}, SWIZZLE_XYZW},
15701e04c3fSmrg};
15801e04c3fSmrg
15901e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_ObjectPlaneT_elements[] = {
16001e04c3fSmrg   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_T}, SWIZZLE_XYZW},
16101e04c3fSmrg};
16201e04c3fSmrg
16301e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_ObjectPlaneR_elements[] = {
16401e04c3fSmrg   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_R}, SWIZZLE_XYZW},
16501e04c3fSmrg};
16601e04c3fSmrg
16701e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_ObjectPlaneQ_elements[] = {
16801e04c3fSmrg   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_Q}, SWIZZLE_XYZW},
16901e04c3fSmrg};
17001e04c3fSmrg
17101e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_Fog_elements[] = {
17201e04c3fSmrg   {"color", {STATE_FOG_COLOR}, SWIZZLE_XYZW},
17301e04c3fSmrg   {"density", {STATE_FOG_PARAMS}, SWIZZLE_XXXX},
17401e04c3fSmrg   {"start", {STATE_FOG_PARAMS}, SWIZZLE_YYYY},
17501e04c3fSmrg   {"end", {STATE_FOG_PARAMS}, SWIZZLE_ZZZZ},
17601e04c3fSmrg   {"scale", {STATE_FOG_PARAMS}, SWIZZLE_WWWW},
17701e04c3fSmrg};
17801e04c3fSmrg
17901e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_NormalScale_elements[] = {
1807ec681f3Smrg   {NULL, {STATE_NORMAL_SCALE_EYESPACE}, SWIZZLE_XXXX},
18101e04c3fSmrg};
18201e04c3fSmrg
18301e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_FogParamsOptimizedMESA_elements[] = {
1847ec681f3Smrg   {NULL, {STATE_FOG_PARAMS_OPTIMIZED}, SWIZZLE_XYZW},
18501e04c3fSmrg};
18601e04c3fSmrg
1877ec681f3Smrg#define ATTRIB(i) \
1887ec681f3Smrg   static const struct gl_builtin_uniform_element gl_CurrentAttribFrag##i##MESA_elements[] = { \
1897ec681f3Smrg      {NULL, {STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, i}, SWIZZLE_XYZW}, \
1907ec681f3Smrg   };
1917ec681f3Smrg
1927ec681f3SmrgATTRIB(0)
1937ec681f3SmrgATTRIB(1)
1947ec681f3SmrgATTRIB(2)
1957ec681f3SmrgATTRIB(3)
1967ec681f3SmrgATTRIB(4)
1977ec681f3SmrgATTRIB(5)
1987ec681f3SmrgATTRIB(6)
1997ec681f3SmrgATTRIB(7)
2007ec681f3SmrgATTRIB(8)
2017ec681f3SmrgATTRIB(9)
2027ec681f3SmrgATTRIB(10)
2037ec681f3SmrgATTRIB(11)
2047ec681f3SmrgATTRIB(12)
2057ec681f3SmrgATTRIB(13)
2067ec681f3SmrgATTRIB(14)
2077ec681f3SmrgATTRIB(15)
2087ec681f3SmrgATTRIB(16)
2097ec681f3SmrgATTRIB(17)
2107ec681f3SmrgATTRIB(18)
2117ec681f3SmrgATTRIB(19)
2127ec681f3SmrgATTRIB(20)
2137ec681f3SmrgATTRIB(21)
2147ec681f3SmrgATTRIB(22)
2157ec681f3SmrgATTRIB(23)
2167ec681f3SmrgATTRIB(24)
2177ec681f3SmrgATTRIB(25)
2187ec681f3SmrgATTRIB(26)
2197ec681f3SmrgATTRIB(27)
2207ec681f3SmrgATTRIB(28)
2217ec681f3SmrgATTRIB(29)
2227ec681f3SmrgATTRIB(30)
2237ec681f3SmrgATTRIB(31)
2247ec681f3Smrg
2257ec681f3Smrg#define MATRIX(name, statevar)				\
2267ec681f3Smrg   static const struct gl_builtin_uniform_element name ## _elements[] = { \
2277ec681f3Smrg      { NULL, { statevar, 0, 0, 0}, SWIZZLE_XYZW },		\
2287ec681f3Smrg      { NULL, { statevar, 0, 1, 1}, SWIZZLE_XYZW },		\
2297ec681f3Smrg      { NULL, { statevar, 0, 2, 2}, SWIZZLE_XYZW },		\
2307ec681f3Smrg      { NULL, { statevar, 0, 3, 3}, SWIZZLE_XYZW },		\
2317ec681f3Smrg   }
23201e04c3fSmrg
2337ec681f3SmrgMATRIX(gl_ModelViewMatrix, STATE_MODELVIEW_MATRIX_TRANSPOSE);
2347ec681f3SmrgMATRIX(gl_ModelViewMatrixInverse, STATE_MODELVIEW_MATRIX_INVTRANS);
2357ec681f3SmrgMATRIX(gl_ModelViewMatrixTranspose, STATE_MODELVIEW_MATRIX);
2367ec681f3SmrgMATRIX(gl_ModelViewMatrixInverseTranspose, STATE_MODELVIEW_MATRIX_INVERSE);
23701e04c3fSmrg
2387ec681f3SmrgMATRIX(gl_ProjectionMatrix, STATE_PROJECTION_MATRIX_TRANSPOSE);
2397ec681f3SmrgMATRIX(gl_ProjectionMatrixInverse, STATE_PROJECTION_MATRIX_INVTRANS);
2407ec681f3SmrgMATRIX(gl_ProjectionMatrixTranspose, STATE_PROJECTION_MATRIX);
2417ec681f3SmrgMATRIX(gl_ProjectionMatrixInverseTranspose, STATE_PROJECTION_MATRIX_INVERSE);
2427ec681f3Smrg
2437ec681f3SmrgMATRIX(gl_ModelViewProjectionMatrix, STATE_MVP_MATRIX_TRANSPOSE);
2447ec681f3SmrgMATRIX(gl_ModelViewProjectionMatrixInverse, STATE_MVP_MATRIX_INVTRANS);
2457ec681f3SmrgMATRIX(gl_ModelViewProjectionMatrixTranspose, STATE_MVP_MATRIX);
2467ec681f3SmrgMATRIX(gl_ModelViewProjectionMatrixInverseTranspose, STATE_MVP_MATRIX_INVERSE);
2477ec681f3Smrg
2487ec681f3SmrgMATRIX(gl_TextureMatrix, STATE_TEXTURE_MATRIX_TRANSPOSE);
2497ec681f3SmrgMATRIX(gl_TextureMatrixInverse, STATE_TEXTURE_MATRIX_INVTRANS);
2507ec681f3SmrgMATRIX(gl_TextureMatrixTranspose, STATE_TEXTURE_MATRIX);
2517ec681f3SmrgMATRIX(gl_TextureMatrixInverseTranspose, STATE_TEXTURE_MATRIX_INVERSE);
25201e04c3fSmrg
25301e04c3fSmrgstatic const struct gl_builtin_uniform_element gl_NormalMatrix_elements[] = {
2547ec681f3Smrg   { NULL, { STATE_MODELVIEW_MATRIX_INVERSE, 0, 0, 0},
25501e04c3fSmrg     MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
2567ec681f3Smrg   { NULL, { STATE_MODELVIEW_MATRIX_INVERSE, 0, 1, 1},
25701e04c3fSmrg     MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
2587ec681f3Smrg   { NULL, { STATE_MODELVIEW_MATRIX_INVERSE, 0, 2, 2},
25901e04c3fSmrg     MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z) },
26001e04c3fSmrg};
26101e04c3fSmrg
26201e04c3fSmrg#undef MATRIX
26301e04c3fSmrg
26401e04c3fSmrg#define STATEVAR(name) {#name, name ## _elements, ARRAY_SIZE(name ## _elements)}
26501e04c3fSmrg
26601e04c3fSmrgstatic const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[] = {
26701e04c3fSmrg   STATEVAR(gl_NumSamples),
26801e04c3fSmrg   STATEVAR(gl_DepthRange),
26901e04c3fSmrg   STATEVAR(gl_ClipPlane),
27001e04c3fSmrg   STATEVAR(gl_Point),
27101e04c3fSmrg   STATEVAR(gl_FrontMaterial),
27201e04c3fSmrg   STATEVAR(gl_BackMaterial),
27301e04c3fSmrg   STATEVAR(gl_LightSource),
27401e04c3fSmrg   STATEVAR(gl_LightModel),
27501e04c3fSmrg   STATEVAR(gl_FrontLightModelProduct),
27601e04c3fSmrg   STATEVAR(gl_BackLightModelProduct),
27701e04c3fSmrg   STATEVAR(gl_FrontLightProduct),
27801e04c3fSmrg   STATEVAR(gl_BackLightProduct),
27901e04c3fSmrg   STATEVAR(gl_TextureEnvColor),
28001e04c3fSmrg   STATEVAR(gl_EyePlaneS),
28101e04c3fSmrg   STATEVAR(gl_EyePlaneT),
28201e04c3fSmrg   STATEVAR(gl_EyePlaneR),
28301e04c3fSmrg   STATEVAR(gl_EyePlaneQ),
28401e04c3fSmrg   STATEVAR(gl_ObjectPlaneS),
28501e04c3fSmrg   STATEVAR(gl_ObjectPlaneT),
28601e04c3fSmrg   STATEVAR(gl_ObjectPlaneR),
28701e04c3fSmrg   STATEVAR(gl_ObjectPlaneQ),
28801e04c3fSmrg   STATEVAR(gl_Fog),
28901e04c3fSmrg
29001e04c3fSmrg   STATEVAR(gl_ModelViewMatrix),
29101e04c3fSmrg   STATEVAR(gl_ModelViewMatrixInverse),
29201e04c3fSmrg   STATEVAR(gl_ModelViewMatrixTranspose),
29301e04c3fSmrg   STATEVAR(gl_ModelViewMatrixInverseTranspose),
29401e04c3fSmrg
29501e04c3fSmrg   STATEVAR(gl_ProjectionMatrix),
29601e04c3fSmrg   STATEVAR(gl_ProjectionMatrixInverse),
29701e04c3fSmrg   STATEVAR(gl_ProjectionMatrixTranspose),
29801e04c3fSmrg   STATEVAR(gl_ProjectionMatrixInverseTranspose),
29901e04c3fSmrg
30001e04c3fSmrg   STATEVAR(gl_ModelViewProjectionMatrix),
30101e04c3fSmrg   STATEVAR(gl_ModelViewProjectionMatrixInverse),
30201e04c3fSmrg   STATEVAR(gl_ModelViewProjectionMatrixTranspose),
30301e04c3fSmrg   STATEVAR(gl_ModelViewProjectionMatrixInverseTranspose),
30401e04c3fSmrg
30501e04c3fSmrg   STATEVAR(gl_TextureMatrix),
30601e04c3fSmrg   STATEVAR(gl_TextureMatrixInverse),
30701e04c3fSmrg   STATEVAR(gl_TextureMatrixTranspose),
30801e04c3fSmrg   STATEVAR(gl_TextureMatrixInverseTranspose),
30901e04c3fSmrg
31001e04c3fSmrg   STATEVAR(gl_NormalMatrix),
31101e04c3fSmrg   STATEVAR(gl_NormalScale),
31201e04c3fSmrg
31301e04c3fSmrg   STATEVAR(gl_FogParamsOptimizedMESA),
3147ec681f3Smrg
3157ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag0MESA),
3167ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag1MESA),
3177ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag2MESA),
3187ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag3MESA),
3197ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag4MESA),
3207ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag5MESA),
3217ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag6MESA),
3227ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag7MESA),
3237ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag8MESA),
3247ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag9MESA),
3257ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag10MESA),
3267ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag11MESA),
3277ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag12MESA),
3287ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag13MESA),
3297ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag14MESA),
3307ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag15MESA),
3317ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag16MESA),
3327ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag17MESA),
3337ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag18MESA),
3347ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag19MESA),
3357ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag20MESA),
3367ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag21MESA),
3377ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag22MESA),
3387ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag23MESA),
3397ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag24MESA),
3407ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag25MESA),
3417ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag26MESA),
3427ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag27MESA),
3437ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag28MESA),
3447ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag29MESA),
3457ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag30MESA),
3467ec681f3Smrg   STATEVAR(gl_CurrentAttribFrag31MESA),
34701e04c3fSmrg
34801e04c3fSmrg   {NULL, NULL, 0}
34901e04c3fSmrg};
35001e04c3fSmrg
35101e04c3fSmrg
35201e04c3fSmrgnamespace {
35301e04c3fSmrg
35401e04c3fSmrg/**
35501e04c3fSmrg * Data structure that accumulates fields for the gl_PerVertex interface
35601e04c3fSmrg * block.
35701e04c3fSmrg */
35801e04c3fSmrgclass per_vertex_accumulator
35901e04c3fSmrg{
36001e04c3fSmrgpublic:
36101e04c3fSmrg   per_vertex_accumulator();
3627ec681f3Smrg   void add_field(int slot, const glsl_type *type, int precision,
3637ec681f3Smrg                  const char *name, enum glsl_interp_mode interp);
36401e04c3fSmrg   const glsl_type *construct_interface_instance() const;
36501e04c3fSmrg
36601e04c3fSmrgprivate:
3677ec681f3Smrg   glsl_struct_field fields[14];
36801e04c3fSmrg   unsigned num_fields;
36901e04c3fSmrg};
37001e04c3fSmrg
37101e04c3fSmrg
37201e04c3fSmrgper_vertex_accumulator::per_vertex_accumulator()
37301e04c3fSmrg   : fields(),
37401e04c3fSmrg     num_fields(0)
37501e04c3fSmrg{
37601e04c3fSmrg}
37701e04c3fSmrg
37801e04c3fSmrg
37901e04c3fSmrgvoid
38001e04c3fSmrgper_vertex_accumulator::add_field(int slot, const glsl_type *type,
3817ec681f3Smrg                                  int precision, const char *name,
3827ec681f3Smrg                                  enum glsl_interp_mode interp)
38301e04c3fSmrg{
38401e04c3fSmrg   assert(this->num_fields < ARRAY_SIZE(this->fields));
38501e04c3fSmrg   this->fields[this->num_fields].type = type;
38601e04c3fSmrg   this->fields[this->num_fields].name = name;
38701e04c3fSmrg   this->fields[this->num_fields].matrix_layout = GLSL_MATRIX_LAYOUT_INHERITED;
38801e04c3fSmrg   this->fields[this->num_fields].location = slot;
38901e04c3fSmrg   this->fields[this->num_fields].offset = -1;
3907ec681f3Smrg   this->fields[this->num_fields].interpolation = interp;
39101e04c3fSmrg   this->fields[this->num_fields].centroid = 0;
39201e04c3fSmrg   this->fields[this->num_fields].sample = 0;
39301e04c3fSmrg   this->fields[this->num_fields].patch = 0;
3947ec681f3Smrg   this->fields[this->num_fields].precision = precision;
39501e04c3fSmrg   this->fields[this->num_fields].memory_read_only = 0;
39601e04c3fSmrg   this->fields[this->num_fields].memory_write_only = 0;
39701e04c3fSmrg   this->fields[this->num_fields].memory_coherent = 0;
39801e04c3fSmrg   this->fields[this->num_fields].memory_volatile = 0;
39901e04c3fSmrg   this->fields[this->num_fields].memory_restrict = 0;
4007ec681f3Smrg   this->fields[this->num_fields].image_format = PIPE_FORMAT_NONE;
40101e04c3fSmrg   this->fields[this->num_fields].explicit_xfb_buffer = 0;
40201e04c3fSmrg   this->fields[this->num_fields].xfb_buffer = -1;
40301e04c3fSmrg   this->fields[this->num_fields].xfb_stride = -1;
40401e04c3fSmrg   this->num_fields++;
40501e04c3fSmrg}
40601e04c3fSmrg
40701e04c3fSmrg
40801e04c3fSmrgconst glsl_type *
40901e04c3fSmrgper_vertex_accumulator::construct_interface_instance() const
41001e04c3fSmrg{
41101e04c3fSmrg   return glsl_type::get_interface_instance(this->fields, this->num_fields,
41201e04c3fSmrg                                            GLSL_INTERFACE_PACKING_STD140,
41301e04c3fSmrg                                            false,
41401e04c3fSmrg                                            "gl_PerVertex");
41501e04c3fSmrg}
41601e04c3fSmrg
41701e04c3fSmrg
41801e04c3fSmrgclass builtin_variable_generator
41901e04c3fSmrg{
42001e04c3fSmrgpublic:
42101e04c3fSmrg   builtin_variable_generator(exec_list *instructions,
42201e04c3fSmrg                              struct _mesa_glsl_parse_state *state);
42301e04c3fSmrg   void generate_constants();
42401e04c3fSmrg   void generate_uniforms();
42501e04c3fSmrg   void generate_special_vars();
42601e04c3fSmrg   void generate_vs_special_vars();
42701e04c3fSmrg   void generate_tcs_special_vars();
42801e04c3fSmrg   void generate_tes_special_vars();
42901e04c3fSmrg   void generate_gs_special_vars();
43001e04c3fSmrg   void generate_fs_special_vars();
43101e04c3fSmrg   void generate_cs_special_vars();
43201e04c3fSmrg   void generate_varyings();
43301e04c3fSmrg
43401e04c3fSmrgprivate:
43501e04c3fSmrg   const glsl_type *array(const glsl_type *base, unsigned elements)
43601e04c3fSmrg   {
43701e04c3fSmrg      return glsl_type::get_array_instance(base, elements);
43801e04c3fSmrg   }
43901e04c3fSmrg
44001e04c3fSmrg   const glsl_type *type(const char *name)
44101e04c3fSmrg   {
44201e04c3fSmrg      return symtab->get_type(name);
44301e04c3fSmrg   }
44401e04c3fSmrg
4457ec681f3Smrg   ir_variable *add_input(int slot, const glsl_type *type, int precision,
4467ec681f3Smrg                          const char *name,
4477ec681f3Smrg                          enum glsl_interp_mode interp = INTERP_MODE_NONE)
4487ec681f3Smrg   {
4497ec681f3Smrg      return add_variable(name, type, precision, ir_var_shader_in, slot, interp);
4507ec681f3Smrg   }
4517ec681f3Smrg
4527ec681f3Smrg   ir_variable *add_input(int slot, const glsl_type *type, const char *name,
4537ec681f3Smrg                          enum glsl_interp_mode interp = INTERP_MODE_NONE)
45401e04c3fSmrg   {
4557ec681f3Smrg      return add_input(slot, type, GLSL_PRECISION_NONE, name, interp);
4567ec681f3Smrg   }
4577ec681f3Smrg
4587ec681f3Smrg   ir_variable *add_output(int slot, const glsl_type *type, int precision,
4597ec681f3Smrg                           const char *name)
4607ec681f3Smrg   {
4617ec681f3Smrg      return add_variable(name, type, precision, ir_var_shader_out, slot);
46201e04c3fSmrg   }
46301e04c3fSmrg
46401e04c3fSmrg   ir_variable *add_output(int slot, const glsl_type *type, const char *name)
46501e04c3fSmrg   {
4667ec681f3Smrg      return add_output(slot, type, GLSL_PRECISION_NONE, name);
46701e04c3fSmrg   }
46801e04c3fSmrg
4697ec681f3Smrg   ir_variable *add_index_output(int slot, int index, const glsl_type *type,
4707ec681f3Smrg                                 int precision, const char *name)
47101e04c3fSmrg   {
4727ec681f3Smrg      return add_index_variable(name, type, precision, ir_var_shader_out, slot,
4737ec681f3Smrg                                index);
47401e04c3fSmrg   }
47501e04c3fSmrg
4767ec681f3Smrg   ir_variable *add_system_value(int slot, const glsl_type *type, int precision,
4777ec681f3Smrg                                 const char *name)
4787ec681f3Smrg   {
4797ec681f3Smrg      return add_variable(name, type, precision, ir_var_system_value, slot);
4807ec681f3Smrg   }
48101e04c3fSmrg   ir_variable *add_system_value(int slot, const glsl_type *type,
48201e04c3fSmrg                                 const char *name)
48301e04c3fSmrg   {
4847ec681f3Smrg      return add_system_value(slot, type, GLSL_PRECISION_NONE, name);
48501e04c3fSmrg   }
48601e04c3fSmrg
48701e04c3fSmrg   ir_variable *add_variable(const char *name, const glsl_type *type,
4887ec681f3Smrg                             int precision, enum ir_variable_mode mode,
4897ec681f3Smrg                             int slot, enum glsl_interp_mode interp = INTERP_MODE_NONE);
49001e04c3fSmrg   ir_variable *add_index_variable(const char *name, const glsl_type *type,
4917ec681f3Smrg                                   int precision, enum ir_variable_mode mode,
4927ec681f3Smrg                                   int slot, int index);
4937ec681f3Smrg   ir_variable *add_uniform(const glsl_type *type, int precision,
4947ec681f3Smrg                            const char *name);
4957ec681f3Smrg   ir_variable *add_uniform(const glsl_type *type, const char *name)
4967ec681f3Smrg   {
4977ec681f3Smrg      return add_uniform(type, GLSL_PRECISION_NONE, name);
4987ec681f3Smrg   }
4997ec681f3Smrg   ir_variable *add_const(const char *name, int precision, int value);
5007ec681f3Smrg   ir_variable *add_const(const char *name, int value)
5017ec681f3Smrg   {
5027ec681f3Smrg      return add_const(name, GLSL_PRECISION_MEDIUM, value);
5037ec681f3Smrg   }
50401e04c3fSmrg   ir_variable *add_const_ivec3(const char *name, int x, int y, int z);
5057ec681f3Smrg   void add_varying(int slot, const glsl_type *type, int precision,
5067ec681f3Smrg                    const char *name,
5077ec681f3Smrg                    enum glsl_interp_mode interp  = INTERP_MODE_NONE);
5087ec681f3Smrg   void add_varying(int slot, const glsl_type *type, const char *name,
5097ec681f3Smrg                    enum glsl_interp_mode interp = INTERP_MODE_NONE)
5107ec681f3Smrg   {
5117ec681f3Smrg      add_varying(slot, type, GLSL_PRECISION_NONE, name, interp);
5127ec681f3Smrg   }
51301e04c3fSmrg
51401e04c3fSmrg   exec_list * const instructions;
51501e04c3fSmrg   struct _mesa_glsl_parse_state * const state;
51601e04c3fSmrg   glsl_symbol_table * const symtab;
51701e04c3fSmrg
51801e04c3fSmrg   /**
51901e04c3fSmrg    * True if compatibility-profile-only variables should be included.  (In
52001e04c3fSmrg    * desktop GL, these are always included when the GLSL version is 1.30 and
52101e04c3fSmrg    * or below).
52201e04c3fSmrg    */
52301e04c3fSmrg   const bool compatibility;
52401e04c3fSmrg
52501e04c3fSmrg   const glsl_type * const bool_t;
52601e04c3fSmrg   const glsl_type * const int_t;
52701e04c3fSmrg   const glsl_type * const uint_t;
52801e04c3fSmrg   const glsl_type * const uint64_t;
52901e04c3fSmrg   const glsl_type * const float_t;
53001e04c3fSmrg   const glsl_type * const vec2_t;
53101e04c3fSmrg   const glsl_type * const vec3_t;
53201e04c3fSmrg   const glsl_type * const vec4_t;
53301e04c3fSmrg   const glsl_type * const uvec3_t;
53401e04c3fSmrg   const glsl_type * const mat3_t;
53501e04c3fSmrg   const glsl_type * const mat4_t;
53601e04c3fSmrg
53701e04c3fSmrg   per_vertex_accumulator per_vertex_in;
53801e04c3fSmrg   per_vertex_accumulator per_vertex_out;
53901e04c3fSmrg};
54001e04c3fSmrg
54101e04c3fSmrg
54201e04c3fSmrgbuiltin_variable_generator::builtin_variable_generator(
54301e04c3fSmrg   exec_list *instructions, struct _mesa_glsl_parse_state *state)
54401e04c3fSmrg   : instructions(instructions), state(state), symtab(state->symbols),
54501e04c3fSmrg     compatibility(state->compat_shader || state->ARB_compatibility_enable),
54601e04c3fSmrg     bool_t(glsl_type::bool_type), int_t(glsl_type::int_type),
54701e04c3fSmrg     uint_t(glsl_type::uint_type),
54801e04c3fSmrg     uint64_t(glsl_type::uint64_t_type),
54901e04c3fSmrg     float_t(glsl_type::float_type), vec2_t(glsl_type::vec2_type),
55001e04c3fSmrg     vec3_t(glsl_type::vec3_type), vec4_t(glsl_type::vec4_type),
55101e04c3fSmrg     uvec3_t(glsl_type::uvec3_type),
55201e04c3fSmrg     mat3_t(glsl_type::mat3_type), mat4_t(glsl_type::mat4_type)
55301e04c3fSmrg{
55401e04c3fSmrg}
55501e04c3fSmrg
55601e04c3fSmrgir_variable *
55701e04c3fSmrgbuiltin_variable_generator::add_index_variable(const char *name,
5587ec681f3Smrg                                               const glsl_type *type,
5597ec681f3Smrg                                               int precision,
5607ec681f3Smrg                                               enum ir_variable_mode mode,
5617ec681f3Smrg                                               int slot, int index)
56201e04c3fSmrg{
56301e04c3fSmrg   ir_variable *var = new(symtab) ir_variable(type, name, mode);
56401e04c3fSmrg   var->data.how_declared = ir_var_declared_implicitly;
56501e04c3fSmrg
56601e04c3fSmrg   switch (var->data.mode) {
56701e04c3fSmrg   case ir_var_auto:
56801e04c3fSmrg   case ir_var_shader_in:
56901e04c3fSmrg   case ir_var_uniform:
57001e04c3fSmrg   case ir_var_system_value:
57101e04c3fSmrg      var->data.read_only = true;
57201e04c3fSmrg      break;
57301e04c3fSmrg   case ir_var_shader_out:
57401e04c3fSmrg   case ir_var_shader_storage:
57501e04c3fSmrg      break;
57601e04c3fSmrg   default:
57701e04c3fSmrg      /* The only variables that are added using this function should be
57801e04c3fSmrg       * uniforms, shader storage, shader inputs, and shader outputs, constants
57901e04c3fSmrg       * (which use ir_var_auto), and system values.
58001e04c3fSmrg       */
58101e04c3fSmrg      assert(0);
58201e04c3fSmrg      break;
58301e04c3fSmrg   }
58401e04c3fSmrg
58501e04c3fSmrg   var->data.location = slot;
58601e04c3fSmrg   var->data.explicit_location = (slot >= 0);
58701e04c3fSmrg   var->data.explicit_index = 1;
58801e04c3fSmrg   var->data.index = index;
58901e04c3fSmrg
5907ec681f3Smrg   if (state->es_shader)
5917ec681f3Smrg      var->data.precision = precision;
5927ec681f3Smrg
59301e04c3fSmrg   /* Once the variable is created an initialized, add it to the symbol table
59401e04c3fSmrg    * and add the declaration to the IR stream.
59501e04c3fSmrg    */
59601e04c3fSmrg   instructions->push_tail(var);
59701e04c3fSmrg
59801e04c3fSmrg   symtab->add_variable(var);
59901e04c3fSmrg   return var;
60001e04c3fSmrg}
60101e04c3fSmrg
60201e04c3fSmrgir_variable *
60301e04c3fSmrgbuiltin_variable_generator::add_variable(const char *name,
60401e04c3fSmrg                                         const glsl_type *type,
6057ec681f3Smrg                                         int precision,
6067ec681f3Smrg                                         enum ir_variable_mode mode, int slot,
6077ec681f3Smrg                                         enum glsl_interp_mode interp)
60801e04c3fSmrg{
60901e04c3fSmrg   ir_variable *var = new(symtab) ir_variable(type, name, mode);
61001e04c3fSmrg   var->data.how_declared = ir_var_declared_implicitly;
61101e04c3fSmrg
61201e04c3fSmrg   switch (var->data.mode) {
61301e04c3fSmrg   case ir_var_auto:
61401e04c3fSmrg   case ir_var_shader_in:
61501e04c3fSmrg   case ir_var_uniform:
61601e04c3fSmrg   case ir_var_system_value:
61701e04c3fSmrg      var->data.read_only = true;
61801e04c3fSmrg      break;
61901e04c3fSmrg   case ir_var_shader_out:
62001e04c3fSmrg   case ir_var_shader_storage:
62101e04c3fSmrg      break;
62201e04c3fSmrg   default:
62301e04c3fSmrg      /* The only variables that are added using this function should be
62401e04c3fSmrg       * uniforms, shader storage, shader inputs, and shader outputs, constants
62501e04c3fSmrg       * (which use ir_var_auto), and system values.
62601e04c3fSmrg       */
62701e04c3fSmrg      assert(0);
62801e04c3fSmrg      break;
62901e04c3fSmrg   }
63001e04c3fSmrg
63101e04c3fSmrg   var->data.location = slot;
63201e04c3fSmrg   var->data.explicit_location = (slot >= 0);
63301e04c3fSmrg   var->data.explicit_index = 0;
6347ec681f3Smrg   var->data.interpolation = interp;
6357ec681f3Smrg
6367ec681f3Smrg   if (state->es_shader)
6377ec681f3Smrg      var->data.precision = precision;
63801e04c3fSmrg
63901e04c3fSmrg   /* Once the variable is created an initialized, add it to the symbol table
64001e04c3fSmrg    * and add the declaration to the IR stream.
64101e04c3fSmrg    */
64201e04c3fSmrg   instructions->push_tail(var);
64301e04c3fSmrg
64401e04c3fSmrg   symtab->add_variable(var);
64501e04c3fSmrg   return var;
64601e04c3fSmrg}
64701e04c3fSmrg
64801e04c3fSmrgextern "C" const struct gl_builtin_uniform_desc *
64901e04c3fSmrg_mesa_glsl_get_builtin_uniform_desc(const char *name)
65001e04c3fSmrg{
65101e04c3fSmrg   for (unsigned i = 0; _mesa_builtin_uniform_desc[i].name != NULL; i++) {
65201e04c3fSmrg      if (strcmp(_mesa_builtin_uniform_desc[i].name, name) == 0) {
65301e04c3fSmrg         return &_mesa_builtin_uniform_desc[i];
65401e04c3fSmrg      }
65501e04c3fSmrg   }
65601e04c3fSmrg   return NULL;
65701e04c3fSmrg}
65801e04c3fSmrg
65901e04c3fSmrgir_variable *
66001e04c3fSmrgbuiltin_variable_generator::add_uniform(const glsl_type *type,
6617ec681f3Smrg                                        int precision,
66201e04c3fSmrg                                        const char *name)
66301e04c3fSmrg{
6647ec681f3Smrg   ir_variable *const uni =
6657ec681f3Smrg      add_variable(name, type, precision, ir_var_uniform, -1);
66601e04c3fSmrg
66701e04c3fSmrg   const struct gl_builtin_uniform_desc* const statevar =
66801e04c3fSmrg      _mesa_glsl_get_builtin_uniform_desc(name);
66901e04c3fSmrg   assert(statevar != NULL);
67001e04c3fSmrg
67101e04c3fSmrg   const unsigned array_count = type->is_array() ? type->length : 1;
67201e04c3fSmrg
67301e04c3fSmrg   ir_state_slot *slots =
67401e04c3fSmrg      uni->allocate_state_slots(array_count * statevar->num_elements);
67501e04c3fSmrg
67601e04c3fSmrg   for (unsigned a = 0; a < array_count; a++) {
67701e04c3fSmrg      for (unsigned j = 0; j < statevar->num_elements; j++) {
67801e04c3fSmrg	 const struct gl_builtin_uniform_element *element =
67901e04c3fSmrg	    &statevar->elements[j];
68001e04c3fSmrg
68101e04c3fSmrg	 memcpy(slots->tokens, element->tokens, sizeof(element->tokens));
6827ec681f3Smrg	 if (type->is_array())
6837ec681f3Smrg            slots->tokens[1] = a;
68401e04c3fSmrg
68501e04c3fSmrg	 slots->swizzle = element->swizzle;
68601e04c3fSmrg	 slots++;
68701e04c3fSmrg      }
68801e04c3fSmrg   }
68901e04c3fSmrg
69001e04c3fSmrg   return uni;
69101e04c3fSmrg}
69201e04c3fSmrg
69301e04c3fSmrg
69401e04c3fSmrgir_variable *
6957ec681f3Smrgbuiltin_variable_generator::add_const(const char *name, int precision,
6967ec681f3Smrg                                      int value)
69701e04c3fSmrg{
69801e04c3fSmrg   ir_variable *const var = add_variable(name, glsl_type::int_type,
6997ec681f3Smrg                                         precision, ir_var_auto, -1);
70001e04c3fSmrg   var->constant_value = new(var) ir_constant(value);
70101e04c3fSmrg   var->constant_initializer = new(var) ir_constant(value);
70201e04c3fSmrg   var->data.has_initializer = true;
70301e04c3fSmrg   return var;
70401e04c3fSmrg}
70501e04c3fSmrg
70601e04c3fSmrg
70701e04c3fSmrgir_variable *
70801e04c3fSmrgbuiltin_variable_generator::add_const_ivec3(const char *name, int x, int y,
70901e04c3fSmrg                                            int z)
71001e04c3fSmrg{
71101e04c3fSmrg   ir_variable *const var = add_variable(name, glsl_type::ivec3_type,
7127ec681f3Smrg                                         GLSL_PRECISION_HIGH,
71301e04c3fSmrg                                         ir_var_auto, -1);
71401e04c3fSmrg   ir_constant_data data;
71501e04c3fSmrg   memset(&data, 0, sizeof(data));
71601e04c3fSmrg   data.i[0] = x;
71701e04c3fSmrg   data.i[1] = y;
71801e04c3fSmrg   data.i[2] = z;
71901e04c3fSmrg   var->constant_value = new(var) ir_constant(glsl_type::ivec3_type, &data);
72001e04c3fSmrg   var->constant_initializer =
72101e04c3fSmrg      new(var) ir_constant(glsl_type::ivec3_type, &data);
72201e04c3fSmrg   var->data.has_initializer = true;
72301e04c3fSmrg   return var;
72401e04c3fSmrg}
72501e04c3fSmrg
72601e04c3fSmrg
72701e04c3fSmrgvoid
72801e04c3fSmrgbuiltin_variable_generator::generate_constants()
72901e04c3fSmrg{
73001e04c3fSmrg   add_const("gl_MaxVertexAttribs", state->Const.MaxVertexAttribs);
73101e04c3fSmrg   add_const("gl_MaxVertexTextureImageUnits",
73201e04c3fSmrg             state->Const.MaxVertexTextureImageUnits);
73301e04c3fSmrg   add_const("gl_MaxCombinedTextureImageUnits",
73401e04c3fSmrg             state->Const.MaxCombinedTextureImageUnits);
73501e04c3fSmrg   add_const("gl_MaxTextureImageUnits", state->Const.MaxTextureImageUnits);
73601e04c3fSmrg   add_const("gl_MaxDrawBuffers", state->Const.MaxDrawBuffers);
73701e04c3fSmrg
73801e04c3fSmrg   /* Max uniforms/varyings: GLSL ES counts these in units of vectors; desktop
73901e04c3fSmrg    * GL counts them in units of "components" or "floats" and also in units
74001e04c3fSmrg    * of vectors since GL 4.1
74101e04c3fSmrg    */
74201e04c3fSmrg   if (!state->es_shader) {
74301e04c3fSmrg      add_const("gl_MaxFragmentUniformComponents",
74401e04c3fSmrg                state->Const.MaxFragmentUniformComponents);
74501e04c3fSmrg      add_const("gl_MaxVertexUniformComponents",
74601e04c3fSmrg                state->Const.MaxVertexUniformComponents);
74701e04c3fSmrg   }
74801e04c3fSmrg
74901e04c3fSmrg   if (state->is_version(410, 100)) {
75001e04c3fSmrg      add_const("gl_MaxVertexUniformVectors",
75101e04c3fSmrg                state->Const.MaxVertexUniformComponents / 4);
75201e04c3fSmrg      add_const("gl_MaxFragmentUniformVectors",
75301e04c3fSmrg                state->Const.MaxFragmentUniformComponents / 4);
75401e04c3fSmrg
75501e04c3fSmrg      /* In GLSL ES 3.00, gl_MaxVaryingVectors was split out to separate
75601e04c3fSmrg       * vertex and fragment shader constants.
75701e04c3fSmrg       */
75801e04c3fSmrg      if (state->is_version(0, 300)) {
75901e04c3fSmrg         add_const("gl_MaxVertexOutputVectors",
76001e04c3fSmrg                   state->ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4);
76101e04c3fSmrg         add_const("gl_MaxFragmentInputVectors",
76201e04c3fSmrg                   state->ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents / 4);
76301e04c3fSmrg      } else {
76401e04c3fSmrg         add_const("gl_MaxVaryingVectors",
76501e04c3fSmrg                   state->ctx->Const.MaxVarying);
76601e04c3fSmrg      }
76701e04c3fSmrg
76801e04c3fSmrg      /* EXT_blend_func_extended brings a built in constant
76901e04c3fSmrg       * for determining number of dual source draw buffers
77001e04c3fSmrg       */
77101e04c3fSmrg      if (state->EXT_blend_func_extended_enable) {
77201e04c3fSmrg         add_const("gl_MaxDualSourceDrawBuffersEXT",
77301e04c3fSmrg                   state->Const.MaxDualSourceDrawBuffers);
77401e04c3fSmrg      }
7757ec681f3Smrg   }
7767ec681f3Smrg
7777ec681f3Smrg   /* gl_MaxVaryingFloats was deprecated in GLSL 1.30+, and was moved to
7787ec681f3Smrg    * compat profile in GLSL 4.20. GLSL ES never supported this constant.
7797ec681f3Smrg    */
7807ec681f3Smrg   if (compatibility || !state->is_version(420, 100))  {
78101e04c3fSmrg      add_const("gl_MaxVaryingFloats", state->ctx->Const.MaxVarying * 4);
78201e04c3fSmrg   }
78301e04c3fSmrg
78401e04c3fSmrg   /* Texel offsets were introduced in ARB_shading_language_420pack (which
78501e04c3fSmrg    * requires desktop GLSL version 130), and adopted into desktop GLSL
78601e04c3fSmrg    * version 4.20 and GLSL ES version 3.00.
78701e04c3fSmrg    */
78801e04c3fSmrg   if ((state->is_version(130, 0) &&
78901e04c3fSmrg        state->ARB_shading_language_420pack_enable) ||
79001e04c3fSmrg      state->is_version(420, 300)) {
79101e04c3fSmrg      add_const("gl_MinProgramTexelOffset",
79201e04c3fSmrg                state->Const.MinProgramTexelOffset);
79301e04c3fSmrg      add_const("gl_MaxProgramTexelOffset",
79401e04c3fSmrg                state->Const.MaxProgramTexelOffset);
79501e04c3fSmrg   }
79601e04c3fSmrg
79701e04c3fSmrg   if (state->has_clip_distance()) {
79801e04c3fSmrg      add_const("gl_MaxClipDistances", state->Const.MaxClipPlanes);
79901e04c3fSmrg   }
80001e04c3fSmrg   if (state->is_version(130, 0)) {
80101e04c3fSmrg      add_const("gl_MaxVaryingComponents", state->ctx->Const.MaxVarying * 4);
80201e04c3fSmrg   }
80301e04c3fSmrg   if (state->has_cull_distance()) {
80401e04c3fSmrg      add_const("gl_MaxCullDistances", state->Const.MaxClipPlanes);
80501e04c3fSmrg      add_const("gl_MaxCombinedClipAndCullDistances",
80601e04c3fSmrg                state->Const.MaxClipPlanes);
80701e04c3fSmrg   }
80801e04c3fSmrg
80901e04c3fSmrg   if (state->has_geometry_shader()) {
81001e04c3fSmrg      add_const("gl_MaxVertexOutputComponents",
81101e04c3fSmrg                state->Const.MaxVertexOutputComponents);
81201e04c3fSmrg      add_const("gl_MaxGeometryInputComponents",
81301e04c3fSmrg                state->Const.MaxGeometryInputComponents);
81401e04c3fSmrg      add_const("gl_MaxGeometryOutputComponents",
81501e04c3fSmrg                state->Const.MaxGeometryOutputComponents);
81601e04c3fSmrg      add_const("gl_MaxFragmentInputComponents",
81701e04c3fSmrg                state->Const.MaxFragmentInputComponents);
81801e04c3fSmrg      add_const("gl_MaxGeometryTextureImageUnits",
81901e04c3fSmrg                state->Const.MaxGeometryTextureImageUnits);
82001e04c3fSmrg      add_const("gl_MaxGeometryOutputVertices",
82101e04c3fSmrg                state->Const.MaxGeometryOutputVertices);
82201e04c3fSmrg      add_const("gl_MaxGeometryTotalOutputComponents",
82301e04c3fSmrg                state->Const.MaxGeometryTotalOutputComponents);
82401e04c3fSmrg      add_const("gl_MaxGeometryUniformComponents",
82501e04c3fSmrg                state->Const.MaxGeometryUniformComponents);
82601e04c3fSmrg
82701e04c3fSmrg      /* Note: the GLSL 1.50-4.40 specs require
82801e04c3fSmrg       * gl_MaxGeometryVaryingComponents to be present, and to be at least 64.
82901e04c3fSmrg       * But they do not define what it means (and there does not appear to be
83001e04c3fSmrg       * any corresponding constant in the GL specs).  However,
83101e04c3fSmrg       * ARB_geometry_shader4 defines MAX_GEOMETRY_VARYING_COMPONENTS_ARB to
83201e04c3fSmrg       * be the maximum number of components available for use as geometry
83301e04c3fSmrg       * outputs.  So we assume this is a synonym for
83401e04c3fSmrg       * gl_MaxGeometryOutputComponents.
83501e04c3fSmrg       */
83601e04c3fSmrg      add_const("gl_MaxGeometryVaryingComponents",
83701e04c3fSmrg                state->Const.MaxGeometryOutputComponents);
83801e04c3fSmrg   }
83901e04c3fSmrg
84001e04c3fSmrg   if (compatibility) {
84101e04c3fSmrg      /* Note: gl_MaxLights stopped being listed as an explicit constant in
84201e04c3fSmrg       * GLSL 1.30, however it continues to be referred to (as a minimum size
84301e04c3fSmrg       * for compatibility-mode uniforms) all the way up through GLSL 4.30, so
84401e04c3fSmrg       * this seems like it was probably an oversight.
84501e04c3fSmrg       */
84601e04c3fSmrg      add_const("gl_MaxLights", state->Const.MaxLights);
84701e04c3fSmrg
84801e04c3fSmrg      add_const("gl_MaxClipPlanes", state->Const.MaxClipPlanes);
84901e04c3fSmrg
85001e04c3fSmrg      /* Note: gl_MaxTextureUnits wasn't made compatibility-only until GLSL
85101e04c3fSmrg       * 1.50, however this seems like it was probably an oversight.
85201e04c3fSmrg       */
85301e04c3fSmrg      add_const("gl_MaxTextureUnits", state->Const.MaxTextureUnits);
85401e04c3fSmrg
85501e04c3fSmrg      /* Note: gl_MaxTextureCoords was left out of GLSL 1.40, but it was
85601e04c3fSmrg       * re-introduced in GLSL 1.50, so this seems like it was probably an
85701e04c3fSmrg       * oversight.
85801e04c3fSmrg       */
85901e04c3fSmrg      add_const("gl_MaxTextureCoords", state->Const.MaxTextureCoords);
86001e04c3fSmrg   }
86101e04c3fSmrg
86201e04c3fSmrg   if (state->has_atomic_counters()) {
86301e04c3fSmrg      add_const("gl_MaxVertexAtomicCounters",
86401e04c3fSmrg                state->Const.MaxVertexAtomicCounters);
86501e04c3fSmrg      add_const("gl_MaxFragmentAtomicCounters",
86601e04c3fSmrg                state->Const.MaxFragmentAtomicCounters);
86701e04c3fSmrg      add_const("gl_MaxCombinedAtomicCounters",
86801e04c3fSmrg                state->Const.MaxCombinedAtomicCounters);
86901e04c3fSmrg      add_const("gl_MaxAtomicCounterBindings",
87001e04c3fSmrg                state->Const.MaxAtomicBufferBindings);
87101e04c3fSmrg
87201e04c3fSmrg      if (state->has_geometry_shader()) {
87301e04c3fSmrg         add_const("gl_MaxGeometryAtomicCounters",
87401e04c3fSmrg                   state->Const.MaxGeometryAtomicCounters);
87501e04c3fSmrg      }
87601e04c3fSmrg      if (state->is_version(110, 320)) {
87701e04c3fSmrg         add_const("gl_MaxTessControlAtomicCounters",
87801e04c3fSmrg                   state->Const.MaxTessControlAtomicCounters);
87901e04c3fSmrg         add_const("gl_MaxTessEvaluationAtomicCounters",
88001e04c3fSmrg                   state->Const.MaxTessEvaluationAtomicCounters);
88101e04c3fSmrg      }
88201e04c3fSmrg   }
88301e04c3fSmrg
88401e04c3fSmrg   if (state->is_version(420, 310)) {
88501e04c3fSmrg      add_const("gl_MaxVertexAtomicCounterBuffers",
88601e04c3fSmrg                state->Const.MaxVertexAtomicCounterBuffers);
88701e04c3fSmrg      add_const("gl_MaxFragmentAtomicCounterBuffers",
88801e04c3fSmrg                state->Const.MaxFragmentAtomicCounterBuffers);
88901e04c3fSmrg      add_const("gl_MaxCombinedAtomicCounterBuffers",
89001e04c3fSmrg                state->Const.MaxCombinedAtomicCounterBuffers);
89101e04c3fSmrg      add_const("gl_MaxAtomicCounterBufferSize",
89201e04c3fSmrg                state->Const.MaxAtomicCounterBufferSize);
89301e04c3fSmrg
89401e04c3fSmrg      if (state->has_geometry_shader()) {
89501e04c3fSmrg         add_const("gl_MaxGeometryAtomicCounterBuffers",
89601e04c3fSmrg                   state->Const.MaxGeometryAtomicCounterBuffers);
89701e04c3fSmrg      }
89801e04c3fSmrg      if (state->is_version(110, 320)) {
89901e04c3fSmrg         add_const("gl_MaxTessControlAtomicCounterBuffers",
90001e04c3fSmrg                   state->Const.MaxTessControlAtomicCounterBuffers);
90101e04c3fSmrg         add_const("gl_MaxTessEvaluationAtomicCounterBuffers",
90201e04c3fSmrg                   state->Const.MaxTessEvaluationAtomicCounterBuffers);
90301e04c3fSmrg      }
90401e04c3fSmrg   }
90501e04c3fSmrg
90601e04c3fSmrg   if (state->is_version(430, 310) || state->ARB_compute_shader_enable) {
90701e04c3fSmrg      add_const("gl_MaxComputeAtomicCounterBuffers",
90801e04c3fSmrg                state->Const.MaxComputeAtomicCounterBuffers);
90901e04c3fSmrg      add_const("gl_MaxComputeAtomicCounters",
91001e04c3fSmrg                state->Const.MaxComputeAtomicCounters);
91101e04c3fSmrg      add_const("gl_MaxComputeImageUniforms",
91201e04c3fSmrg                state->Const.MaxComputeImageUniforms);
91301e04c3fSmrg      add_const("gl_MaxComputeTextureImageUnits",
91401e04c3fSmrg                state->Const.MaxComputeTextureImageUnits);
91501e04c3fSmrg      add_const("gl_MaxComputeUniformComponents",
91601e04c3fSmrg                state->Const.MaxComputeUniformComponents);
91701e04c3fSmrg
91801e04c3fSmrg      add_const_ivec3("gl_MaxComputeWorkGroupCount",
91901e04c3fSmrg                      state->Const.MaxComputeWorkGroupCount[0],
92001e04c3fSmrg                      state->Const.MaxComputeWorkGroupCount[1],
92101e04c3fSmrg                      state->Const.MaxComputeWorkGroupCount[2]);
92201e04c3fSmrg      add_const_ivec3("gl_MaxComputeWorkGroupSize",
92301e04c3fSmrg                      state->Const.MaxComputeWorkGroupSize[0],
92401e04c3fSmrg                      state->Const.MaxComputeWorkGroupSize[1],
92501e04c3fSmrg                      state->Const.MaxComputeWorkGroupSize[2]);
92601e04c3fSmrg
92701e04c3fSmrg      /* From the GLSL 4.40 spec, section 7.1 (Built-In Language Variables):
92801e04c3fSmrg       *
92901e04c3fSmrg       *     The built-in constant gl_WorkGroupSize is a compute-shader
93001e04c3fSmrg       *     constant containing the local work-group size of the shader.  The
93101e04c3fSmrg       *     size of the work group in the X, Y, and Z dimensions is stored in
93201e04c3fSmrg       *     the x, y, and z components.  The constants values in
93301e04c3fSmrg       *     gl_WorkGroupSize will match those specified in the required
93401e04c3fSmrg       *     local_size_x, local_size_y, and local_size_z layout qualifiers
93501e04c3fSmrg       *     for the current shader.  This is a constant so that it can be
93601e04c3fSmrg       *     used to size arrays of memory that can be shared within the local
93701e04c3fSmrg       *     work group.  It is a compile-time error to use gl_WorkGroupSize
93801e04c3fSmrg       *     in a shader that does not declare a fixed local group size, or
93901e04c3fSmrg       *     before that shader has declared a fixed local group size, using
94001e04c3fSmrg       *     local_size_x, local_size_y, and local_size_z.
94101e04c3fSmrg       *
94201e04c3fSmrg       * To prevent the shader from trying to refer to gl_WorkGroupSize before
94301e04c3fSmrg       * the layout declaration, we don't define it here.  Intead we define it
94401e04c3fSmrg       * in ast_cs_input_layout::hir().
94501e04c3fSmrg       */
94601e04c3fSmrg   }
94701e04c3fSmrg
94801e04c3fSmrg   if (state->has_enhanced_layouts()) {
94901e04c3fSmrg      add_const("gl_MaxTransformFeedbackBuffers",
95001e04c3fSmrg                state->Const.MaxTransformFeedbackBuffers);
95101e04c3fSmrg      add_const("gl_MaxTransformFeedbackInterleavedComponents",
95201e04c3fSmrg                state->Const.MaxTransformFeedbackInterleavedComponents);
95301e04c3fSmrg   }
95401e04c3fSmrg
95501e04c3fSmrg   if (state->has_shader_image_load_store()) {
95601e04c3fSmrg      add_const("gl_MaxImageUnits",
95701e04c3fSmrg                state->Const.MaxImageUnits);
95801e04c3fSmrg      add_const("gl_MaxVertexImageUniforms",
95901e04c3fSmrg                state->Const.MaxVertexImageUniforms);
96001e04c3fSmrg      add_const("gl_MaxFragmentImageUniforms",
96101e04c3fSmrg                state->Const.MaxFragmentImageUniforms);
96201e04c3fSmrg      add_const("gl_MaxCombinedImageUniforms",
96301e04c3fSmrg                state->Const.MaxCombinedImageUniforms);
96401e04c3fSmrg
96501e04c3fSmrg      if (state->has_geometry_shader()) {
96601e04c3fSmrg         add_const("gl_MaxGeometryImageUniforms",
96701e04c3fSmrg                   state->Const.MaxGeometryImageUniforms);
96801e04c3fSmrg      }
96901e04c3fSmrg
97001e04c3fSmrg      if (!state->es_shader) {
97101e04c3fSmrg         add_const("gl_MaxCombinedImageUnitsAndFragmentOutputs",
97201e04c3fSmrg                   state->Const.MaxCombinedShaderOutputResources);
97301e04c3fSmrg         add_const("gl_MaxImageSamples",
97401e04c3fSmrg                   state->Const.MaxImageSamples);
97501e04c3fSmrg      }
97601e04c3fSmrg
97701e04c3fSmrg      if (state->has_tessellation_shader()) {
97801e04c3fSmrg         add_const("gl_MaxTessControlImageUniforms",
97901e04c3fSmrg                   state->Const.MaxTessControlImageUniforms);
98001e04c3fSmrg         add_const("gl_MaxTessEvaluationImageUniforms",
98101e04c3fSmrg                   state->Const.MaxTessEvaluationImageUniforms);
98201e04c3fSmrg      }
98301e04c3fSmrg   }
98401e04c3fSmrg
98501e04c3fSmrg   if (state->is_version(440, 310) ||
98601e04c3fSmrg       state->ARB_ES3_1_compatibility_enable) {
98701e04c3fSmrg      add_const("gl_MaxCombinedShaderOutputResources",
98801e04c3fSmrg                state->Const.MaxCombinedShaderOutputResources);
98901e04c3fSmrg   }
99001e04c3fSmrg
99101e04c3fSmrg   if (state->is_version(410, 0) ||
99201e04c3fSmrg       state->ARB_viewport_array_enable ||
9937ec681f3Smrg       state->OES_viewport_array_enable) {
9947ec681f3Smrg      add_const("gl_MaxViewports", GLSL_PRECISION_HIGH,
9957ec681f3Smrg                state->Const.MaxViewports);
9967ec681f3Smrg   }
99701e04c3fSmrg
99801e04c3fSmrg   if (state->has_tessellation_shader()) {
99901e04c3fSmrg      add_const("gl_MaxPatchVertices", state->Const.MaxPatchVertices);
100001e04c3fSmrg      add_const("gl_MaxTessGenLevel", state->Const.MaxTessGenLevel);
100101e04c3fSmrg      add_const("gl_MaxTessControlInputComponents", state->Const.MaxTessControlInputComponents);
100201e04c3fSmrg      add_const("gl_MaxTessControlOutputComponents", state->Const.MaxTessControlOutputComponents);
100301e04c3fSmrg      add_const("gl_MaxTessControlTextureImageUnits", state->Const.MaxTessControlTextureImageUnits);
100401e04c3fSmrg      add_const("gl_MaxTessEvaluationInputComponents", state->Const.MaxTessEvaluationInputComponents);
100501e04c3fSmrg      add_const("gl_MaxTessEvaluationOutputComponents", state->Const.MaxTessEvaluationOutputComponents);
100601e04c3fSmrg      add_const("gl_MaxTessEvaluationTextureImageUnits", state->Const.MaxTessEvaluationTextureImageUnits);
100701e04c3fSmrg      add_const("gl_MaxTessPatchComponents", state->Const.MaxTessPatchComponents);
100801e04c3fSmrg      add_const("gl_MaxTessControlTotalOutputComponents", state->Const.MaxTessControlTotalOutputComponents);
100901e04c3fSmrg      add_const("gl_MaxTessControlUniformComponents", state->Const.MaxTessControlUniformComponents);
101001e04c3fSmrg      add_const("gl_MaxTessEvaluationUniformComponents", state->Const.MaxTessEvaluationUniformComponents);
101101e04c3fSmrg   }
101201e04c3fSmrg
101301e04c3fSmrg   if (state->is_version(450, 320) ||
101401e04c3fSmrg       state->OES_sample_variables_enable ||
101501e04c3fSmrg       state->ARB_ES3_1_compatibility_enable)
101601e04c3fSmrg      add_const("gl_MaxSamples", state->Const.MaxSamples);
101701e04c3fSmrg}
101801e04c3fSmrg
101901e04c3fSmrg
102001e04c3fSmrg/**
102101e04c3fSmrg * Generate uniform variables (which exist in all types of shaders).
102201e04c3fSmrg */
102301e04c3fSmrgvoid
102401e04c3fSmrgbuiltin_variable_generator::generate_uniforms()
102501e04c3fSmrg{
102601e04c3fSmrg   if (state->is_version(400, 320) ||
102701e04c3fSmrg       state->ARB_sample_shading_enable ||
102801e04c3fSmrg       state->OES_sample_variables_enable)
10297ec681f3Smrg      add_uniform(int_t, GLSL_PRECISION_LOW, "gl_NumSamples");
103001e04c3fSmrg   add_uniform(type("gl_DepthRangeParameters"), "gl_DepthRange");
10317ec681f3Smrg
10327ec681f3Smrg   for (unsigned i = 0; i < VARYING_SLOT_VAR0; i++) {
10337ec681f3Smrg      char name[128];
10347ec681f3Smrg
10357ec681f3Smrg      snprintf(name, sizeof(name), "gl_CurrentAttribFrag%uMESA", i);
10367ec681f3Smrg      add_uniform(vec4_t, name);
10377ec681f3Smrg   }
103801e04c3fSmrg
103901e04c3fSmrg   if (compatibility) {
104001e04c3fSmrg      add_uniform(mat4_t, "gl_ModelViewMatrix");
104101e04c3fSmrg      add_uniform(mat4_t, "gl_ProjectionMatrix");
104201e04c3fSmrg      add_uniform(mat4_t, "gl_ModelViewProjectionMatrix");
104301e04c3fSmrg      add_uniform(mat3_t, "gl_NormalMatrix");
104401e04c3fSmrg      add_uniform(mat4_t, "gl_ModelViewMatrixInverse");
104501e04c3fSmrg      add_uniform(mat4_t, "gl_ProjectionMatrixInverse");
104601e04c3fSmrg      add_uniform(mat4_t, "gl_ModelViewProjectionMatrixInverse");
104701e04c3fSmrg      add_uniform(mat4_t, "gl_ModelViewMatrixTranspose");
104801e04c3fSmrg      add_uniform(mat4_t, "gl_ProjectionMatrixTranspose");
104901e04c3fSmrg      add_uniform(mat4_t, "gl_ModelViewProjectionMatrixTranspose");
105001e04c3fSmrg      add_uniform(mat4_t, "gl_ModelViewMatrixInverseTranspose");
105101e04c3fSmrg      add_uniform(mat4_t, "gl_ProjectionMatrixInverseTranspose");
105201e04c3fSmrg      add_uniform(mat4_t, "gl_ModelViewProjectionMatrixInverseTranspose");
105301e04c3fSmrg      add_uniform(float_t, "gl_NormalScale");
105401e04c3fSmrg      add_uniform(type("gl_LightModelParameters"), "gl_LightModel");
105501e04c3fSmrg      add_uniform(vec4_t, "gl_FogParamsOptimizedMESA");
105601e04c3fSmrg
105701e04c3fSmrg      const glsl_type *const mat4_array_type =
105801e04c3fSmrg	 array(mat4_t, state->Const.MaxTextureCoords);
105901e04c3fSmrg      add_uniform(mat4_array_type, "gl_TextureMatrix");
106001e04c3fSmrg      add_uniform(mat4_array_type, "gl_TextureMatrixInverse");
106101e04c3fSmrg      add_uniform(mat4_array_type, "gl_TextureMatrixTranspose");
106201e04c3fSmrg      add_uniform(mat4_array_type, "gl_TextureMatrixInverseTranspose");
106301e04c3fSmrg
106401e04c3fSmrg      add_uniform(array(vec4_t, state->Const.MaxClipPlanes), "gl_ClipPlane");
106501e04c3fSmrg      add_uniform(type("gl_PointParameters"), "gl_Point");
106601e04c3fSmrg
106701e04c3fSmrg      const glsl_type *const material_parameters_type =
106801e04c3fSmrg	 type("gl_MaterialParameters");
106901e04c3fSmrg      add_uniform(material_parameters_type, "gl_FrontMaterial");
107001e04c3fSmrg      add_uniform(material_parameters_type, "gl_BackMaterial");
107101e04c3fSmrg
107201e04c3fSmrg      add_uniform(array(type("gl_LightSourceParameters"),
107301e04c3fSmrg                        state->Const.MaxLights),
107401e04c3fSmrg                  "gl_LightSource");
107501e04c3fSmrg
107601e04c3fSmrg      const glsl_type *const light_model_products_type =
107701e04c3fSmrg         type("gl_LightModelProducts");
107801e04c3fSmrg      add_uniform(light_model_products_type, "gl_FrontLightModelProduct");
107901e04c3fSmrg      add_uniform(light_model_products_type, "gl_BackLightModelProduct");
108001e04c3fSmrg
108101e04c3fSmrg      const glsl_type *const light_products_type =
108201e04c3fSmrg         array(type("gl_LightProducts"), state->Const.MaxLights);
108301e04c3fSmrg      add_uniform(light_products_type, "gl_FrontLightProduct");
108401e04c3fSmrg      add_uniform(light_products_type, "gl_BackLightProduct");
108501e04c3fSmrg
108601e04c3fSmrg      add_uniform(array(vec4_t, state->Const.MaxTextureUnits),
108701e04c3fSmrg                  "gl_TextureEnvColor");
108801e04c3fSmrg
108901e04c3fSmrg      const glsl_type *const texcoords_vec4 =
109001e04c3fSmrg	 array(vec4_t, state->Const.MaxTextureCoords);
109101e04c3fSmrg      add_uniform(texcoords_vec4, "gl_EyePlaneS");
109201e04c3fSmrg      add_uniform(texcoords_vec4, "gl_EyePlaneT");
109301e04c3fSmrg      add_uniform(texcoords_vec4, "gl_EyePlaneR");
109401e04c3fSmrg      add_uniform(texcoords_vec4, "gl_EyePlaneQ");
109501e04c3fSmrg      add_uniform(texcoords_vec4, "gl_ObjectPlaneS");
109601e04c3fSmrg      add_uniform(texcoords_vec4, "gl_ObjectPlaneT");
109701e04c3fSmrg      add_uniform(texcoords_vec4, "gl_ObjectPlaneR");
109801e04c3fSmrg      add_uniform(texcoords_vec4, "gl_ObjectPlaneQ");
109901e04c3fSmrg
110001e04c3fSmrg      add_uniform(type("gl_FogParameters"), "gl_Fog");
110101e04c3fSmrg   }
110201e04c3fSmrg}
110301e04c3fSmrg
110401e04c3fSmrg
110501e04c3fSmrg/**
110601e04c3fSmrg * Generate special variables which exist in all shaders.
110701e04c3fSmrg */
110801e04c3fSmrgvoid
110901e04c3fSmrgbuiltin_variable_generator::generate_special_vars()
111001e04c3fSmrg{
111101e04c3fSmrg   if (state->ARB_shader_ballot_enable) {
111201e04c3fSmrg      add_system_value(SYSTEM_VALUE_SUBGROUP_SIZE, uint_t, "gl_SubGroupSizeARB");
111301e04c3fSmrg      add_system_value(SYSTEM_VALUE_SUBGROUP_INVOCATION, uint_t, "gl_SubGroupInvocationARB");
111401e04c3fSmrg      add_system_value(SYSTEM_VALUE_SUBGROUP_EQ_MASK, uint64_t, "gl_SubGroupEqMaskARB");
111501e04c3fSmrg      add_system_value(SYSTEM_VALUE_SUBGROUP_GE_MASK, uint64_t, "gl_SubGroupGeMaskARB");
111601e04c3fSmrg      add_system_value(SYSTEM_VALUE_SUBGROUP_GT_MASK, uint64_t, "gl_SubGroupGtMaskARB");
111701e04c3fSmrg      add_system_value(SYSTEM_VALUE_SUBGROUP_LE_MASK, uint64_t, "gl_SubGroupLeMaskARB");
111801e04c3fSmrg      add_system_value(SYSTEM_VALUE_SUBGROUP_LT_MASK, uint64_t, "gl_SubGroupLtMaskARB");
111901e04c3fSmrg   }
112001e04c3fSmrg}
112101e04c3fSmrg
112201e04c3fSmrg
112301e04c3fSmrg/**
112401e04c3fSmrg * Generate variables which only exist in vertex shaders.
112501e04c3fSmrg */
112601e04c3fSmrgvoid
112701e04c3fSmrgbuiltin_variable_generator::generate_vs_special_vars()
112801e04c3fSmrg{
11297ec681f3Smrg   if (state->is_version(130, 300) || state->EXT_gpu_shader4_enable) {
11307ec681f3Smrg      add_system_value(SYSTEM_VALUE_VERTEX_ID, int_t, GLSL_PRECISION_HIGH,
11317ec681f3Smrg                       "gl_VertexID");
11327ec681f3Smrg   }
113301e04c3fSmrg   if (state->is_version(460, 0)) {
113401e04c3fSmrg      add_system_value(SYSTEM_VALUE_BASE_VERTEX, int_t, "gl_BaseVertex");
113501e04c3fSmrg      add_system_value(SYSTEM_VALUE_BASE_INSTANCE, int_t, "gl_BaseInstance");
113601e04c3fSmrg      add_system_value(SYSTEM_VALUE_DRAW_ID, int_t, "gl_DrawID");
113701e04c3fSmrg   }
11387ec681f3Smrg   if (state->EXT_draw_instanced_enable && state->is_version(0, 100))
11397ec681f3Smrg      add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, GLSL_PRECISION_HIGH,
11407ec681f3Smrg                       "gl_InstanceIDEXT");
11417ec681f3Smrg
114201e04c3fSmrg   if (state->ARB_draw_instanced_enable)
114301e04c3fSmrg      add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, "gl_InstanceIDARB");
11447ec681f3Smrg
11457e102996Smaya   if (state->ARB_draw_instanced_enable || state->is_version(140, 300) ||
11467ec681f3Smrg       state->EXT_gpu_shader4_enable) {
11477ec681f3Smrg      add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, GLSL_PRECISION_HIGH,
11487ec681f3Smrg                       "gl_InstanceID");
11497ec681f3Smrg   }
115001e04c3fSmrg   if (state->ARB_shader_draw_parameters_enable) {
115101e04c3fSmrg      add_system_value(SYSTEM_VALUE_BASE_VERTEX, int_t, "gl_BaseVertexARB");
115201e04c3fSmrg      add_system_value(SYSTEM_VALUE_BASE_INSTANCE, int_t, "gl_BaseInstanceARB");
115301e04c3fSmrg      add_system_value(SYSTEM_VALUE_DRAW_ID, int_t, "gl_DrawIDARB");
115401e04c3fSmrg   }
115501e04c3fSmrg   if (compatibility) {
115601e04c3fSmrg      add_input(VERT_ATTRIB_POS, vec4_t, "gl_Vertex");
115701e04c3fSmrg      add_input(VERT_ATTRIB_NORMAL, vec3_t, "gl_Normal");
115801e04c3fSmrg      add_input(VERT_ATTRIB_COLOR0, vec4_t, "gl_Color");
115901e04c3fSmrg      add_input(VERT_ATTRIB_COLOR1, vec4_t, "gl_SecondaryColor");
116001e04c3fSmrg      add_input(VERT_ATTRIB_TEX0, vec4_t, "gl_MultiTexCoord0");
116101e04c3fSmrg      add_input(VERT_ATTRIB_TEX1, vec4_t, "gl_MultiTexCoord1");
116201e04c3fSmrg      add_input(VERT_ATTRIB_TEX2, vec4_t, "gl_MultiTexCoord2");
116301e04c3fSmrg      add_input(VERT_ATTRIB_TEX3, vec4_t, "gl_MultiTexCoord3");
116401e04c3fSmrg      add_input(VERT_ATTRIB_TEX4, vec4_t, "gl_MultiTexCoord4");
116501e04c3fSmrg      add_input(VERT_ATTRIB_TEX5, vec4_t, "gl_MultiTexCoord5");
116601e04c3fSmrg      add_input(VERT_ATTRIB_TEX6, vec4_t, "gl_MultiTexCoord6");
116701e04c3fSmrg      add_input(VERT_ATTRIB_TEX7, vec4_t, "gl_MultiTexCoord7");
116801e04c3fSmrg      add_input(VERT_ATTRIB_FOG, float_t, "gl_FogCoord");
116901e04c3fSmrg   }
117001e04c3fSmrg}
117101e04c3fSmrg
117201e04c3fSmrg
117301e04c3fSmrg/**
117401e04c3fSmrg * Generate variables which only exist in tessellation control shaders.
117501e04c3fSmrg */
117601e04c3fSmrgvoid
117701e04c3fSmrgbuiltin_variable_generator::generate_tcs_special_vars()
117801e04c3fSmrg{
11797ec681f3Smrg   add_system_value(SYSTEM_VALUE_PRIMITIVE_ID, int_t, GLSL_PRECISION_HIGH,
11807ec681f3Smrg                    "gl_PrimitiveID");
11817ec681f3Smrg   add_system_value(SYSTEM_VALUE_INVOCATION_ID, int_t, GLSL_PRECISION_HIGH,
11827ec681f3Smrg                    "gl_InvocationID");
11837ec681f3Smrg   add_system_value(SYSTEM_VALUE_VERTICES_IN, int_t, GLSL_PRECISION_HIGH,
11847ec681f3Smrg                    "gl_PatchVerticesIn");
118501e04c3fSmrg
118601e04c3fSmrg   add_output(VARYING_SLOT_TESS_LEVEL_OUTER, array(float_t, 4),
11877ec681f3Smrg              GLSL_PRECISION_HIGH, "gl_TessLevelOuter")->data.patch = 1;
118801e04c3fSmrg   add_output(VARYING_SLOT_TESS_LEVEL_INNER, array(float_t, 2),
11897ec681f3Smrg              GLSL_PRECISION_HIGH, "gl_TessLevelInner")->data.patch = 1;
119001e04c3fSmrg   /* XXX What to do if multiple are flipped on? */
119101e04c3fSmrg   int bbox_slot = state->ctx->Const.NoPrimitiveBoundingBoxOutput ? -1 :
119201e04c3fSmrg      VARYING_SLOT_BOUNDING_BOX0;
119301e04c3fSmrg   if (state->EXT_primitive_bounding_box_enable)
119401e04c3fSmrg      add_output(bbox_slot, array(vec4_t, 2), "gl_BoundingBoxEXT")
119501e04c3fSmrg         ->data.patch = 1;
11967ec681f3Smrg   if (state->OES_primitive_bounding_box_enable) {
11977ec681f3Smrg      add_output(bbox_slot, array(vec4_t, 2), GLSL_PRECISION_HIGH,
11987ec681f3Smrg                 "gl_BoundingBoxOES")->data.patch = 1;
11997ec681f3Smrg   }
12007ec681f3Smrg   if (state->is_version(0, 320) || state->ARB_ES3_2_compatibility_enable) {
12017ec681f3Smrg      add_output(bbox_slot, array(vec4_t, 2), GLSL_PRECISION_HIGH,
12027ec681f3Smrg                 "gl_BoundingBox")->data.patch = 1;
12037ec681f3Smrg   }
12047ec681f3Smrg
12057ec681f3Smrg   /* NOTE: These are completely pointless. Writing these will never go
12067ec681f3Smrg    * anywhere. But the specs demands it. So we add them with a slot of -1,
12077ec681f3Smrg    * which makes the data go nowhere.
12087ec681f3Smrg    */
12097ec681f3Smrg   if (state->NV_viewport_array2_enable) {
12107ec681f3Smrg      add_output(-1, int_t, "gl_Layer");
12117ec681f3Smrg      add_output(-1, int_t, "gl_ViewportIndex");
12127ec681f3Smrg      add_output(-1, array(int_t, 1), "gl_ViewportMask");
12137ec681f3Smrg   }
12147ec681f3Smrg
121501e04c3fSmrg}
121601e04c3fSmrg
121701e04c3fSmrg
121801e04c3fSmrg/**
121901e04c3fSmrg * Generate variables which only exist in tessellation evaluation shaders.
122001e04c3fSmrg */
122101e04c3fSmrgvoid
122201e04c3fSmrgbuiltin_variable_generator::generate_tes_special_vars()
122301e04c3fSmrg{
122401e04c3fSmrg   ir_variable *var;
122501e04c3fSmrg
12267ec681f3Smrg   add_system_value(SYSTEM_VALUE_PRIMITIVE_ID, int_t, GLSL_PRECISION_HIGH,
12277ec681f3Smrg                    "gl_PrimitiveID");
12287ec681f3Smrg   add_system_value(SYSTEM_VALUE_VERTICES_IN, int_t, GLSL_PRECISION_HIGH,
12297ec681f3Smrg                    "gl_PatchVerticesIn");
12307ec681f3Smrg   add_system_value(SYSTEM_VALUE_TESS_COORD, vec3_t, GLSL_PRECISION_HIGH,
12317ec681f3Smrg                    "gl_TessCoord");
123201e04c3fSmrg   if (this->state->ctx->Const.GLSLTessLevelsAsInputs) {
123301e04c3fSmrg      add_input(VARYING_SLOT_TESS_LEVEL_OUTER, array(float_t, 4),
12347ec681f3Smrg                GLSL_PRECISION_HIGH, "gl_TessLevelOuter")->data.patch = 1;
123501e04c3fSmrg      add_input(VARYING_SLOT_TESS_LEVEL_INNER, array(float_t, 2),
12367ec681f3Smrg                GLSL_PRECISION_HIGH, "gl_TessLevelInner")->data.patch = 1;
123701e04c3fSmrg   } else {
123801e04c3fSmrg      add_system_value(SYSTEM_VALUE_TESS_LEVEL_OUTER, array(float_t, 4),
12397ec681f3Smrg                       GLSL_PRECISION_HIGH, "gl_TessLevelOuter");
124001e04c3fSmrg      add_system_value(SYSTEM_VALUE_TESS_LEVEL_INNER, array(float_t, 2),
12417ec681f3Smrg                       GLSL_PRECISION_HIGH, "gl_TessLevelInner");
124201e04c3fSmrg   }
12437ec681f3Smrg   if (state->ARB_shader_viewport_layer_array_enable ||
12447ec681f3Smrg       state->NV_viewport_array2_enable) {
124501e04c3fSmrg      var = add_output(VARYING_SLOT_LAYER, int_t, "gl_Layer");
124601e04c3fSmrg      var->data.interpolation = INTERP_MODE_FLAT;
124701e04c3fSmrg      var = add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
124801e04c3fSmrg      var->data.interpolation = INTERP_MODE_FLAT;
124901e04c3fSmrg   }
12507ec681f3Smrg   if (state->NV_viewport_array2_enable) {
12517ec681f3Smrg      var = add_output(VARYING_SLOT_VIEWPORT_MASK, array(int_t, 1),
12527ec681f3Smrg                       "gl_ViewportMask");
12537ec681f3Smrg      var->data.interpolation = INTERP_MODE_FLAT;
12547ec681f3Smrg   }
125501e04c3fSmrg}
125601e04c3fSmrg
125701e04c3fSmrg
125801e04c3fSmrg/**
125901e04c3fSmrg * Generate variables which only exist in geometry shaders.
126001e04c3fSmrg */
126101e04c3fSmrgvoid
126201e04c3fSmrgbuiltin_variable_generator::generate_gs_special_vars()
126301e04c3fSmrg{
126401e04c3fSmrg   ir_variable *var;
126501e04c3fSmrg
12667ec681f3Smrg   var = add_output(VARYING_SLOT_LAYER, int_t, GLSL_PRECISION_HIGH, "gl_Layer");
126701e04c3fSmrg   var->data.interpolation = INTERP_MODE_FLAT;
126801e04c3fSmrg   if (state->is_version(410, 0) || state->ARB_viewport_array_enable ||
126901e04c3fSmrg       state->OES_viewport_array_enable) {
12707ec681f3Smrg      var = add_output(VARYING_SLOT_VIEWPORT, int_t, GLSL_PRECISION_HIGH,
12717ec681f3Smrg                       "gl_ViewportIndex");
12727ec681f3Smrg      var->data.interpolation = INTERP_MODE_FLAT;
12737ec681f3Smrg   }
12747ec681f3Smrg   if (state->NV_viewport_array2_enable) {
12757ec681f3Smrg      var = add_output(VARYING_SLOT_VIEWPORT_MASK, array(int_t, 1),
12767ec681f3Smrg                       "gl_ViewportMask");
127701e04c3fSmrg      var->data.interpolation = INTERP_MODE_FLAT;
127801e04c3fSmrg   }
127901e04c3fSmrg   if (state->is_version(400, 320) || state->ARB_gpu_shader5_enable ||
128001e04c3fSmrg       state->OES_geometry_shader_enable || state->EXT_geometry_shader_enable) {
12817ec681f3Smrg      add_system_value(SYSTEM_VALUE_INVOCATION_ID, int_t, GLSL_PRECISION_HIGH,
12827ec681f3Smrg                       "gl_InvocationID");
128301e04c3fSmrg   }
128401e04c3fSmrg
128501e04c3fSmrg   /* Although gl_PrimitiveID appears in tessellation control and tessellation
128601e04c3fSmrg    * evaluation shaders, it has a different function there than it has in
128701e04c3fSmrg    * geometry shaders, so we treat it (and its counterpart gl_PrimitiveIDIn)
128801e04c3fSmrg    * as special geometry shader variables.
128901e04c3fSmrg    *
129001e04c3fSmrg    * Note that although the general convention of suffixing geometry shader
129101e04c3fSmrg    * input varyings with "In" was not adopted into GLSL 1.50, it is used in
129201e04c3fSmrg    * the specific case of gl_PrimitiveIDIn.  So we don't need to treat
129301e04c3fSmrg    * gl_PrimitiveIDIn as an {ARB,EXT}_geometry_shader4-only variable.
129401e04c3fSmrg    */
12957ec681f3Smrg   var = add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, GLSL_PRECISION_HIGH,
12967ec681f3Smrg                   "gl_PrimitiveIDIn");
129701e04c3fSmrg   var->data.interpolation = INTERP_MODE_FLAT;
12987ec681f3Smrg   var = add_output(VARYING_SLOT_PRIMITIVE_ID, int_t, GLSL_PRECISION_HIGH,
12997ec681f3Smrg                    "gl_PrimitiveID");
130001e04c3fSmrg   var->data.interpolation = INTERP_MODE_FLAT;
130101e04c3fSmrg}
130201e04c3fSmrg
130301e04c3fSmrg
130401e04c3fSmrg/**
130501e04c3fSmrg * Generate variables which only exist in fragment shaders.
130601e04c3fSmrg */
130701e04c3fSmrgvoid
130801e04c3fSmrgbuiltin_variable_generator::generate_fs_special_vars()
130901e04c3fSmrg{
131001e04c3fSmrg   ir_variable *var;
131101e04c3fSmrg
13127ec681f3Smrg   int frag_coord_precision = (state->is_version(0, 300) ?
13137ec681f3Smrg                               GLSL_PRECISION_HIGH :
13147ec681f3Smrg                               GLSL_PRECISION_MEDIUM);
131501e04c3fSmrg
13167ec681f3Smrg   if (this->state->ctx->Const.GLSLFragCoordIsSysVal) {
13177ec681f3Smrg      add_system_value(SYSTEM_VALUE_FRAG_COORD, vec4_t, frag_coord_precision,
13187ec681f3Smrg                       "gl_FragCoord");
13197ec681f3Smrg   } else {
13207ec681f3Smrg      add_input(VARYING_SLOT_POS, vec4_t, frag_coord_precision, "gl_FragCoord");
13217ec681f3Smrg   }
13227ec681f3Smrg
13237ec681f3Smrg   if (this->state->ctx->Const.GLSLFrontFacingIsSysVal) {
13247ec681f3Smrg      var = add_system_value(SYSTEM_VALUE_FRONT_FACE, bool_t, "gl_FrontFacing");
13257ec681f3Smrg      var->data.interpolation = INTERP_MODE_FLAT;
13267ec681f3Smrg   } else {
13277ec681f3Smrg      var = add_input(VARYING_SLOT_FACE, bool_t, "gl_FrontFacing");
13287ec681f3Smrg      var->data.interpolation = INTERP_MODE_FLAT;
13297ec681f3Smrg   }
133001e04c3fSmrg
13317ec681f3Smrg   if (state->is_version(120, 100)) {
13327ec681f3Smrg      if (this->state->ctx->Const.GLSLPointCoordIsSysVal)
13337ec681f3Smrg         add_system_value(SYSTEM_VALUE_POINT_COORD, vec2_t,
13347ec681f3Smrg                          GLSL_PRECISION_MEDIUM, "gl_PointCoord");
13357ec681f3Smrg      else
13367ec681f3Smrg         add_input(VARYING_SLOT_PNTC, vec2_t, GLSL_PRECISION_MEDIUM,
13377ec681f3Smrg                   "gl_PointCoord");
13387ec681f3Smrg   }
133901e04c3fSmrg
13407e102996Smaya   if (state->has_geometry_shader() || state->EXT_gpu_shader4_enable) {
13417ec681f3Smrg      var = add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, GLSL_PRECISION_HIGH,
13427ec681f3Smrg                      "gl_PrimitiveID");
134301e04c3fSmrg      var->data.interpolation = INTERP_MODE_FLAT;
134401e04c3fSmrg   }
134501e04c3fSmrg
134601e04c3fSmrg   /* gl_FragColor and gl_FragData were deprecated starting in desktop GLSL
134701e04c3fSmrg    * 1.30, and were relegated to the compatibility profile in GLSL 4.20.
134801e04c3fSmrg    * They were removed from GLSL ES 3.00.
134901e04c3fSmrg    */
135001e04c3fSmrg   if (compatibility || !state->is_version(420, 300)) {
13517ec681f3Smrg      add_output(FRAG_RESULT_COLOR, vec4_t, GLSL_PRECISION_MEDIUM,
13527ec681f3Smrg                 "gl_FragColor");
135301e04c3fSmrg      add_output(FRAG_RESULT_DATA0,
13547ec681f3Smrg                 array(vec4_t, state->Const.MaxDrawBuffers),
13557ec681f3Smrg                 GLSL_PRECISION_MEDIUM,
13567ec681f3Smrg                 "gl_FragData");
135701e04c3fSmrg   }
135801e04c3fSmrg
135901e04c3fSmrg   if (state->has_framebuffer_fetch() && !state->is_version(130, 300)) {
136001e04c3fSmrg      ir_variable *const var =
136101e04c3fSmrg         add_output(FRAG_RESULT_DATA0,
136201e04c3fSmrg                    array(vec4_t, state->Const.MaxDrawBuffers),
136301e04c3fSmrg                    "gl_LastFragData");
136401e04c3fSmrg      var->data.precision = GLSL_PRECISION_MEDIUM;
136501e04c3fSmrg      var->data.read_only = 1;
136601e04c3fSmrg      var->data.fb_fetch_output = 1;
136701e04c3fSmrg      var->data.memory_coherent = 1;
136801e04c3fSmrg   }
136901e04c3fSmrg
137001e04c3fSmrg   if (state->es_shader && state->language_version == 100 && state->EXT_blend_func_extended_enable) {
137101e04c3fSmrg      add_index_output(FRAG_RESULT_COLOR, 1, vec4_t,
13727ec681f3Smrg                       GLSL_PRECISION_MEDIUM, "gl_SecondaryFragColorEXT");
137301e04c3fSmrg      add_index_output(FRAG_RESULT_DATA0, 1,
137401e04c3fSmrg                       array(vec4_t, state->Const.MaxDualSourceDrawBuffers),
13757ec681f3Smrg                       GLSL_PRECISION_MEDIUM, "gl_SecondaryFragDataEXT");
137601e04c3fSmrg   }
137701e04c3fSmrg
137801e04c3fSmrg   /* gl_FragDepth has always been in desktop GLSL, but did not appear in GLSL
137901e04c3fSmrg    * ES 1.00.
138001e04c3fSmrg    */
13817ec681f3Smrg   if (state->is_version(110, 300)) {
13827ec681f3Smrg      add_output(FRAG_RESULT_DEPTH, float_t, GLSL_PRECISION_HIGH,
13837ec681f3Smrg                 "gl_FragDepth");
13847ec681f3Smrg   }
138501e04c3fSmrg
138601e04c3fSmrg   if (state->EXT_frag_depth_enable)
138701e04c3fSmrg      add_output(FRAG_RESULT_DEPTH, float_t, "gl_FragDepthEXT");
138801e04c3fSmrg
138901e04c3fSmrg   if (state->ARB_shader_stencil_export_enable) {
139001e04c3fSmrg      ir_variable *const var =
139101e04c3fSmrg         add_output(FRAG_RESULT_STENCIL, int_t, "gl_FragStencilRefARB");
139201e04c3fSmrg      if (state->ARB_shader_stencil_export_warn)
139301e04c3fSmrg         var->enable_extension_warning("GL_ARB_shader_stencil_export");
139401e04c3fSmrg   }
139501e04c3fSmrg
139601e04c3fSmrg   if (state->AMD_shader_stencil_export_enable) {
139701e04c3fSmrg      ir_variable *const var =
139801e04c3fSmrg         add_output(FRAG_RESULT_STENCIL, int_t, "gl_FragStencilRefAMD");
139901e04c3fSmrg      if (state->AMD_shader_stencil_export_warn)
140001e04c3fSmrg         var->enable_extension_warning("GL_AMD_shader_stencil_export");
140101e04c3fSmrg   }
140201e04c3fSmrg
140301e04c3fSmrg   if (state->is_version(400, 320) ||
140401e04c3fSmrg       state->ARB_sample_shading_enable ||
140501e04c3fSmrg       state->OES_sample_variables_enable) {
14067ec681f3Smrg      add_system_value(SYSTEM_VALUE_SAMPLE_ID, int_t, GLSL_PRECISION_LOW,
14077ec681f3Smrg                       "gl_SampleID");
14087ec681f3Smrg      add_system_value(SYSTEM_VALUE_SAMPLE_POS, vec2_t, GLSL_PRECISION_MEDIUM,
14097ec681f3Smrg                       "gl_SamplePosition");
141001e04c3fSmrg      /* From the ARB_sample_shading specification:
141101e04c3fSmrg       *    "The number of elements in the array is ceil(<s>/32), where
141201e04c3fSmrg       *    <s> is the maximum number of color samples supported by the
141301e04c3fSmrg       *    implementation."
141401e04c3fSmrg       * Since no drivers expose more than 32x MSAA, we can simply set
141501e04c3fSmrg       * the array size to 1 rather than computing it.
141601e04c3fSmrg       */
14177ec681f3Smrg      add_output(FRAG_RESULT_SAMPLE_MASK, array(int_t, 1),
14187ec681f3Smrg                 GLSL_PRECISION_HIGH, "gl_SampleMask");
141901e04c3fSmrg   }
142001e04c3fSmrg
142101e04c3fSmrg   if (state->is_version(400, 320) ||
142201e04c3fSmrg       state->ARB_gpu_shader5_enable ||
142301e04c3fSmrg       state->OES_sample_variables_enable) {
14247ec681f3Smrg      add_system_value(SYSTEM_VALUE_SAMPLE_MASK_IN, array(int_t, 1),
14257ec681f3Smrg                       GLSL_PRECISION_HIGH, "gl_SampleMaskIn");
142601e04c3fSmrg   }
142701e04c3fSmrg
142801e04c3fSmrg   if (state->is_version(430, 320) ||
142901e04c3fSmrg       state->ARB_fragment_layer_viewport_enable ||
143001e04c3fSmrg       state->OES_geometry_shader_enable ||
143101e04c3fSmrg       state->EXT_geometry_shader_enable) {
14327ec681f3Smrg      add_varying(VARYING_SLOT_LAYER, int_t, GLSL_PRECISION_HIGH,
14337ec681f3Smrg                  "gl_Layer", INTERP_MODE_FLAT);
143401e04c3fSmrg   }
143501e04c3fSmrg
143601e04c3fSmrg   if (state->is_version(430, 0) ||
143701e04c3fSmrg       state->ARB_fragment_layer_viewport_enable ||
143801e04c3fSmrg       state->OES_viewport_array_enable) {
14397ec681f3Smrg      add_varying(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex", INTERP_MODE_FLAT);
144001e04c3fSmrg   }
144101e04c3fSmrg
144201e04c3fSmrg   if (state->is_version(450, 310) || state->ARB_ES3_1_compatibility_enable)
144301e04c3fSmrg      add_system_value(SYSTEM_VALUE_HELPER_INVOCATION, bool_t, "gl_HelperInvocation");
144401e04c3fSmrg}
144501e04c3fSmrg
144601e04c3fSmrg
144701e04c3fSmrg/**
144801e04c3fSmrg * Generate variables which only exist in compute shaders.
144901e04c3fSmrg */
145001e04c3fSmrgvoid
145101e04c3fSmrgbuiltin_variable_generator::generate_cs_special_vars()
145201e04c3fSmrg{
145301e04c3fSmrg   add_system_value(SYSTEM_VALUE_LOCAL_INVOCATION_ID, uvec3_t,
145401e04c3fSmrg                    "gl_LocalInvocationID");
14557ec681f3Smrg   add_system_value(SYSTEM_VALUE_WORKGROUP_ID, uvec3_t, "gl_WorkGroupID");
14567ec681f3Smrg   add_system_value(SYSTEM_VALUE_NUM_WORKGROUPS, uvec3_t, "gl_NumWorkGroups");
145701e04c3fSmrg
145801e04c3fSmrg   if (state->ARB_compute_variable_group_size_enable) {
14597ec681f3Smrg      add_system_value(SYSTEM_VALUE_WORKGROUP_SIZE,
146001e04c3fSmrg                       uvec3_t, "gl_LocalGroupSizeARB");
146101e04c3fSmrg   }
146201e04c3fSmrg
146301e04c3fSmrg   add_system_value(SYSTEM_VALUE_GLOBAL_INVOCATION_ID,
146401e04c3fSmrg                    uvec3_t, "gl_GlobalInvocationID");
146501e04c3fSmrg   add_system_value(SYSTEM_VALUE_LOCAL_INVOCATION_INDEX,
146601e04c3fSmrg                    uint_t, "gl_LocalInvocationIndex");
146701e04c3fSmrg}
146801e04c3fSmrg
146901e04c3fSmrg
147001e04c3fSmrg/**
147101e04c3fSmrg * Add a single "varying" variable.  The variable's type and direction (input
147201e04c3fSmrg * or output) are adjusted as appropriate for the type of shader being
147301e04c3fSmrg * compiled.
147401e04c3fSmrg */
147501e04c3fSmrgvoid
147601e04c3fSmrgbuiltin_variable_generator::add_varying(int slot, const glsl_type *type,
14777ec681f3Smrg                                        int precision, const char *name,
14787ec681f3Smrg                                        enum glsl_interp_mode interp)
147901e04c3fSmrg{
148001e04c3fSmrg   switch (state->stage) {
148101e04c3fSmrg   case MESA_SHADER_TESS_CTRL:
148201e04c3fSmrg   case MESA_SHADER_TESS_EVAL:
148301e04c3fSmrg   case MESA_SHADER_GEOMETRY:
14847ec681f3Smrg      this->per_vertex_in.add_field(slot, type, precision, name, interp);
14857ec681f3Smrg      FALLTHROUGH;
148601e04c3fSmrg   case MESA_SHADER_VERTEX:
14877ec681f3Smrg      this->per_vertex_out.add_field(slot, type, precision, name, interp);
148801e04c3fSmrg      break;
148901e04c3fSmrg   case MESA_SHADER_FRAGMENT:
14907ec681f3Smrg      add_input(slot, type, precision, name, interp);
149101e04c3fSmrg      break;
149201e04c3fSmrg   case MESA_SHADER_COMPUTE:
149301e04c3fSmrg      /* Compute shaders don't have varyings. */
149401e04c3fSmrg      break;
149501e04c3fSmrg   default:
149601e04c3fSmrg      break;
149701e04c3fSmrg   }
149801e04c3fSmrg}
149901e04c3fSmrg
150001e04c3fSmrg
150101e04c3fSmrg/**
150201e04c3fSmrg * Generate variables that are used to communicate data from one shader stage
150301e04c3fSmrg * to the next ("varyings").
150401e04c3fSmrg */
150501e04c3fSmrgvoid
150601e04c3fSmrgbuiltin_variable_generator::generate_varyings()
150701e04c3fSmrg{
15087ec681f3Smrg   struct gl_shader_compiler_options *options =
15097ec681f3Smrg      &state->ctx->Const.ShaderCompilerOptions[state->stage];
15107ec681f3Smrg
151101e04c3fSmrg   /* gl_Position and gl_PointSize are not visible from fragment shaders. */
151201e04c3fSmrg   if (state->stage != MESA_SHADER_FRAGMENT) {
15137ec681f3Smrg      add_varying(VARYING_SLOT_POS, vec4_t, GLSL_PRECISION_HIGH, "gl_Position");
151401e04c3fSmrg      if (!state->es_shader ||
151501e04c3fSmrg          state->stage == MESA_SHADER_VERTEX ||
151601e04c3fSmrg          (state->stage == MESA_SHADER_GEOMETRY &&
151701e04c3fSmrg           (state->OES_geometry_point_size_enable ||
151801e04c3fSmrg            state->EXT_geometry_point_size_enable)) ||
151901e04c3fSmrg          ((state->stage == MESA_SHADER_TESS_CTRL ||
152001e04c3fSmrg            state->stage == MESA_SHADER_TESS_EVAL) &&
152101e04c3fSmrg           (state->OES_tessellation_point_size_enable ||
152201e04c3fSmrg            state->EXT_tessellation_point_size_enable))) {
15237ec681f3Smrg         add_varying(VARYING_SLOT_PSIZ,
15247ec681f3Smrg                     float_t,
15257ec681f3Smrg                     state->is_version(0, 300) ?
15267ec681f3Smrg                     GLSL_PRECISION_HIGH :
15277ec681f3Smrg                     GLSL_PRECISION_MEDIUM,
15287ec681f3Smrg                     "gl_PointSize");
152901e04c3fSmrg      }
15307ec681f3Smrg      if (state->stage == MESA_SHADER_VERTEX) {
15317ec681f3Smrg         if (state->AMD_vertex_shader_viewport_index_enable ||
15327ec681f3Smrg             state->ARB_shader_viewport_layer_array_enable ||
15337ec681f3Smrg             state->NV_viewport_array2_enable) {
15347ec681f3Smrg            add_varying(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex", INTERP_MODE_FLAT);
15357ec681f3Smrg         }
15367ec681f3Smrg
15377ec681f3Smrg         if (state->AMD_vertex_shader_layer_enable ||
15387ec681f3Smrg             state->ARB_shader_viewport_layer_array_enable ||
15397ec681f3Smrg             state->NV_viewport_array2_enable) {
15407ec681f3Smrg            add_varying(VARYING_SLOT_LAYER, int_t, GLSL_PRECISION_HIGH,
15417ec681f3Smrg                        "gl_Layer", INTERP_MODE_FLAT);
15427ec681f3Smrg         }
15437ec681f3Smrg
15447ec681f3Smrg         /* From the NV_viewport_array2 specification:
15457ec681f3Smrg          *
15467ec681f3Smrg          *    "The variable gl_ViewportMask[] is available as an output variable
15477ec681f3Smrg          *    in the VTG languages. The array has ceil(v/32) elements where v is
15487ec681f3Smrg          *    the maximum number of viewports supported by the implementation."
15497ec681f3Smrg          *
15507ec681f3Smrg          * Since no drivers expose more than 16 viewports, we can simply set the
15517ec681f3Smrg          * array size to 1 rather than computing it and dealing with varying
15527ec681f3Smrg          * slot complication.
15537ec681f3Smrg          */
15547ec681f3Smrg         if (state->NV_viewport_array2_enable)
15557ec681f3Smrg            add_varying(VARYING_SLOT_VIEWPORT_MASK, array(int_t, 1),
15567ec681f3Smrg                        "gl_ViewportMask", INTERP_MODE_FLAT);
15577ec681f3Smrg        }
155801e04c3fSmrg   }
155901e04c3fSmrg
156001e04c3fSmrg   if (state->has_clip_distance()) {
156101e04c3fSmrg       add_varying(VARYING_SLOT_CLIP_DIST0, array(float_t, 0),
15627ec681f3Smrg                   GLSL_PRECISION_HIGH, "gl_ClipDistance");
156301e04c3fSmrg   }
156401e04c3fSmrg   if (state->has_cull_distance()) {
156501e04c3fSmrg      add_varying(VARYING_SLOT_CULL_DIST0, array(float_t, 0),
15667ec681f3Smrg                  GLSL_PRECISION_HIGH, "gl_CullDistance");
156701e04c3fSmrg   }
156801e04c3fSmrg
156901e04c3fSmrg   if (compatibility) {
157001e04c3fSmrg      add_varying(VARYING_SLOT_TEX0, array(vec4_t, 0), "gl_TexCoord");
157101e04c3fSmrg      add_varying(VARYING_SLOT_FOGC, float_t, "gl_FogFragCoord");
157201e04c3fSmrg      if (state->stage == MESA_SHADER_FRAGMENT) {
157301e04c3fSmrg         add_varying(VARYING_SLOT_COL0, vec4_t, "gl_Color");
157401e04c3fSmrg         add_varying(VARYING_SLOT_COL1, vec4_t, "gl_SecondaryColor");
157501e04c3fSmrg      } else {
157601e04c3fSmrg         add_varying(VARYING_SLOT_CLIP_VERTEX, vec4_t, "gl_ClipVertex");
157701e04c3fSmrg         add_varying(VARYING_SLOT_COL0, vec4_t, "gl_FrontColor");
157801e04c3fSmrg         add_varying(VARYING_SLOT_BFC0, vec4_t, "gl_BackColor");
157901e04c3fSmrg         add_varying(VARYING_SLOT_COL1, vec4_t, "gl_FrontSecondaryColor");
158001e04c3fSmrg         add_varying(VARYING_SLOT_BFC1, vec4_t, "gl_BackSecondaryColor");
158101e04c3fSmrg      }
158201e04c3fSmrg   }
158301e04c3fSmrg
158401e04c3fSmrg   /* Section 7.1 (Built-In Language Variables) of the GLSL 4.00 spec
158501e04c3fSmrg    * says:
158601e04c3fSmrg    *
158701e04c3fSmrg    *    "In the tessellation control language, built-in variables are
158801e04c3fSmrg    *    intrinsically declared as:
158901e04c3fSmrg    *
159001e04c3fSmrg    *        in gl_PerVertex {
159101e04c3fSmrg    *            vec4 gl_Position;
159201e04c3fSmrg    *            float gl_PointSize;
159301e04c3fSmrg    *            float gl_ClipDistance[];
159401e04c3fSmrg    *        } gl_in[gl_MaxPatchVertices];"
159501e04c3fSmrg    */
159601e04c3fSmrg   if (state->stage == MESA_SHADER_TESS_CTRL ||
159701e04c3fSmrg       state->stage == MESA_SHADER_TESS_EVAL) {
159801e04c3fSmrg      const glsl_type *per_vertex_in_type =
159901e04c3fSmrg         this->per_vertex_in.construct_interface_instance();
160001e04c3fSmrg      add_variable("gl_in", array(per_vertex_in_type, state->Const.MaxPatchVertices),
16017ec681f3Smrg                   GLSL_PRECISION_NONE, ir_var_shader_in, -1);
160201e04c3fSmrg   }
160301e04c3fSmrg   if (state->stage == MESA_SHADER_GEOMETRY) {
160401e04c3fSmrg      const glsl_type *per_vertex_in_type =
160501e04c3fSmrg         this->per_vertex_in.construct_interface_instance();
160601e04c3fSmrg      add_variable("gl_in", array(per_vertex_in_type, 0),
16077ec681f3Smrg                   GLSL_PRECISION_NONE, ir_var_shader_in, -1);
160801e04c3fSmrg   }
160901e04c3fSmrg   if (state->stage == MESA_SHADER_TESS_CTRL) {
161001e04c3fSmrg      const glsl_type *per_vertex_out_type =
161101e04c3fSmrg         this->per_vertex_out.construct_interface_instance();
161201e04c3fSmrg      add_variable("gl_out", array(per_vertex_out_type, 0),
16137ec681f3Smrg                   GLSL_PRECISION_NONE, ir_var_shader_out, -1);
161401e04c3fSmrg   }
161501e04c3fSmrg   if (state->stage == MESA_SHADER_VERTEX ||
161601e04c3fSmrg       state->stage == MESA_SHADER_TESS_EVAL ||
161701e04c3fSmrg       state->stage == MESA_SHADER_GEOMETRY) {
161801e04c3fSmrg      const glsl_type *per_vertex_out_type =
161901e04c3fSmrg         this->per_vertex_out.construct_interface_instance();
162001e04c3fSmrg      const glsl_struct_field *fields = per_vertex_out_type->fields.structure;
162101e04c3fSmrg      for (unsigned i = 0; i < per_vertex_out_type->length; i++) {
162201e04c3fSmrg         ir_variable *var =
16237ec681f3Smrg            add_variable(fields[i].name, fields[i].type, fields[i].precision,
16247ec681f3Smrg                         ir_var_shader_out, fields[i].location);
162501e04c3fSmrg         var->data.interpolation = fields[i].interpolation;
162601e04c3fSmrg         var->data.centroid = fields[i].centroid;
162701e04c3fSmrg         var->data.sample = fields[i].sample;
162801e04c3fSmrg         var->data.patch = fields[i].patch;
162901e04c3fSmrg         var->init_interface_type(per_vertex_out_type);
16307ec681f3Smrg
16317ec681f3Smrg         var->data.invariant = fields[i].location == VARYING_SLOT_POS &&
16327ec681f3Smrg                               options->PositionAlwaysInvariant;
16337ec681f3Smrg
16347ec681f3Smrg         var->data.precise = fields[i].location == VARYING_SLOT_POS &&
16357ec681f3Smrg                               options->PositionAlwaysPrecise;
163601e04c3fSmrg      }
163701e04c3fSmrg   }
163801e04c3fSmrg}
163901e04c3fSmrg
164001e04c3fSmrg
164101e04c3fSmrg}; /* Anonymous namespace */
164201e04c3fSmrg
164301e04c3fSmrg
164401e04c3fSmrgvoid
164501e04c3fSmrg_mesa_glsl_initialize_variables(exec_list *instructions,
164601e04c3fSmrg				struct _mesa_glsl_parse_state *state)
164701e04c3fSmrg{
164801e04c3fSmrg   builtin_variable_generator gen(instructions, state);
164901e04c3fSmrg
165001e04c3fSmrg   gen.generate_constants();
165101e04c3fSmrg   gen.generate_uniforms();
165201e04c3fSmrg   gen.generate_special_vars();
165301e04c3fSmrg
165401e04c3fSmrg   gen.generate_varyings();
165501e04c3fSmrg
165601e04c3fSmrg   switch (state->stage) {
165701e04c3fSmrg   case MESA_SHADER_VERTEX:
165801e04c3fSmrg      gen.generate_vs_special_vars();
165901e04c3fSmrg      break;
166001e04c3fSmrg   case MESA_SHADER_TESS_CTRL:
166101e04c3fSmrg      gen.generate_tcs_special_vars();
166201e04c3fSmrg      break;
166301e04c3fSmrg   case MESA_SHADER_TESS_EVAL:
166401e04c3fSmrg      gen.generate_tes_special_vars();
166501e04c3fSmrg      break;
166601e04c3fSmrg   case MESA_SHADER_GEOMETRY:
166701e04c3fSmrg      gen.generate_gs_special_vars();
166801e04c3fSmrg      break;
166901e04c3fSmrg   case MESA_SHADER_FRAGMENT:
167001e04c3fSmrg      gen.generate_fs_special_vars();
167101e04c3fSmrg      break;
167201e04c3fSmrg   case MESA_SHADER_COMPUTE:
167301e04c3fSmrg      gen.generate_cs_special_vars();
167401e04c3fSmrg      break;
167501e04c3fSmrg   default:
167601e04c3fSmrg      break;
167701e04c3fSmrg   }
167801e04c3fSmrg}
1679