mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-28 10:20:09 +01:00
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:
parent
909d4deea8
commit
f57cc49683
3 changed files with 42 additions and 168 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue