Am 05.02.2018 um 05:58 schrieb Dave Airlie:
> From: Dave Airlie <airl...@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 <srol...@vmware.com>

> 
> Signed-off-by: Dave Airlie <airl...@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;
> 

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to