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
