zink: rewrite all undefined shader reads as 0001 instead of undef

this is a little less hostile towards broken/buggy apps

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17775>
This commit is contained in:
Mike Blumenkrantz
2022-07-29 11:39:44 -04:00
committed by Marge Bot
parent 2bbc2c49ec
commit 0f97e317e3

View File

@@ -1475,27 +1475,23 @@ rewrite_read_as_0(nir_builder *b, nir_instr *instr, void *data)
if (deref_var != var)
return false;
b->cursor = nir_before_instr(instr);
nir_ssa_def *zero = nir_imm_zero(b, nir_dest_num_components(intr->dest), nir_dest_bit_size(intr->dest));
nir_ssa_def *zero = zero = nir_imm_zero(b, nir_dest_num_components(intr->dest), nir_dest_bit_size(intr->dest));
if (b->shader->info.stage == MESA_SHADER_FRAGMENT) {
switch (var->data.location) {
case VARYING_SLOT_COL0:
case VARYING_SLOT_COL1:
case VARYING_SLOT_BFC0:
case VARYING_SLOT_BFC1:
/* default color is 0,0,0,1 */
if (nir_dest_num_components(intr->dest) == 4)
zero = nir_vector_insert_imm(b, zero, nir_imm_float(b, 1.0), 3);
break;
default:
break;
}
}
nir_ssa_def_rewrite_uses(&intr->dest.ssa, zero);
return true;
}
static bool
rewrite_and_discard_read(nir_builder *b, nir_instr *instr, void *data)
{
nir_variable *var = data;
if (instr->type != nir_instr_type_intrinsic)
return false;
nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
if (intr->intrinsic != nir_intrinsic_load_deref)
return false;
nir_variable *deref_var = nir_intrinsic_get_var(intr, 0);
if (deref_var != var)
return false;
b->cursor = nir_before_instr(instr);
nir_ssa_def *undef = nir_ssa_undef(b, nir_dest_num_components(intr->dest), nir_dest_bit_size(intr->dest));
nir_ssa_def_rewrite_uses(&intr->dest.ssa, undef);
nir_instr_remove(instr);
return true;
}
@@ -1532,8 +1528,8 @@ zink_compiler_assign_io(nir_shader *producer, nir_shader *consumer)
nir_foreach_variable_with_modes_safe(var, consumer, nir_var_shader_in) {
if (!assign_consumer_var_io(consumer->info.stage, var, &reserved, slot_map)) {
do_fixup = true;
/* input needs to be rewritten as an undef to ensure the entire deref chain is deleted */
nir_shader_instructions_pass(consumer, rewrite_and_discard_read, nir_metadata_dominance, var);
/* input needs to be rewritten */
nir_shader_instructions_pass(consumer, rewrite_read_as_0, nir_metadata_dominance, var);
}
}
}