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 <apinheiro@igalia.com> Cc: "11.2 12.0" <mesa-stable@lists.freedesktop.org> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
@@ -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];
|
||||
|
@@ -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();
|
||||
|
Reference in New Issue
Block a user