panfrost: Introduce pan_afbc_mode

Introduce an enum to represent an AFBC compression mode. These modes are not
formats, on Valhall they are decoupled from the format. As such, it does not
make sense to use a pipe_format to represent them. Add an enum that we can use
in a straightforward way on Midgard and Bifrost to fallback for texture views,
and can map 1:1 to the Valhall hardware enum.

In addition to being less overloaded semantically, this lets -Wswitch kick in to
ensure that we handle all enums when translating. The straightforward
translation raises the following warnings:

../src/panfrost/lib/pan_cs.c:437:9: warning: enumeration value ‘PAN_AFBC_MODE_R5G5B5A1’ not handled in switch [-Wswitch]
  437 |         switch (panfrost_afbc_format(PAN_ARCH, format)) {
      |         ^~~~~~

...indicating that some formats were missed, leading to assertion fails "unknown
canonical AFBC format" when rendering RGB5A1, which dEQP-GLES31 does. Fixes
regressions in
dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers.*
on Valhall.

Given how scarce v9 hardware is, that v10 isn't upstream yet, and the offending
code was merged a week ago, this should not have actually affected anyone. At
any rate, it's a good reminder we really do need CI for v9...

Fixes: 8e125b6c15 ("panfrost: Enable AFBC of more formats")
Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20311>
This commit is contained in:
Alyssa Rosenzweig 2022-12-13 21:52:26 -05:00 committed by Marge Bot
parent 0784adc668
commit cb5e417c01
3 changed files with 49 additions and 31 deletions

View file

@ -115,7 +115,7 @@ unswizzled_format(enum pipe_format format)
* the canonical AFBC internal format if it exists, or NONE if the format
* cannot be compressed. */
enum pipe_format
enum pan_afbc_mode
panfrost_afbc_format(unsigned arch, enum pipe_format format)
{
/* Luminance-alpha not supported for AFBC on v7+ */
@ -125,7 +125,7 @@ panfrost_afbc_format(unsigned arch, enum pipe_format format)
case PIPE_FORMAT_I8_UNORM:
case PIPE_FORMAT_L8A8_UNORM:
if (arch >= 7)
return PIPE_FORMAT_NONE;
return PAN_AFBC_MODE_INVALID;
else
break;
default:
@ -141,32 +141,29 @@ panfrost_afbc_format(unsigned arch, enum pipe_format format)
/* Don't allow swizzled formats on v7+ */
if (arch >= 7 && format != unswizzled_format(format))
return PIPE_FORMAT_NONE;
return PAN_AFBC_MODE_INVALID;
/* Otherwise swizzling doesn't affect AFBC */
format = unswizzled_format(format);
switch (format) {
case PIPE_FORMAT_R8_UNORM:
case PIPE_FORMAT_R8G8_UNORM:
case PIPE_FORMAT_R8G8B8_UNORM:
case PIPE_FORMAT_R8G8B8A8_UNORM:
case PIPE_FORMAT_R5G6B5_UNORM:
case PIPE_FORMAT_R5G5B5A1_UNORM:
case PIPE_FORMAT_R10G10B10A2_UNORM:
case PIPE_FORMAT_R4G4B4A4_UNORM:
return format;
case PIPE_FORMAT_Z16_UNORM:
return PIPE_FORMAT_R8G8_UNORM;
case PIPE_FORMAT_R8_UNORM: return PAN_AFBC_MODE_R8;
case PIPE_FORMAT_R8G8_UNORM: return PAN_AFBC_MODE_R8G8;
case PIPE_FORMAT_R8G8B8_UNORM: return PAN_AFBC_MODE_R8G8B8;
case PIPE_FORMAT_R8G8B8A8_UNORM: return PAN_AFBC_MODE_R8G8B8A8;
case PIPE_FORMAT_R5G6B5_UNORM: return PAN_AFBC_MODE_R5G6B5;
case PIPE_FORMAT_R5G5B5A1_UNORM: return PAN_AFBC_MODE_R5G5B5A1;
case PIPE_FORMAT_R10G10B10A2_UNORM: return PAN_AFBC_MODE_R10G10B10A2;
case PIPE_FORMAT_R4G4B4A4_UNORM: return PAN_AFBC_MODE_R4G4B4A4;
case PIPE_FORMAT_Z16_UNORM: return PAN_AFBC_MODE_R8G8;
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
case PIPE_FORMAT_Z24X8_UNORM:
case PIPE_FORMAT_X24S8_UINT:
return PIPE_FORMAT_R8G8B8A8_UNORM;
return PAN_AFBC_MODE_R8G8B8A8;
default:
return PIPE_FORMAT_NONE;
return PAN_AFBC_MODE_INVALID;
}
}
@ -175,7 +172,7 @@ panfrost_afbc_format(unsigned arch, enum pipe_format format)
bool
panfrost_format_supports_afbc(const struct panfrost_device *dev, enum pipe_format format)
{
return panfrost_afbc_format(dev->arch, format) != PIPE_FORMAT_NONE;
return panfrost_afbc_format(dev->arch, format) != PAN_AFBC_MODE_INVALID;
}
/* The lossless colour transform (AFBC_FORMAT_MOD_YTR) requires RGB. */

View file

@ -435,18 +435,20 @@ pan_afbc_compression_mode(enum pipe_format format)
* panfrost_afbc_format.
*/
switch (panfrost_afbc_format(PAN_ARCH, format)) {
case PIPE_FORMAT_R8_UNORM: return MALI_AFBC_COMPRESSION_MODE_R8;
case PIPE_FORMAT_R8G8_UNORM: return MALI_AFBC_COMPRESSION_MODE_R8G8;
case PIPE_FORMAT_R5G6B5_UNORM: return MALI_AFBC_COMPRESSION_MODE_R5G6B5;
case PIPE_FORMAT_R4G4B4A4_UNORM: return MALI_AFBC_COMPRESSION_MODE_R4G4B4A4;
case PIPE_FORMAT_R8G8B8_UNORM: return MALI_AFBC_COMPRESSION_MODE_R8G8B8;
case PIPE_FORMAT_R8G8B8A8_UNORM: return MALI_AFBC_COMPRESSION_MODE_R8G8B8A8;
case PIPE_FORMAT_R10G10B10A2_UNORM: return MALI_AFBC_COMPRESSION_MODE_R10G10B10A2;
case PIPE_FORMAT_R11G11B10_FLOAT: return MALI_AFBC_COMPRESSION_MODE_R11G11B10;
case PIPE_FORMAT_S8_UINT: return MALI_AFBC_COMPRESSION_MODE_S8;
case PIPE_FORMAT_NONE: unreachable("invalid format for AFBC");
default: unreachable("unknown canonical AFBC format");
case PAN_AFBC_MODE_R8: return MALI_AFBC_COMPRESSION_MODE_R8;
case PAN_AFBC_MODE_R8G8: return MALI_AFBC_COMPRESSION_MODE_R8G8;
case PAN_AFBC_MODE_R5G6B5: return MALI_AFBC_COMPRESSION_MODE_R5G6B5;
case PAN_AFBC_MODE_R4G4B4A4: return MALI_AFBC_COMPRESSION_MODE_R4G4B4A4;
case PAN_AFBC_MODE_R5G5B5A1: return MALI_AFBC_COMPRESSION_MODE_R5G5B5A1;
case PAN_AFBC_MODE_R8G8B8: return MALI_AFBC_COMPRESSION_MODE_R8G8B8;
case PAN_AFBC_MODE_R8G8B8A8: return MALI_AFBC_COMPRESSION_MODE_R8G8B8A8;
case PAN_AFBC_MODE_R10G10B10A2: return MALI_AFBC_COMPRESSION_MODE_R10G10B10A2;
case PAN_AFBC_MODE_R11G11B10: return MALI_AFBC_COMPRESSION_MODE_R11G11B10;
case PAN_AFBC_MODE_S8: return MALI_AFBC_COMPRESSION_MODE_S8;
case PAN_AFBC_MODE_INVALID: unreachable("Invalid AFBC format");
}
unreachable("all AFBC formats handled");
}
#endif

View file

@ -147,13 +147,32 @@ panfrost_compute_checksum_size(
unsigned width,
unsigned height);
/* AFBC */
/* AFBC format mode. The ordering is intended to match the Valhall hardware enum
* ("AFBC Compression Mode"), but this enum is required in software on older
* hardware for correct handling of texture views. Defining the enum lets us
* unify these code paths.
*/
enum pan_afbc_mode {
PAN_AFBC_MODE_R8,
PAN_AFBC_MODE_R8G8,
PAN_AFBC_MODE_R5G6B5,
PAN_AFBC_MODE_R4G4B4A4,
PAN_AFBC_MODE_R5G5B5A1,
PAN_AFBC_MODE_R8G8B8,
PAN_AFBC_MODE_R8G8B8A8,
PAN_AFBC_MODE_R10G10B10A2,
PAN_AFBC_MODE_R11G11B10,
PAN_AFBC_MODE_S8,
/* Sentintel signalling a format that cannot be compressed */
PAN_AFBC_MODE_INVALID
};
bool
panfrost_format_supports_afbc(const struct panfrost_device *dev,
enum pipe_format format);
enum pipe_format
enum pan_afbc_mode
panfrost_afbc_format(unsigned arch, enum pipe_format format);
#define AFBC_HEADER_BYTES_PER_TILE 16