diff options
author | Francisco Jerez <[email protected]> | 2014-02-12 17:10:09 +0100 |
---|---|---|
committer | Francisco Jerez <[email protected]> | 2014-02-12 18:44:05 +0100 |
commit | fcd869ed56db83cfdafe8af030518cd8cf7f5708 (patch) | |
tree | deeb08dad5e2bc11a1fca55c1bfa297eff5c5fac /src/glsl | |
parent | b0b26faa25110df16791f20e5560beb57a27894a (diff) |
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 <[email protected]>
Diffstat (limited to 'src/glsl')
-rw-r--r-- | src/glsl/glsl_parser.yy | 18 | ||||
-rw-r--r-- | src/glsl/glsl_parser_extras.cpp | 1 | ||||
-rw-r--r-- | src/glsl/glsl_parser_extras.h | 2 |
3 files changed, 20 insertions, 1 deletions
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]; }; |