diff options
author | Eduardo Lima Mitev <[email protected]> | 2017-03-05 20:28:43 +0100 |
---|---|---|
committer | Neil Roberts <[email protected]> | 2017-10-30 18:10:39 +0100 |
commit | f9de7f55969e981f6e98a41fce04bc3a2a8280eb (patch) | |
tree | 76be292c6d07cac2a20ffb5fd2645d10b121df4e /src/compiler/glsl | |
parent | f5fe99ac85e15b705612bd9e7599cc974c2a121b (diff) |
glsl/linker: Check that re-declared, inter-shader built-in blocks match
>From GLSL 4.5 spec, section "7.1 Built-In Language Variables", page 130 of
the PDF states:
"If multiple shaders using members of a built-in block belonging to
the same interface are linked together in the same program, they must
all redeclare the built-in block in the same way, as described in
section 4.3.9 “Interface Blocks” for interface-block matching, or a
link-time error will result."
Fixes:
* GL45-CTS.CommonBugs.CommonBug_PerVertexValidation
v2 (Neil Roberts):
Explicitly look for gl_PerVertex in the symbol tables instead of
waiting to find a variable in the interface.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102677
Reviewed-by: Kenneth Graunke <[email protected]>
Signed-off-by: Eduardo Lima Mitev <[email protected]>
Signed-off-by: Neil Roberts <[email protected]>
Diffstat (limited to 'src/compiler/glsl')
-rw-r--r-- | src/compiler/glsl/link_interface_blocks.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/compiler/glsl/link_interface_blocks.cpp b/src/compiler/glsl/link_interface_blocks.cpp index 7037c7776de..510d4f71bbe 100644 --- a/src/compiler/glsl/link_interface_blocks.cpp +++ b/src/compiler/glsl/link_interface_blocks.cpp @@ -364,6 +364,35 @@ validate_interstage_inout_blocks(struct gl_shader_program *prog, consumer->Stage != MESA_SHADER_FRAGMENT) || consumer->Stage == MESA_SHADER_GEOMETRY; + /* Check that block re-declarations of gl_PerVertex are compatible + * across shaders: From OpenGL Shading Language 4.5, section + * "7.1 Built-In Language Variables", page 130 of the PDF: + * + * "If multiple shaders using members of a built-in block belonging + * to the same interface are linked together in the same program, + * they must all redeclare the built-in block in the same way, as + * described in section 4.3.9 “Interface Blocks” for interface-block + * matching, or a link-time error will result." + * + * This is done explicitly outside of iterating the member variable + * declarations because it is possible that the variables are not used and + * so they would have been optimised out. + */ + const glsl_type *consumer_iface = + consumer->symbols->get_interface("gl_PerVertex", + ir_var_shader_in); + + const glsl_type *producer_iface = + producer->symbols->get_interface("gl_PerVertex", + ir_var_shader_out); + + if (producer_iface && consumer_iface && + interstage_member_mismatch(prog, consumer_iface, producer_iface)) { + linker_error(prog, "Incompatible or missing gl_PerVertex re-declaration " + "in consecutive shaders"); + return; + } + /* Add output interfaces from the producer to the symbol table. */ foreach_in_list(ir_instruction, node, producer->ir) { ir_variable *var = node->as_variable(); |