Mesa (staging/21.2): panfrost: Add internal afbc_formats

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Oct 27 17:40:57 UTC 2021


Module: Mesa
Branch: staging/21.2
Commit: b49ca39202e0e521692234785da0ee2670f53786
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b49ca39202e0e521692234785da0ee2670f53786

Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date:   Sat Oct 16 19:45:27 2021 -0400

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 at collabora.com>
Cc: mesa-stable
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13205>
(cherry picked from commit 93c9123c313d688913ed86f77c6841738f94988a)

---

 .pick_status.json              |  2 +-
 src/panfrost/lib/pan_afbc.c    | 60 +++++++++++++++++++++++++++++++++---------
 src/panfrost/lib/pan_texture.h |  3 +++
 3 files changed, 51 insertions(+), 14 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 671ce54c46b..a1a5e37ce75 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -670,7 +670,7 @@
         "description": "panfrost: Add internal afbc_formats",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": null
     },
diff --git a/src/panfrost/lib/pan_afbc.c b/src/panfrost/lib/pan_afbc.c
index 652819b5053..49949081bf3 100644
--- a/src/panfrost/lib/pan_afbc.c
+++ b/src/panfrost/lib/pan_afbc.c
@@ -70,37 +70,71 @@
 #define AFBC_TILE_HEIGHT 16
 #define AFBC_CACHE_ALIGN 64
 
-/* Is it possible to AFBC compress a particular format? Common formats (and
- * YUV) are compressible. Some obscure formats are not and fallback on linear,
- * at a performance hit. Also, if you need to disable AFBC entirely in the
- * driver for debug/profiling, just always return false here. */
+/* AFBC supports compressing a few canonical formats. Additional formats are
+ * available by using a canonical internal format. Given a PIPE format, find
+ * the canonical AFBC internal format if it exists, or NONE if the format
+ * cannot be compressed. */
 
-bool
-panfrost_format_supports_afbc(const struct panfrost_device *dev, enum pipe_format format)
+enum pipe_format
+panfrost_afbc_format(const struct panfrost_device *dev, enum pipe_format format)
 {
+        /* Don't allow swizzled formats on v7 */
         switch (format) {
+        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:
+        case PIPE_FORMAT_B8G8R8_UNORM:
+        case PIPE_FORMAT_B5G6R5_UNORM:
+                if (dev->arch >= 7)
+                        return PIPE_FORMAT_NONE;
+
+                break;
+        default:
+                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_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_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:
-        case PIPE_FORMAT_B8G8R8_UNORM:
+                return PIPE_FORMAT_R8G8B8A8_UNORM;
+
+        case PIPE_FORMAT_R5G6B5_UNORM:
         case PIPE_FORMAT_B5G6R5_UNORM:
-                return (dev->arch < 7);
+                return PIPE_FORMAT_R5G6B5_UNORM;
+
+        /* TODO: More AFBC formats */
         default:
-                return false;
+                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
 panfrost_afbc_header_size(unsigned width, unsigned height)
 {
diff --git a/src/panfrost/lib/pan_texture.h b/src/panfrost/lib/pan_texture.h
index d8d9093f127..02288799abf 100644
--- a/src/panfrost/lib/pan_texture.h
+++ b/src/panfrost/lib/pan_texture.h
@@ -157,6 +157,9 @@ bool
 panfrost_format_supports_afbc(const struct panfrost_device *dev,
                 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
 
 unsigned



More information about the mesa-commit mailing list