mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 04:50:11 +01:00
zink: simplify shader i/o assignment
by utilizing a separate slot map for patch variables, the entire i/o assignment mechanism can be simplified to accurately manage i/o for all types of variables and avoid location conflicts affects: KHR-Single-GL46.enhanced_layouts* Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15770>
This commit is contained in:
parent
beb7a9cec5
commit
f7ade1f188
1 changed files with 31 additions and 30 deletions
|
|
@ -1075,20 +1075,18 @@ assign_producer_var_io(gl_shader_stage stage, nir_variable *var, unsigned *reser
|
||||||
default:
|
default:
|
||||||
if (var->data.patch) {
|
if (var->data.patch) {
|
||||||
assert(slot >= VARYING_SLOT_PATCH0);
|
assert(slot >= VARYING_SLOT_PATCH0);
|
||||||
slot = slot - VARYING_SLOT_PATCH0;
|
slot -= VARYING_SLOT_PATCH0;
|
||||||
} else if (slot >= VARYING_SLOT_VAR0 &&
|
|
||||||
var->data.mode == nir_var_shader_in &&
|
|
||||||
stage == MESA_SHADER_TESS_EVAL) {
|
|
||||||
slot = slot - VARYING_SLOT_VAR0;
|
|
||||||
} else {
|
|
||||||
if (slot_map[slot] == 0xff) {
|
|
||||||
assert(*reserved < MAX_VARYING);
|
|
||||||
slot_map[slot] = *reserved;
|
|
||||||
*reserved += glsl_count_vec4_slots(var->type, false, false);
|
|
||||||
}
|
|
||||||
slot = slot_map[slot];
|
|
||||||
assert(slot < MAX_VARYING);
|
|
||||||
}
|
}
|
||||||
|
if (slot_map[slot] == 0xff) {
|
||||||
|
assert(*reserved < MAX_VARYING);
|
||||||
|
slot_map[slot] = *reserved;
|
||||||
|
if (stage == MESA_SHADER_TESS_EVAL && var->data.mode == nir_var_shader_in && !var->data.patch)
|
||||||
|
*reserved += glsl_count_vec4_slots(glsl_get_array_element(var->type), false, false);
|
||||||
|
else
|
||||||
|
*reserved += glsl_count_vec4_slots(var->type, false, false);
|
||||||
|
}
|
||||||
|
slot = slot_map[slot];
|
||||||
|
assert(slot < MAX_VARYING);
|
||||||
var->data.driver_location = slot;
|
var->data.driver_location = slot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1124,21 +1122,18 @@ assign_consumer_var_io(gl_shader_stage stage, nir_variable *var, unsigned *reser
|
||||||
default:
|
default:
|
||||||
if (var->data.patch) {
|
if (var->data.patch) {
|
||||||
assert(slot >= VARYING_SLOT_PATCH0);
|
assert(slot >= VARYING_SLOT_PATCH0);
|
||||||
var->data.driver_location = slot - VARYING_SLOT_PATCH0;
|
slot -= VARYING_SLOT_PATCH0;
|
||||||
} else if (slot >= VARYING_SLOT_VAR0 &&
|
|
||||||
stage == MESA_SHADER_TESS_CTRL &&
|
|
||||||
var->data.mode == nir_var_shader_out)
|
|
||||||
var->data.driver_location = slot - VARYING_SLOT_VAR0;
|
|
||||||
else {
|
|
||||||
if (slot_map[slot] == (unsigned char)-1) {
|
|
||||||
if (!is_texcoord(stage, var))
|
|
||||||
/* dead io */
|
|
||||||
return false;
|
|
||||||
/* texcoords can't be eliminated in fs due to GL_COORD_REPLACE */
|
|
||||||
slot_map[slot] = (*reserved)++;
|
|
||||||
}
|
|
||||||
var->data.driver_location = slot_map[slot];
|
|
||||||
}
|
}
|
||||||
|
if (slot_map[slot] == (unsigned char)-1) {
|
||||||
|
if (stage != MESA_SHADER_TESS_CTRL && !is_texcoord(stage, var))
|
||||||
|
/* dead io */
|
||||||
|
return false;
|
||||||
|
/* - texcoords can't be eliminated in fs due to GL_COORD_REPLACE
|
||||||
|
* - patch variables may be read in the workgroup
|
||||||
|
*/
|
||||||
|
slot_map[slot] = (*reserved)++;
|
||||||
|
}
|
||||||
|
var->data.driver_location = slot_map[slot];
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -1165,17 +1160,23 @@ rewrite_and_discard_read(nir_builder *b, nir_instr *instr, void *data)
|
||||||
void
|
void
|
||||||
zink_compiler_assign_io(nir_shader *producer, nir_shader *consumer)
|
zink_compiler_assign_io(nir_shader *producer, nir_shader *consumer)
|
||||||
{
|
{
|
||||||
unsigned reserved = 0;
|
unsigned reserved = 0, patch_reserved = 0;
|
||||||
unsigned char slot_map[VARYING_SLOT_MAX];
|
unsigned char slot_map[VARYING_SLOT_MAX];
|
||||||
memset(slot_map, -1, sizeof(slot_map));
|
memset(slot_map, -1, sizeof(slot_map));
|
||||||
|
unsigned char patch_slot_map[VARYING_SLOT_MAX];
|
||||||
|
memset(patch_slot_map, -1, sizeof(patch_slot_map));
|
||||||
bool do_fixup = false;
|
bool do_fixup = false;
|
||||||
nir_shader *nir = producer->info.stage == MESA_SHADER_TESS_CTRL ? producer : consumer;
|
nir_shader *nir = producer->info.stage == MESA_SHADER_TESS_CTRL ? producer : consumer;
|
||||||
if (producer->info.stage == MESA_SHADER_TESS_CTRL) {
|
if (producer->info.stage == MESA_SHADER_TESS_CTRL) {
|
||||||
/* never assign from tcs -> tes, always invert */
|
/* never assign from tcs -> tes, always invert */
|
||||||
nir_foreach_variable_with_modes(var, consumer, nir_var_shader_in)
|
nir_foreach_variable_with_modes(var, consumer, nir_var_shader_in)
|
||||||
assign_producer_var_io(consumer->info.stage, var, &reserved, slot_map);
|
assign_producer_var_io(consumer->info.stage, var,
|
||||||
|
var->data.patch ? &patch_reserved : &reserved,
|
||||||
|
var->data.patch ? patch_slot_map : slot_map);
|
||||||
nir_foreach_variable_with_modes_safe(var, producer, nir_var_shader_out) {
|
nir_foreach_variable_with_modes_safe(var, producer, nir_var_shader_out) {
|
||||||
if (!assign_consumer_var_io(producer->info.stage, var, &reserved, slot_map))
|
if (!assign_consumer_var_io(producer->info.stage, var,
|
||||||
|
var->data.patch ? &patch_reserved : &reserved,
|
||||||
|
var->data.patch ? patch_slot_map : slot_map))
|
||||||
/* this is an output, nothing more needs to be done for it to be dropped */
|
/* this is an output, nothing more needs to be done for it to be dropped */
|
||||||
do_fixup = true;
|
do_fixup = true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue