From ca96b3a409b6d293fe7b11032c6eb023cf0bd4ea Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Thu, 13 Oct 2022 19:48:37 +0200 Subject: [PATCH] etnaviv: rs: try to find exact format match first For MSAA downsampling to work correctly, the RS engine needs to know the exact format of the blit source/target. The compatible formats are fine as long as the RS is only used as a tiler without doing any conversion. Signed-off-by: Lucas Stach Reviewed-by: Christian Gmeiner Part-of: --- src/gallium/drivers/etnaviv/etnaviv_rs.c | 8 ++++- .../drivers/etnaviv/etnaviv_translate.h | 29 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.c b/src/gallium/drivers/etnaviv/etnaviv_rs.c index bb4388b12af..1a5c47b27f5 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rs.c +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.c @@ -632,7 +632,13 @@ etna_try_rs_blit(struct pipe_context *pctx, if (blit_info->src.format != blit_info->dst.format) return false; - uint32_t format = etna_compatible_rs_format(blit_info->dst.format); + /* try to find a exact format match first */ + uint32_t format = translate_rs_format(blit_info->dst.format); + /* When not resolving MSAA, but only doing a layout conversion, we can get + * away with a fallback format of matching size. + */ + if (format == ETNA_NO_MATCH && msaa_xscale == 1 && msaa_yscale == 1) + format = etna_compatible_rs_format(blit_info->dst.format); if (format == ETNA_NO_MATCH) return false; diff --git a/src/gallium/drivers/etnaviv/etnaviv_translate.h b/src/gallium/drivers/etnaviv/etnaviv_translate.h index 97316ed4c59..018c1ab35b0 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_translate.h +++ b/src/gallium/drivers/etnaviv/etnaviv_translate.h @@ -271,6 +271,35 @@ translate_ts_format(enum pipe_format fmt) } } +/* formats directly supported in the RS engine */ +static inline uint32_t +translate_rs_format(enum pipe_format fmt) +{ + /* Note: Pipe format convention is LSB to MSB, VIVS is MSB to LSB */ + switch (fmt) { + case PIPE_FORMAT_B4G4R4X4_UNORM: + return RS_FORMAT_X4R4G4B4; + case PIPE_FORMAT_B4G4R4A4_UNORM: + return RS_FORMAT_A4R4G4B4; + case PIPE_FORMAT_B5G5R5X1_UNORM: + return RS_FORMAT_X1R5G5B5; + case PIPE_FORMAT_B5G5R5A1_UNORM: + return RS_FORMAT_A1R5G5B5; + case PIPE_FORMAT_B5G6R5_UNORM: + return RS_FORMAT_R5G6B5; + case PIPE_FORMAT_B8G8R8X8_UNORM: + case PIPE_FORMAT_B8G8R8X8_SRGB: + case PIPE_FORMAT_R8G8B8X8_UNORM: + return RS_FORMAT_X8R8G8B8; + case PIPE_FORMAT_B8G8R8A8_UNORM: + case PIPE_FORMAT_B8G8R8A8_SRGB: + case PIPE_FORMAT_R8G8B8A8_UNORM: + return RS_FORMAT_A8R8G8B8; + default: + return ETNA_NO_MATCH; + } +} + /* Return normalization flag for vertex element format */ static inline uint32_t translate_vertex_format_normalize(enum pipe_format fmt)