Mesa (main): util: change util_format_snorm8_to_sint8 -> snorm_to_sint for radeonsi

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 28 13:18:09 UTC 2022


Module: Mesa
Branch: main
Commit: 2d4067a6fb8f3f95218a93e2fdf3923861b6e2d7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2d4067a6fb8f3f95218a93e2fdf3923861b6e2d7

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Sun Apr 24 22:42:10 2022 -0400

util: change util_format_snorm8_to_sint8 -> snorm_to_sint for radeonsi

Convert all SNORM formats to SINT.

This fixes SNORM blits for radeonsi.

Reviewed-by: Emma Anholt <emma at anholt.net>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16132>

---

 src/gallium/drivers/radeonsi/si_blit.c         |  6 +--
 src/gallium/drivers/radeonsi/si_compute_blit.c |  6 +--
 src/util/format/u_format.c                     | 67 +++++++++++++++++++++-----
 src/util/format/u_format.h                     |  3 +-
 4 files changed, 62 insertions(+), 20 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c
index b17ea48abe6..3a3c1255716 100644
--- a/src/gallium/drivers/radeonsi/si_blit.c
+++ b/src/gallium/drivers/radeonsi/si_blit.c
@@ -1028,11 +1028,11 @@ void si_resource_copy_region(struct pipe_context *ctx, struct pipe_resource *dst
       }
    }
 
-   /* SNORM8 blitting has precision issues on some chips. Use the SINT
+   /* SNORM blitting has precision issues on some chips. Use the SINT
     * equivalent instead, which doesn't force DCC decompression.
     */
-   if (util_format_is_snorm8(dst_templ.format)) {
-      dst_templ.format = src_templ.format = util_format_snorm8_to_sint8(dst_templ.format);
+   if (util_format_is_snorm(dst_templ.format)) {
+      dst_templ.format = src_templ.format = util_format_snorm_to_sint(dst_templ.format);
    }
 
    vi_disable_dcc_if_incompatible_format(sctx, dst, dst_level, dst_templ.format);
diff --git a/src/gallium/drivers/radeonsi/si_compute_blit.c b/src/gallium/drivers/radeonsi/si_compute_blit.c
index 4d509c9a877..e6ac4b5e64c 100644
--- a/src/gallium/drivers/radeonsi/si_compute_blit.c
+++ b/src/gallium/drivers/radeonsi/si_compute_blit.c
@@ -581,11 +581,11 @@ void si_compute_copy_image(struct si_context *sctx, struct pipe_resource *dst, u
    image[1].u.tex.last_layer = dst->target == PIPE_TEXTURE_3D ? u_minify(dst->depth0, dst_level) - 1
                                                               : (unsigned)(dst->array_size - 1);
 
-   /* SNORM8 blitting has precision issues on some chips. Use the SINT
+   /* SNORM blitting has precision issues on some chips. Use the SINT
     * equivalent instead, which doesn't force DCC decompression.
     */
-   if (util_format_is_snorm8(dst->format)) {
-      image[0].format = image[1].format = util_format_snorm8_to_sint8(dst->format);
+   if (util_format_is_snorm(dst->format)) {
+      image[0].format = image[1].format = util_format_snorm_to_sint(dst->format);
    }
 
    if (is_dcc_decompress)
diff --git a/src/util/format/u_format.c b/src/util/format/u_format.c
index 52d33a3a983..481e3e0a457 100644
--- a/src/util/format/u_format.c
+++ b/src/util/format/u_format.c
@@ -980,17 +980,47 @@ void util_format_unswizzle_4f(float *dst, const float *src,
 }
 
 enum pipe_format
-util_format_snorm8_to_sint8(enum pipe_format format)
+util_format_snorm_to_sint(enum pipe_format format)
 {
    switch (format) {
+   case PIPE_FORMAT_R32_SNORM:
+      return PIPE_FORMAT_R32_SINT;
+   case PIPE_FORMAT_R32G32_SNORM:
+      return PIPE_FORMAT_R32G32_SINT;
+   case PIPE_FORMAT_R32G32B32_SNORM:
+      return PIPE_FORMAT_R32G32B32_SINT;
+   case PIPE_FORMAT_R32G32B32A32_SNORM:
+      return PIPE_FORMAT_R32G32B32A32_SINT;
+
+   case PIPE_FORMAT_R16_SNORM:
+      return PIPE_FORMAT_R16_SINT;
+   case PIPE_FORMAT_R16G16_SNORM:
+      return PIPE_FORMAT_R16G16_SINT;
+   case PIPE_FORMAT_R16G16B16_SNORM:
+      return PIPE_FORMAT_R16G16B16_SINT;
+   case PIPE_FORMAT_R16G16B16A16_SNORM:
+      return PIPE_FORMAT_R16G16B16A16_SINT;
+
    case PIPE_FORMAT_R8_SNORM:
       return PIPE_FORMAT_R8_SINT;
    case PIPE_FORMAT_R8G8_SNORM:
       return PIPE_FORMAT_R8G8_SINT;
    case PIPE_FORMAT_R8G8B8_SNORM:
       return PIPE_FORMAT_R8G8B8_SINT;
+   case PIPE_FORMAT_B8G8R8_SNORM:
+      return PIPE_FORMAT_B8G8R8_SINT;
    case PIPE_FORMAT_R8G8B8A8_SNORM:
       return PIPE_FORMAT_R8G8B8A8_SINT;
+   case PIPE_FORMAT_B8G8R8A8_SNORM:
+      return PIPE_FORMAT_B8G8R8A8_SINT;
+
+   case PIPE_FORMAT_R10G10B10A2_SNORM:
+      return PIPE_FORMAT_R10G10B10A2_SINT;
+   case PIPE_FORMAT_B10G10R10A2_SNORM:
+      return PIPE_FORMAT_B10G10R10A2_SINT;
+
+   case PIPE_FORMAT_R10G10B10X2_SNORM:
+      return PIPE_FORMAT_R10G10B10X2_SINT;
 
    case PIPE_FORMAT_A8_SNORM:
       return PIPE_FORMAT_A8_SINT;
@@ -1001,30 +1031,43 @@ util_format_snorm8_to_sint8(enum pipe_format format)
    case PIPE_FORMAT_I8_SNORM:
       return PIPE_FORMAT_I8_SINT;
 
+   case PIPE_FORMAT_A16_SNORM:
+      return PIPE_FORMAT_A16_SINT;
+   case PIPE_FORMAT_L16_SNORM:
+      return PIPE_FORMAT_L16_SINT;
+   case PIPE_FORMAT_L16A16_SNORM:
+      return PIPE_FORMAT_L16A16_SINT;
+   case PIPE_FORMAT_I16_SNORM:
+      return PIPE_FORMAT_I16_SINT;
+
    case PIPE_FORMAT_R8G8B8X8_SNORM:
       return PIPE_FORMAT_R8G8B8X8_SINT;
-   case PIPE_FORMAT_B8G8R8X8_SNORM:
-      return PIPE_FORMAT_B8G8R8X8_SINT;
+   case PIPE_FORMAT_R16G16B16X16_SNORM:
+      return PIPE_FORMAT_R16G16B16X16_SINT;
 
    case PIPE_FORMAT_R8A8_SNORM:
       return PIPE_FORMAT_R8A8_SINT;
+   case PIPE_FORMAT_R16A16_SNORM:
+      return PIPE_FORMAT_R16A16_SINT;
+
    case PIPE_FORMAT_G8R8_SNORM:
       return PIPE_FORMAT_G8R8_SINT;
-
-   case PIPE_FORMAT_A8R8G8B8_SNORM:
-      return PIPE_FORMAT_A8R8G8B8_SINT;
-   case PIPE_FORMAT_X8R8G8B8_SNORM:
-      return PIPE_FORMAT_X8R8G8B8_SINT;
+   case PIPE_FORMAT_G16R16_SNORM:
+      return PIPE_FORMAT_G16R16_SINT;
 
    case PIPE_FORMAT_A8B8G8R8_SNORM:
       return PIPE_FORMAT_A8B8G8R8_SINT;
    case PIPE_FORMAT_X8B8G8R8_SNORM:
       return PIPE_FORMAT_X8B8G8R8_SINT;
 
-   case PIPE_FORMAT_R10G10B10A2_SNORM:
-      return PIPE_FORMAT_R10G10B10A2_SINT;
-   case PIPE_FORMAT_B10G10R10A2_SNORM:
-      return PIPE_FORMAT_B10G10R10A2_SINT;
+   case PIPE_FORMAT_B8G8R8X8_SNORM:
+      return PIPE_FORMAT_B8G8R8X8_SINT;
+   case PIPE_FORMAT_A8R8G8B8_SNORM:
+      return PIPE_FORMAT_A8R8G8B8_SINT;
+   case PIPE_FORMAT_X8R8G8B8_SNORM:
+      return PIPE_FORMAT_X8R8G8B8_SINT;
+   case PIPE_FORMAT_B10G10R10X2_SNORM:
+      return PIPE_FORMAT_B10G10R10X2_SINT;
 
    default:
       return format;
diff --git a/src/util/format/u_format.h b/src/util/format/u_format.h
index 307cd98bad4..7f820bf1de1 100644
--- a/src/util/format/u_format.h
+++ b/src/util/format/u_format.h
@@ -1672,8 +1672,7 @@ void util_format_unswizzle_4f(float *dst, const float *src,
                               const unsigned char swz[4]);
 
 enum pipe_format
-util_format_snorm8_to_sint8(enum pipe_format format) ATTRIBUTE_CONST;
-
+util_format_snorm_to_sint(enum pipe_format format) ATTRIBUTE_CONST;
 
 extern void
 util_copy_rect(ubyte * dst, enum pipe_format format,



More information about the mesa-commit mailing list