diff --git a/.pick_status.json b/.pick_status.json
index fd56816da28..648c6224ade 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -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
diff --git a/src/panfrost/ci/panfrost-g925-fails.txt b/src/panfrost/ci/panfrost-g925-fails.txt
index 3566bd31d31..94645a08fba 100644
--- a/src/panfrost/ci/panfrost-g925-fails.txt
+++ b/src/panfrost/ci/panfrost-g925-fails.txt
@@ -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
diff --git a/src/panfrost/genxml/v10.xml b/src/panfrost/genxml/v10.xml
index ffb448afdad..2303aa8f7b8 100644
--- a/src/panfrost/genxml/v10.xml
+++ b/src/panfrost/genxml/v10.xml
@@ -1723,7 +1723,8 @@
-
+
@@ -1749,7 +1750,8 @@
-
+
@@ -1849,6 +1851,8 @@
+
diff --git a/src/panfrost/genxml/v12.xml b/src/panfrost/genxml/v12.xml
index 5526f24baa0..ad4d8f9f41e 100644
--- a/src/panfrost/genxml/v12.xml
+++ b/src/panfrost/genxml/v12.xml
@@ -2010,7 +2010,8 @@
-
+
@@ -2037,7 +2038,8 @@
-
+
@@ -2137,6 +2139,8 @@
+
diff --git a/src/panfrost/genxml/v13.xml b/src/panfrost/genxml/v13.xml
index 4e7f7038556..7e94a8209f0 100644
--- a/src/panfrost/genxml/v13.xml
+++ b/src/panfrost/genxml/v13.xml
@@ -2316,7 +2316,8 @@
-
+
@@ -2343,7 +2344,8 @@
-
+
@@ -2443,6 +2445,8 @@
+
diff --git a/src/panfrost/genxml/v6.xml b/src/panfrost/genxml/v6.xml
index 69fd18ef61d..ff06bd54349 100644
--- a/src/panfrost/genxml/v6.xml
+++ b/src/panfrost/genxml/v6.xml
@@ -1009,6 +1009,8 @@
+
@@ -1121,6 +1123,8 @@
+
diff --git a/src/panfrost/genxml/v7.xml b/src/panfrost/genxml/v7.xml
index 9bf1190899b..a0a8477b384 100644
--- a/src/panfrost/genxml/v7.xml
+++ b/src/panfrost/genxml/v7.xml
@@ -1101,6 +1101,8 @@
+
@@ -1203,6 +1205,8 @@
+
diff --git a/src/panfrost/genxml/v9.xml b/src/panfrost/genxml/v9.xml
index f0b82108859..57ecc2a07bc 100644
--- a/src/panfrost/genxml/v9.xml
+++ b/src/panfrost/genxml/v9.xml
@@ -1147,7 +1147,8 @@
-
+
@@ -1173,7 +1174,8 @@
-
+
@@ -1270,6 +1272,8 @@
+
diff --git a/src/panfrost/lib/pan_desc.c b/src/panfrost/lib/pan_desc.c
index 7803b1e5029..9e3532849bc 100644
--- a/src/panfrost/lib/pan_desc.c
+++ b/src/panfrost/lib/pan_desc.c
@@ -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
diff --git a/src/panfrost/lib/pan_desc.h b/src/panfrost/lib/pan_desc.h
index 5adcdb128d9..f657038125b 100644
--- a/src/panfrost/lib/pan_desc.h
+++ b/src/panfrost/lib/pan_desc.h
@@ -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,