panfrost: Fix clean_pixel_write_enable forced check for AFBC

Clean tiles must actually be written back for AFBC buffers (color,
z/s) when either one of the effective tile size dimension is smaller
than the superblock dimension. This commit fixes the current check
which compares the effective tile size to the superblock size.

Fixes: 762a0f4133 ("panfrost: Add the concept of render block")
Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38422>
(cherry picked from commit 098b69a05c)
This commit is contained in:
Loïc Molinari 2025-11-13 10:02:43 +01:00 committed by Eric Engestrom
parent db6cbb8410
commit 51ed940bb8
10 changed files with 55 additions and 18 deletions

View file

@ -204,7 +204,7 @@
"description": "panfrost: Fix clean_pixel_write_enable forced check for AFBC",
"nominated": true,
"nomination_type": 2,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "762a0f413369ecbbeb94810b133e66963b69208b",
"notes": null

View file

@ -3,7 +3,6 @@ dEQP-VK.wsi.wayland.swapchain.create.image_extent,Crash
dEQP-VK.wsi.wayland.swapchain.simulate_oom.image_extent,Crash
angle-KHR-GLES3.framebuffer_blit.scissor_blit,Fail
angle-KHR-GLES3.packed_depth_stencil.verify_read_pixels.depth24_stencil8,Fail
angle-KHR-GLES3.packed_depth_stencil.verify_read_pixels.depth32f_stencil8,Fail
angle-KHR-GLES31.core.shader_atomic_counters.advanced-usage-multi-stage,Fail

View file

@ -1723,7 +1723,8 @@
<field name="MSAA" size="2" start="0:8" default="Single" type="MSAA"/>
<field name="Reverse Issue Order" size="1" start="0:30" type="bool"/>
<!-- Note: Must be set if AFBC is enabled and effective_tile_size is not 16x16 -->
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="0:31" type="bool"/>
<field name="Header" size="64" start="8:0" type="address"/>
@ -1749,7 +1750,8 @@
<field name="MSAA" size="2" start="0:24" default="Single" type="MSAA"/>
<field name="Reverse Issue Order" size="1" start="0:30" type="bool"/>
<!-- Note: Must be set if AFBC is enabled and effective_tile_size is not 16x16 -->
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="0:31" type="bool"/>
<field name="Header" size="64" start="12:0" type="address"/>
@ -1849,6 +1851,8 @@
<field name="sRGB" size="1" start="1:14" type="bool"/>
<field name="Dithering Enable" size="1" start="1:15" type="bool"/>
<field name="Swizzle" size="12" start="1:16" type="Component Swizzle"/>
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="1:31" type="bool"/>
<field name="YUV Transform" size="1" start="2:0" type="bool"/>
<field name="Split block" size="1" start="2:1" type="bool"/>

View file

@ -2010,7 +2010,8 @@
<field name="MSAA" size="2" start="0:8" default="Single" type="MSAA"/>
<field name="Reverse Issue Order" size="1" start="0:30" type="bool"/>
<!-- Note: Must be set if AFBC is enabled and effective_tile_size is not 16x16 -->
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="0:31" type="bool"/>
<field name="Header" size="64" start="8:0" type="address"/>
@ -2037,7 +2038,8 @@
<field name="MSAA" size="2" start="0:24" default="Single" type="MSAA"/>
<field name="Reverse Issue Order" size="1" start="0:30" type="bool"/>
<!-- Note: Must be set if AFBC is enabled and effective_tile_size is not 16x16 -->
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="0:31" type="bool"/>
<field name="Header" size="64" start="12:0" type="address"/>
@ -2137,6 +2139,8 @@
<field name="sRGB" size="1" start="1:14" type="bool"/>
<field name="Dithering Enable" size="1" start="1:15" type="bool"/>
<field name="Swizzle" size="12" start="1:16" type="Component Swizzle"/>
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="1:31" type="bool"/>
<field name="YUV Transform" size="1" start="2:0" type="bool"/>
<field name="Split block" size="1" start="2:1" type="bool"/>

View file

@ -2316,7 +2316,8 @@
<field name="MSAA" size="2" start="0:8" default="Single" type="MSAA"/>
<field name="Reverse Issue Order" size="1" start="0:30" type="bool"/>
<!-- Note: Must be set if AFBC is enabled and effective_tile_size is not 16x16 -->
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="0:31" type="bool"/>
<field name="Header" size="64" start="8:0" type="address"/>
@ -2343,7 +2344,8 @@
<field name="MSAA" size="2" start="0:24" default="Single" type="MSAA"/>
<field name="Reverse Issue Order" size="1" start="0:30" type="bool"/>
<!-- Note: Must be set if AFBC is enabled and effective_tile_size is not 16x16 -->
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="0:31" type="bool"/>
<field name="Header" size="64" start="12:0" type="address"/>
@ -2443,6 +2445,8 @@
<field name="sRGB" size="1" start="1:14" type="bool"/>
<field name="Dithering Enable" size="1" start="1:15" type="bool"/>
<field name="Swizzle" size="12" start="1:16" type="Component Swizzle"/>
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="1:31" type="bool"/>
<field name="YUV Transform" size="1" start="2:0" type="bool"/>
<field name="Split block" size="1" start="2:1" type="bool"/>

View file

@ -1009,6 +1009,8 @@
<field name="Block Format" size="2" start="3:4" type="Block Format"/>
<field name="MSAA" size="2" start="3:6" default="Single" type="MSAA"/>
<field name="Big Endian" size="1" start="3:8" type="bool"/>
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="3:10" type="bool"/>
<field name="Header" size="64" start="4:0" type="address"/>
<field name="Header Row Stride" size="13" start="6:0" type="uint"/>
@ -1121,6 +1123,8 @@
<field name="sRGB" size="1" start="1:14" type="bool"/>
<field name="Dithering Enable" size="1" start="1:15" type="bool"/>
<field name="Swizzle" size="12" start="1:16" type="Component Swizzle"/>
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="1:31" type="bool"/>
<field name="Header" size="64" start="4:0" type="address"/>
<field name="Row Stride" size="13" start="6:0" type="uint"/>

View file

@ -1101,6 +1101,8 @@
<field name="Write Format" size="4" start="3:0" type="ZS Format"/>
<field name="Block Format" size="4" start="3:4" type="Block Format"/>
<field name="MSAA" size="2" start="3:8" default="Single" type="MSAA"/>
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="3:10" type="bool"/>
<field name="Header" size="64" start="4:0" type="address"/>
<field name="Header Row Stride" size="13" start="6:0" type="uint"/>
@ -1203,6 +1205,8 @@
<field name="sRGB" size="1" start="1:14" type="bool"/>
<field name="Dithering Enable" size="1" start="1:15" type="bool"/>
<field name="Swizzle" size="12" start="1:16" type="Component Swizzle"/>
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="1:31" type="bool"/>
<field name="Header" size="64" start="4:0" type="address"/>
<field name="Row Stride" size="13" start="6:0" type="uint"/>

View file

@ -1147,7 +1147,8 @@
<field name="MSAA" size="2" start="0:8" default="Single" type="MSAA"/>
<field name="Reverse Issue Order" size="1" start="0:30" type="bool"/>
<!-- Note: Must be set if AFBC is enabled and effective_tile_size is not 16x16 -->
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="0:31" type="bool"/>
<field name="Header" size="64" start="8:0" type="address"/>
@ -1173,7 +1174,8 @@
<field name="MSAA" size="2" start="0:24" default="Single" type="MSAA"/>
<field name="Reverse Issue Order" size="1" start="0:30" type="bool"/>
<!-- Note: Must be set if AFBC is enabled and effective_tile_size is not 16x16 -->
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="0:31" type="bool"/>
<field name="Header" size="64" start="12:0" type="address"/>
@ -1270,6 +1272,8 @@
<field name="sRGB" size="1" start="1:14" type="bool"/>
<field name="Dithering Enable" size="1" start="1:15" type="bool"/>
<field name="Swizzle" size="12" start="1:16" type="Component Swizzle"/>
<!-- Must be set if either one of the effective tile size dimension is
smaller than the AFBC superblock dimension. -->
<field name="Clean Pixel Write Enable" size="1" start="1:31" type="bool"/>
<field name="YUV Transform" size="1" start="2:0" type="bool"/>
<field name="Split block" size="1" start="2:1" type="bool"/>

View file

@ -940,9 +940,9 @@ pan_fix_frame_shader_mode(enum mali_pre_post_frame_shader_mode mode,
return mode;
}
/* Regardless of clean_tile_write_enable, the hardware writes clean tiles if
* the effective tile size differs from the superblock size of any enabled AFBC
* render target. Check this condition. */
/* Clean tiles must be written back for AFBC buffers (color, z/s) when either
* one of the effective tile size dimension is smaller than the superblock
* dimension. */
static bool
pan_force_clean_write_on(const struct pan_image *image, unsigned tile_size)
@ -953,13 +953,15 @@ pan_force_clean_write_on(const struct pan_image *image, unsigned tile_size)
if (!drm_is_afbc(image->props.modifier))
return false;
struct pan_image_block_size renderblk_sz =
pan_afbc_renderblock_size(image->props.modifier);
assert(renderblk_sz.width >= 16 && renderblk_sz.height >= 16);
assert(tile_size <= pan_max_effective_tile_size(PAN_ARCH));
return tile_size != renderblk_sz.width * renderblk_sz.height;
struct pan_image_block_size tileblk_sz =
pan_effective_tile_block_size(tile_size);
struct pan_image_block_size superblk_sz =
pan_afbc_superblock_size(image->props.modifier);
return tileblk_sz.width < superblk_sz.width ||
tileblk_sz.height < superblk_sz.height;
}
static bool

View file

@ -247,6 +247,18 @@ pan_sample_pattern(unsigned samples)
}
}
static inline struct pan_image_block_size
pan_effective_tile_block_size(unsigned tile_size)
{
/* Tile is either a square or a rect whose width is twice the height. */
unsigned shift_h = util_logbase2(tile_size);
unsigned shift_w = shift_h + 1;
unsigned h = 1 << (shift_h >> 1);
unsigned w = 1 << (shift_w >> 1);
return (struct pan_image_block_size){w, h};
}
void GENX(pan_select_tile_size)(struct pan_fb_info *fb);
void GENX(pan_emit_tls)(const struct pan_tls_info *info,