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)
|
if (deref_var != var)
|
||||||
return false;
|
return false;
|
||||||
b->cursor = nir_before_instr(instr);
|
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);
|
nir_ssa_def_rewrite_uses(&intr->dest.ssa, zero);
|
||||||
return true;
|
nir_instr_remove(instr);
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
return true;
|
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) {
|
nir_foreach_variable_with_modes_safe(var, consumer, nir_var_shader_in) {
|
||||||
if (!assign_consumer_var_io(consumer->info.stage, var, &reserved, slot_map)) {
|
if (!assign_consumer_var_io(consumer->info.stage, var, &reserved, slot_map)) {
|
||||||
do_fixup = true;
|
do_fixup = true;
|
||||||
/* input needs to be rewritten as an undef to ensure the entire deref chain is deleted */
|
/* input needs to be rewritten */
|
||||||
nir_shader_instructions_pass(consumer, rewrite_and_discard_read, nir_metadata_dominance, var);
|
nir_shader_instructions_pass(consumer, rewrite_read_as_0, nir_metadata_dominance, var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user