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 <kenneth@whitecape.org> Signed-off-by: Eduardo Lima Mitev <elima@igalia.com> Signed-off-by: Neil Roberts <nroberts@igalia.com>
This commit is contained in:

committed by
Neil Roberts

parent
f5fe99ac85
commit
f9de7f5596
@@ -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();
|
||||
|
Reference in New Issue
Block a user