diff options
author | John Brooks <[email protected]> | 2017-05-15 01:47:38 -0400 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2017-05-20 17:30:05 +0200 |
commit | 6e8f34a2deab4d8c259066eae892119afef7cfb0 (patch) | |
tree | 66446ff0c0997edb071c78c6e0577163fc018947 /src | |
parent | bf4d7671f423f5d4e451fba81bb9d9ae57f5fe5b (diff) |
glsl: Conditionally allow redeclaration of built-in variables
Conditional on allow_glsl_builtin_variable_redeclaration driconf option.
v2 (Samuel Pitoiset):
- Rename allow_glsl_builtin_redeclaration ->
allow_glsl_builtin_variable_redeclaration
- style: put spaces after 'if'
Signed-off-by: John Brooks <[email protected]>
Reviewed-by: Edward O'Callaghan <[email protected]>
Reviewed-by: Samuel Pitoiset <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/glsl/ast_to_hir.cpp | 16 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_parser_extras.cpp | 2 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_parser_extras.h | 1 |
3 files changed, 19 insertions, 0 deletions
diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index 0dc69ef4b11..2dec8bbc32b 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -4276,6 +4276,22 @@ get_variable_being_redeclared(ir_variable *var, YYLTYPE loc, */ earlier->data.precision = var->data.precision; + } else if (earlier->data.how_declared == ir_var_declared_implicitly && + state->allow_builtin_variable_redeclaration) { + /* Allow verbatim redeclarations of built-in variables. Not explicitly + * valid, but some applications do it. + */ + if (earlier->data.mode != var->data.mode && + !(earlier->data.mode == ir_var_system_value && + var->data.mode == ir_var_shader_in)) { + _mesa_glsl_error(&loc, state, + "redeclaration of `%s' with incorrect qualifiers", + var->name); + } else if (earlier->type != var->type) { + _mesa_glsl_error(&loc, state, + "redeclaration of `%s' has incorrect type", + var->name); + } } else if (allow_all_redeclarations) { if (earlier->data.mode != var->data.mode) { _mesa_glsl_error(&loc, state, diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index d731e35e212..0f892b03a13 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -305,6 +305,8 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, sizeof(this->atomic_counter_offsets)); this->allow_extension_directive_midshader = ctx->Const.AllowGLSLExtensionDirectiveMidShader; + this->allow_builtin_variable_redeclaration = + ctx->Const.AllowGLSLBuiltinVariableRedeclaration; this->cs_input_local_size_variable_specified = false; diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h index 3a84d655b14..be6c8dce6b4 100644 --- a/src/compiler/glsl/glsl_parser_extras.h +++ b/src/compiler/glsl/glsl_parser_extras.h @@ -842,6 +842,7 @@ struct _mesa_glsl_parse_state { unsigned atomic_counter_offsets[MAX_COMBINED_ATOMIC_BUFFERS]; bool allow_extension_directive_midshader; + bool allow_builtin_variable_redeclaration; /** * Known subroutine type declarations. |