gallium/util: add util_format_snorm8_to_sint8 (from radeonsi)

This commit is contained in:
Marek Olšák 2019-01-15 12:33:53 -05:00
parent 3ee240890c
commit b443465fb9
3 changed files with 45 additions and 30 deletions

View file

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

View file

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

View file

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