diff --git a/src/amd/common/ac_nir.h b/src/amd/common/ac_nir.h index 43c4ebc7835..ed7906afaaf 100644 --- a/src/amd/common/ac_nir.h +++ b/src/amd/common/ac_nir.h @@ -294,7 +294,6 @@ typedef struct { bool clamp_color; bool alpha_to_one; enum compare_func alpha_func; - unsigned broadcast_last_cbuf; bool kill_z; bool kill_stencil; bool kill_samplemask; diff --git a/src/amd/common/ac_nir_lower_ps.c b/src/amd/common/ac_nir_lower_ps.c index 3b95234d7ea..447ff6bbbc4 100644 --- a/src/amd/common/ac_nir_lower_ps.c +++ b/src/amd/common/ac_nir_lower_ps.c @@ -28,6 +28,7 @@ typedef struct { uint8_t colors_written; nir_alu_type color_type[MAX_DRAW_BUFFERS]; bool has_dual_src_blending; + bool writes_all_cbufs; /* MAX_DRAW_BUFFERS for MRT export, 1 for MRTZ export */ nir_intrinsic_instr *exp[MAX_DRAW_BUFFERS + 1]; @@ -243,6 +244,7 @@ gather_ps_store_output(nir_builder *b, nir_intrinsic_instr *intrin, lower_ps_sta s->colors_written |= BITFIELD_BIT(color_index); s->color_type[color_index] = nir_intrinsic_src_type(intrin); s->has_dual_src_blending |= dual_src_blend_index == 1; + s->writes_all_cbufs |= slot == FRAG_RESULT_COLOR; } /* Keep output instruction if not exported in nir. */ @@ -784,10 +786,11 @@ export_ps_outputs(nir_builder *b, lower_ps_state *s) } } - if (s->options->broadcast_last_cbuf > 0) { - /* write to all color buffers */ - assert(s->colors_written & 0x1); - for (int cbuf = 0; cbuf <= s->options->broadcast_last_cbuf; cbuf++) + if (s->writes_all_cbufs && s->colors_written == 0x1) { + /* This will do nothing for color buffers with SPI_SHADER_COL_FORMAT=ZERO, so always + * iterate over all 8. + */ + for (int cbuf = 0; cbuf < 8; cbuf++) emit_ps_color_export(b, s, 0, cbuf); } else { for (int cbuf = 0; cbuf < MAX_DRAW_BUFFERS; cbuf++) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 3d0f14fd144..7be1e9d3c6f 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2536,7 +2536,6 @@ static struct nir_shader *si_get_nir_shader(struct si_shader *shader, struct si_ .clamp_color = key->ps.part.epilog.clamp_color, .alpha_to_one = key->ps.part.epilog.alpha_to_one, .alpha_func = key->ps.part.epilog.alpha_func, - .broadcast_last_cbuf = key->ps.part.epilog.last_cbuf, .kill_z = key->ps.part.epilog.kill_z, .kill_stencil = key->ps.part.epilog.kill_stencil, .kill_samplemask = key->ps.part.epilog.kill_samplemask,