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