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,