[Mesa-dev] [PATCH] r600: fixup sparse color exports.

Roland Scheidegger sroland at vmware.com
Tue Feb 6 05:05:13 UTC 2018


Am 05.02.2018 um 05:58 schrieb Dave Airlie:
> From: Dave Airlie <airlied at redhat.com>
> 
> If we have gaps in the shader mask we have to have 0x1 in them
> according to a comment in radeonsi, and this is required to fix
> the test at least on cayman.
> 
> We also need to record the highest one written to write to the
> ps exports reg.
> 
> This fixes:
> KHR-GL45.enhanced_layouts.fragment_data_location_api

Does that mean there's actually a performance benefit when there's no
gaps? That's something the APIs wouldn't tell you :-).

Reviewed-by: Roland Scheidegger <sroland at vmware.com>

> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/gallium/drivers/r600/evergreen_state.c |  2 +-
>  src/gallium/drivers/r600/r600_shader.c     | 10 ++++++++++
>  src/gallium/drivers/r600/r600_shader.h     |  1 +
>  3 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
> index 4c9163c2a7..742ca5babb 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -3369,7 +3369,7 @@ void evergreen_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader
>  			exports_ps |= 1;
>  	}
>  
> -	num_cout = rshader->nr_ps_color_exports;
> +	num_cout = rshader->ps_export_highest + 1;
>  
>  	exports_ps |= S_02884C_EXPORT_COLORS(num_cout);
>  	if (!exports_ps) {
> diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
> index 72e3063804..33eb5accea 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -3876,6 +3876,16 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
>  					output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
>  					shader->nr_ps_color_exports++;
>  					shader->ps_color_export_mask |= (0xf << (shader->output[i].sid * 4));
> +
> +					/* If the i-th target format is set, all previous target formats must
> +					 * be non-zero to avoid hangs. - from radeonsi, seems to apply to eg as well.
> +					 */
> +					if (shader->output[i].sid > 0)
> +						for (unsigned x = 0; x < shader->output[i].sid; x++)
> +							shader->ps_color_export_mask |= (1 << (x*4));
> +
> +					if (shader->output[i].sid > shader->ps_export_highest)
> +						shader->ps_export_highest = shader->output[i].sid;
>  					if (shader->fs_write_all && (rscreen->b.chip_class >= EVERGREEN)) {
>  						for (k = 1; k < max_color_exports; k++) {
>  							j++;
> diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h
> index 7fca3f455e..4b23facf6f 100644
> --- a/src/gallium/drivers/r600/r600_shader.h
> +++ b/src/gallium/drivers/r600/r600_shader.h
> @@ -85,6 +85,7 @@ struct r600_shader {
>  	/* Real number of ps color exports compiled in the bytecode */
>  	unsigned		nr_ps_color_exports;
>  	unsigned                ps_color_export_mask;
> +	unsigned                ps_export_highest;
>  	/* bit n is set if the shader writes gl_ClipDistance[n] */
>  	unsigned		cc_dist_mask;
>  	unsigned		clip_dist_write;
> 



More information about the mesa-dev mailing list