[Mesa-dev] [PATCH 4/4] radeonsi: add a workaround for inexact SNORM8 blitting again

Marek Olšák maraeo at gmail.com
Sat Jun 17 13:44:34 UTC 2017


From: Marek Olšák <marek.olsak at amd.com>

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;
+			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);
 
-- 
2.7.4



More information about the mesa-dev mailing list