[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