diff --git a/src/gallium/drivers/panfrost/pan_blend_shaders.c b/src/gallium/drivers/panfrost/pan_blend_shaders.c index 24c0d6f7e5f..c4e04986ca9 100644 --- a/src/gallium/drivers/panfrost/pan_blend_shaders.c +++ b/src/gallium/drivers/panfrost/pan_blend_shaders.c @@ -261,35 +261,8 @@ bifrost_get_blend_desc(enum pipe_format fmt, unsigned rt) cfg.fixed_function.conversion.memory_format.srgb = desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB; - if (util_format_is_unorm8(desc)) { - cfg.fixed_function.conversion.memory_format.format = MALI_RGBA8_2; - continue; - } - - enum pipe_format linearized = util_format_linear(fmt); - switch (linearized) { - case PIPE_FORMAT_B5G6R5_UNORM: - cfg.fixed_function.conversion.memory_format.format = MALI_R5G6B5; - break; - case PIPE_FORMAT_A4B4G4R4_UNORM: - case PIPE_FORMAT_B4G4R4A4_UNORM: - case PIPE_FORMAT_R4G4B4A4_UNORM: - cfg.fixed_function.conversion.memory_format.format = MALI_RGBA4; - break; - case PIPE_FORMAT_R10G10B10A2_UNORM: - case PIPE_FORMAT_B10G10R10A2_UNORM: - case PIPE_FORMAT_R10G10B10X2_UNORM: - case PIPE_FORMAT_B10G10R10X2_UNORM: - cfg.fixed_function.conversion.memory_format.format = MALI_RGB10_A2_2; - break; - case PIPE_FORMAT_B5G5R5A1_UNORM: - case PIPE_FORMAT_R5G5B5A1_UNORM: - case PIPE_FORMAT_B5G5R5X1_UNORM: - cfg.fixed_function.conversion.memory_format.format = MALI_RGB5_A1; - break; - default: - unreachable("Invalid format"); - } + cfg.fixed_function.conversion.memory_format.format = + panfrost_format_to_bifrost_blend(desc, true); } return res; diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 6345d8d7ec7..40d1bc45392 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -298,7 +298,7 @@ panfrost_emit_bifrost_blend(struct panfrost_batch *batch, cfg.bifrost.internal.fixed_function.num_comps = format_desc->nr_channels; cfg.bifrost.internal.fixed_function.conversion.memory_format.format = - panfrost_format_to_bifrost_blend(format_desc); + panfrost_format_to_bifrost_blend(format_desc, true); if (dev->quirks & HAS_SWIZZLES) { cfg.bifrost.internal.fixed_function.conversion.memory_format.swizzle = panfrost_get_default_swizzle(4); diff --git a/src/panfrost/lib/midgard.xml b/src/panfrost/lib/midgard.xml index bbe131e6e3f..9d152fa0b8b 100644 --- a/src/panfrost/lib/midgard.xml +++ b/src/panfrost/lib/midgard.xml @@ -173,11 +173,22 @@ - - - - - + + + + + + + + + + + + + + + + diff --git a/src/panfrost/lib/pan_blit.c b/src/panfrost/lib/pan_blit.c index 5e0d7aa6061..0a15161f609 100644 --- a/src/panfrost/lib/pan_blit.c +++ b/src/panfrost/lib/pan_blit.c @@ -575,7 +575,7 @@ bifrost_load_emit_blend_rt(struct pan_pool *pool, void *out, cfg.bifrost.equation.color_mask = 0xf; cfg.bifrost.internal.fixed_function.num_comps = format_desc->nr_channels; cfg.bifrost.internal.fixed_function.conversion.memory_format.format = - panfrost_format_to_bifrost_blend(format_desc); + panfrost_format_to_bifrost_blend(format_desc, true); cfg.bifrost.internal.fixed_function.conversion.register_format = blit_type_to_reg_fmt(T); diff --git a/src/panfrost/lib/pan_format.c b/src/panfrost/lib/pan_format.c index 481a538ad9c..acd7b37438a 100644 --- a/src/panfrost/lib/pan_format.c +++ b/src/panfrost/lib/pan_format.c @@ -445,21 +445,35 @@ panfrost_invert_swizzle(const unsigned char *in, unsigned char *out) } enum mali_format -panfrost_format_to_bifrost_blend(const struct util_format_description *desc) +panfrost_format_to_bifrost_blend(const struct util_format_description *desc, bool dither) { - enum mali_format format = panfrost_pipe_format_table[desc->format].hw; - assert(format); + struct pan_blendable_format fmt = panfrost_blend_format(desc->format); - switch (format) { - case MALI_RGBA4_UNORM: - return MALI_RGBA4; - case MALI_RGBA8_UNORM: - case MALI_RGB8_UNORM: - return MALI_RGBA8_2; - case MALI_RGB10_A2_UNORM: - return MALI_RGB10_A2_2; + /* Formats requiring blend shaders are stored raw in the tilebuffer */ + if (!fmt.internal) + return desc->format; + + /* Else, pick the pixel format matching the tilebuffer format */ + switch (fmt.internal) { + case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R8G8B8A8: + return MALI_RGBA8_TB; + + case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R10G10B10A2: + return MALI_RGB10_A2_TB; + + case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R8G8B8A2: + return dither ? MALI_RGB8_A2_AU : MALI_RGB8_A2_PU; + + case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R4G4B4A4: + return dither ? MALI_RGBA4_AU : MALI_RGBA4_PU; + + case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R5G6B5A0: + return dither ? MALI_R5G6B5_AU : MALI_R5G6B5_PU; + + case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R5G5B5A1: + return dither ? MALI_RGB5_A1_AU : MALI_RGB5_A1_PU; default: - return format; + unreachable("invalid internal blendable"); } } diff --git a/src/panfrost/lib/pan_texture.h b/src/panfrost/lib/pan_texture.h index 337641a022a..70f2ca211d6 100644 --- a/src/panfrost/lib/pan_texture.h +++ b/src/panfrost/lib/pan_texture.h @@ -194,7 +194,7 @@ panfrost_bifrost_swizzle(unsigned components) } enum mali_format -panfrost_format_to_bifrost_blend(const struct util_format_description *desc); +panfrost_format_to_bifrost_blend(const struct util_format_description *desc, bool dither); struct pan_pool; struct pan_scoreboard;