[Mesa-dev] [PATCH] glsl: geom shader max_vertices layout must match.
Dave Airlie
airlied at gmail.com
Fri Jun 3 00:46:15 UTC 2016
From: Dave Airlie <airlied at redhat.com>
"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
Cc: "11.2 12.0" <mesa-stable at lists.freedesktop.org>
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/compiler/glsl/ast.h | 3 ++-
src/compiler/glsl/ast_type.cpp | 17 ++++++++++-------
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 ca98ed2..06c7b03 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 54e9dad..1372ff7 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 c9654ac..ba658ae 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();
--
2.5.5
More information about the mesa-dev
mailing list