glsl: Fix locations of variables in patch qualified interface blocks.
As of commit d82f8d9772
, we actually
parse and attempt to handle the 'patch' qualifier on interface blocks.
This patch fixes explicit locations for variables in such blocks.
Without it, many program interface query dEQP/CTS tests hit this
assertion in ir_set_program_inouts.cpp
if (is_patch_generic) {
assert(idx >= VARYING_SLOT_PATCH0 && idx < VARYING_SLOT_TESS_MAX);
bitfield = BITFIELD64_BIT(idx - VARYING_SLOT_PATCH0);
}
because the location was incorrectly based on VARYING_SLOT_VAR0.
Note that most of the tests affected currently fail before they hit
this, due to confusion about what the program interface query name
of those resources should be.
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
096ad19a2b
commit
d0cd504046
|
@ -6819,7 +6819,8 @@ ast_process_struct_or_iface_block_members(exec_list *instructions,
|
|||
unsigned qual_location;
|
||||
if (process_qualifier_constant(state, &loc, "location",
|
||||
qual->location, &qual_location)) {
|
||||
fields[i].location = VARYING_SLOT_VAR0 + qual_location;
|
||||
fields[i].location = qual_location +
|
||||
(fields[i].patch ? VARYING_SLOT_PATCH0 : VARYING_SLOT_VAR0);
|
||||
expl_location = fields[i].location +
|
||||
fields[i].type->count_attribute_slots(false);
|
||||
}
|
||||
|
@ -7299,7 +7300,8 @@ ast_interface_block::hir(exec_list *instructions,
|
|||
layout.location, &expl_location)) {
|
||||
return NULL;
|
||||
} else {
|
||||
expl_location = VARYING_SLOT_VAR0 + expl_location;
|
||||
expl_location += this->layout.flags.q.patch ? VARYING_SLOT_PATCH0
|
||||
: VARYING_SLOT_VAR0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue