1 /* 2 * Copyright 2008, 2009 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 #include <stdio.h> 24 #include <stdarg.h> 25 #include <string.h> 26 #include <assert.h> 27 28 #include "main/core.h" /* for struct gl_context */ 29 #include "main/context.h" 30 #include "main/debug_output.h" 31 #include "main/formats.h" 32 #include "main/shaderobj.h" 33 #include "util/u_atomic.h" /* for p_atomic_cmpxchg */ 34 #include "util/ralloc.h" 35 #include "ast.h" 36 #include "glsl_parser_extras.h" 37 #include "glsl_parser.h" 38 #include "ir_optimization.h" 39 #include "loop_analysis.h" 40 41 /** 42 * Format a short human-readable description of the given GLSL version. 43 */ 44 const char * 45 glsl_compute_version_string(void *mem_ctx, bool is_es, unsigned version) 46 { 47 return ralloc_asprintf(mem_ctx, "GLSL%s %d.%02d", is_es ? " ES" : "", 48 version / 100, version % 100); 49 } 50 51 52 static const unsigned known_desktop_glsl_versions[] = 53 { 110, 120, 130, 140, 150, 330, 400, 410, 420, 430, 440, 450 }; 54 static const unsigned known_desktop_gl_versions[] = 55 { 20, 21, 30, 31, 32, 33, 40, 41, 42, 43, 44, 45 }; 56 57 58 _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, 59 gl_shader_stage stage, 60 void *mem_ctx) 61 : ctx(_ctx), cs_input_local_size_specified(false), cs_input_local_size(), 62 switch_state() 63 { 64 assert(stage < MESA_SHADER_STAGES); 65 this->stage = stage; 66 67 this->scanner = NULL; 68 this->translation_unit.make_empty(); 69 this->symbols = new(mem_ctx) glsl_symbol_table; 70 71 this->linalloc = linear_alloc_parent(this, 0); 72 73 this->info_log = ralloc_strdup(mem_ctx, ""); 74 this->error = false; 75 this->loop_nesting_ast = NULL; 76 77 this->uses_builtin_functions = false; 78 79 /* Set default language version and extensions */ 80 this->language_version = 110; 81 this->forced_language_version = ctx->Const.ForceGLSLVersion; 82 this->zero_init = ctx->Const.GLSLZeroInit; 83 this->gl_version = 20; 84 this->es_shader = false; 85 this->ARB_texture_rectangle_enable = true; 86 87 /* OpenGL ES 2.0 has different defaults from desktop GL. */ 88 if (ctx->API == API_OPENGLES2) { 89 this->language_version = 100; 90 this->es_shader = true; 91 this->ARB_texture_rectangle_enable = false; 92 } 93 94 this->extensions = &ctx->Extensions; 95 96 this->Const.MaxLights = ctx->Const.MaxLights; 97 this->Const.MaxClipPlanes = ctx->Const.MaxClipPlanes; 98 this->Const.MaxTextureUnits = ctx->Const.MaxTextureUnits; 99 this->Const.MaxTextureCoords = ctx->Const.MaxTextureCoordUnits; 100 this->Const.MaxVertexAttribs = ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs; 101 this->Const.MaxVertexUniformComponents = ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents; 102 this->Const.MaxVertexTextureImageUnits = ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits; 103 this->Const.MaxCombinedTextureImageUnits = ctx->Const.MaxCombinedTextureImageUnits; 104 this->Const.MaxTextureImageUnits = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits; 105 this->Const.MaxFragmentUniformComponents = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents; 106 this->Const.MinProgramTexelOffset = ctx->Const.MinProgramTexelOffset; 107 this->Const.MaxProgramTexelOffset = ctx->Const.MaxProgramTexelOffset; 108 109 this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers; 110 111 this->Const.MaxDualSourceDrawBuffers = ctx->Const.MaxDualSourceDrawBuffers; 112 113 /* 1.50 constants */ 114 this->Const.MaxVertexOutputComponents = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents; 115 this->Const.MaxGeometryInputComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxInputComponents; 116 this->Const.MaxGeometryOutputComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents; 117 this->Const.MaxFragmentInputComponents = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents; 118 this->Const.MaxGeometryTextureImageUnits = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits; 119 this->Const.MaxGeometryOutputVertices = ctx->Const.MaxGeometryOutputVertices; 120 this->Const.MaxGeometryTotalOutputComponents = ctx->Const.MaxGeometryTotalOutputComponents; 121 this->Const.MaxGeometryUniformComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxUniformComponents; 122 123 this->Const.MaxVertexAtomicCounters = ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicCounters; 124 this->Const.MaxTessControlAtomicCounters = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxAtomicCounters; 125 this->Const.MaxTessEvaluationAtomicCounters = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxAtomicCounters; 126 this->Const.MaxGeometryAtomicCounters = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicCounters; 127 this->Const.MaxFragmentAtomicCounters = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters; 128 this->Const.MaxComputeAtomicCounters = ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicCounters; 129 this->Const.MaxCombinedAtomicCounters = ctx->Const.MaxCombinedAtomicCounters; 130 this->Const.MaxAtomicBufferBindings = ctx->Const.MaxAtomicBufferBindings; 131 this->Const.MaxVertexAtomicCounterBuffers = 132 ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicBuffers; 133 this->Const.MaxTessControlAtomicCounterBuffers = 134 ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxAtomicBuffers; 135 this->Const.MaxTessEvaluationAtomicCounterBuffers = 136 ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxAtomicBuffers; 137 this->Const.MaxGeometryAtomicCounterBuffers = 138 ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers; 139 this->Const.MaxFragmentAtomicCounterBuffers = 140 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers; 141 this->Const.MaxComputeAtomicCounterBuffers = 142 ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers; 143 this->Const.MaxCombinedAtomicCounterBuffers = 144 ctx->Const.MaxCombinedAtomicBuffers; 145 this->Const.MaxAtomicCounterBufferSize = 146 ctx->Const.MaxAtomicBufferSize; 147 148 /* ARB_enhanced_layouts constants */ 149 this->Const.MaxTransformFeedbackBuffers = ctx->Const.MaxTransformFeedbackBuffers; 150 this->Const.MaxTransformFeedbackInterleavedComponents = ctx->Const.MaxTransformFeedbackInterleavedComponents; 151 152 /* Compute shader constants */ 153 for (unsigned i = 0; i < ARRAY_SIZE(this->Const.MaxComputeWorkGroupCount); i++) 154 this->Const.MaxComputeWorkGroupCount[i] = ctx->Const.MaxComputeWorkGroupCount[i]; 155 for (unsigned i = 0; i < ARRAY_SIZE(this->Const.MaxComputeWorkGroupSize); i++) 156 this->Const.MaxComputeWorkGroupSize[i] = ctx->Const.MaxComputeWorkGroupSize[i]; 157 158 this->Const.MaxComputeTextureImageUnits = ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits; 159 this->Const.MaxComputeUniformComponents = ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents; 160 161 this->Const.MaxImageUnits = ctx->Const.MaxImageUnits; 162 this->Const.MaxCombinedShaderOutputResources = ctx->Const.MaxCombinedShaderOutputResources; 163 this->Const.MaxImageSamples = ctx->Const.MaxImageSamples; 164 this->Const.MaxVertexImageUniforms = ctx->Const.Program[MESA_SHADER_VERTEX].MaxImageUniforms; 165 this->Const.MaxTessControlImageUniforms = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxImageUniforms; 166 this->Const.MaxTessEvaluationImageUniforms = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxImageUniforms; 167 this->Const.MaxGeometryImageUniforms = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxImageUniforms; 168 this->Const.MaxFragmentImageUniforms = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxImageUniforms; 169 this->Const.MaxComputeImageUniforms = ctx->Const.Program[MESA_SHADER_COMPUTE].MaxImageUniforms; 170 this->Const.MaxCombinedImageUniforms = ctx->Const.MaxCombinedImageUniforms; 171 172 /* ARB_viewport_array */ 173 this->Const.MaxViewports = ctx->Const.MaxViewports; 174 175 /* tessellation shader constants */ 176 this->Const.MaxPatchVertices = ctx->Const.MaxPatchVertices; 177 this->Const.MaxTessGenLevel = ctx->Const.MaxTessGenLevel; 178 this->Const.MaxTessControlInputComponents = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxInputComponents; 179 this->Const.MaxTessControlOutputComponents = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxOutputComponents; 180 this->Const.MaxTessControlTextureImageUnits = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits; 181 this->Const.MaxTessEvaluationInputComponents = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxInputComponents; 182 this->Const.MaxTessEvaluationOutputComponents = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxOutputComponents; 183 this->Const.MaxTessEvaluationTextureImageUnits = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits; 184 this->Const.MaxTessPatchComponents = ctx->Const.MaxTessPatchComponents; 185 this->Const.MaxTessControlTotalOutputComponents = ctx->Const.MaxTessControlTotalOutputComponents; 186 this->Const.MaxTessControlUniformComponents = ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxUniformComponents; 187 this->Const.MaxTessEvaluationUniformComponents = ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxUniformComponents; 188 189 /* GL 4.5 / OES_sample_variables */ 190 this->Const.MaxSamples = ctx->Const.MaxSamples; 191 192 this->current_function = NULL; 193 this->toplevel_ir = NULL; 194 this->found_return = false; 195 this->all_invariant = false; 196 this->user_structures = NULL; 197 this->num_user_structures = 0; 198 this->num_subroutines = 0; 199 this->subroutines = NULL; 200 this->num_subroutine_types = 0; 201 this->subroutine_types = NULL; 202 203 /* supported_versions should be large enough to support the known desktop 204 * GLSL versions plus 4 GLES versions (ES 1.00, ES 3.00, ES 3.10, ES 3.20) 205 */ 206 STATIC_ASSERT((ARRAY_SIZE(known_desktop_glsl_versions) + 4) == 207 ARRAY_SIZE(this->supported_versions)); 208 209 /* Populate the list of supported GLSL versions */ 210 /* FINISHME: Once the OpenGL 3.0 'forward compatible' context or 211 * the OpenGL 3.2 Core context is supported, this logic will need 212 * change. Older versions of GLSL are no longer supported 213 * outside the compatibility contexts of 3.x. 214 */ 215 this->num_supported_versions = 0; 216 if (_mesa_is_desktop_gl(ctx)) { 217 for (unsigned i = 0; i < ARRAY_SIZE(known_desktop_glsl_versions); i++) { 218 if (known_desktop_glsl_versions[i] <= ctx->Const.GLSLVersion) { 219 this->supported_versions[this->num_supported_versions].ver 220 = known_desktop_glsl_versions[i]; 221 this->supported_versions[this->num_supported_versions].gl_ver 222 = known_desktop_gl_versions[i]; 223 this->supported_versions[this->num_supported_versions].es = false; 224 this->num_supported_versions++; 225 } 226 } 227 } 228 if (ctx->API == API_OPENGLES2 || ctx->Extensions.ARB_ES2_compatibility) { 229 this->supported_versions[this->num_supported_versions].ver = 100; 230 this->supported_versions[this->num_supported_versions].gl_ver = 20; 231 this->supported_versions[this->num_supported_versions].es = true; 232 this->num_supported_versions++; 233 } 234 if (_mesa_is_gles3(ctx) || ctx->Extensions.ARB_ES3_compatibility) { 235 this->supported_versions[this->num_supported_versions].ver = 300; 236 this->supported_versions[this->num_supported_versions].gl_ver = 30; 237 this->supported_versions[this->num_supported_versions].es = true; 238 this->num_supported_versions++; 239 } 240 if (_mesa_is_gles31(ctx) || ctx->Extensions.ARB_ES3_1_compatibility) { 241 this->supported_versions[this->num_supported_versions].ver = 310; 242 this->supported_versions[this->num_supported_versions].gl_ver = 31; 243 this->supported_versions[this->num_supported_versions].es = true; 244 this->num_supported_versions++; 245 } 246 if ((ctx->API == API_OPENGLES2 && ctx->Version >= 32) || 247 ctx->Extensions.ARB_ES3_2_compatibility) { 248 this->supported_versions[this->num_supported_versions].ver = 320; 249 this->supported_versions[this->num_supported_versions].gl_ver = 32; 250 this->supported_versions[this->num_supported_versions].es = true; 251 this->num_supported_versions++; 252 } 253 254 /* Create a string for use in error messages to tell the user which GLSL 255 * versions are supported. 256 */ 257 char *supported = ralloc_strdup(this, ""); 258 for (unsigned i = 0; i < this->num_supported_versions; i++) { 259 unsigned ver = this->supported_versions[i].ver; 260 const char *const prefix = (i == 0) 261 ? "" 262 : ((i == this->num_supported_versions - 1) ? ", and " : ", "); 263 const char *const suffix = (this->supported_versions[i].es) ? " ES" : ""; 264 265 ralloc_asprintf_append(& supported, "%s%u.%02u%s", 266 prefix, 267 ver / 100, ver % 100, 268 suffix); 269 } 270 271 this->supported_version_string = supported; 272 273 if (ctx->Const.ForceGLSLExtensionsWarn) 274 _mesa_glsl_process_extension("all", NULL, "warn", NULL, this); 275 276 this->default_uniform_qualifier = new(this) ast_type_qualifier(); 277 this->default_uniform_qualifier->flags.q.shared = 1; 278 this->default_uniform_qualifier->flags.q.column_major = 1; 279 280 this->default_shader_storage_qualifier = new(this) ast_type_qualifier(); 281 this->default_shader_storage_qualifier->flags.q.shared = 1; 282 this->default_shader_storage_qualifier->flags.q.column_major = 1; 283 284 this->fs_uses_gl_fragcoord = false; 285 this->fs_redeclares_gl_fragcoord = false; 286 this->fs_origin_upper_left = false; 287 this->fs_pixel_center_integer = false; 288 this->fs_redeclares_gl_fragcoord_with_no_layout_qualifiers = false; 289 290 this->gs_input_prim_type_specified = false; 291 this->tcs_output_vertices_specified = false; 292 this->gs_input_size = 0; 293 this->in_qualifier = new(this) ast_type_qualifier(); 294 this->out_qualifier = new(this) ast_type_qualifier(); 295 this->fs_early_fragment_tests = false; 296 this->fs_inner_coverage = false; 297 this->fs_post_depth_coverage = false; 298 this->fs_blend_support = 0; 299 memset(this->atomic_counter_offsets, 0, 300 sizeof(this->atomic_counter_offsets)); 301 this->allow_extension_directive_midshader = 302 ctx->Const.AllowGLSLExtensionDirectiveMidShader; 303 304 this->cs_input_local_size_variable_specified = false; 305 } 306 307 /** 308 * Determine whether the current GLSL version is sufficiently high to support 309 * a certain feature, and generate an error message if it isn't. 310 * 311 * \param required_glsl_version and \c required_glsl_es_version are 312 * interpreted as they are in _mesa_glsl_parse_state::is_version(). 313 * 314 * \param locp is the parser location where the error should be reported. 315 * 316 * \param fmt (and additional arguments) constitute a printf-style error 317 * message to report if the version check fails. Information about the 318 * current and required GLSL versions will be appended. So, for example, if 319 * the GLSL version being compiled is 1.20, and check_version(130, 300, locp, 320 * "foo unsupported") is called, the error message will be "foo unsupported in 321 * GLSL 1.20 (GLSL 1.30 or GLSL 3.00 ES required)". 322 */ 323 bool 324 _mesa_glsl_parse_state::check_version(unsigned required_glsl_version, 325 unsigned required_glsl_es_version, 326 YYLTYPE *locp, const char *fmt, ...) 327 { 328 if (this->is_version(required_glsl_version, required_glsl_es_version)) 329 return true; 330 331 va_list args; 332 va_start(args, fmt); 333 char *problem = ralloc_vasprintf(this, fmt, args); 334 va_end(args); 335 const char *glsl_version_string 336 = glsl_compute_version_string(this, false, required_glsl_version); 337 const char *glsl_es_version_string 338 = glsl_compute_version_string(this, true, required_glsl_es_version); 339 const char *requirement_string = ""; 340 if (required_glsl_version && required_glsl_es_version) { 341 requirement_string = ralloc_asprintf(this, " (%s or %s required)", 342 glsl_version_string, 343 glsl_es_version_string); 344 } else if (required_glsl_version) { 345 requirement_string = ralloc_asprintf(this, " (%s required)", 346 glsl_version_string); 347 } else if (required_glsl_es_version) { 348 requirement_string = ralloc_asprintf(this, " (%s required)", 349 glsl_es_version_string); 350 } 351 _mesa_glsl_error(locp, this, "%s in %s%s", 352 problem, this->get_version_string(), 353 requirement_string); 354 355 return false; 356 } 357 358 /** 359 * Process a GLSL #version directive. 360 * 361 * \param version is the integer that follows the #version token. 362 * 363 * \param ident is a string identifier that follows the integer, if any is 364 * present. Otherwise NULL. 365 */ 366 void 367 _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version, 368 const char *ident) 369 { 370 bool es_token_present = false; 371 if (ident) { 372 if (strcmp(ident, "es") == 0) { 373 es_token_present = true; 374 } else if (version >= 150) { 375 if (strcmp(ident, "core") == 0) { 376 /* Accept the token. There's no need to record that this is 377 * a core profile shader since that's the only profile we support. 378 */ 379 } else if (strcmp(ident, "compatibility") == 0) { 380 _mesa_glsl_error(locp, this, 381 "the compatibility profile is not supported"); 382 } else { 383 _mesa_glsl_error(locp, this, 384 "\"%s\" is not a valid shading language profile; " 385 "if present, it must be \"core\"", ident); 386 } 387 } else { 388 _mesa_glsl_error(locp, this, 389 "illegal text following version number"); 390 } 391 } 392 393 this->es_shader = es_token_present; 394 if (version == 100) { 395 if (es_token_present) { 396 _mesa_glsl_error(locp, this, 397 "GLSL 1.00 ES should be selected using " 398 "`#version 100'"); 399 } else { 400 this->es_shader = true; 401 } 402 } 403 404 if (this->es_shader) { 405 this->ARB_texture_rectangle_enable = false; 406 } 407 408 if (this->forced_language_version) 409 this->language_version = this->forced_language_version; 410 else 411 this->language_version = version; 412 413 bool supported = false; 414 for (unsigned i = 0; i < this->num_supported_versions; i++) { 415 if (this->supported_versions[i].ver == this->language_version 416 && this->supported_versions[i].es == this->es_shader) { 417 this->gl_version = this->supported_versions[i].gl_ver; 418 supported = true; 419 break; 420 } 421 } 422 423 if (!supported) { 424 _mesa_glsl_error(locp, this, "%s is not supported. " 425 "Supported versions are: %s", 426 this->get_version_string(), 427 this->supported_version_string); 428 429 /* On exit, the language_version must be set to a valid value. 430 * Later calls to _mesa_glsl_initialize_types will misbehave if 431 * the version is invalid. 432 */ 433 switch (this->ctx->API) { 434 case API_OPENGL_COMPAT: 435 case API_OPENGL_CORE: 436 this->language_version = this->ctx->Const.GLSLVersion; 437 break; 438 439 case API_OPENGLES: 440 assert(!"Should not get here."); 441 /* FALLTHROUGH */ 442 443 case API_OPENGLES2: 444 this->language_version = 100; 445 break; 446 } 447 } 448 } 449 450 451 /* This helper function will append the given message to the shader's 452 info log and report it via GL_ARB_debug_output. Per that extension, 453 'type' is one of the enum values classifying the message, and 454 'id' is the implementation-defined ID of the given message. */ 455 static void 456 _mesa_glsl_msg(const YYLTYPE *locp, _mesa_glsl_parse_state *state, 457 GLenum type, const char *fmt, va_list ap) 458 { 459 bool error = (type == MESA_DEBUG_TYPE_ERROR); 460 GLuint msg_id = 0; 461 462 assert(state->info_log != NULL); 463 464 /* Get the offset that the new message will be written to. */ 465 int msg_offset = strlen(state->info_log); 466 467 ralloc_asprintf_append(&state->info_log, "%u:%u(%u): %s: ", 468 locp->source, 469 locp->first_line, 470 locp->first_column, 471 error ? "error" : "warning"); 472 ralloc_vasprintf_append(&state->info_log, fmt, ap); 473 474 const char *const msg = &state->info_log[msg_offset]; 475 struct gl_context *ctx = state->ctx; 476 477 /* Report the error via GL_ARB_debug_output. */ 478 _mesa_shader_debug(ctx, type, &msg_id, msg); 479 480 ralloc_strcat(&state->info_log, "\n"); 481 } 482 483 void 484 _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state, 485 const char *fmt, ...) 486 { 487 va_list ap; 488 489 state->error = true; 490 491 va_start(ap, fmt); 492 _mesa_glsl_msg(locp, state, MESA_DEBUG_TYPE_ERROR, fmt, ap); 493 va_end(ap); 494 } 495 496 497 void 498 _mesa_glsl_warning(const YYLTYPE *locp, _mesa_glsl_parse_state *state, 499 const char *fmt, ...) 500 { 501 va_list ap; 502 503 va_start(ap, fmt); 504 _mesa_glsl_msg(locp, state, MESA_DEBUG_TYPE_OTHER, fmt, ap); 505 va_end(ap); 506 } 507 508 509 /** 510 * Enum representing the possible behaviors that can be specified in 511 * an #extension directive. 512 */ 513 enum ext_behavior { 514 extension_disable, 515 extension_enable, 516 extension_require, 517 extension_warn 518 }; 519 520 /** 521 * Element type for _mesa_glsl_supported_extensions 522 */ 523 struct _mesa_glsl_extension { 524 /** 525 * Name of the extension when referred to in a GLSL extension 526 * statement 527 */ 528 const char *name; 529 530 /** 531 * Whether this extension is a part of AEP 532 */ 533 bool aep; 534 535 /** 536 * Predicate that checks whether the relevant extension is available for 537 * this context. 538 */ 539 bool (*available_pred)(const struct gl_context *, 540 gl_api api, uint8_t version); 541 542 /** 543 * Flag in the _mesa_glsl_parse_state struct that should be set 544 * when this extension is enabled. 545 * 546 * See note in _mesa_glsl_extension::supported_flag about "pointer 547 * to member" types. 548 */ 549 bool _mesa_glsl_parse_state::* enable_flag; 550 551 /** 552 * Flag in the _mesa_glsl_parse_state struct that should be set 553 * when the shader requests "warn" behavior for this extension. 554 * 555 * See note in _mesa_glsl_extension::supported_flag about "pointer 556 * to member" types. 557 */ 558 bool _mesa_glsl_parse_state::* warn_flag; 559 560 561 bool compatible_with_state(const _mesa_glsl_parse_state *state, 562 gl_api api, uint8_t gl_version) const; 563 void set_flags(_mesa_glsl_parse_state *state, ext_behavior behavior) const; 564 }; 565 566 /** Checks if the context supports a user-facing extension */ 567 #define EXT(name_str, driver_cap, ...) \ 568 static MAYBE_UNUSED bool \ 569 has_##name_str(const struct gl_context *ctx, gl_api api, uint8_t version) \ 570 { \ 571 return ctx->Extensions.driver_cap && (version >= \ 572 _mesa_extension_table[MESA_EXTENSION_##name_str].version[api]); \ 573 } 574 #include "main/extensions_table.h" 575 #undef EXT 576 577 #define EXT(NAME) \ 578 { "GL_" #NAME, false, has_##NAME, \ 579 &_mesa_glsl_parse_state::NAME##_enable, \ 580 &_mesa_glsl_parse_state::NAME##_warn } 581 582 #define EXT_AEP(NAME) \ 583 { "GL_" #NAME, true, has_##NAME, \ 584 &_mesa_glsl_parse_state::NAME##_enable, \ 585 &_mesa_glsl_parse_state::NAME##_warn } 586 587 /** 588 * Table of extensions that can be enabled/disabled within a shader, 589 * and the conditions under which they are supported. 590 */ 591 static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = { 592 /* ARB extensions go here, sorted alphabetically. 593 */ 594 EXT(ARB_ES3_1_compatibility), 595 EXT(ARB_ES3_2_compatibility), 596 EXT(ARB_arrays_of_arrays), 597 EXT(ARB_compute_shader), 598 EXT(ARB_compute_variable_group_size), 599 EXT(ARB_conservative_depth), 600 EXT(ARB_cull_distance), 601 EXT(ARB_derivative_control), 602 EXT(ARB_draw_buffers), 603 EXT(ARB_draw_instanced), 604 EXT(ARB_enhanced_layouts), 605 EXT(ARB_explicit_attrib_location), 606 EXT(ARB_explicit_uniform_location), 607 EXT(ARB_fragment_coord_conventions), 608 EXT(ARB_fragment_layer_viewport), 609 EXT(ARB_gpu_shader5), 610 EXT(ARB_gpu_shader_fp64), 611 EXT(ARB_post_depth_coverage), 612 EXT(ARB_sample_shading), 613 EXT(ARB_separate_shader_objects), 614 EXT(ARB_shader_atomic_counter_ops), 615 EXT(ARB_shader_atomic_counters), 616 EXT(ARB_shader_bit_encoding), 617 EXT(ARB_shader_clock), 618 EXT(ARB_shader_draw_parameters), 619 EXT(ARB_shader_group_vote), 620 EXT(ARB_shader_image_load_store), 621 EXT(ARB_shader_image_size), 622 EXT(ARB_shader_precision), 623 EXT(ARB_shader_stencil_export), 624 EXT(ARB_shader_storage_buffer_object), 625 EXT(ARB_shader_subroutine), 626 EXT(ARB_shader_texture_image_samples), 627 EXT(ARB_shader_texture_lod), 628 EXT(ARB_shader_viewport_layer_array), 629 EXT(ARB_shading_language_420pack), 630 EXT(ARB_shading_language_packing), 631 EXT(ARB_tessellation_shader), 632 EXT(ARB_texture_cube_map_array), 633 EXT(ARB_texture_gather), 634 EXT(ARB_texture_multisample), 635 EXT(ARB_texture_query_levels), 636 EXT(ARB_texture_query_lod), 637 EXT(ARB_texture_rectangle), 638 EXT(ARB_uniform_buffer_object), 639 EXT(ARB_vertex_attrib_64bit), 640 EXT(ARB_viewport_array), 641 642 /* KHR extensions go here, sorted alphabetically. 643 */ 644 EXT_AEP(KHR_blend_equation_advanced), 645 646 /* OES extensions go here, sorted alphabetically. 647 */ 648 EXT(OES_EGL_image_external), 649 EXT(OES_geometry_point_size), 650 EXT(OES_geometry_shader), 651 EXT(OES_gpu_shader5), 652 EXT(OES_primitive_bounding_box), 653 EXT_AEP(OES_sample_variables), 654 EXT_AEP(OES_shader_image_atomic), 655 EXT(OES_shader_io_blocks), 656 EXT_AEP(OES_shader_multisample_interpolation), 657 EXT(OES_standard_derivatives), 658 EXT(OES_tessellation_point_size), 659 EXT(OES_tessellation_shader), 660 EXT(OES_texture_3D), 661 EXT(OES_texture_buffer), 662 EXT(OES_texture_cube_map_array), 663 EXT_AEP(OES_texture_storage_multisample_2d_array), 664 EXT(OES_viewport_array), 665 666 /* All other extensions go here, sorted alphabetically. 667 */ 668 EXT(AMD_conservative_depth), 669 EXT(AMD_shader_stencil_export), 670 EXT(AMD_shader_trinary_minmax), 671 EXT(AMD_vertex_shader_layer), 672 EXT(AMD_vertex_shader_viewport_index), 673 EXT(ANDROID_extension_pack_es31a), 674 EXT(EXT_blend_func_extended), 675 EXT(EXT_draw_buffers), 676 EXT(EXT_clip_cull_distance), 677 EXT(EXT_geometry_point_size), 678 EXT_AEP(EXT_geometry_shader), 679 EXT_AEP(EXT_gpu_shader5), 680 EXT_AEP(EXT_primitive_bounding_box), 681 EXT(EXT_separate_shader_objects), 682 EXT(EXT_shader_framebuffer_fetch), 683 EXT(EXT_shader_integer_mix), 684 EXT_AEP(EXT_shader_io_blocks), 685 EXT(EXT_shader_samples_identical), 686 EXT(EXT_tessellation_point_size), 687 EXT_AEP(EXT_tessellation_shader), 688 EXT(EXT_texture_array), 689 EXT_AEP(EXT_texture_buffer), 690 EXT_AEP(EXT_texture_cube_map_array), 691 EXT(INTEL_conservative_rasterization), 692 EXT(MESA_shader_integer_functions), 693 EXT(NV_image_formats), 694 }; 695 696 #undef EXT 697 698 699 /** 700 * Determine whether a given extension is compatible with the target, 701 * API, and extension information in the current parser state. 702 */ 703 bool _mesa_glsl_extension::compatible_with_state( 704 const _mesa_glsl_parse_state *state, gl_api api, uint8_t gl_version) const 705 { 706 return this->available_pred(state->ctx, api, gl_version); 707 } 708 709 /** 710 * Set the appropriate flags in the parser state to establish the 711 * given behavior for this extension. 712 */ 713 void _mesa_glsl_extension::set_flags(_mesa_glsl_parse_state *state, 714 ext_behavior behavior) const 715 { 716 /* Note: the ->* operator indexes into state by the 717 * offsets this->enable_flag and this->warn_flag. See 718 * _mesa_glsl_extension::supported_flag for more info. 719 */ 720 state->*(this->enable_flag) = (behavior != extension_disable); 721 state->*(this->warn_flag) = (behavior == extension_warn); 722 } 723 724 /** 725 * Find an extension by name in _mesa_glsl_supported_extensions. If 726 * the name is not found, return NULL. 727 */ 728 static const _mesa_glsl_extension *find_extension(const char *name) 729 { 730 for (unsigned i = 0; i < ARRAY_SIZE(_mesa_glsl_supported_extensions); ++i) { 731 if (strcmp(name, _mesa_glsl_supported_extensions[i].name) == 0) { 732 return &_mesa_glsl_supported_extensions[i]; 733 } 734 } 735 return NULL; 736 } 737 738 bool 739 _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp, 740 const char *behavior_string, YYLTYPE *behavior_locp, 741 _mesa_glsl_parse_state *state) 742 { 743 uint8_t gl_version = state->ctx->Extensions.Version; 744 gl_api api = state->ctx->API; 745 ext_behavior behavior; 746 if (strcmp(behavior_string, "warn") == 0) { 747 behavior = extension_warn; 748 } else if (strcmp(behavior_string, "require") == 0) { 749 behavior = extension_require; 750 } else if (strcmp(behavior_string, "enable") == 0) { 751 behavior = extension_enable; 752 } else if (strcmp(behavior_string, "disable") == 0) { 753 behavior = extension_disable; 754 } else { 755 _mesa_glsl_error(behavior_locp, state, 756 "unknown extension behavior `%s'", 757 behavior_string); 758 return false; 759 } 760 761 /* If we're in a desktop context but with an ES shader, use an ES API enum 762 * to verify extension availability. 763 */ 764 if (state->es_shader && api != API_OPENGLES2) 765 api = API_OPENGLES2; 766 /* Use the language-version derived GL version to extension checks, unless 767 * we're using meta, which sets the version to the max. 768 */ 769 if (gl_version != 0xff) 770 gl_version = state->gl_version; 771 772 if (strcmp(name, "all") == 0) { 773 if ((behavior == extension_enable) || (behavior == extension_require)) { 774 _mesa_glsl_error(name_locp, state, "cannot %s all extensions", 775 (behavior == extension_enable) 776 ? "enable" : "require"); 777 return false; 778 } else { 779 for (unsigned i = 0; 780 i < ARRAY_SIZE(_mesa_glsl_supported_extensions); ++i) { 781 const _mesa_glsl_extension *extension 782 = &_mesa_glsl_supported_extensions[i]; 783 if (extension->compatible_with_state(state, api, gl_version)) { 784 _mesa_glsl_supported_extensions[i].set_flags(state, behavior); 785 } 786 } 787 } 788 } else { 789 const _mesa_glsl_extension *extension = find_extension(name); 790 if (extension && extension->compatible_with_state(state, api, gl_version)) { 791 extension->set_flags(state, behavior); 792 if (extension->available_pred == has_ANDROID_extension_pack_es31a) { 793 for (unsigned i = 0; 794 i < ARRAY_SIZE(_mesa_glsl_supported_extensions); ++i) { 795 const _mesa_glsl_extension *extension = 796 &_mesa_glsl_supported_extensions[i]; 797 798 if (!extension->aep) 799 continue; 800 /* AEP should not be enabled if all of the sub-extensions can't 801 * also be enabled. This is not the proper layer to do such 802 * error-checking though. 803 */ 804 assert(extension->compatible_with_state(state, api, gl_version)); 805 extension->set_flags(state, behavior); 806 } 807 } 808 } else { 809 static const char fmt[] = "extension `%s' unsupported in %s shader"; 810 811 if (behavior == extension_require) { 812 _mesa_glsl_error(name_locp, state, fmt, 813 name, _mesa_shader_stage_to_string(state->stage)); 814 return false; 815 } else { 816 _mesa_glsl_warning(name_locp, state, fmt, 817 name, _mesa_shader_stage_to_string(state->stage)); 818 } 819 } 820 } 821 822 return true; 823 } 824 825 826 /** 827 * Recurses through <type> and <expr> if <expr> is an aggregate initializer 828 * and sets <expr>'s <constructor_type> field to <type>. Gives later functions 829 * (process_array_constructor, et al) sufficient information to do type 830 * checking. 831 * 832 * Operates on assignments involving an aggregate initializer. E.g., 833 * 834 * vec4 pos = {1.0, -1.0, 0.0, 1.0}; 835 * 836 * or more ridiculously, 837 * 838 * struct S { 839 * vec4 v[2]; 840 * }; 841 * 842 * struct { 843 * S a[2], b; 844 * int c; 845 * } aggregate = { 846 * { 847 * { 848 * { 849 * {1.0, 2.0, 3.0, 4.0}, // a[0].v[0] 850 * {5.0, 6.0, 7.0, 8.0} // a[0].v[1] 851 * } // a[0].v 852 * }, // a[0] 853 * { 854 * { 855 * {1.0, 2.0, 3.0, 4.0}, // a[1].v[0] 856 * {5.0, 6.0, 7.0, 8.0} // a[1].v[1] 857 * } // a[1].v 858 * } // a[1] 859 * }, // a 860 * { 861 * { 862 * {1.0, 2.0, 3.0, 4.0}, // b.v[0] 863 * {5.0, 6.0, 7.0, 8.0} // b.v[1] 864 * } // b.v 865 * }, // b 866 * 4 // c 867 * }; 868 * 869 * This pass is necessary because the right-hand side of <type> e = { ... } 870 * doesn't contain sufficient information to determine if the types match. 871 */ 872 void 873 _mesa_ast_set_aggregate_type(const glsl_type *type, 874 ast_expression *expr) 875 { 876 ast_aggregate_initializer *ai = (ast_aggregate_initializer *)expr; 877 ai->constructor_type = type; 878 879 /* If the aggregate is an array, recursively set its elements' types. */ 880 if (type->is_array()) { 881 /* Each array element has the type type->fields.array. 882 * 883 * E.g., if <type> if struct S[2] we want to set each element's type to 884 * struct S. 885 */ 886 for (exec_node *expr_node = ai->expressions.get_head_raw(); 887 !expr_node->is_tail_sentinel(); 888 expr_node = expr_node->next) { 889 ast_expression *expr = exec_node_data(ast_expression, expr_node, 890 link); 891 892 if (expr->oper == ast_aggregate) 893 _mesa_ast_set_aggregate_type(type->fields.array, expr); 894 } 895 896 /* If the aggregate is a struct, recursively set its fields' types. */ 897 } else if (type->is_record()) { 898 exec_node *expr_node = ai->expressions.get_head_raw(); 899 900 /* Iterate through the struct's fields. */ 901 for (unsigned i = 0; !expr_node->is_tail_sentinel() && i < type->length; 902 i++, expr_node = expr_node->next) { 903 ast_expression *expr = exec_node_data(ast_expression, expr_node, 904 link); 905 906 if (expr->oper == ast_aggregate) { 907 _mesa_ast_set_aggregate_type(type->fields.structure[i].type, expr); 908 } 909 } 910 /* If the aggregate is a matrix, set its columns' types. */ 911 } else if (type->is_matrix()) { 912 for (exec_node *expr_node = ai->expressions.get_head_raw(); 913 !expr_node->is_tail_sentinel(); 914 expr_node = expr_node->next) { 915 ast_expression *expr = exec_node_data(ast_expression, expr_node, 916 link); 917 918 if (expr->oper == ast_aggregate) 919 _mesa_ast_set_aggregate_type(type->column_type(), expr); 920 } 921 } 922 } 923 924 void 925 _mesa_ast_process_interface_block(YYLTYPE *locp, 926 _mesa_glsl_parse_state *state, 927 ast_interface_block *const block, 928 const struct ast_type_qualifier &q) 929 { 930 if (q.flags.q.buffer) { 931 if (!state->has_shader_storage_buffer_objects()) { 932 _mesa_glsl_error(locp, state, 933 "#version 430 / GL_ARB_shader_storage_buffer_object " 934 "required for defining shader storage blocks"); 935 } else if (state->ARB_shader_storage_buffer_object_warn) { 936 _mesa_glsl_warning(locp, state, 937 "#version 430 / GL_ARB_shader_storage_buffer_object " 938 "required for defining shader storage blocks"); 939 } 940 } else if (q.flags.q.uniform) { 941 if (!state->has_uniform_buffer_objects()) { 942 _mesa_glsl_error(locp, state, 943 "#version 140 / GL_ARB_uniform_buffer_object " 944 "required for defining uniform blocks"); 945 } else if (state->ARB_uniform_buffer_object_warn) { 946 _mesa_glsl_warning(locp, state, 947 "#version 140 / GL_ARB_uniform_buffer_object " 948 "required for defining uniform blocks"); 949 } 950 } else { 951 if (!state->has_shader_io_blocks()) { 952 if (state->es_shader) { 953 _mesa_glsl_error(locp, state, 954 "GL_OES_shader_io_blocks or #version 320 " 955 "required for using interface blocks"); 956 } else { 957 _mesa_glsl_error(locp, state, 958 "#version 150 required for using " 959 "interface blocks"); 960 } 961 } 962 } 963 964 /* From the GLSL 1.50.11 spec, section 4.3.7 ("Interface Blocks"): 965 * "It is illegal to have an input block in a vertex shader 966 * or an output block in a fragment shader" 967 */ 968 if ((state->stage == MESA_SHADER_VERTEX) && q.flags.q.in) { 969 _mesa_glsl_error(locp, state, 970 "`in' interface block is not allowed for " 971 "a vertex shader"); 972 } else if ((state->stage == MESA_SHADER_FRAGMENT) && q.flags.q.out) { 973 _mesa_glsl_error(locp, state, 974 "`out' interface block is not allowed for " 975 "a fragment shader"); 976 } 977 978 /* Since block arrays require names, and both features are added in 979 * the same language versions, we don't have to explicitly 980 * version-check both things. 981 */ 982 if (block->instance_name != NULL) { 983 state->check_version(150, 300, locp, "interface blocks with " 984 "an instance name are not allowed"); 985 } 986 987 uint64_t interface_type_mask; 988 struct ast_type_qualifier temp_type_qualifier; 989 990 /* Get a bitmask containing only the in/out/uniform/buffer 991 * flags, allowing us to ignore other irrelevant flags like 992 * interpolation qualifiers. 993 */ 994 temp_type_qualifier.flags.i = 0; 995 temp_type_qualifier.flags.q.uniform = true; 996 temp_type_qualifier.flags.q.in = true; 997 temp_type_qualifier.flags.q.out = true; 998 temp_type_qualifier.flags.q.buffer = true; 999 temp_type_qualifier.flags.q.patch = true; 1000 interface_type_mask = temp_type_qualifier.flags.i; 1001 1002 /* Get the block's interface qualifier. The interface_qualifier 1003 * production rule guarantees that only one bit will be set (and 1004 * it will be in/out/uniform). 1005 */ 1006 uint64_t block_interface_qualifier = q.flags.i; 1007 1008 block->default_layout.flags.i |= block_interface_qualifier; 1009 1010 if (state->stage == MESA_SHADER_GEOMETRY && 1011 state->has_explicit_attrib_stream() && 1012 block->default_layout.flags.q.out) { 1013 /* Assign global layout's stream value. */ 1014 block->default_layout.flags.q.stream = 1; 1015 block->default_layout.flags.q.explicit_stream = 0; 1016 block->default_layout.stream = state->out_qualifier->stream; 1017 } 1018 1019 if (state->has_enhanced_layouts() && block->default_layout.flags.q.out) { 1020 /* Assign global layout's xfb_buffer value. */ 1021 block->default_layout.flags.q.xfb_buffer = 1; 1022 block->default_layout.flags.q.explicit_xfb_buffer = 0; 1023 block->default_layout.xfb_buffer = state->out_qualifier->xfb_buffer; 1024 } 1025 1026 foreach_list_typed (ast_declarator_list, member, link, &block->declarations) { 1027 ast_type_qualifier& qualifier = member->type->qualifier; 1028 if ((qualifier.flags.i & interface_type_mask) == 0) { 1029 /* GLSLangSpec.1.50.11, 4.3.7 (Interface Blocks): 1030 * "If no optional qualifier is used in a member declaration, the 1031 * qualifier of the variable is just in, out, or uniform as declared 1032 * by interface-qualifier." 1033 */ 1034 qualifier.flags.i |= block_interface_qualifier; 1035 } else if ((qualifier.flags.i & interface_type_mask) != 1036 block_interface_qualifier) { 1037 /* GLSLangSpec.1.50.11, 4.3.7 (Interface Blocks): 1038 * "If optional qualifiers are used, they can include interpolation 1039 * and storage qualifiers and they must declare an input, output, 1040 * or uniform variable consistent with the interface qualifier of 1041 * the block." 1042 */ 1043 _mesa_glsl_error(locp, state, 1044 "uniform/in/out qualifier on " 1045 "interface block member does not match " 1046 "the interface block"); 1047 } 1048 1049 if (!(q.flags.q.in || q.flags.q.out) && qualifier.flags.q.invariant) 1050 _mesa_glsl_error(locp, state, 1051 "invariant qualifiers can be used only " 1052 "in interface block members for shader " 1053 "inputs or outputs"); 1054 } 1055 } 1056 1057 void 1058 _mesa_ast_type_qualifier_print(const struct ast_type_qualifier *q) 1059 { 1060 if (q->flags.q.subroutine) 1061 printf("subroutine "); 1062 1063 if (q->flags.q.subroutine_def) { 1064 printf("subroutine ("); 1065 q->subroutine_list->print(); 1066 printf(")"); 1067 } 1068 1069 if (q->flags.q.constant) 1070 printf("const "); 1071 1072 if (q->flags.q.invariant) 1073 printf("invariant "); 1074 1075 if (q->flags.q.attribute) 1076 printf("attribute "); 1077 1078 if (q->flags.q.varying) 1079 printf("varying "); 1080 1081 if (q->flags.q.in && q->flags.q.out) 1082 printf("inout "); 1083 else { 1084 if (q->flags.q.in) 1085 printf("in "); 1086 1087 if (q->flags.q.out) 1088 printf("out "); 1089 } 1090 1091 if (q->flags.q.centroid) 1092 printf("centroid "); 1093 if (q->flags.q.sample) 1094 printf("sample "); 1095 if (q->flags.q.patch) 1096 printf("patch "); 1097 if (q->flags.q.uniform) 1098 printf("uniform "); 1099 if (q->flags.q.buffer) 1100 printf("buffer "); 1101 if (q->flags.q.smooth) 1102 printf("smooth "); 1103 if (q->flags.q.flat) 1104 printf("flat "); 1105 if (q->flags.q.noperspective) 1106 printf("noperspective "); 1107 } 1108 1109 1110 void 1111 ast_node::print(void) const 1112 { 1113 printf("unhandled node "); 1114 } 1115 1116 1117 ast_node::ast_node(void) 1118 { 1119 this->location.source = 0; 1120 this->location.first_line = 0; 1121 this->location.first_column = 0; 1122 this->location.last_line = 0; 1123 this->location.last_column = 0; 1124 } 1125 1126 1127 static void 1128 ast_opt_array_dimensions_print(const ast_array_specifier *array_specifier) 1129 { 1130 if (array_specifier) 1131 array_specifier->print(); 1132 } 1133 1134 1135 void 1136 ast_compound_statement::print(void) const 1137 { 1138 printf("{\n"); 1139 1140 foreach_list_typed(ast_node, ast, link, &this->statements) { 1141 ast->print(); 1142 } 1143 1144 printf("}\n"); 1145 } 1146 1147 1148 ast_compound_statement::ast_compound_statement(int new_scope, 1149 ast_node *statements) 1150 { 1151 this->new_scope = new_scope; 1152 1153 if (statements != NULL) { 1154 this->statements.push_degenerate_list_at_head(&statements->link); 1155 } 1156 } 1157 1158 1159 void 1160 ast_expression::print(void) const 1161 { 1162 switch (oper) { 1163 case ast_assign: 1164 case ast_mul_assign: 1165 case ast_div_assign: 1166 case ast_mod_assign: 1167 case ast_add_assign: 1168 case ast_sub_assign: 1169 case ast_ls_assign: 1170 case ast_rs_assign: 1171 case ast_and_assign: 1172 case ast_xor_assign: 1173 case ast_or_assign: 1174 subexpressions[0]->print(); 1175 printf("%s ", operator_string(oper)); 1176 subexpressions[1]->print(); 1177 break; 1178 1179 case ast_field_selection: 1180 subexpressions[0]->print(); 1181 printf(". %s ", primary_expression.identifier); 1182 break; 1183 1184 case ast_plus: 1185 case ast_neg: 1186 case ast_bit_not: 1187 case ast_logic_not: 1188 case ast_pre_inc: 1189 case ast_pre_dec: 1190 printf("%s ", operator_string(oper)); 1191 subexpressions[0]->print(); 1192 break; 1193 1194 case ast_post_inc: 1195 case ast_post_dec: 1196 subexpressions[0]->print(); 1197 printf("%s ", operator_string(oper)); 1198 break; 1199 1200 case ast_conditional: 1201 subexpressions[0]->print(); 1202 printf("? "); 1203 subexpressions[1]->print(); 1204 printf(": "); 1205 subexpressions[2]->print(); 1206 break; 1207 1208 case ast_array_index: 1209 subexpressions[0]->print(); 1210 printf("[ "); 1211 subexpressions[1]->print(); 1212 printf("] "); 1213 break; 1214 1215 case ast_function_call: { 1216 subexpressions[0]->print(); 1217 printf("( "); 1218 1219 foreach_list_typed (ast_node, ast, link, &this->expressions) { 1220 if (&ast->link != this->expressions.get_head()) 1221 printf(", "); 1222 1223 ast->print(); 1224 } 1225 1226 printf(") "); 1227 break; 1228 } 1229 1230 case ast_identifier: 1231 printf("%s ", primary_expression.identifier); 1232 break; 1233 1234 case ast_int_constant: 1235 printf("%d ", primary_expression.int_constant); 1236 break; 1237 1238 case ast_uint_constant: 1239 printf("%u ", primary_expression.uint_constant); 1240 break; 1241 1242 case ast_float_constant: 1243 printf("%f ", primary_expression.float_constant); 1244 break; 1245 1246 case ast_double_constant: 1247 printf("%f ", primary_expression.double_constant); 1248 break; 1249 1250 case ast_bool_constant: 1251 printf("%s ", 1252 primary_expression.bool_constant 1253 ? "true" : "false"); 1254 break; 1255 1256 case ast_sequence: { 1257 printf("( "); 1258 foreach_list_typed (ast_node, ast, link, & this->expressions) { 1259 if (&ast->link != this->expressions.get_head()) 1260 printf(", "); 1261 1262 ast->print(); 1263 } 1264 printf(") "); 1265 break; 1266 } 1267 1268 case ast_aggregate: { 1269 printf("{ "); 1270 foreach_list_typed (ast_node, ast, link, & this->expressions) { 1271 if (&ast->link != this->expressions.get_head()) 1272 printf(", "); 1273 1274 ast->print(); 1275 } 1276 printf("} "); 1277 break; 1278 } 1279 1280 default: 1281 assert(0); 1282 break; 1283 } 1284 } 1285 1286 ast_expression::ast_expression(int oper, 1287 ast_expression *ex0, 1288 ast_expression *ex1, 1289 ast_expression *ex2) : 1290 primary_expression() 1291 { 1292 this->oper = ast_operators(oper); 1293 this->subexpressions[0] = ex0; 1294 this->subexpressions[1] = ex1; 1295 this->subexpressions[2] = ex2; 1296 this->non_lvalue_description = NULL; 1297 this->is_lhs = false; 1298 } 1299 1300 1301 void 1302 ast_expression_statement::print(void) const 1303 { 1304 if (expression) 1305 expression->print(); 1306 1307 printf("; "); 1308 } 1309 1310 1311 ast_expression_statement::ast_expression_statement(ast_expression *ex) : 1312 expression(ex) 1313 { 1314 /* empty */ 1315 } 1316 1317 1318 void 1319 ast_function::print(void) const 1320 { 1321 return_type->print(); 1322 printf(" %s (", identifier); 1323 1324 foreach_list_typed(ast_node, ast, link, & this->parameters) { 1325 ast->print(); 1326 } 1327 1328 printf(")"); 1329 } 1330 1331 1332 ast_function::ast_function(void) 1333 : return_type(NULL), identifier(NULL), is_definition(false), 1334 signature(NULL) 1335 { 1336 /* empty */ 1337 } 1338 1339 1340 void 1341 ast_fully_specified_type::print(void) const 1342 { 1343 _mesa_ast_type_qualifier_print(& qualifier); 1344 specifier->print(); 1345 } 1346 1347 1348 void 1349 ast_parameter_declarator::print(void) const 1350 { 1351 type->print(); 1352 if (identifier) 1353 printf("%s ", identifier); 1354 ast_opt_array_dimensions_print(array_specifier); 1355 } 1356 1357 1358 void 1359 ast_function_definition::print(void) const 1360 { 1361 prototype->print(); 1362 body->print(); 1363 } 1364 1365 1366 void 1367 ast_declaration::print(void) const 1368 { 1369 printf("%s ", identifier); 1370 ast_opt_array_dimensions_print(array_specifier); 1371 1372 if (initializer) { 1373 printf("= "); 1374 initializer->print(); 1375 } 1376 } 1377 1378 1379 ast_declaration::ast_declaration(const char *identifier, 1380 ast_array_specifier *array_specifier, 1381 ast_expression *initializer) 1382 { 1383 this->identifier = identifier; 1384 this->array_specifier = array_specifier; 1385 this->initializer = initializer; 1386 } 1387 1388 1389 void 1390 ast_declarator_list::print(void) const 1391 { 1392 assert(type || invariant); 1393 1394 if (type) 1395 type->print(); 1396 else if (invariant) 1397 printf("invariant "); 1398 else 1399 printf("precise "); 1400 1401 foreach_list_typed (ast_node, ast, link, & this->declarations) { 1402 if (&ast->link != this->declarations.get_head()) 1403 printf(", "); 1404 1405 ast->print(); 1406 } 1407 1408 printf("; "); 1409 } 1410 1411 1412 ast_declarator_list::ast_declarator_list(ast_fully_specified_type *type) 1413 { 1414 this->type = type; 1415 this->invariant = false; 1416 this->precise = false; 1417 } 1418 1419 void 1420 ast_jump_statement::print(void) const 1421 { 1422 switch (mode) { 1423 case ast_continue: 1424 printf("continue; "); 1425 break; 1426 case ast_break: 1427 printf("break; "); 1428 break; 1429 case ast_return: 1430 printf("return "); 1431 if (opt_return_value) 1432 opt_return_value->print(); 1433 1434 printf("; "); 1435 break; 1436 case ast_discard: 1437 printf("discard; "); 1438 break; 1439 } 1440 } 1441 1442 1443 ast_jump_statement::ast_jump_statement(int mode, ast_expression *return_value) 1444 : opt_return_value(NULL) 1445 { 1446 this->mode = ast_jump_modes(mode); 1447 1448 if (mode == ast_return) 1449 opt_return_value = return_value; 1450 } 1451 1452 1453 void 1454 ast_selection_statement::print(void) const 1455 { 1456 printf("if ( "); 1457 condition->print(); 1458 printf(") "); 1459 1460 then_statement->print(); 1461 1462 if (else_statement) { 1463 printf("else "); 1464 else_statement->print(); 1465 } 1466 } 1467 1468 1469 ast_selection_statement::ast_selection_statement(ast_expression *condition, 1470 ast_node *then_statement, 1471 ast_node *else_statement) 1472 { 1473 this->condition = condition; 1474 this->then_statement = then_statement; 1475 this->else_statement = else_statement; 1476 } 1477 1478 1479 void 1480 ast_switch_statement::print(void) const 1481 { 1482 printf("switch ( "); 1483 test_expression->print(); 1484 printf(") "); 1485 1486 body->print(); 1487 } 1488 1489 1490 ast_switch_statement::ast_switch_statement(ast_expression *test_expression, 1491 ast_node *body) 1492 { 1493 this->test_expression = test_expression; 1494 this->body = body; 1495 } 1496 1497 1498 void 1499 ast_switch_body::print(void) const 1500 { 1501 printf("{\n"); 1502 if (stmts != NULL) { 1503 stmts->print(); 1504 } 1505 printf("}\n"); 1506 } 1507 1508 1509 ast_switch_body::ast_switch_body(ast_case_statement_list *stmts) 1510 { 1511 this->stmts = stmts; 1512 } 1513 1514 1515 void ast_case_label::print(void) const 1516 { 1517 if (test_value != NULL) { 1518 printf("case "); 1519 test_value->print(); 1520 printf(": "); 1521 } else { 1522 printf("default: "); 1523 } 1524 } 1525 1526 1527 ast_case_label::ast_case_label(ast_expression *test_value) 1528 { 1529 this->test_value = test_value; 1530 } 1531 1532 1533 void ast_case_label_list::print(void) const 1534 { 1535 foreach_list_typed(ast_node, ast, link, & this->labels) { 1536 ast->print(); 1537 } 1538 printf("\n"); 1539 } 1540 1541 1542 ast_case_label_list::ast_case_label_list(void) 1543 { 1544 } 1545 1546 1547 void ast_case_statement::print(void) const 1548 { 1549 labels->print(); 1550 foreach_list_typed(ast_node, ast, link, & this->stmts) { 1551 ast->print(); 1552 printf("\n"); 1553 } 1554 } 1555 1556 1557 ast_case_statement::ast_case_statement(ast_case_label_list *labels) 1558 { 1559 this->labels = labels; 1560 } 1561 1562 1563 void ast_case_statement_list::print(void) const 1564 { 1565 foreach_list_typed(ast_node, ast, link, & this->cases) { 1566 ast->print(); 1567 } 1568 } 1569 1570 1571 ast_case_statement_list::ast_case_statement_list(void) 1572 { 1573 } 1574 1575 1576 void 1577 ast_iteration_statement::print(void) const 1578 { 1579 switch (mode) { 1580 case ast_for: 1581 printf("for( "); 1582 if (init_statement) 1583 init_statement->print(); 1584 printf("; "); 1585 1586 if (condition) 1587 condition->print(); 1588 printf("; "); 1589 1590 if (rest_expression) 1591 rest_expression->print(); 1592 printf(") "); 1593 1594 body->print(); 1595 break; 1596 1597 case ast_while: 1598 printf("while ( "); 1599 if (condition) 1600 condition->print(); 1601 printf(") "); 1602 body->print(); 1603 break; 1604 1605 case ast_do_while: 1606 printf("do "); 1607 body->print(); 1608 printf("while ( "); 1609 if (condition) 1610 condition->print(); 1611 printf("); "); 1612 break; 1613 } 1614 } 1615 1616 1617 ast_iteration_statement::ast_iteration_statement(int mode, 1618 ast_node *init, 1619 ast_node *condition, 1620 ast_expression *rest_expression, 1621 ast_node *body) 1622 { 1623 this->mode = ast_iteration_modes(mode); 1624 this->init_statement = init; 1625 this->condition = condition; 1626 this->rest_expression = rest_expression; 1627 this->body = body; 1628 } 1629 1630 1631 void 1632 ast_struct_specifier::print(void) const 1633 { 1634 printf("struct %s { ", name); 1635 foreach_list_typed(ast_node, ast, link, &this->declarations) { 1636 ast->print(); 1637 } 1638 printf("} "); 1639 } 1640 1641 1642 ast_struct_specifier::ast_struct_specifier(void *lin_ctx, const char *identifier, 1643 ast_declarator_list *declarator_list) 1644 { 1645 if (identifier == NULL) { 1646 static mtx_t mutex = _MTX_INITIALIZER_NP; 1647 static unsigned anon_count = 1; 1648 unsigned count; 1649 1650 mtx_lock(&mutex); 1651 count = anon_count++; 1652 mtx_unlock(&mutex); 1653 1654 identifier = linear_asprintf(lin_ctx, "#anon_struct_%04x", count); 1655 } 1656 name = identifier; 1657 this->declarations.push_degenerate_list_at_head(&declarator_list->link); 1658 is_declaration = true; 1659 layout = NULL; 1660 } 1661 1662 void ast_subroutine_list::print(void) const 1663 { 1664 foreach_list_typed (ast_node, ast, link, & this->declarations) { 1665 if (&ast->link != this->declarations.get_head()) 1666 printf(", "); 1667 ast->print(); 1668 } 1669 } 1670 1671 static void 1672 set_shader_inout_layout(struct gl_shader *shader, 1673 struct _mesa_glsl_parse_state *state) 1674 { 1675 /* Should have been prevented by the parser. */ 1676 if (shader->Stage == MESA_SHADER_TESS_CTRL || 1677 shader->Stage == MESA_SHADER_VERTEX) { 1678 assert(!state->in_qualifier->flags.i); 1679 } else if (shader->Stage != MESA_SHADER_GEOMETRY && 1680 shader->Stage != MESA_SHADER_TESS_EVAL) { 1681 assert(!state->in_qualifier->flags.i); 1682 } 1683 1684 if (shader->Stage != MESA_SHADER_COMPUTE) { 1685 /* Should have been prevented by the parser. */ 1686 assert(!state->cs_input_local_size_specified); 1687 assert(!state->cs_input_local_size_variable_specified); 1688 } 1689 1690 if (shader->Stage != MESA_SHADER_FRAGMENT) { 1691 /* Should have been prevented by the parser. */ 1692 assert(!state->fs_uses_gl_fragcoord); 1693 assert(!state->fs_redeclares_gl_fragcoord); 1694 assert(!state->fs_pixel_center_integer); 1695 assert(!state->fs_origin_upper_left); 1696 assert(!state->fs_early_fragment_tests); 1697 assert(!state->fs_inner_coverage); 1698 assert(!state->fs_post_depth_coverage); 1699 } 1700 1701 for (unsigned i = 0; i < MAX_FEEDBACK_BUFFERS; i++) { 1702 if (state->out_qualifier->out_xfb_stride[i]) { 1703 unsigned xfb_stride; 1704 if (state->out_qualifier->out_xfb_stride[i]-> 1705 process_qualifier_constant(state, "xfb_stride", &xfb_stride, 1706 true)) { 1707 shader->info.TransformFeedback.BufferStride[i] = xfb_stride; 1708 } 1709 } 1710 } 1711 1712 switch (shader->Stage) { 1713 case MESA_SHADER_TESS_CTRL: 1714 shader->info.TessCtrl.VerticesOut = 0; 1715 if (state->tcs_output_vertices_specified) { 1716 unsigned vertices; 1717 if (state->out_qualifier->vertices-> 1718 process_qualifier_constant(state, "vertices", &vertices, 1719 false)) { 1720 1721 YYLTYPE loc = state->out_qualifier->vertices->get_location(); 1722 if (vertices > state->Const.MaxPatchVertices) { 1723 _mesa_glsl_error(&loc, state, "vertices (%d) exceeds " 1724 "GL_MAX_PATCH_VERTICES", vertices); 1725 } 1726 shader->info.TessCtrl.VerticesOut = vertices; 1727 } 1728 } 1729 break; 1730 case MESA_SHADER_TESS_EVAL: 1731 shader->info.TessEval.PrimitiveMode = PRIM_UNKNOWN; 1732 if (state->in_qualifier->flags.q.prim_type) 1733 shader->info.TessEval.PrimitiveMode = state->in_qualifier->prim_type; 1734 1735 shader->info.TessEval.Spacing = TESS_SPACING_UNSPECIFIED; 1736 if (state->in_qualifier->flags.q.vertex_spacing) 1737 shader->info.TessEval.Spacing = state->in_qualifier->vertex_spacing; 1738 1739 shader->info.TessEval.VertexOrder = 0; 1740 if (state->in_qualifier->flags.q.ordering) 1741 shader->info.TessEval.VertexOrder = state->in_qualifier->ordering; 1742 1743 shader->info.TessEval.PointMode = -1; 1744 if (state->in_qualifier->flags.q.point_mode) 1745 shader->info.TessEval.PointMode = state->in_qualifier->point_mode; 1746 break; 1747 case MESA_SHADER_GEOMETRY: 1748 shader->info.Geom.VerticesOut = -1; 1749 if (state->out_qualifier->flags.q.max_vertices) { 1750 unsigned qual_max_vertices; 1751 if (state->out_qualifier->max_vertices-> 1752 process_qualifier_constant(state, "max_vertices", 1753 &qual_max_vertices, true)) { 1754 1755 if (qual_max_vertices > state->Const.MaxGeometryOutputVertices) { 1756 YYLTYPE loc = state->out_qualifier->max_vertices->get_location(); 1757 _mesa_glsl_error(&loc, state, 1758 "maximum output vertices (%d) exceeds " 1759 "GL_MAX_GEOMETRY_OUTPUT_VERTICES", 1760 qual_max_vertices); 1761 } 1762 shader->info.Geom.VerticesOut = qual_max_vertices; 1763 } 1764 } 1765 1766 if (state->gs_input_prim_type_specified) { 1767 shader->info.Geom.InputType = state->in_qualifier->prim_type; 1768 } else { 1769 shader->info.Geom.InputType = PRIM_UNKNOWN; 1770 } 1771 1772 if (state->out_qualifier->flags.q.prim_type) { 1773 shader->info.Geom.OutputType = state->out_qualifier->prim_type; 1774 } else { 1775 shader->info.Geom.OutputType = PRIM_UNKNOWN; 1776 } 1777 1778 shader->info.Geom.Invocations = 0; 1779 if (state->in_qualifier->flags.q.invocations) { 1780 unsigned invocations; 1781 if (state->in_qualifier->invocations-> 1782 process_qualifier_constant(state, "invocations", 1783 &invocations, false)) { 1784 1785 YYLTYPE loc = state->in_qualifier->invocations->get_location(); 1786 if (invocations > MAX_GEOMETRY_SHADER_INVOCATIONS) { 1787 _mesa_glsl_error(&loc, state, 1788 "invocations (%d) exceeds " 1789 "GL_MAX_GEOMETRY_SHADER_INVOCATIONS", 1790 invocations); 1791 } 1792 shader->info.Geom.Invocations = invocations; 1793 } 1794 } 1795 break; 1796 1797 case MESA_SHADER_COMPUTE: 1798 if (state->cs_input_local_size_specified) { 1799 for (int i = 0; i < 3; i++) 1800 shader->info.Comp.LocalSize[i] = state->cs_input_local_size[i]; 1801 } else { 1802 for (int i = 0; i < 3; i++) 1803 shader->info.Comp.LocalSize[i] = 0; 1804 } 1805 1806 shader->info.Comp.LocalSizeVariable = 1807 state->cs_input_local_size_variable_specified; 1808 break; 1809 1810 case MESA_SHADER_FRAGMENT: 1811 shader->info.redeclares_gl_fragcoord = 1812 state->fs_redeclares_gl_fragcoord; 1813 shader->info.uses_gl_fragcoord = state->fs_uses_gl_fragcoord; 1814 shader->info.pixel_center_integer = state->fs_pixel_center_integer; 1815 shader->info.origin_upper_left = state->fs_origin_upper_left; 1816 shader->info.ARB_fragment_coord_conventions_enable = 1817 state->ARB_fragment_coord_conventions_enable; 1818 shader->info.EarlyFragmentTests = state->fs_early_fragment_tests; 1819 shader->info.InnerCoverage = state->fs_inner_coverage; 1820 shader->info.PostDepthCoverage = state->fs_post_depth_coverage; 1821 shader->BlendSupport = state->fs_blend_support; 1822 break; 1823 1824 default: 1825 /* Nothing to do. */ 1826 break; 1827 } 1828 } 1829 1830 extern "C" { 1831 1832 static void 1833 assign_subroutine_indexes(struct gl_shader *sh, 1834 struct _mesa_glsl_parse_state *state) 1835 { 1836 int j, k; 1837 int index = 0; 1838 1839 for (j = 0; j < state->num_subroutines; j++) { 1840 while (state->subroutines[j]->subroutine_index == -1) { 1841 for (k = 0; k < state->num_subroutines; k++) { 1842 if (state->subroutines[k]->subroutine_index == index) 1843 break; 1844 else if (k == state->num_subroutines - 1) { 1845 state->subroutines[j]->subroutine_index = index; 1846 } 1847 } 1848 index++; 1849 } 1850 } 1851 } 1852 1853 static void 1854 add_builtin_defines(struct _mesa_glsl_parse_state *state, 1855 void (*add_builtin_define)(struct glcpp_parser *, const char *, int), 1856 struct glcpp_parser *data, 1857 unsigned version, 1858 bool es) 1859 { 1860 unsigned gl_version = state->ctx->Extensions.Version; 1861 gl_api api = state->ctx->API; 1862 1863 if (gl_version != 0xff) { 1864 unsigned i; 1865 for (i = 0; i < state->num_supported_versions; i++) { 1866 if (state->supported_versions[i].ver == version && 1867 state->supported_versions[i].es == es) { 1868 gl_version = state->supported_versions[i].gl_ver; 1869 break; 1870 } 1871 } 1872 1873 if (i == state->num_supported_versions) 1874 return; 1875 } 1876 1877 if (es) 1878 api = API_OPENGLES2; 1879 1880 for (unsigned i = 0; 1881 i < ARRAY_SIZE(_mesa_glsl_supported_extensions); ++i) { 1882 const _mesa_glsl_extension *extension 1883 = &_mesa_glsl_supported_extensions[i]; 1884 if (extension->compatible_with_state(state, api, gl_version)) { 1885 add_builtin_define(data, extension->name, 1); 1886 } 1887 } 1888 } 1889 1890 /* Implements parsing checks that we can't do during parsing */ 1891 static void 1892 do_late_parsing_checks(struct _mesa_glsl_parse_state *state) 1893 { 1894 if (state->stage == MESA_SHADER_COMPUTE && !state->has_compute_shader()) { 1895 YYLTYPE loc; 1896 memset(&loc, 0, sizeof(loc)); 1897 _mesa_glsl_error(&loc, state, "Compute shaders require " 1898 "GLSL 4.30 or GLSL ES 3.10"); 1899 } 1900 } 1901 1902 void 1903 _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, 1904 bool dump_ast, bool dump_hir) 1905 { 1906 struct _mesa_glsl_parse_state *state = 1907 new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader); 1908 const char *source = shader->Source; 1909 1910 if (ctx->Const.GenerateTemporaryNames) 1911 (void) p_atomic_cmpxchg(&ir_variable::temporaries_allocate_names, 1912 false, true); 1913 1914 state->error = glcpp_preprocess(state, &source, &state->info_log, 1915 add_builtin_defines, state, ctx); 1916 1917 if (!state->error) { 1918 _mesa_glsl_lexer_ctor(state, source); 1919 _mesa_glsl_parse(state); 1920 _mesa_glsl_lexer_dtor(state); 1921 do_late_parsing_checks(state); 1922 } 1923 1924 if (dump_ast) { 1925 foreach_list_typed(ast_node, ast, link, &state->translation_unit) { 1926 ast->print(); 1927 } 1928 printf("\n\n"); 1929 } 1930 1931 ralloc_free(shader->ir); 1932 shader->ir = new(shader) exec_list; 1933 if (!state->error && !state->translation_unit.is_empty()) 1934 _mesa_ast_to_hir(shader->ir, state); 1935 1936 if (!state->error) { 1937 validate_ir_tree(shader->ir); 1938 1939 /* Print out the unoptimized IR. */ 1940 if (dump_hir) { 1941 _mesa_print_ir(stdout, shader->ir, state); 1942 } 1943 } 1944 1945 1946 if (!state->error && !shader->ir->is_empty()) { 1947 struct gl_shader_compiler_options *options = 1948 &ctx->Const.ShaderCompilerOptions[shader->Stage]; 1949 1950 assign_subroutine_indexes(shader, state); 1951 lower_subroutine(shader->ir, state); 1952 1953 /* Do some optimization at compile time to reduce shader IR size 1954 * and reduce later work if the same shader is linked multiple times 1955 */ 1956 if (ctx->Const.GLSLOptimizeConservatively) { 1957 /* Run it just once. */ 1958 do_common_optimization(shader->ir, false, false, options, 1959 ctx->Const.NativeIntegers); 1960 } else { 1961 /* Repeat it until it stops making changes. */ 1962 while (do_common_optimization(shader->ir, false, false, options, 1963 ctx->Const.NativeIntegers)) 1964 ; 1965 } 1966 1967 validate_ir_tree(shader->ir); 1968 1969 enum ir_variable_mode other; 1970 switch (shader->Stage) { 1971 case MESA_SHADER_VERTEX: 1972 other = ir_var_shader_in; 1973 break; 1974 case MESA_SHADER_FRAGMENT: 1975 other = ir_var_shader_out; 1976 break; 1977 default: 1978 /* Something invalid to ensure optimize_dead_builtin_uniforms 1979 * doesn't remove anything other than uniforms or constants. 1980 */ 1981 other = ir_var_mode_count; 1982 break; 1983 } 1984 1985 optimize_dead_builtin_variables(shader->ir, other); 1986 1987 validate_ir_tree(shader->ir); 1988 } 1989 1990 if (shader->InfoLog) 1991 ralloc_free(shader->InfoLog); 1992 1993 if (!state->error) 1994 set_shader_inout_layout(shader, state); 1995 1996 shader->symbols = new(shader->ir) glsl_symbol_table; 1997 shader->CompileStatus = !state->error; 1998 shader->InfoLog = state->info_log; 1999 shader->Version = state->language_version; 2000 shader->IsES = state->es_shader; 2001 2002 /* Retain any live IR, but trash the rest. */ 2003 reparent_ir(shader->ir, shader->ir); 2004 2005 /* Destroy the symbol table. Create a new symbol table that contains only 2006 * the variables and functions that still exist in the IR. The symbol 2007 * table will be used later during linking. 2008 * 2009 * There must NOT be any freed objects still referenced by the symbol 2010 * table. That could cause the linker to dereference freed memory. 2011 * 2012 * We don't have to worry about types or interface-types here because those 2013 * are fly-weights that are looked up by glsl_type. 2014 */ 2015 foreach_in_list (ir_instruction, ir, shader->ir) { 2016 switch (ir->ir_type) { 2017 case ir_type_function: 2018 shader->symbols->add_function((ir_function *) ir); 2019 break; 2020 case ir_type_variable: { 2021 ir_variable *const var = (ir_variable *) ir; 2022 2023 if (var->data.mode != ir_var_temporary) 2024 shader->symbols->add_variable(var); 2025 break; 2026 } 2027 default: 2028 break; 2029 } 2030 } 2031 2032 _mesa_glsl_initialize_derived_variables(ctx, shader); 2033 2034 delete state->symbols; 2035 ralloc_free(state); 2036 } 2037 2038 } /* extern "C" */ 2039 /** 2040 * Do the set of common optimizations passes 2041 * 2042 * \param ir List of instructions to be optimized 2043 * \param linked Is the shader linked? This enables 2044 * optimizations passes that remove code at 2045 * global scope and could cause linking to 2046 * fail. 2047 * \param uniform_locations_assigned Have locations already been assigned for 2048 * uniforms? This prevents the declarations 2049 * of unused uniforms from being removed. 2050 * The setting of this flag only matters if 2051 * \c linked is \c true. 2052 * \param options The driver's preferred shader options. 2053 * \param native_integers Selects optimizations that depend on the 2054 * implementations supporting integers 2055 * natively (as opposed to supporting 2056 * integers in floating point registers). 2057 */ 2058 bool 2059 do_common_optimization(exec_list *ir, bool linked, 2060 bool uniform_locations_assigned, 2061 const struct gl_shader_compiler_options *options, 2062 bool native_integers) 2063 { 2064 const bool debug = false; 2065 GLboolean progress = GL_FALSE; 2066 2067 #define OPT(PASS, ...) do { \ 2068 if (debug) { \ 2069 fprintf(stderr, "START GLSL optimization %s\n", #PASS); \ 2070 const bool opt_progress = PASS(__VA_ARGS__); \ 2071 progress = opt_progress || progress; \ 2072 if (opt_progress) \ 2073 _mesa_print_ir(stderr, ir, NULL); \ 2074 fprintf(stderr, "GLSL optimization %s: %s progress\n", \ 2075 #PASS, opt_progress ? "made" : "no"); \ 2076 } else { \ 2077 progress = PASS(__VA_ARGS__) || progress; \ 2078 } \ 2079 } while (false) 2080 2081 OPT(lower_instructions, ir, SUB_TO_ADD_NEG); 2082 2083 if (linked) { 2084 OPT(do_function_inlining, ir); 2085 OPT(do_dead_functions, ir); 2086 OPT(do_structure_splitting, ir); 2087 } 2088 propagate_invariance(ir); 2089 OPT(do_if_simplification, ir); 2090 OPT(opt_flatten_nested_if_blocks, ir); 2091 OPT(opt_conditional_discard, ir); 2092 OPT(do_copy_propagation, ir); 2093 OPT(do_copy_propagation_elements, ir); 2094 2095 if (options->OptimizeForAOS && !linked) 2096 OPT(opt_flip_matrices, ir); 2097 2098 if (linked && options->OptimizeForAOS) { 2099 OPT(do_vectorize, ir); 2100 } 2101 2102 if (linked) 2103 OPT(do_dead_code, ir, uniform_locations_assigned); 2104 else 2105 OPT(do_dead_code_unlinked, ir); 2106 OPT(do_dead_code_local, ir); 2107 OPT(do_tree_grafting, ir); 2108 OPT(do_constant_propagation, ir); 2109 if (linked) 2110 OPT(do_constant_variable, ir); 2111 else 2112 OPT(do_constant_variable_unlinked, ir); 2113 OPT(do_constant_folding, ir); 2114 OPT(do_minmax_prune, ir); 2115 OPT(do_rebalance_tree, ir); 2116 OPT(do_algebraic, ir, native_integers, options); 2117 OPT(do_lower_jumps, ir, true, true, options->EmitNoMainReturn, 2118 options->EmitNoCont, options->EmitNoLoops); 2119 OPT(do_vec_index_to_swizzle, ir); 2120 OPT(lower_vector_insert, ir, false); 2121 OPT(do_swizzle_swizzle, ir); 2122 OPT(do_noop_swizzle, ir); 2123 2124 OPT(optimize_split_arrays, ir, linked); 2125 OPT(optimize_redundant_jumps, ir); 2126 2127 if (options->MaxUnrollIterations) { 2128 loop_state *ls = analyze_loop_variables(ir); 2129 if (ls->loop_found) { 2130 OPT(set_loop_controls, ir, ls); 2131 OPT(unroll_loops, ir, ls, options); 2132 } 2133 delete ls; 2134 } 2135 2136 #undef OPT 2137 2138 return progress; 2139 } 2140 2141 extern "C" { 2142 2143 /** 2144 * To be called at GL teardown time, this frees compiler datastructures. 2145 * 2146 * After calling this, any previously compiled shaders and shader 2147 * programs would be invalid. So this should happen at approximately 2148 * program exit. 2149 */ 2150 void 2151 _mesa_destroy_shader_compiler(void) 2152 { 2153 _mesa_destroy_shader_compiler_caches(); 2154 2155 _mesa_glsl_release_types(); 2156 } 2157 2158 /** 2159 * Releases compiler caches to trade off performance for memory. 2160 * 2161 * Intended to be used with glReleaseShaderCompiler(). 2162 */ 2163 void 2164 _mesa_destroy_shader_compiler_caches(void) 2165 { 2166 _mesa_glsl_release_builtin_functions(); 2167 } 2168 2169 } 2170