From c2e78f1b225f3208c771c285edfd369149c60fda Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Wed, 29 Apr 2026 17:09:51 +0200 Subject: [PATCH] tu: Fix CP_CCHE_INVALIDATE not being applied at the right point Apparently CP_CCHE_INVALIDATE is just a plain register write underneath, so it needs WFI before it, in order to invalidate at the right point. ``` CP_CCHE_INVALIDATE: mov $addr, 0x9881 mov $data, 0x1 waitin mov $01, $data ``` Fixes misrendering in Doom Eternal on A750. Fixes: fb1c3f7f5de ("tu: Implement CCHE invalidation") Signed-off-by: Danylo Piliaiev Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index 4055a511008..aeaf8676d08 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -352,8 +352,13 @@ tu6_emit_flushes(struct tu_cmd_buffer *cmd_buffer, tu_emit_event_write(cmd_buffer, cs, FD_CCU_CLEAN_BLIT_CACHE); if (CHIP >= A7XX && (flushes & TU_CMD_FLAG_CCHE_INVALIDATE) && /* Invalidating UCHE seems to also invalidate CCHE */ - !(flushes & TU_CMD_FLAG_CACHE_INVALIDATE)) + !(flushes & TU_CMD_FLAG_CACHE_INVALIDATE)) { + /* CP_CCHE_INVALIDATE is just a plain register write underneath, so + * it needs WFI before it, in order to invalidate at the right point. + */ + tu_cs_emit_wfi(cs); tu_cs_emit_pkt7(cs, CP_CCHE_INVALIDATE, 0); + } if (CHIP == A7XX && (flushes & TU_CMD_FLAG_RTU_INVALIDATE) && cmd_buffer->device->physical_device->info->props.has_rt_workaround) tu_emit_rt_workaround(cmd_buffer, cs);