diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 542bd3d37dc..a16985208c7 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -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); } } }