diff options
author | Dave Airlie <[email protected]> | 2016-06-03 10:45:07 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2016-06-06 18:02:19 +1000 |
commit | 4c863993780a11cea6f88fa0682796bee5794042 (patch) | |
tree | b4219e4bfc0ed625c4185efee935c1b5b129e9e3 /src/compiler/glsl | |
parent | ffcef720b74737b07086db86f34aa2f4b8c58a50 (diff) |
glsl: geom shader max_vertices layout must match.
From GLSL 4.5 spec, "4.4.2.3 Geometry Outputs".
"all geometry shader output vertex count declarations in a
program must declare the same count."
Fixes:
GL45-CTS.geometry_shader.output.conflicted_output_vertices_max
Reviewed-by: Alejandro PiƱeiro <[email protected]>
Cc: "11.2 12.0" <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/compiler/glsl')
-rw-r--r-- | src/compiler/glsl/ast.h | 3 | ||||
-rw-r--r-- | src/compiler/glsl/ast_type.cpp | 17 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_parser_extras.cpp | 2 |
3 files changed, 13 insertions, 9 deletions
diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h index ca98ed2834d..06c7b032a79 100644 --- a/src/compiler/glsl/ast.h +++ b/src/compiler/glsl/ast.h @@ -368,7 +368,8 @@ public: bool process_qualifier_constant(struct _mesa_glsl_parse_state *state, const char *qual_indentifier, - unsigned *value, bool can_be_zero); + unsigned *value, bool can_be_zero, + bool must_match = false); void merge_qualifier(ast_layout_expression *l_expr) { diff --git a/src/compiler/glsl/ast_type.cpp b/src/compiler/glsl/ast_type.cpp index 54e9dadaa94..1372ff79eec 100644 --- a/src/compiler/glsl/ast_type.cpp +++ b/src/compiler/glsl/ast_type.cpp @@ -678,7 +678,8 @@ bool ast_layout_expression::process_qualifier_constant(struct _mesa_glsl_parse_state *state, const char *qual_indentifier, unsigned *value, - bool can_be_zero) + bool can_be_zero, + bool must_match) { int min_value = 0; bool first_pass = true; @@ -716,12 +717,14 @@ ast_layout_expression::process_qualifier_constant(struct _mesa_glsl_parse_state * in a single declaration, the last occurrence overrides the * former occurrence(s)." */ - if (!state->has_420pack() && !first_pass && *value != const_int->value.u[0]) { - YYLTYPE loc = const_expression->get_location(); - _mesa_glsl_error(&loc, state, "%s layout qualifier does not " - "match previous declaration (%d vs %d)", - qual_indentifier, *value, const_int->value.i[0]); - return false; + if (!first_pass) { + if ((must_match || !state->has_420pack()) && *value != const_int->value.u[0]) { + YYLTYPE loc = const_expression->get_location(); + _mesa_glsl_error(&loc, state, "%s layout qualifier does not " + "match previous declaration (%d vs %d)", + qual_indentifier, *value, const_int->value.i[0]); + return false; + } } else { first_pass = false; *value = const_int->value.u[0]; diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index c9654acc6c1..ba658aec23f 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -1692,7 +1692,7 @@ set_shader_inout_layout(struct gl_shader *shader, unsigned qual_max_vertices; if (state->out_qualifier->max_vertices-> process_qualifier_constant(state, "max_vertices", - &qual_max_vertices, true)) { + &qual_max_vertices, true, true)) { if (qual_max_vertices > state->Const.MaxGeometryOutputVertices) { YYLTYPE loc = state->out_qualifier->max_vertices->get_location(); |