From 75b858e904aff123ae256311a578a41301d37808 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Sat, 11 Mar 2023 19:47:27 -0500 Subject: [PATCH] asahi: Support more renderable formats Fixes KHR-GLES3.copy_tex_image_conversions.forbidden.* Arguably working around a mesa/st issue but more format support is good for compatibility and performance anyway. Signed-off-by: Alyssa Rosenzweig Reviewed-by: Janne Grunau Part-of: --- src/asahi/lib/agx_formats.c | 22 ++++++++++++++++++++++ src/asahi/lib/agx_nir_format_helpers.h | 3 ++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/asahi/lib/agx_formats.c b/src/asahi/lib/agx_formats.c index 4aa4efa..f74da6f 100644 --- a/src/asahi/lib/agx_formats.c +++ b/src/asahi/lib/agx_formats.c @@ -21,6 +21,18 @@ /* clang-format off */ const struct agx_pixel_format_entry agx_pixel_format[PIPE_FORMAT_COUNT] = { + AGX_FMT(R5G6B5_UNORM, R5G6B5, UNORM, T, F16), + AGX_FMT(B5G6R5_UNORM, R5G6B5, UNORM, T, F16), + + AGX_FMT(R5G5B5A1_UNORM, R5G5B5A1, UNORM, T, F16), + AGX_FMT(B5G5R5A1_UNORM, R5G5B5A1, UNORM, T, F16), + AGX_FMT(R5G5B5A1_UNORM, R5G5B5A1, UNORM, T, F16), + AGX_FMT(B5G5R5A1_UNORM, R5G5B5A1, UNORM, T, F16), + + AGX_FMT(R4G4B4A4_UNORM, R4G4B4A4, UNORM, T, F16), + AGX_FMT(B4G4R4A4_UNORM, R4G4B4A4, UNORM, T, F16), + AGX_FMT(A4B4G4R4_UNORM, R4G4B4A4, UNORM, T, F16), + AGX_FMT(R8_UNORM, R8, UNORM, T, U8NORM), AGX_FMT(R8G8_UNORM, R8G8, UNORM, T, U8NORM), AGX_FMT(R8G8B8A8_UNORM, R8G8B8A8, UNORM, T, U8NORM), @@ -63,34 +75,42 @@ const struct agx_pixel_format_entry agx_pixel_format[PIPE_FORMAT_COUNT] = { AGX_FMT(R16_FLOAT, R16, FLOAT, T, F16), AGX_FMT(R16G16_FLOAT, R16G16, FLOAT, T, F16), + AGX_FMT(R16G16B16X16_FLOAT, R16G16B16A16, FLOAT, T, F16), AGX_FMT(R16G16B16A16_FLOAT, R16G16B16A16, FLOAT, T, F16), AGX_FMT(R32_FLOAT, R32, FLOAT, T, I32), AGX_FMT(R32G32_FLOAT, R32G32, FLOAT, T, I32), + AGX_FMT(R32G32B32X32_FLOAT, R32G32B32A32, FLOAT, T, I32), AGX_FMT(R32G32B32A32_FLOAT, R32G32B32A32, FLOAT, T, I32), AGX_FMT(R8_UINT, R8, UINT, T, I8), AGX_FMT(R8G8_UINT, R8G8, UINT, T, I8), + AGX_FMT(R8G8B8X8_UINT, R8G8B8A8, UINT, T, I8), AGX_FMT(R8G8B8A8_UINT, R8G8B8A8, UINT, T, I8), AGX_FMT(R16_UINT, R16, UINT, T, I16), AGX_FMT(R16G16_UINT, R16G16, UINT, T, I16), + AGX_FMT(R16G16B16X16_UINT, R16G16B16A16, UINT, T, I16), AGX_FMT(R16G16B16A16_UINT, R16G16B16A16, UINT, T, I16), AGX_FMT(R32_UINT, R32, UINT, T, I32), AGX_FMT(R32G32_UINT, R32G32, UINT, T, I32), + AGX_FMT(R32G32B32X32_UINT, R32G32B32A32, UINT, T, I32), AGX_FMT(R32G32B32A32_UINT, R32G32B32A32, UINT, T, I32), AGX_FMT(R8_SINT, R8, SINT, T, I8), AGX_FMT(R8G8_SINT, R8G8, SINT, T, I8), + AGX_FMT(R8G8B8X8_SINT, R8G8B8A8, SINT, T, I8), AGX_FMT(R8G8B8A8_SINT, R8G8B8A8, SINT, T, I8), AGX_FMT(R16_SINT, R16, SINT, T, I16), AGX_FMT(R16G16_SINT, R16G16, SINT, T, I16), + AGX_FMT(R16G16B16X16_SINT, R16G16B16A16, SINT, T, I16), AGX_FMT(R16G16B16A16_SINT, R16G16B16A16, SINT, T, I16), AGX_FMT(R32_SINT, R32, SINT, T, I32), AGX_FMT(R32G32_SINT, R32G32, SINT, T, I32), + AGX_FMT(R32G32B32X32_SINT, R32G32B32A32, SINT, T, I32), AGX_FMT(R32G32B32A32_SINT, R32G32B32A32, SINT, T, I32), AGX_FMT(Z16_UNORM, R16, UNORM, F, _), @@ -106,7 +126,9 @@ const struct agx_pixel_format_entry agx_pixel_format[PIPE_FORMAT_COUNT] = { AGX_FMT(Z24_UNORM_S8_UINT, R32, FLOAT, F, _), AGX_FMT(R10G10B10A2_UNORM, R10G10B10A2, UNORM, T, RGB10A2), + AGX_FMT(R10G10B10X2_UNORM, R10G10B10A2, UNORM, T, RGB10A2), AGX_FMT(B10G10R10A2_UNORM, R10G10B10A2, UNORM, T, RGB10A2), + AGX_FMT(B10G10R10X2_UNORM, R10G10B10A2, UNORM, T, RGB10A2), AGX_FMT(R10G10B10A2_UINT, R10G10B10A2, UINT, T, I16), AGX_FMT(B10G10R10A2_UINT, R10G10B10A2, UINT, T, I16), diff --git a/src/asahi/lib/agx_nir_format_helpers.h b/src/asahi/lib/agx_nir_format_helpers.h index 1cf74fb..fe6df12 100644 --- a/src/asahi/lib/agx_nir_format_helpers.h +++ b/src/asahi/lib/agx_nir_format_helpers.h @@ -20,7 +20,8 @@ nir_sign_extend_if_sint(nir_builder *b, nir_ssa_def *x, enum pipe_format format) unsigned bits[4] = {0}; for (unsigned i = 0; i < desc->nr_channels; ++i) { - assert(desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED); + assert(desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED || + desc->channel[i].type == UTIL_FORMAT_TYPE_VOID); bits[i] = desc->channel[i].size; } -- 2.7.4