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