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 <stereotype441@gmail.com>
This commit is contained in:
Francisco Jerez 2014-02-12 17:10:09 +01:00
parent b0b26faa25
commit fcd869ed56
3 changed files with 20 additions and 1 deletions

View file

@ -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;
}
}

View file

@ -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));
}

View file

@ -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];
};