diff --git a/.pick_status.json b/.pick_status.json index f8572cb131d..cc5666dae08 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -3234,7 +3234,7 @@ "description": "tu: Fix CP_CCHE_INVALIDATE not being applied at the right point", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "fb1c3f7f5de6642fcd127724a0cea5643d39d7ee", "notes": null diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index d2f7c1728d5..00e3d9e8fe8 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);