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