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