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 "glsl_parser_extras.h" 26 #include "glsl_symbol_table.h" 27 #include "builtin_variables.h" 28 29 static void generate_ARB_draw_buffers_variables(exec_list *, 30 struct _mesa_glsl_parse_state *, 31 bool, _mesa_glsl_parser_targets); 32 33 static ir_variable * 34 add_variable(const char *name, enum ir_variable_mode mode, int slot, 35 const glsl_type *type, exec_list *instructions, 36 glsl_symbol_table *symtab) 37 { 38 ir_variable *var = new(symtab) ir_variable(type, name, mode); 39 40 switch (var->mode) { 41 case ir_var_auto: 42 case ir_var_in: 43 case ir_var_uniform: 44 var->read_only = true; 45 break; 46 case ir_var_inout: 47 case ir_var_out: 48 break; 49 default: 50 assert(0); 51 break; 52 } 53 54 var->location = slot; 55 var->explicit_location = (slot >= 0); 56 57 /* Once the variable is created an initialized, add it to the symbol table 58 * and add the declaration to the IR stream. 59 */ 60 instructions->push_tail(var); 61 62 symtab->add_variable(var); 63 return var; 64 } 65 66 static ir_variable * 67 add_uniform(exec_list *instructions, 68 struct _mesa_glsl_parse_state *state, 69 const char *name, const glsl_type *type) 70 { 71 return add_variable(name, ir_var_uniform, -1, type, instructions, 72 state->symbols); 73 } 74 75 static void 76 add_builtin_variable(const builtin_variable *proto, exec_list *instructions, 77 glsl_symbol_table *symtab) 78 { 79 /* Create a new variable declaration from the description supplied by 80 * the caller. 81 */ 82 const glsl_type *const type = symtab->get_type(proto->type); 83 84 assert(type != NULL); 85 86 add_variable(proto->name, proto->mode, proto->slot, type, instructions, 87 symtab); 88 } 89 90 static void 91 add_builtin_constant(exec_list *instructions, 92 struct _mesa_glsl_parse_state *state, 93 const char *name, int value) 94 { 95 ir_variable *const var = add_variable(name, ir_var_auto, 96 -1, glsl_type::int_type, 97 instructions, state->symbols); 98 var->constant_value = new(var) ir_constant(value); 99 } 100 101 /* Several constants in GLSL ES have different names than normal desktop GLSL. 102 * Therefore, this function should only be called on the ES path. 103 */ 104 static void 105 generate_100ES_uniforms(exec_list *instructions, 106 struct _mesa_glsl_parse_state *state) 107 { 108 add_builtin_constant(instructions, state, "gl_MaxVertexAttribs", 109 state->Const.MaxVertexAttribs); 110 add_builtin_constant(instructions, state, "gl_MaxVertexUniformVectors", 111 state->Const.MaxVertexUniformComponents); 112 add_builtin_constant(instructions, state, "gl_MaxVaryingVectors", 113 state->Const.MaxVaryingFloats / 4); 114 add_builtin_constant(instructions, state, "gl_MaxVertexTextureImageUnits", 115 state->Const.MaxVertexTextureImageUnits); 116 add_builtin_constant(instructions, state, "gl_MaxCombinedTextureImageUnits", 117 state->Const.MaxCombinedTextureImageUnits); 118 add_builtin_constant(instructions, state, "gl_MaxTextureImageUnits", 119 state->Const.MaxTextureImageUnits); 120 add_builtin_constant(instructions, state, "gl_MaxFragmentUniformVectors", 121 state->Const.MaxFragmentUniformComponents); 122 123 add_uniform(instructions, state, "gl_DepthRange", 124 state->symbols->get_type("gl_DepthRangeParameters")); 125 } 126 127 static void 128 generate_110_uniforms(exec_list *instructions, 129 struct _mesa_glsl_parse_state *state) 130 { 131 for (unsigned i = 0 132 ; i < Elements(builtin_110_deprecated_uniforms) 133 ; i++) { 134 add_builtin_variable(& builtin_110_deprecated_uniforms[i], 135 instructions, state->symbols); 136 } 137 138 add_builtin_constant(instructions, state, "gl_MaxLights", 139 state->Const.MaxLights); 140 add_builtin_constant(instructions, state, "gl_MaxClipPlanes", 141 state->Const.MaxClipPlanes); 142 add_builtin_constant(instructions, state, "gl_MaxTextureUnits", 143 state->Const.MaxTextureUnits); 144 add_builtin_constant(instructions, state, "gl_MaxTextureCoords", 145 state->Const.MaxTextureCoords); 146 add_builtin_constant(instructions, state, "gl_MaxVertexAttribs", 147 state->Const.MaxVertexAttribs); 148 add_builtin_constant(instructions, state, "gl_MaxVertexUniformComponents", 149 state->Const.MaxVertexUniformComponents); 150 add_builtin_constant(instructions, state, "gl_MaxVaryingFloats", 151 state->Const.MaxVaryingFloats); 152 add_builtin_constant(instructions, state, "gl_MaxVertexTextureImageUnits", 153 state->Const.MaxVertexTextureImageUnits); 154 add_builtin_constant(instructions, state, "gl_MaxCombinedTextureImageUnits", 155 state->Const.MaxCombinedTextureImageUnits); 156 add_builtin_constant(instructions, state, "gl_MaxTextureImageUnits", 157 state->Const.MaxTextureImageUnits); 158 add_builtin_constant(instructions, state, "gl_MaxFragmentUniformComponents", 159 state->Const.MaxFragmentUniformComponents); 160 161 const glsl_type *const mat4_array_type = 162 glsl_type::get_array_instance(glsl_type::mat4_type, 163 state->Const.MaxTextureCoords); 164 165 add_uniform(instructions, state, "gl_TextureMatrix", mat4_array_type); 166 add_uniform(instructions, state, "gl_TextureMatrixInverse", mat4_array_type); 167 add_uniform(instructions, state, "gl_TextureMatrixTranspose", mat4_array_type); 168 add_uniform(instructions, state, "gl_TextureMatrixInverseTranspose", mat4_array_type); 169 170 add_uniform(instructions, state, "gl_DepthRange", 171 state->symbols->get_type("gl_DepthRangeParameters")); 172 173 add_uniform(instructions, state, "gl_ClipPlane", 174 glsl_type::get_array_instance(glsl_type::vec4_type, 175 state->Const.MaxClipPlanes)); 176 add_uniform(instructions, state, "gl_Point", 177 state->symbols->get_type("gl_PointParameters")); 178 179 const glsl_type *const material_parameters_type = 180 state->symbols->get_type("gl_MaterialParameters"); 181 add_uniform(instructions, state, "gl_FrontMaterial", material_parameters_type); 182 add_uniform(instructions, state, "gl_BackMaterial", material_parameters_type); 183 184 const glsl_type *const light_source_array_type = 185 glsl_type::get_array_instance(state->symbols->get_type("gl_LightSourceParameters"), state->Const.MaxLights); 186 187 add_uniform(instructions, state, "gl_LightSource", light_source_array_type); 188 189 const glsl_type *const light_model_products_type = 190 state->symbols->get_type("gl_LightModelProducts"); 191 add_uniform(instructions, state, "gl_FrontLightModelProduct", 192 light_model_products_type); 193 add_uniform(instructions, state, "gl_BackLightModelProduct", 194 light_model_products_type); 195 196 const glsl_type *const light_products_type = 197 glsl_type::get_array_instance(state->symbols->get_type("gl_LightProducts"), 198 state->Const.MaxLights); 199 add_uniform(instructions, state, "gl_FrontLightProduct", light_products_type); 200 add_uniform(instructions, state, "gl_BackLightProduct", light_products_type); 201 202 add_uniform(instructions, state, "gl_TextureEnvColor", 203 glsl_type::get_array_instance(glsl_type::vec4_type, 204 state->Const.MaxTextureUnits)); 205 206 const glsl_type *const texcoords_vec4 = 207 glsl_type::get_array_instance(glsl_type::vec4_type, 208 state->Const.MaxTextureCoords); 209 add_uniform(instructions, state, "gl_EyePlaneS", texcoords_vec4); 210 add_uniform(instructions, state, "gl_EyePlaneT", texcoords_vec4); 211 add_uniform(instructions, state, "gl_EyePlaneR", texcoords_vec4); 212 add_uniform(instructions, state, "gl_EyePlaneQ", texcoords_vec4); 213 add_uniform(instructions, state, "gl_ObjectPlaneS", texcoords_vec4); 214 add_uniform(instructions, state, "gl_ObjectPlaneT", texcoords_vec4); 215 add_uniform(instructions, state, "gl_ObjectPlaneR", texcoords_vec4); 216 add_uniform(instructions, state, "gl_ObjectPlaneQ", texcoords_vec4); 217 218 add_uniform(instructions, state, "gl_Fog", 219 state->symbols->get_type("gl_FogParameters")); 220 } 221 222 /* This function should only be called for ES, not desktop GL. */ 223 static void 224 generate_100ES_vs_variables(exec_list *instructions, 225 struct _mesa_glsl_parse_state *state) 226 { 227 for (unsigned i = 0; i < Elements(builtin_core_vs_variables); i++) { 228 add_builtin_variable(& builtin_core_vs_variables[i], 229 instructions, state->symbols); 230 } 231 232 generate_100ES_uniforms(instructions, state); 233 234 generate_ARB_draw_buffers_variables(instructions, state, false, 235 vertex_shader); 236 } 237 238 239 static void 240 generate_110_vs_variables(exec_list *instructions, 241 struct _mesa_glsl_parse_state *state) 242 { 243 for (unsigned i = 0; i < Elements(builtin_core_vs_variables); i++) { 244 add_builtin_variable(& builtin_core_vs_variables[i], 245 instructions, state->symbols); 246 } 247 248 for (unsigned i = 0 249 ; i < Elements(builtin_110_deprecated_vs_variables) 250 ; i++) { 251 add_builtin_variable(& builtin_110_deprecated_vs_variables[i], 252 instructions, state->symbols); 253 } 254 generate_110_uniforms(instructions, state); 255 256 /* From page 54 (page 60 of the PDF) of the GLSL 1.20 spec: 257 * 258 * "As with all arrays, indices used to subscript gl_TexCoord must 259 * either be an integral constant expressions, or this array must be 260 * re-declared by the shader with a size. The size can be at most 261 * gl_MaxTextureCoords. Using indexes close to 0 may aid the 262 * implementation in preserving varying resources." 263 */ 264 const glsl_type *const vec4_array_type = 265 glsl_type::get_array_instance(glsl_type::vec4_type, 0); 266 267 add_variable("gl_TexCoord", ir_var_out, VERT_RESULT_TEX0, vec4_array_type, 268 instructions, state->symbols); 269 270 generate_ARB_draw_buffers_variables(instructions, state, false, 271 vertex_shader); 272 } 273 274 275 static void 276 generate_120_vs_variables(exec_list *instructions, 277 struct _mesa_glsl_parse_state *state) 278 { 279 /* GLSL version 1.20 did not add any built-in variables in the vertex 280 * shader. 281 */ 282 generate_110_vs_variables(instructions, state); 283 } 284 285 286 static void 287 generate_130_vs_variables(exec_list *instructions, 288 struct _mesa_glsl_parse_state *state) 289 { 290 generate_120_vs_variables(instructions, state); 291 292 for (unsigned i = 0; i < Elements(builtin_130_vs_variables); i++) { 293 add_builtin_variable(& builtin_130_vs_variables[i], 294 instructions, state->symbols); 295 } 296 297 const glsl_type *const clip_distance_array_type = 298 glsl_type::get_array_instance(glsl_type::float_type, 299 state->Const.MaxClipPlanes); 300 301 /* FINISHME: gl_ClipDistance needs a real location assigned. */ 302 add_variable("gl_ClipDistance", ir_var_out, -1, clip_distance_array_type, 303 instructions, state->symbols); 304 305 } 306 307 308 static void 309 initialize_vs_variables(exec_list *instructions, 310 struct _mesa_glsl_parse_state *state) 311 { 312 313 switch (state->language_version) { 314 case 100: 315 generate_100ES_vs_variables(instructions, state); 316 break; 317 case 110: 318 generate_110_vs_variables(instructions, state); 319 break; 320 case 120: 321 generate_120_vs_variables(instructions, state); 322 break; 323 case 130: 324 generate_130_vs_variables(instructions, state); 325 break; 326 } 327 } 328 329 /* This function should only be called for ES, not desktop GL. */ 330 static void 331 generate_100ES_fs_variables(exec_list *instructions, 332 struct _mesa_glsl_parse_state *state) 333 { 334 for (unsigned i = 0; i < Elements(builtin_core_fs_variables); i++) { 335 add_builtin_variable(& builtin_core_fs_variables[i], 336 instructions, state->symbols); 337 } 338 339 for (unsigned i = 0; i < Elements(builtin_100ES_fs_variables); i++) { 340 add_builtin_variable(& builtin_100ES_fs_variables[i], 341 instructions, state->symbols); 342 } 343 344 generate_100ES_uniforms(instructions, state); 345 346 generate_ARB_draw_buffers_variables(instructions, state, false, 347 fragment_shader); 348 } 349 350 static void 351 generate_110_fs_variables(exec_list *instructions, 352 struct _mesa_glsl_parse_state *state) 353 { 354 for (unsigned i = 0; i < Elements(builtin_core_fs_variables); i++) { 355 add_builtin_variable(& builtin_core_fs_variables[i], 356 instructions, state->symbols); 357 } 358 359 for (unsigned i = 0; i < Elements(builtin_110_fs_variables); i++) { 360 add_builtin_variable(& builtin_110_fs_variables[i], 361 instructions, state->symbols); 362 } 363 364 for (unsigned i = 0 365 ; i < Elements(builtin_110_deprecated_fs_variables) 366 ; i++) { 367 add_builtin_variable(& builtin_110_deprecated_fs_variables[i], 368 instructions, state->symbols); 369 } 370 generate_110_uniforms(instructions, state); 371 372 /* From page 54 (page 60 of the PDF) of the GLSL 1.20 spec: 373 * 374 * "As with all arrays, indices used to subscript gl_TexCoord must 375 * either be an integral constant expressions, or this array must be 376 * re-declared by the shader with a size. The size can be at most 377 * gl_MaxTextureCoords. Using indexes close to 0 may aid the 378 * implementation in preserving varying resources." 379 */ 380 const glsl_type *const vec4_array_type = 381 glsl_type::get_array_instance(glsl_type::vec4_type, 0); 382 383 add_variable("gl_TexCoord", ir_var_in, FRAG_ATTRIB_TEX0, vec4_array_type, 384 instructions, state->symbols); 385 386 generate_ARB_draw_buffers_variables(instructions, state, false, 387 fragment_shader); 388 } 389 390 391 static void 392 generate_ARB_draw_buffers_variables(exec_list *instructions, 393 struct _mesa_glsl_parse_state *state, 394 bool warn, _mesa_glsl_parser_targets target) 395 { 396 /* gl_MaxDrawBuffers is available in all shader stages. 397 */ 398 ir_variable *const mdb = 399 add_variable("gl_MaxDrawBuffers", ir_var_auto, -1, 400 glsl_type::int_type, instructions, state->symbols); 401 402 if (warn) 403 mdb->warn_extension = "GL_ARB_draw_buffers"; 404 405 mdb->constant_value = new(mdb) 406 ir_constant(int(state->Const.MaxDrawBuffers)); 407 408 409 /* gl_FragData is only available in the fragment shader. 410 */ 411 if (target == fragment_shader) { 412 const glsl_type *const vec4_array_type = 413 glsl_type::get_array_instance(glsl_type::vec4_type, 414 state->Const.MaxDrawBuffers); 415 416 ir_variable *const fd = 417 add_variable("gl_FragData", ir_var_out, FRAG_RESULT_DATA0, 418 vec4_array_type, instructions, state->symbols); 419 420 if (warn) 421 fd->warn_extension = "GL_ARB_draw_buffers"; 422 } 423 } 424 425 static void 426 generate_ARB_shader_stencil_export_variables(exec_list *instructions, 427 struct _mesa_glsl_parse_state *state, 428 bool warn) 429 { 430 /* gl_FragStencilRefARB is only available in the fragment shader. 431 */ 432 ir_variable *const fd = 433 add_variable("gl_FragStencilRefARB", ir_var_out, FRAG_RESULT_STENCIL, 434 glsl_type::int_type, instructions, state->symbols); 435 436 if (warn) 437 fd->warn_extension = "GL_ARB_shader_stencil_export"; 438 } 439 440 static void 441 generate_120_fs_variables(exec_list *instructions, 442 struct _mesa_glsl_parse_state *state) 443 { 444 generate_110_fs_variables(instructions, state); 445 446 for (unsigned i = 0 447 ; i < Elements(builtin_120_fs_variables) 448 ; i++) { 449 add_builtin_variable(& builtin_120_fs_variables[i], 450 instructions, state->symbols); 451 } 452 } 453 454 static void 455 generate_130_fs_variables(exec_list *instructions, 456 struct _mesa_glsl_parse_state *state) 457 { 458 generate_120_fs_variables(instructions, state); 459 460 const glsl_type *const clip_distance_array_type = 461 glsl_type::get_array_instance(glsl_type::float_type, 462 state->Const.MaxClipPlanes); 463 464 /* FINISHME: gl_ClipDistance needs a real location assigned. */ 465 add_variable("gl_ClipDistance", ir_var_in, -1, clip_distance_array_type, 466 instructions, state->symbols); 467 } 468 469 static void 470 initialize_fs_variables(exec_list *instructions, 471 struct _mesa_glsl_parse_state *state) 472 { 473 474 switch (state->language_version) { 475 case 100: 476 generate_100ES_fs_variables(instructions, state); 477 break; 478 case 110: 479 generate_110_fs_variables(instructions, state); 480 break; 481 case 120: 482 generate_120_fs_variables(instructions, state); 483 break; 484 case 130: 485 generate_130_fs_variables(instructions, state); 486 break; 487 } 488 489 if (state->ARB_shader_stencil_export_enable) 490 generate_ARB_shader_stencil_export_variables(instructions, state, 491 state->ARB_shader_stencil_export_warn); 492 } 493 494 void 495 _mesa_glsl_initialize_variables(exec_list *instructions, 496 struct _mesa_glsl_parse_state *state) 497 { 498 switch (state->target) { 499 case vertex_shader: 500 initialize_vs_variables(instructions, state); 501 break; 502 case geometry_shader: 503 break; 504 case fragment_shader: 505 initialize_fs_variables(instructions, state); 506 break; 507 } 508 } 509