panfrost: Add internal afbc_formats
We need to know the internal (physical) formats used for AFBC of a given logical format, in order to check format compatibility and determine if we need to decompress AFBC for conformance. Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com> Cc: mesa-stable Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13205>
This commit is contained in:
parent
342ed4909f
commit
93c9123c31
|
@ -70,23 +70,16 @@
|
||||||
#define AFBC_TILE_HEIGHT 16
|
#define AFBC_TILE_HEIGHT 16
|
||||||
#define AFBC_CACHE_ALIGN 64
|
#define AFBC_CACHE_ALIGN 64
|
||||||
|
|
||||||
/* Is it possible to AFBC compress a particular format? Common formats (and
|
/* AFBC supports compressing a few canonical formats. Additional formats are
|
||||||
* YUV) are compressible. Some obscure formats are not and fallback on linear,
|
* available by using a canonical internal format. Given a PIPE format, find
|
||||||
* at a performance hit. Also, if you need to disable AFBC entirely in the
|
* the canonical AFBC internal format if it exists, or NONE if the format
|
||||||
* driver for debug/profiling, just always return false here. */
|
* cannot be compressed. */
|
||||||
|
|
||||||
bool
|
enum pipe_format
|
||||||
panfrost_format_supports_afbc(const struct panfrost_device *dev, enum pipe_format format)
|
panfrost_afbc_format(const struct panfrost_device *dev, enum pipe_format format)
|
||||||
{
|
{
|
||||||
|
/* Don't allow swizzled formats on v7 */
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case PIPE_FORMAT_R8G8B8A8_UNORM:
|
|
||||||
case PIPE_FORMAT_R8G8B8X8_UNORM:
|
|
||||||
case PIPE_FORMAT_R8G8B8_UNORM:
|
|
||||||
case PIPE_FORMAT_R5G6B5_UNORM:
|
|
||||||
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
|
|
||||||
case PIPE_FORMAT_Z24X8_UNORM:
|
|
||||||
case PIPE_FORMAT_Z16_UNORM:
|
|
||||||
return true;
|
|
||||||
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
||||||
case PIPE_FORMAT_B8G8R8X8_UNORM:
|
case PIPE_FORMAT_B8G8R8X8_UNORM:
|
||||||
case PIPE_FORMAT_A8R8G8B8_UNORM:
|
case PIPE_FORMAT_A8R8G8B8_UNORM:
|
||||||
|
@ -95,10 +88,51 @@ panfrost_format_supports_afbc(const struct panfrost_device *dev, enum pipe_forma
|
||||||
case PIPE_FORMAT_A8B8G8R8_UNORM:
|
case PIPE_FORMAT_A8B8G8R8_UNORM:
|
||||||
case PIPE_FORMAT_B8G8R8_UNORM:
|
case PIPE_FORMAT_B8G8R8_UNORM:
|
||||||
case PIPE_FORMAT_B5G6R5_UNORM:
|
case PIPE_FORMAT_B5G6R5_UNORM:
|
||||||
return (dev->arch < 7);
|
if (dev->arch >= 7)
|
||||||
|
return PIPE_FORMAT_NONE;
|
||||||
|
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (format) {
|
||||||
|
case PIPE_FORMAT_Z16_UNORM:
|
||||||
|
return PIPE_FORMAT_R8G8_UNORM;
|
||||||
|
|
||||||
|
case PIPE_FORMAT_R8G8B8_UNORM:
|
||||||
|
case PIPE_FORMAT_B8G8R8_UNORM:
|
||||||
|
return PIPE_FORMAT_R8G8B8_UNORM;
|
||||||
|
|
||||||
|
case PIPE_FORMAT_R8G8B8A8_UNORM:
|
||||||
|
case PIPE_FORMAT_R8G8B8X8_UNORM:
|
||||||
|
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
|
||||||
|
case PIPE_FORMAT_Z24X8_UNORM:
|
||||||
|
case PIPE_FORMAT_X24S8_UINT:
|
||||||
|
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
||||||
|
case PIPE_FORMAT_B8G8R8X8_UNORM:
|
||||||
|
case PIPE_FORMAT_A8R8G8B8_UNORM:
|
||||||
|
case PIPE_FORMAT_X8R8G8B8_UNORM:
|
||||||
|
case PIPE_FORMAT_X8B8G8R8_UNORM:
|
||||||
|
case PIPE_FORMAT_A8B8G8R8_UNORM:
|
||||||
|
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
|
||||||
|
case PIPE_FORMAT_R5G6B5_UNORM:
|
||||||
|
case PIPE_FORMAT_B5G6R5_UNORM:
|
||||||
|
return PIPE_FORMAT_R5G6B5_UNORM;
|
||||||
|
|
||||||
|
/* TODO: More AFBC formats */
|
||||||
|
default:
|
||||||
|
return PIPE_FORMAT_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A format may be compressed as AFBC if it has an AFBC internal format */
|
||||||
|
|
||||||
|
bool
|
||||||
|
panfrost_format_supports_afbc(const struct panfrost_device *dev, enum pipe_format format)
|
||||||
|
{
|
||||||
|
return panfrost_afbc_format(dev, format) != PIPE_FORMAT_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
|
|
|
@ -148,6 +148,9 @@ bool
|
||||||
panfrost_format_supports_afbc(const struct panfrost_device *dev,
|
panfrost_format_supports_afbc(const struct panfrost_device *dev,
|
||||||
enum pipe_format format);
|
enum pipe_format format);
|
||||||
|
|
||||||
|
enum pipe_format
|
||||||
|
panfrost_afbc_format(const struct panfrost_device *dev, enum pipe_format format);
|
||||||
|
|
||||||
#define AFBC_HEADER_BYTES_PER_TILE 16
|
#define AFBC_HEADER_BYTES_PER_TILE 16
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
|
|
Loading…
Reference in New Issue