Mesa (main): freedreno/a6xx: Use UNORM for SNORM copy blits
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jun 17 19:52:06 UTC 2021
Module: Mesa
Branch: main
Commit: 678e4842cca21c5098b0f458464375dac5153897
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=678e4842cca21c5098b0f458464375dac5153897
Author: Rob Clark <robdclark at chromium.org>
Date: Tue Jun 15 16:35:57 2021 -0700
freedreno/a6xx: Use UNORM for SNORM copy blits
Signed-off-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11402>
---
src/gallium/drivers/freedreno/a6xx/fd6_blitter.c | 52 ++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
index f9fffbf54d4..4e5555a3f04 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
@@ -1127,15 +1127,67 @@ handle_compressed_blit(struct fd_context *ctx,
return do_rewritten_blit(ctx, &blit);
}
+static enum pipe_format
+snorm_copy_format(enum pipe_format format)
+{
+ switch (format) {
+ case PIPE_FORMAT_R8_SNORM: return PIPE_FORMAT_R8_UNORM;
+ case PIPE_FORMAT_R16_SNORM: return PIPE_FORMAT_R16_UNORM;
+ case PIPE_FORMAT_A16_SNORM: return PIPE_FORMAT_A16_UNORM;
+ case PIPE_FORMAT_L16_SNORM: return PIPE_FORMAT_L16_UNORM;
+ case PIPE_FORMAT_I16_SNORM: return PIPE_FORMAT_I16_UNORM;
+ case PIPE_FORMAT_R8G8_SNORM: return PIPE_FORMAT_R8G8_UNORM;
+ case PIPE_FORMAT_R8G8B8_SNORM: return PIPE_FORMAT_R8G8B8_UNORM;
+ case PIPE_FORMAT_R32_SNORM: return PIPE_FORMAT_R32_UNORM;
+ case PIPE_FORMAT_R16G16_SNORM: return PIPE_FORMAT_R16G16_UNORM;
+ case PIPE_FORMAT_L16A16_SNORM: return PIPE_FORMAT_L16A16_UNORM;
+ case PIPE_FORMAT_R8G8B8A8_SNORM: return PIPE_FORMAT_R8G8B8A8_UNORM;
+ case PIPE_FORMAT_R10G10B10A2_SNORM: return PIPE_FORMAT_R10G10B10A2_UNORM;
+ case PIPE_FORMAT_B10G10R10A2_SNORM: return PIPE_FORMAT_B10G10R10A2_UNORM;
+ case PIPE_FORMAT_R16G16B16_SNORM: return PIPE_FORMAT_R16G16B16_UNORM;
+ case PIPE_FORMAT_R16G16B16A16_SNORM: return PIPE_FORMAT_R16G16B16A16_UNORM;
+ case PIPE_FORMAT_R16G16B16X16_SNORM: return PIPE_FORMAT_R16G16B16X16_UNORM;
+ case PIPE_FORMAT_R32G32_SNORM: return PIPE_FORMAT_R32G32_UNORM;
+ case PIPE_FORMAT_R32G32B32_SNORM: return PIPE_FORMAT_R32G32B32_UNORM;
+ case PIPE_FORMAT_R32G32B32A32_SNORM: return PIPE_FORMAT_R32G32B32A32_UNORM;
+ default:
+ unreachable("unhandled snorm format");
+ return format;
+ }
+}
+
+/**
+ * For SNORM formats, copy them as the equivalent UNORM format. If we treat
+ * them as snorm then the 0x80 (-1.0 snorm8) value will get clamped to 0x81
+ * (also -1.0), when we're supposed to be memcpying the bits. See
+ * https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/2917 for discussion.
+ */
+static bool
+handle_snorm_copy_blit(struct fd_context *ctx,
+ const struct pipe_blit_info *info)
+ assert_dt
+{
+ struct pipe_blit_info blit = *info;
+
+ blit.src.format = blit.dst.format = snorm_copy_format(info->src.format);
+
+ return do_rewritten_blit(ctx, &blit);
+}
+
static bool
fd6_blit(struct fd_context *ctx, const struct pipe_blit_info *info) assert_dt
{
if (info->mask & PIPE_MASK_ZS)
return handle_zs_blit(ctx, info);
+
if (util_format_is_compressed(info->src.format) ||
util_format_is_compressed(info->dst.format))
return handle_compressed_blit(ctx, info);
+ if ((info->src.format == info->dst.format) &&
+ util_format_is_snorm(info->src.format))
+ return handle_snorm_copy_blit(ctx, info);
+
return handle_rgba_blit(ctx, info);
}
More information about the mesa-commit
mailing list