diff options
author | Ian Romanick <[email protected]> | 2013-08-30 15:42:01 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2013-09-04 08:11:45 -0700 |
commit | 0851aa73659f894e6b54e3ef272c1fa360165128 (patch) | |
tree | 0cae10aade8f73f007d77daced5b59e92d48a0c3 | |
parent | ceceaf53ceb7f5251833646a212a1c7e5786511c (diff) |
glsl: Validate qualifiers on VS color outputs with FS color inputs
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.
v2: Update callers of cross_validate_types_and_qualifiers and
cross_validate_front_and_back_color. The function signature changed in
v2 of a previous patch. Suggested by Paul.
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Paul Berry <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=47755
-rw-r--r-- | src/glsl/link_varyings.cpp | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp index 0368de9d575..47d9316cf04 100644 --- a/src/glsl/link_varyings.cpp +++ b/src/glsl/link_varyings.cpp @@ -133,6 +133,26 @@ 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, + GLenum producer_type) +{ + if (front_color != NULL && front_color->assigned) + cross_validate_types_and_qualifiers(prog, input, front_color, + consumer_type, producer_type); + + if (back_color != NULL && back_color->assigned) + cross_validate_types_and_qualifiers(prog, input, back_color, + consumer_type, producer_type); +} + +/** * Validate that outputs from one stage match inputs of another */ void @@ -167,10 +187,32 @@ 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, producer->Type); + } 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, producer->Type); + } else { + ir_variable *const output = parameters.get_variable(input->name); + if (output != NULL) { + cross_validate_types_and_qualifiers(prog, input, output, + consumer->Type, producer->Type); + } } } } |