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