From 55735b6146f75408eddbb37c2a7d77f26364b9c9 Mon Sep 17 00:00:00 2001 From: "Eric R. Smith" Date: Wed, 25 Jun 2025 17:15:56 +0000 Subject: [PATCH] pan: Add 16 bit AFBC support (v10+ only) Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/genxml/v10.xml | 6 ++++++ src/panfrost/genxml/v12.xml | 4 ++++ src/panfrost/genxml/v13.xml | 4 ++++ src/panfrost/lib/pan_afbc.h | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+) diff --git a/src/panfrost/genxml/v10.xml b/src/panfrost/genxml/v10.xml index ec74a5ca326..9dd050c92d8 100644 --- a/src/panfrost/genxml/v10.xml +++ b/src/panfrost/genxml/v10.xml @@ -1222,16 +1222,22 @@ + + + + + + diff --git a/src/panfrost/genxml/v12.xml b/src/panfrost/genxml/v12.xml index 7b078878e76..4b682f61e84 100644 --- a/src/panfrost/genxml/v12.xml +++ b/src/panfrost/genxml/v12.xml @@ -1486,16 +1486,20 @@ + + + + diff --git a/src/panfrost/genxml/v13.xml b/src/panfrost/genxml/v13.xml index a4ae2cd4424..09bd7141908 100644 --- a/src/panfrost/genxml/v13.xml +++ b/src/panfrost/genxml/v13.xml @@ -1788,16 +1788,20 @@ + + + + diff --git a/src/panfrost/lib/pan_afbc.h b/src/panfrost/lib/pan_afbc.h index 0e6a920d4f9..dfe9669b12c 100644 --- a/src/panfrost/lib/pan_afbc.h +++ b/src/panfrost/lib/pan_afbc.h @@ -80,6 +80,12 @@ enum pan_afbc_mode { PAN_AFBC_MODE_R10G10B10A2, PAN_AFBC_MODE_R11G11B10, + /* 16 bit modes, available on v10+ */ + PAN_AFBC_MODE_R16, + PAN_AFBC_MODE_R16G16, + PAN_AFBC_MODE_R16G16B16, + PAN_AFBC_MODE_R16G16B16A16, + /* YUV special modes */ PAN_AFBC_MODE_YUV420_6C8, PAN_AFBC_MODE_YUV420_2C8, @@ -538,6 +544,7 @@ pan_afbc_format(unsigned arch, enum pipe_format format, unsigned plane_idx) format = util_format_any_to_unorm(format); /* Luminance-alpha not supported for AFBC on v7+ */ + /* 16 bit modes only available for AFBC on v10 and later */ switch (format) { case PIPE_FORMAT_A8_UNORM: case PIPE_FORMAT_L8_UNORM: @@ -547,6 +554,14 @@ pan_afbc_format(unsigned arch, enum pipe_format format, unsigned plane_idx) return PAN_AFBC_MODE_INVALID; else break; + case PIPE_FORMAT_R16_UNORM: + case PIPE_FORMAT_R16G16_UNORM: + case PIPE_FORMAT_R16G16B16_UNORM: + case PIPE_FORMAT_R16G16B16A16_UNORM: + if (arch < 10) + return PAN_AFBC_MODE_INVALID; + else + break; default: break; } @@ -576,6 +591,12 @@ pan_afbc_format(unsigned arch, enum pipe_format format, unsigned plane_idx) case PIPE_FORMAT_S8_UINT: return arch >= 9 ? PAN_AFBC_MODE_R8 : PAN_AFBC_MODE_INVALID; + case PIPE_FORMAT_R16_UNORM: return PAN_AFBC_MODE_R16; + case PIPE_FORMAT_R16G16_UNORM: return PAN_AFBC_MODE_R16G16; + case PIPE_FORMAT_R16G16B16_UNORM: return PAN_AFBC_MODE_R16G16B16; + case PIPE_FORMAT_R16G16B16A16_UNORM: + return PAN_AFBC_MODE_R16G16B16A16; + default: return PAN_AFBC_MODE_INVALID; } /* clang-format on */ @@ -676,6 +697,16 @@ pan_afbc_compression_mode(enum pan_afbc_mode mode) return MALI_AFBC_COMPRESSION_MODE_R10G10B10A2; case PAN_AFBC_MODE_R11G11B10: return MALI_AFBC_COMPRESSION_MODE_R11G11B10; +#if PAN_ARCH >= 10 + case PAN_AFBC_MODE_R16: + return MALI_AFBC_COMPRESSION_MODE_R16; + case PAN_AFBC_MODE_R16G16: + return MALI_AFBC_COMPRESSION_MODE_R16G16; + case PAN_AFBC_MODE_R16G16B16: + return MALI_AFBC_COMPRESSION_MODE_R16G16B16; + case PAN_AFBC_MODE_R16G16B16A16: + return MALI_AFBC_COMPRESSION_MODE_R16G16B16A16; +#endif case PAN_AFBC_MODE_YUV420_6C8: return MALI_AFBC_COMPRESSION_MODE_YUV420_6C8; case PAN_AFBC_MODE_YUV420_2C8: @@ -700,6 +731,12 @@ pan_afbc_compression_mode(enum pan_afbc_mode mode) return MALI_AFBC_COMPRESSION_MODE_YUV422_2C10; case PAN_AFBC_MODE_YUV422_1C10: return MALI_AFBC_COMPRESSION_MODE_YUV422_1C10; +#if PAN_ARCH == 9 + case PAN_AFBC_MODE_R16: + case PAN_AFBC_MODE_R16G16: + case PAN_AFBC_MODE_R16G16B16: + case PAN_AFBC_MODE_R16G16B16A16: +#endif case PAN_AFBC_MODE_INVALID: UNREACHABLE("Invalid AFBC format"); }