util/format: Autogen type conversion helpers

We are about to need new type converters for our AFBC mode selection
logic (AFBC is type agnostic, but we currently accept only UNORM
formats), so let's switch to an autogen solution for the existing ones,
and generate all missing type converters along the way.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Eric R. Smith <eric.smith@collabora.com>
Reviewed-by: Christoph Pillmayer <christoph.pillmayer@arm.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37158>
This commit is contained in:
Boris Brezillon 2025-09-04 13:12:33 +02:00 committed by Marge Bot
parent 909d4deea8
commit f57cc49683
3 changed files with 42 additions and 168 deletions

View file

@ -1032,101 +1032,6 @@ void util_format_unswizzle_4f(float *dst, const float *src,
}
}
enum pipe_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;
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_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_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_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_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;
}
}
/**
* If the format is RGB, return BGR. If the format is BGR, return RGB.
* This may fail by returning PIPE_FORMAT_NONE.
@ -1257,72 +1162,6 @@ util_format_unpack_description(enum pipe_format format)
return util_format_unpack_table[format];
}
enum pipe_format
util_format_snorm_to_unorm(enum pipe_format format)
{
#define CASE(x) case PIPE_FORMAT_##x##_SNORM: return PIPE_FORMAT_##x##_UNORM
switch (format) {
CASE(R8G8B8A8);
CASE(R8G8B8X8);
CASE(B8G8R8A8);
CASE(B8G8R8X8);
CASE(A8R8G8B8);
CASE(X8R8G8B8);
CASE(A8B8G8R8);
CASE(X8B8G8R8);
CASE(R10G10B10A2);
CASE(R10G10B10X2);
CASE(B10G10R10A2);
CASE(B10G10R10X2);
CASE(R8);
CASE(R8G8);
CASE(G8R8);
CASE(R8G8B8);
CASE(B8G8R8);
CASE(R16);
CASE(R16G16);
CASE(G16R16);
CASE(R16G16B16);
CASE(R16G16B16A16);
CASE(R16G16B16X16);
CASE(R32);
CASE(R32G32);
CASE(R32G32B32);
CASE(R32G32B32A32);
CASE(RGTC1);
CASE(RGTC2);
CASE(ETC2_R11);
CASE(ETC2_RG11);
CASE(A8);
CASE(A16);
CASE(L8);
CASE(L16);
CASE(I8);
CASE(I16);
CASE(L8A8);
CASE(L16A16);
CASE(R8A8);
CASE(R16A16);
CASE(LATC1);
CASE(LATC2);
default:
return format;
}
#undef CASE
}
enum pipe_format
util_format_rgbx_to_rgba(enum pipe_format format)
{

View file

@ -1545,9 +1545,6 @@ 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_snorm_to_sint(enum pipe_format format) ATTRIBUTE_CONST;
extern void
util_copy_rect(void * dst, enum pipe_format format,
unsigned dst_stride, unsigned dst_x, unsigned dst_y,
@ -1561,10 +1558,6 @@ util_copy_rect(void * dst, enum pipe_format format,
enum pipe_format
util_format_rgb_to_bgr(enum pipe_format format);
/* Returns the pipe format with SNORM formats cast to UNORM, otherwise the original pipe format. */
enum pipe_format
util_format_snorm_to_unorm(enum pipe_format format);
enum pipe_format
util_format_rgbx_to_rgba(enum pipe_format format);

View file

@ -494,6 +494,47 @@ def write_get_plane_format(formats):
print('}', file=sys.stdout3)
print(file=sys.stdout3)
def write_type_conv_helper(formats, in_type, out_type):
print('static inline enum pipe_format', file=sys.stdout3)
print('util_format_%s_to_%s(enum pipe_format format)' % (in_type, out_type), file=sys.stdout3)
print('{', file=sys.stdout3)
print(' switch (format) {', file=sys.stdout3)
for out_fmt in formats:
if out_fmt.colorspace != 'RGB':
continue
if out_type not in out_fmt.short_name():
continue
match = []
if in_type != 'any':
match += [out_fmt.short_name().replace(out_type, in_type)]
else:
for fmt_type in ['unorm', 'snorm', 'uint', 'sint', 'float']:
if fmt_type != in_type:
match += [out_fmt.short_name().replace(out_type, fmt_type)]
found_match = False
for in_fmt in formats:
if in_fmt.short_name() in match:
print(' case %s:' % in_fmt.name, file=sys.stdout3)
found_match = True
if found_match:
print(' return %s;' % out_fmt.name, file=sys.stdout3)
print(' default:', file=sys.stdout3)
print(' return format;', file=sys.stdout3)
print(' }', file=sys.stdout3)
print('}', file=sys.stdout3)
def write_type_conv_helpers(formats):
out_types = ['unorm', 'snorm', 'uint', 'sint', 'float']
in_types = out_types + ['any']
for in_type in in_types:
for out_type in out_types:
if in_type != out_type:
write_type_conv_helper(formats, in_type, out_type)
print(file=sys.stdout3)
def write_format_inline_helpers(formats):
write_to_chroma_format(formats)
print(file=sys.stdout3)
@ -501,6 +542,7 @@ def write_format_inline_helpers(formats):
print(file=sys.stdout3)
write_get_plane_width_height(formats)
print(file=sys.stdout3)
write_type_conv_helpers(formats)
def write_format_table(formats):
write_format_table_header(sys.stdout)