OSDN Git Service

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