panfrost: Specialize blendable formats for sRGB

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>
This commit is contained in:
Alyssa Rosenzweig
2021-04-12 11:18:16 -04:00
committed by Marge Bot
parent 218b50fae4
commit 86e895c429
+26 -27
View File
@@ -44,36 +44,40 @@
#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_SRGB(L8, R8),
BFMT_SRGB(L8A8, R8G8),
BFMT_SRGB(R8, R8),
BFMT_SRGB(R8G8, R8G8),
BFMT_SRGB(R8G8B8, 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),
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(B5G6R5_UNORM, R5G6B5A0, R5G6B5),
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;
}