From: Icecream95 Date: Tue, 2 Jun 2020 02:14:12 +0000 (+1200) Subject: panfrost: Only use AFBC YTR with RGB and RGBA X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=99446c9f7d34a0bbefa47fdd6acb539421b59d65;p=mesa.git panfrost: Only use AFBC YTR with RGB and RGBA The "lossless colorspace transform" is lossy for R and RG formats. Reviewed-by: Alyssa Rosenzweig Part-of: --- diff --git a/src/gallium/drivers/panfrost/pan_mfbd.c b/src/gallium/drivers/panfrost/pan_mfbd.c index 4b762d1b646..62d86a678e7 100644 --- a/src/gallium/drivers/panfrost/pan_mfbd.c +++ b/src/gallium/drivers/panfrost/pan_mfbd.c @@ -241,7 +241,13 @@ panfrost_mfbd_set_cbuf( rt->framebuffer = base + header_size; rt->afbc.metadata = base; rt->afbc.stride = 0; - rt->afbc.flags = MALI_AFBC_FLAGS | MALI_AFBC_YTR; + rt->afbc.flags = MALI_AFBC_FLAGS; + + unsigned components = util_format_get_nr_components(surf->format); + + /* The "lossless colorspace transform" is lossy for R and RG formats */ + if (components >= 3) + rt->afbc.flags |= MALI_AFBC_YTR; /* TODO: The blob sets this to something nonzero, but it's not * clear what/how to calculate/if it matters */ diff --git a/src/panfrost/encoder/pan_texture.c b/src/panfrost/encoder/pan_texture.c index 22ff30828ca..cfd66c78c43 100644 --- a/src/panfrost/encoder/pan_texture.c +++ b/src/panfrost/encoder/pan_texture.c @@ -82,8 +82,10 @@ panfrost_astc_stretch(unsigned dim) return MIN2(dim, 11) - 4; } -/* Texture addresses are tagged with information about AFBC (colour AFBC?) xor - * ASTC (stretch factor) if in use. */ +/* Texture addresses are tagged with information about compressed formats. + * AFBC uses a bit for whether the colorspace transform is enabled (RGB and + * RGBA only). + * For ASTC, this is a "stretch factor" encoding the block size. */ static unsigned panfrost_compression_tag( @@ -91,7 +93,7 @@ panfrost_compression_tag( enum mali_format format, enum mali_texture_layout layout) { if (layout == MALI_TEXTURE_AFBC) - return util_format_has_depth(desc) ? 0x0 : 0x1; + return desc->nr_channels >= 3; else if (format == MALI_ASTC_HDR_SUPP || format == MALI_ASTC_SRGB_SUPP) return (panfrost_astc_stretch(desc->block.height) << 3) | panfrost_astc_stretch(desc->block.width);