[Mesa-dev] [PATCH 3/4] glsl: Validate qualifiers on VS color outputs with FS color inputs
Ian Romanick
idr at freedesktop.org
Fri Aug 30 16:07:29 PDT 2013
From: Ian Romanick <ian.d.romanick at intel.com>
The vertex shader color outputs (gl_FrontColor, gl_BackColor,
gl_FrontSecondaryColor, and gl_BackSecondaryColor) don't have the same
names as the matching fragment shader color inputs (gl_Color and
gl_SecondaryColor). As a result, the qualifiers on them were not being
properly cross validated.
Full spec compliance required ir_variable::used and
ir_variable::assigned be set properly. Without the preceeding patch,
which fixes the ::clone method to copy them, this will not be the case.
Fixes all of the previously failing piglit
spec/glsl-1.30/linker/interpolation-qualifiers tests.
Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=47755
---
src/glsl/link_varyings.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 50 insertions(+), 3 deletions(-)
diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
index a1899f7..7a61b1a 100644
--- a/src/glsl/link_varyings.cpp
+++ b/src/glsl/link_varyings.cpp
@@ -132,6 +132,29 @@ cross_validate_types_and_qualifiers(struct gl_shader_program *prog,
}
/**
+ * Validate front and back color outputs against single color input
+ */
+static void
+cross_validate_front_and_back_color(struct gl_shader_program *prog,
+ const ir_variable *input,
+ const ir_variable *front_color,
+ const ir_variable *back_color,
+ GLenum consumer_type,
+ const char *consumer_stage,
+ const char *producer_stage)
+{
+ if (front_color != NULL && front_color->assigned)
+ cross_validate_types_and_qualifiers(prog, input, front_color,
+ consumer_type, consumer_stage,
+ producer_stage);
+
+ if (back_color != NULL && back_color->assigned)
+ cross_validate_types_and_qualifiers(prog, input, back_color,
+ consumer_type, consumer_stage,
+ producer_stage);
+}
+
+/**
* Validate that outputs from one stage match inputs of another
*/
void
@@ -170,11 +193,35 @@ cross_validate_outputs_to_inputs(struct gl_shader_program *prog,
if ((input == NULL) || (input->mode != ir_var_shader_in))
continue;
- ir_variable *const output = parameters.get_variable(input->name);
- if (output != NULL) {
- cross_validate_types_and_qualifiers(prog, input, output,
+ if (strcmp(input->name, "gl_Color") == 0 && input->used) {
+ const ir_variable *const front_color =
+ parameters.get_variable("gl_FrontColor");
+
+ const ir_variable *const back_color =
+ parameters.get_variable("gl_BackColor");
+
+ cross_validate_front_and_back_color(prog, input,
+ front_color, back_color,
consumer->Type, consumer_stage,
producer_stage);
+ } else if (strcmp(input->name, "gl_SecondaryColor") == 0 && input->used) {
+ const ir_variable *const front_color =
+ parameters.get_variable("gl_FrontSecondaryColor");
+
+ const ir_variable *const back_color =
+ parameters.get_variable("gl_BackSecondaryColor");
+
+ cross_validate_front_and_back_color(prog, input,
+ front_color, back_color,
+ consumer->Type, consumer_stage,
+ producer_stage);
+ } else {
+ ir_variable *const output = parameters.get_variable(input->name);
+ if (output != NULL) {
+ cross_validate_types_and_qualifiers(prog, input, output,
+ consumer->Type, consumer_stage,
+ producer_stage);
+ }
}
}
}
--
1.8.1.4
More information about the mesa-dev
mailing list