summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2019-01-15 12:33:53 -0500
committerMarek Olšák <[email protected]>2019-01-22 12:21:43 -0500
commitb443465fb966218fd81c119d4d6e449ab7ffc0a5 (patch)
treefed3356cd23d1a74eed159c42a1697cbd7ec429c
parent3ee240890ce2d474ce96712972d2e06e363341f4 (diff)
gallium/util: add util_format_snorm8_to_sint8 (from radeonsi)
-rw-r--r--src/gallium/auxiliary/util/u_format.c40
-rw-r--r--src/gallium/auxiliary/util/u_format.h3
-rw-r--r--src/gallium/drivers/radeonsi/si_blit.c32
3 files changed, 45 insertions, 30 deletions
diff --git a/src/gallium/auxiliary/util/u_format.c b/src/gallium/auxiliary/util/u_format.c
index 231e89017b4..862061a8ec2 100644
--- a/src/gallium/auxiliary/util/u_format.c
+++ b/src/gallium/auxiliary/util/u_format.c
@@ -886,3 +886,43 @@ void util_format_unswizzle_4f(float *dst, const float *src,
}
}
}
+
+enum pipe_format
+util_format_snorm8_to_sint8(enum pipe_format format)
+{
+ switch (format) {
+ 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_R8G8B8A8_SNORM:
+ return PIPE_FORMAT_R8G8B8A8_SINT;
+
+ case PIPE_FORMAT_A8_SNORM:
+ return PIPE_FORMAT_A8_SINT;
+ case PIPE_FORMAT_L8_SNORM:
+ return PIPE_FORMAT_L8_SINT;
+ case PIPE_FORMAT_L8A8_SNORM:
+ return PIPE_FORMAT_L8A8_SINT;
+ case PIPE_FORMAT_I8_SNORM:
+ return PIPE_FORMAT_I8_SINT;
+
+ case PIPE_FORMAT_R8G8B8X8_SNORM:
+ return PIPE_FORMAT_R8G8B8X8_SINT;
+ case PIPE_FORMAT_R8A8_SNORM:
+ return PIPE_FORMAT_R8A8_SINT;
+ case PIPE_FORMAT_A8L8_SNORM:
+ return PIPE_FORMAT_A8L8_SINT;
+ case PIPE_FORMAT_G8R8_SNORM:
+ return PIPE_FORMAT_G8R8_SINT;
+ case PIPE_FORMAT_A8B8G8R8_SNORM:
+ return PIPE_FORMAT_A8B8G8R8_SINT;
+ case PIPE_FORMAT_X8B8G8R8_SNORM:
+ return PIPE_FORMAT_X8B8G8R8_SINT;
+
+ default:
+ return format;
+ }
+}
diff --git a/src/gallium/auxiliary/util/u_format.h b/src/gallium/auxiliary/util/u_format.h
index 8dcc438a4a1..0c0c505e391 100644
--- a/src/gallium/auxiliary/util/u_format.h
+++ b/src/gallium/auxiliary/util/u_format.h
@@ -1358,6 +1358,9 @@ void pipe_swizzle_4f(float *dst, const float *src,
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);
+
#ifdef __cplusplus
} // extern "C" {
#endif
diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c
index 69b1af02db0..16be11247e4 100644
--- a/src/gallium/drivers/radeonsi/si_blit.c
+++ b/src/gallium/drivers/radeonsi/si_blit.c
@@ -1012,36 +1012,8 @@ void si_resource_copy_region(struct pipe_context *ctx,
* 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:
- /* There are no SINT variants for ABGR and XBGR, so we have to use RGBA. */
- case PIPE_FORMAT_A8B8G8R8_SNORM:
- case PIPE_FORMAT_X8B8G8R8_SNORM:
- dst_templ.format = src_templ.format = PIPE_FORMAT_R8G8B8A8_SINT;
- 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 */
- }
+ dst_templ.format = src_templ.format =
+ util_format_snorm8_to_sint8(dst_templ.format);
}
vi_disable_dcc_if_incompatible_format(sctx, dst, dst_level,