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:

committed by
Marge Bot

parent
2bbc2c49ec
commit
0f97e317e3
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user