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@anholt.net>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16132>
This commit is contained in:
Marek Olšák 2022-04-24 22:42:10 -04:00 committed by Marge Bot
parent 09d6ebac7e
commit 2d4067a6fb
4 changed files with 62 additions and 20 deletions

View file

@ -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);

View file

@ -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)

View file

@ -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;

View file

@ -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,