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

2018-02-05 Thread Roland Scheidegger
Am 05.02.2018 um 05:58 schrieb Dave Airlie:
> From: Dave Airlie 
> 
> 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 

> 
> Signed-off-by: Dave Airlie 
> ---
>  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 */
>   unsignednr_ps_color_exports;
>   unsignedps_color_export_mask;
> + unsignedps_export_highest;
>   /* bit n is set if the shader writes gl_ClipDistance[n] */
>   unsignedcc_dist_mask;
>   unsignedclip_dist_write;
> 

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


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

2018-02-04 Thread Dave Airlie
From: Dave Airlie 

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

Signed-off-by: Dave Airlie 
---
 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 */
unsignednr_ps_color_exports;
unsignedps_color_export_mask;
+   unsignedps_export_highest;
/* bit n is set if the shader writes gl_ClipDistance[n] */
unsignedcc_dist_mask;
unsignedclip_dist_write;
-- 
2.14.3

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