panfrost: Specialize blendable formats for sRGB
authorAlyssa Rosenzweig <alyssa@collabora.com>
Mon, 12 Apr 2021 15:18:16 +0000 (11:18 -0400)
committerMarge Bot <eric+marge@anholt.net>
Wed, 21 Apr 2021 13:20:40 +0000 (13:20 +0000)
Avoids the need to go between linear and sRGB pipe formats in the hot
path. We're already reserving the space, may as well use it.

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/10188>

src/panfrost/lib/pan_format.c

index fcc8ac3..2b4bfcb 100644 (file)
 #define MALI_BLEND_AU_R5G5B5A1    (MALI_RGB5_A1_AU  << 12)
 #define MALI_BLEND_PU_R5G5B5A1    (MALI_RGB5_A1_PU  << 12)
 
-#define BFMT2(pipe, internal, writeback) \
+#define BFMT2(pipe, internal, writeback, srgb) \
         [PIPE_FORMAT_##pipe] = { \
                 MALI_COLOR_BUFFER_INTERNAL_FORMAT_## internal, \
                 MALI_MFBD_COLOR_FORMAT_## writeback, \
-                MALI_BLEND_AU_ ## internal, \
-                MALI_BLEND_PU_ ## internal, \
+                MALI_BLEND_AU_ ## internal | (srgb ? (1 << 20) : 0), \
+                MALI_BLEND_PU_ ## internal | (srgb ? (1 << 20) : 0), \
         }
 
 #define BFMT(pipe, internal_and_writeback) \
-        BFMT2(pipe, internal_and_writeback, internal_and_writeback)
+        BFMT2(pipe, internal_and_writeback, internal_and_writeback, 0)
+
+#define BFMT_SRGB(pipe, writeback) \
+        BFMT2(pipe ##_UNORM, R8G8B8A8, writeback, 0), \
+        BFMT2(pipe ##_SRGB, R8G8B8A8, writeback, 1)
 
 static const struct pan_blendable_format panfrost_blendable_formats[PIPE_FORMAT_COUNT] = {
-        BFMT2(L8_UNORM, R8G8B8A8, R8),
-        BFMT2(L8A8_UNORM, R8G8B8A8, R8G8),
-        BFMT2(I8_UNORM, R8G8B8A8, R8),
-        BFMT2(A8_UNORM, R8G8B8A8, R8),
-        BFMT2(R8_UNORM, R8G8B8A8, R8),
-        BFMT2(R8G8_UNORM, R8G8B8A8, R8G8),
-        BFMT2(R8G8B8_UNORM, R8G8B8A8, R8G8B8),
-
-        BFMT(B8G8R8A8_UNORM, R8G8B8A8),
-        BFMT(B8G8R8X8_UNORM, R8G8B8A8),
-        BFMT(A8R8G8B8_UNORM, R8G8B8A8),
-        BFMT(X8R8G8B8_UNORM, R8G8B8A8),
-        BFMT(A8B8G8R8_UNORM, R8G8B8A8),
-        BFMT(X8B8G8R8_UNORM, R8G8B8A8),
-        BFMT(R8G8B8X8_UNORM, R8G8B8A8),
-        BFMT(R8G8B8A8_UNORM, R8G8B8A8),
-
-        BFMT2(B5G6R5_UNORM, R5G6B5A0, R5G6B5),
+        BFMT_SRGB(L8, R8),
+        BFMT_SRGB(L8A8, R8G8),
+        BFMT_SRGB(R8, R8),
+        BFMT_SRGB(R8G8, R8G8),
+        BFMT_SRGB(R8G8B8, R8G8B8),
+
+        BFMT_SRGB(B8G8R8A8, R8G8B8A8),
+        BFMT_SRGB(B8G8R8X8, R8G8B8A8),
+        BFMT_SRGB(A8R8G8B8, R8G8B8A8),
+        BFMT_SRGB(X8R8G8B8, R8G8B8A8),
+        BFMT_SRGB(A8B8G8R8, R8G8B8A8),
+        BFMT_SRGB(X8B8G8R8, R8G8B8A8),
+        BFMT_SRGB(R8G8B8X8, R8G8B8A8),
+        BFMT_SRGB(R8G8B8A8, R8G8B8A8),
+
+        BFMT2(A8_UNORM, R8G8B8A8, R8, 0),
+        BFMT2(I8_UNORM, R8G8B8A8, R8, 0),
+        BFMT2(B5G6R5_UNORM, R5G6B5A0, R5G6B5, 0),
 
         BFMT(A4B4G4R4_UNORM, R4G4B4A4),
         BFMT(B4G4R4A4_UNORM, R4G4B4A4),
@@ -89,12 +93,10 @@ static const struct pan_blendable_format panfrost_blendable_formats[PIPE_FORMAT_
         BFMT(B5G5R5X1_UNORM, R5G5B5A1),
 };
 
-/* Accessor that is generic over linear/sRGB */
-
 struct pan_blendable_format
 panfrost_blend_format(enum pipe_format format)
 {
-        return panfrost_blendable_formats[util_format_linear(format)];
+        return panfrost_blendable_formats[format];
 }
 
 /* Convenience */
@@ -699,7 +701,7 @@ unsigned
 panfrost_format_to_bifrost_blend(const struct panfrost_device *dev,
                                  const struct util_format_description *desc, bool dither)
 {
-        struct pan_blendable_format fmt = panfrost_blend_format(desc->format);
+        struct pan_blendable_format fmt = panfrost_blendable_formats[desc->format];
 
         /* Formats requiring blend shaders are stored raw in the tilebuffer */
         if (!fmt.internal)
@@ -710,9 +712,6 @@ panfrost_format_to_bifrost_blend(const struct panfrost_device *dev,
         if (dev->quirks & HAS_SWIZZLES)
                 extra |= panfrost_get_default_swizzle(4);
 
-        if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
-                extra |= 1 << 20;
-
         return (dither ? fmt.bifrost_dither : fmt.bifrost_no_dither) | extra;
 }