On 17.06.2017 15:44, Marek Olšák wrote:
From: Marek Olšák <[email protected]>

GFX9 is affected.
---
  src/gallium/drivers/radeonsi/si_blit.c | 36 ++++++++++++++++++++++++++++++++++
  1 file changed, 36 insertions(+)

diff --git a/src/gallium/drivers/radeonsi/si_blit.c 
b/src/gallium/drivers/radeonsi/si_blit.c
index 1159594..b78fddf 100644
--- a/src/gallium/drivers/radeonsi/si_blit.c
+++ b/src/gallium/drivers/radeonsi/si_blit.c
@@ -1133,20 +1133,56 @@ void si_resource_copy_region(struct pipe_context *ctx,
                                src_templ.format = 
PIPE_FORMAT_R32G32B32A32_UINT;
                                break;
                        default:
                                fprintf(stderr, "Unhandled format %s with blocksize 
%u\n",
                                        util_format_short_name(src->format), 
blocksize);
                                assert(0);
                        }
                }
        }
+ /* SNORM8 blitting has precision issues on some chips. Use the SINT
+        * equivalent instead, which doesn't force DCC decompression.
+        * Note that some chips avoid this issue by using SDMA.
+        */
+       if (util_format_is_snorm8(dst_templ.format)) {
+               switch (dst_templ.format) {
+               case PIPE_FORMAT_R8_SNORM:
+                       dst_templ.format = src_templ.format = 
PIPE_FORMAT_R8_SINT;
+                       break;
+               case PIPE_FORMAT_R8G8_SNORM:
+                       dst_templ.format = src_templ.format = 
PIPE_FORMAT_R8G8_SINT;
+                       break;
+               case PIPE_FORMAT_R8G8B8X8_SNORM:
+                       dst_templ.format = src_templ.format = 
PIPE_FORMAT_R8G8B8X8_SINT;
+                       break;
+               case PIPE_FORMAT_R8G8B8A8_SNORM:
+               case PIPE_FORMAT_A8B8G8R8_SNORM: /* also swizzle */
+               case PIPE_FORMAT_X8B8G8R8_SNORM: /* also swizzle */
+                       dst_templ.format = src_templ.format = 
PIPE_FORMAT_R8G8B8A8_SINT;

Why does R8G8B8X8 need a separate case but not X8B8G8R8?

Do we have a test for this?

Cheers,
Nicolai


+                       break;
+               case PIPE_FORMAT_A8_SNORM:
+                       dst_templ.format = src_templ.format = 
PIPE_FORMAT_A8_SINT;
+                       break;
+               case PIPE_FORMAT_L8_SNORM:
+                       dst_templ.format = src_templ.format = 
PIPE_FORMAT_L8_SINT;
+                       break;
+               case PIPE_FORMAT_L8A8_SNORM:
+                       dst_templ.format = src_templ.format = 
PIPE_FORMAT_L8A8_SINT;
+                       break;
+               case PIPE_FORMAT_I8_SNORM:
+                       dst_templ.format = src_templ.format = 
PIPE_FORMAT_I8_SINT;
+                       break;
+               default:; /* fall through */
+               }
+       }
+
        vi_disable_dcc_if_incompatible_format(&sctx->b, dst, dst_level,
                                              dst_templ.format);
        vi_disable_dcc_if_incompatible_format(&sctx->b, src, src_level,
                                              src_templ.format);
/* Initialize the surface. */
        dst_view = r600_create_surface_custom(ctx, dst, &dst_templ,
                                              dst_width0, dst_height0,
                                              dst_width, dst_height);


--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to