diff options
author | Marek Olšák <[email protected]> | 2014-12-08 15:58:42 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2014-12-10 21:59:37 +0100 |
commit | 15186607bb99c637d2ab28d65e033d470a84b51c (patch) | |
tree | 1098c2c1f0321703624af38ed63a7daef1755b89 | |
parent | 3291eedfe601b9d09023fb24987ae7d2c7e977c3 (diff) |
radeonsi: take into account NULL colorbuffers when computing CB_TARGET_MASK
Reviewed-by: Michel Dänzer <[email protected]>
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state.c | 16 |
1 files changed, 12 insertions, 4 deletions
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); } |