glsl: Generate error for invalid input layout declarations

Fixes various piglit tests:
spec/glsl-1.50/compiler/incorrect-in-layout-qualifier-*.geom

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
This commit is contained in:
Jordan Justen 2014-02-04 11:32:56 -08:00
parent 0c558f9ee6
commit 738c9c3c54
1 changed files with 13 additions and 0 deletions

View File

@ -207,6 +207,8 @@ ast_type_qualifier::merge_in_qualifier(YYLTYPE *loc,
void *mem_ctx = state; void *mem_ctx = state;
bool create_gs_ast = false; bool create_gs_ast = false;
bool create_cs_ast = false; bool create_cs_ast = false;
ast_type_qualifier valid_in_mask;
valid_in_mask.flags.i = 0;
switch (state->stage) { switch (state->stage) {
case MESA_SHADER_GEOMETRY: case MESA_SHADER_GEOMETRY:
@ -229,6 +231,8 @@ ast_type_qualifier::merge_in_qualifier(YYLTYPE *loc,
create_gs_ast |= create_gs_ast |=
q.flags.q.prim_type && q.flags.q.prim_type &&
!state->in_qualifier->flags.q.prim_type; !state->in_qualifier->flags.q.prim_type;
valid_in_mask.flags.q.prim_type = 1;
break; break;
case MESA_SHADER_FRAGMENT: case MESA_SHADER_FRAGMENT:
if (q.flags.q.early_fragment_tests) { if (q.flags.q.early_fragment_tests) {
@ -241,6 +245,8 @@ ast_type_qualifier::merge_in_qualifier(YYLTYPE *loc,
create_cs_ast |= create_cs_ast |=
q.flags.q.local_size != 0 && q.flags.q.local_size != 0 &&
state->in_qualifier->flags.q.local_size == 0; state->in_qualifier->flags.q.local_size == 0;
valid_in_mask.flags.q.local_size = 1;
break; break;
default: default:
_mesa_glsl_error(loc, state, _mesa_glsl_error(loc, state,
@ -249,6 +255,13 @@ ast_type_qualifier::merge_in_qualifier(YYLTYPE *loc,
break; break;
} }
/* Generate an error when invalid input layout qualifiers are used. */
if ((q.flags.i & ~valid_in_mask.flags.i) != 0) {
_mesa_glsl_error(loc, state,
"invalid input layout qualifiers used");
return false;
}
/* Input layout qualifiers can be specified multiple /* Input layout qualifiers can be specified multiple
* times in separate declarations, as long as they match. * times in separate declarations, as long as they match.
*/ */