[Mesa-dev] [PATCH 4/5] radeonsi: simplify CB_TARGET_MASK logic
Nicolai Hähnle
nhaehnle at gmail.com
Wed Aug 17 09:36:49 UTC 2016
Patches 1-4:
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
On 11.08.2016 18:16, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> we can now rely on CB_COLORn_INFO to disable empty slots.
> ---
> src/gallium/drivers/radeonsi/si_state.c | 21 +++++++--------------
> 1 file changed, 7 insertions(+), 14 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
> index a44f977..8d9fe53 100644
> --- a/src/gallium/drivers/radeonsi/si_state.c
> +++ b/src/gallium/drivers/radeonsi/si_state.c
> @@ -81,41 +81,34 @@ static uint32_t S_FIXED(float value, uint32_t frac_bits)
> /* 12.4 fixed-point */
> static unsigned si_pack_float_12p4(float x)
> {
> return x <= 0 ? 0 :
> x >= 4096 ? 0xffff : x * 16;
> }
>
> /*
> * Inferred framebuffer and blender state.
> *
> - * One of the reasons CB_TARGET_MASK 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.
> - *
> - * Another reason is to avoid a hang with dual source blending.
> + * CB_TARGET_MASK is emitted here to avoid a hang with dual source blending
> + * if there is not enough PS outputs.
> */
> static void si_emit_cb_render_state(struct si_context *sctx, struct r600_atom *atom)
> {
> struct radeon_winsys_cs *cs = sctx->b.gfx.cs;
> struct si_state_blend *blend = sctx->queued.named.blend;
> - uint32_t cb_target_mask = 0, i;
> -
> - for (i = 0; i < sctx->framebuffer.state.nr_cbufs; i++)
> - if (sctx->framebuffer.state.cbufs[i])
> - cb_target_mask |= 0xf << (4*i);
> + uint32_t cb_target_mask, i;
>
> + /* CB_COLORn_INFO.FORMAT=INVALID disables empty colorbuffer slots. */
> if (blend)
> - cb_target_mask &= blend->cb_target_mask;
> + cb_target_mask = blend->cb_target_mask;
> + else
> + cb_target_mask = 0xffffffff;
>
> /* Avoid a hang that happens when dual source blending is enabled
> * but there is not enough color outputs. This is undefined behavior,
> * so disable color writes completely.
> *
> * Reproducible with Unigine Heaven 4.0 and drirc missing.
> */
> if (blend && blend->dual_src_blend &&
> sctx->ps_shader.cso &&
> (sctx->ps_shader.cso->info.colors_written & 0x3) != 0x3)
>
More information about the mesa-dev
mailing list