spirv: Fix locations for per-patch varyings

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24998>
This commit is contained in:
Faith Ekstrand 2023-09-29 17:59:19 -05:00 committed by Marge Bot
parent c6c2c1b2b2
commit dfbc03fa88

View file

@ -1575,7 +1575,7 @@ var_decoration_cb(struct vtn_builder *b, struct vtn_value *val, int member,
location += VERT_ATTRIB_GENERIC0;
} else if (vtn_var->mode == vtn_variable_mode_input ||
vtn_var->mode == vtn_variable_mode_output) {
location += vtn_var->var->data.patch ? VARYING_SLOT_PATCH0 : VARYING_SLOT_VAR0;
location += VARYING_SLOT_VAR0;
} else if (vtn_var->mode == vtn_variable_mode_call_data ||
vtn_var->mode == vtn_variable_mode_ray_payload) {
/* This location is fine as-is */
@ -1982,6 +1982,23 @@ assign_missing_member_locations(struct vtn_variable *var)
}
}
static void
adjust_patch_locations(struct vtn_builder *b, struct vtn_variable *var)
{
uint16_t num_data = 1;
struct nir_variable_data *data = &var->var->data;
if (var->var->members) {
num_data = var->var->num_members;
data = var->var->members;
}
for (uint16_t i = 0; i < num_data; i++) {
vtn_assert(data[i].location < VARYING_SLOT_PATCH0);
if (data[i].patch && data[i].location >= VARYING_SLOT_VAR0)
data[i].location += VARYING_SLOT_PATCH0 - VARYING_SLOT_VAR0;
}
}
nir_deref_instr *
vtn_get_call_payload_for_location(struct vtn_builder *b, uint32_t location_id)
{
@ -2329,6 +2346,12 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val,
assign_missing_member_locations(var);
}
if ((b->shader->info.stage == MESA_SHADER_TESS_CTRL &&
var->mode == vtn_variable_mode_output) ||
(b->shader->info.stage == MESA_SHADER_TESS_EVAL &&
var->mode == vtn_variable_mode_input))
adjust_patch_locations(b, var);
if (var->mode == vtn_variable_mode_uniform ||
var->mode == vtn_variable_mode_image ||
var->mode == vtn_variable_mode_ubo ||