panfrost: use RGB1 component ordering for R5G6B5 pixel formats

For some purposes (e.g. advanced blending) we need a non-zero alpha
value returned from reads. This is only guaranteed on Bifrost if
we explicitly request RGB1 component ordering. The default is to use
RGBA component ordering, which for R5G6B5 causes 0 to be read for
alpha.

A complication is that the Mali fixed function hardware requires
four components (which implies RGBA rather than RGB1). If fixed
function blending is in use, we modify the pixel format back to
RGBA when building the blend descriptor.

Cc: mesa-stable
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Mary Guillemard <mary.guillemard@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29606>
This commit is contained in:
Eric R. Smith 2024-06-04 13:38:21 -03:00 committed by Marge Bot
parent 5ab29555cf
commit 004e0eb3ab
2 changed files with 32 additions and 24 deletions

View file

@ -47,6 +47,7 @@
#include "pan_cmdstream.h"
#include "pan_context.h"
#include "pan_csf.h"
#include "pan_format.h"
#include "pan_indirect_dispatch.h"
#include "pan_jm.h"
#include "pan_job.h"
@ -387,6 +388,17 @@ panfrost_emit_blend(struct panfrost_batch *batch, void *rts,
panfrost_dithered_format_from_pipe_format)(format, dithered);
cfg.fixed_function.rt = i;
#if PAN_ARCH >= 7
if (cfg.mode == MALI_BLEND_MODE_FIXED_FUNCTION &&
(cfg.fixed_function.conversion.memory_format & 0xff) ==
MALI_RGB_COMPONENT_ORDER_RGB1) {
/* fixed function does not like RGB1 as the component order */
/* force this field to be the default 0 (RGBA) */
cfg.fixed_function.conversion.memory_format &= ~0xff;
cfg.fixed_function.conversion.memory_format |=
MALI_RGB_COMPONENT_ORDER_RGBA;
}
#endif
#if PAN_ARCH <= 7
if (!info.opaque) {
cfg.fixed_function.alpha_zero_nop = info.alpha_zero_nop;

View file

@ -30,18 +30,26 @@
/* Convenience */
#define MALI_BLEND_AU_R8G8B8A8 (MALI_RGBA8_TB << 12)
#define MALI_BLEND_PU_R8G8B8A8 (MALI_RGBA8_TB << 12)
#define MALI_BLEND_AU_R10G10B10A2 (MALI_RGB10_A2_TB << 12)
#define MALI_BLEND_PU_R10G10B10A2 (MALI_RGB10_A2_TB << 12)
#define MALI_BLEND_AU_R8G8B8A2 (MALI_RGB8_A2_AU << 12)
#define MALI_BLEND_PU_R8G8B8A2 (MALI_RGB8_A2_PU << 12)
#define MALI_BLEND_AU_R4G4B4A4 (MALI_RGBA4_AU << 12)
#define MALI_BLEND_PU_R4G4B4A4 (MALI_RGBA4_PU << 12)
#define MALI_BLEND_AU_R5G6B5A0 (MALI_R5G6B5_AU << 12)
#define MALI_BLEND_PU_R5G6B5A0 (MALI_R5G6B5_PU << 12)
#define MALI_BLEND_AU_R5G5B5A1 (MALI_RGB5_A1_AU << 12)
#define MALI_BLEND_PU_R5G5B5A1 (MALI_RGB5_A1_PU << 12)
#if PAN_ARCH == 6
#define MALI_RGBA_SWIZZLE PAN_V6_SWIZZLE(R, G, B, A)
#define MALI_RGB1_SWIZZLE PAN_V6_SWIZZLE(R, G, B, A)
#else
#define MALI_RGBA_SWIZZLE MALI_RGB_COMPONENT_ORDER_RGBA
#define MALI_RGB1_SWIZZLE MALI_RGB_COMPONENT_ORDER_RGB1
#endif
#define MALI_BLEND_AU_R8G8B8A8 (MALI_RGBA8_TB << 12) | MALI_RGBA_SWIZZLE
#define MALI_BLEND_PU_R8G8B8A8 (MALI_RGBA8_TB << 12) | MALI_RGBA_SWIZZLE
#define MALI_BLEND_AU_R10G10B10A2 (MALI_RGB10_A2_TB << 12) | MALI_RGBA_SWIZZLE
#define MALI_BLEND_PU_R10G10B10A2 (MALI_RGB10_A2_TB << 12) | MALI_RGBA_SWIZZLE
#define MALI_BLEND_AU_R8G8B8A2 (MALI_RGB8_A2_AU << 12) | MALI_RGBA_SWIZZLE
#define MALI_BLEND_PU_R8G8B8A2 (MALI_RGB8_A2_PU << 12) | MALI_RGBA_SWIZZLE
#define MALI_BLEND_AU_R4G4B4A4 (MALI_RGBA4_AU << 12) | MALI_RGBA_SWIZZLE
#define MALI_BLEND_PU_R4G4B4A4 (MALI_RGBA4_PU << 12) | MALI_RGBA_SWIZZLE
#define MALI_BLEND_AU_R5G6B5A0 (MALI_R5G6B5_AU << 12) | MALI_RGB1_SWIZZLE
#define MALI_BLEND_PU_R5G6B5A0 (MALI_R5G6B5_PU << 12) | MALI_RGB1_SWIZZLE
#define MALI_BLEND_AU_R5G5B5A1 (MALI_RGB5_A1_AU << 12) | MALI_RGBA_SWIZZLE
#define MALI_BLEND_PU_R5G5B5A1 (MALI_RGB5_A1_PU << 12) | MALI_RGBA_SWIZZLE
#if PAN_ARCH <= 5
#define BFMT2(pipe, internal, writeback, srgb) \
@ -50,18 +58,6 @@
MALI_COLOR_FORMAT_##writeback, \
{ 0, 0 }, \
}
#elif PAN_ARCH == 6
#define BFMT2(pipe, internal, writeback, srgb) \
[PIPE_FORMAT_##pipe] = { \
MALI_COLOR_BUFFER_INTERNAL_FORMAT_##internal, \
MALI_COLOR_FORMAT_##writeback, \
{ \
MALI_BLEND_PU_##internal | (srgb ? (1 << 20) : 0) | \
PAN_V6_SWIZZLE(R, G, B, A), \
MALI_BLEND_AU_##internal | (srgb ? (1 << 20) : 0) | \
PAN_V6_SWIZZLE(R, G, B, A), \
}, \
}
#else
#define BFMT2(pipe, internal, writeback, srgb) \
[PIPE_FORMAT_##pipe] = { \