From fcd869ed56db83cfdafe8af030518cd8cf7f5708 Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Wed, 12 Feb 2014 17:10:09 +0100 Subject: [PATCH] glsl/parser: Handle the early_fragment_tests input layout qualifier. v2: Only allow the early_fragment_tests qualifier in fragment shaders. Reviewed-by: Paul Berry --- src/glsl/glsl_parser.yy | 18 +++++++++++++++++- src/glsl/glsl_parser_extras.cpp | 1 + src/glsl/glsl_parser_extras.h | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy index e43bc4f17ba..2b5061d4c57 100644 --- a/src/glsl/glsl_parser.yy +++ b/src/glsl/glsl_parser.yy @@ -1231,6 +1231,15 @@ layout_qualifier_id: } } + /* Layout qualifiers for ARB_shader_image_load_store. */ + if (state->ARB_shader_image_load_store_enable || + state->is_version(420, 0)) { + if (!$$.flags.i && + match_layout_qualifier($1, "early_fragment_tests", state) == 0) { + $$.flags.q.early_fragment_tests = 1; + } + } + if (!$$.flags.i) { _mesa_glsl_error(& @1, state, "unrecognized layout identifier " "`%s'", $1); @@ -2388,6 +2397,13 @@ layout_defaults: } } break; + case MESA_SHADER_FRAGMENT: + if ($1.flags.q.early_fragment_tests) { + state->early_fragment_tests = true; + } else { + _mesa_glsl_error(& @1, state, "invalid input layout qualifier"); + } + break; case MESA_SHADER_COMPUTE: { if ($1.flags.q.local_size == 0) { _mesa_glsl_error(& @1, state, @@ -2409,7 +2425,7 @@ layout_defaults: default: _mesa_glsl_error(& @1, state, "input layout qualifiers only valid in " - "geometry and compute shaders"); + "geometry, fragment and compute shaders"); break; } } diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index 196714f3272..8bab7a981f2 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -197,6 +197,7 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, this->gs_input_prim_type = GL_POINTS; this->gs_input_size = 0; this->out_qualifier = new(this) ast_type_qualifier(); + this->early_fragment_tests = false; memset(this->atomic_counter_offsets, 0, sizeof(this->atomic_counter_offsets)); } diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h index 2083d555f67..ba32c086e3a 100644 --- a/src/glsl/glsl_parser_extras.h +++ b/src/glsl/glsl_parser_extras.h @@ -395,6 +395,8 @@ struct _mesa_glsl_parse_state { */ unsigned gs_input_size; + bool early_fragment_tests; + /** Atomic counter offsets by binding */ unsigned atomic_counter_offsets[MAX_COMBINED_ATOMIC_BUFFERS]; }; -- 2.30.2