diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/glsl/ast_to_hir.cpp | 7 | ||||
-rw-r--r-- | src/compiler/glsl/ast_type.cpp | 7 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_parser.yy | 7 |
3 files changed, 19 insertions, 2 deletions
diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index 79e14cc6c9b..a3a24810012 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -5132,7 +5132,12 @@ ast_declarator_list::hir(exec_list *instructions, && !state->has_explicit_attrib_location() && !state->has_separate_shader_objects() && !state->ARB_fragment_coord_conventions_enable) { - if (this->type->qualifier.flags.q.out) { + /* GL_EXT_gpu_shader4 only allows "varying out" on fragment shader + * outputs. (the varying flag is not set by the parser) + */ + if (this->type->qualifier.flags.q.out && + (!state->EXT_gpu_shader4_enable || + state->stage != MESA_SHADER_FRAGMENT)) { _mesa_glsl_error(& loc, state, "`out' qualifier in declaration of `%s' " "only valid for function parameters in %s", diff --git a/src/compiler/glsl/ast_type.cpp b/src/compiler/glsl/ast_type.cpp index b499ee913e7..c7f74e7aa08 100644 --- a/src/compiler/glsl/ast_type.cpp +++ b/src/compiler/glsl/ast_type.cpp @@ -489,6 +489,13 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc, q.flags.q.bound_image) merge_bindless_qualifier(state); + if (state->EXT_gpu_shader4_enable && + state->stage == MESA_SHADER_FRAGMENT && + this->flags.q.varying && q.flags.q.out) { + this->flags.q.varying = 0; + this->flags.q.out = 1; + } + return r; } diff --git a/src/compiler/glsl/glsl_parser.yy b/src/compiler/glsl/glsl_parser.yy index 80634144084..6426f890b9e 100644 --- a/src/compiler/glsl/glsl_parser.yy +++ b/src/compiler/glsl/glsl_parser.yy @@ -2086,8 +2086,13 @@ type_qualifier: /* Section 4.3 of the GLSL 1.20 specification states: * "Variable declarations may have a storage qualifier specified..." * 1.30 clarifies this to "may have one storage qualifier". + * + * GL_EXT_gpu_shader4 allows "varying out" in fragment shaders. */ - if ($2.has_storage()) + if ($2.has_storage() && + (!state->EXT_gpu_shader4_enable || + state->stage != MESA_SHADER_FRAGMENT || + !$1.flags.q.varying || !$2.flags.q.out)) _mesa_glsl_error(&@1, state, "duplicate storage qualifier"); if (!state->has_420pack_or_es31() && |