From: Marek Olšák Date: Mon, 8 Dec 2014 14:58:42 +0000 (+0100) Subject: radeonsi: take into account NULL colorbuffers when computing CB_TARGET_MASK X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=15186607bb99c637d2ab28d65e033d470a84b51c;p=mesa.git radeonsi: take into account NULL colorbuffers when computing CB_TARGET_MASK Reviewed-by: Michel Dänzer --- diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 1bb1f69044c..097c31cc943 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -210,13 +210,19 @@ static unsigned si_pack_float_12p4(float x) } /* - * inferred framebuffer and blender state + * Inferred framebuffer and blender state. + * + * One of the reasons this must be derived from the framebuffer state is that: + * - The blend state mask is 0xf most of the time. + * - The COLOR1 format isn't INVALID because of possible dual-source blending, + * so COLOR1 is enabled pretty much all the time. + * So CB_TARGET_MASK is the only register that can disable COLOR1. */ static void si_update_fb_blend_state(struct si_context *sctx) { struct si_pm4_state *pm4; struct si_state_blend *blend = sctx->queued.named.blend; - uint32_t mask; + uint32_t mask = 0, i; if (blend == NULL) return; @@ -225,10 +231,12 @@ static void si_update_fb_blend_state(struct si_context *sctx) if (pm4 == NULL) return; - mask = (1ULL << ((unsigned)sctx->framebuffer.state.nr_cbufs * 4)) - 1; + for (i = 0; i < sctx->framebuffer.state.nr_cbufs; i++) + if (sctx->framebuffer.state.cbufs[i]) + mask |= 0xf << (4*i); mask &= blend->cb_target_mask; - si_pm4_set_reg(pm4, R_028238_CB_TARGET_MASK, mask); + si_pm4_set_reg(pm4, R_028238_CB_TARGET_MASK, mask); si_pm4_set_state(sctx, fb_blend, pm4); }