From 953a791b53d2316747134d1e794caf44faf38e25 Mon Sep 17 00:00:00 2001 From: "Eric R. Smith" Date: Fri, 15 Aug 2025 12:42:18 -0300 Subject: [PATCH] panvk: revised occlusion query pointer fix It turns out that the `occlusion_query.syncobj` is used to set state that later code relies on, and setting it to NULL causes some Vulkan CTS tests to fail. Instead, we should explicitly check for the mode being `MALI_OCCLUSION_MODE_DISABLED` to avoid using an invalid `ptr` field. Fixes: 24c692c9816 ("panvk: fix a NULL pointer dereference in occlusion queries") Reviewed-by: Lars-Ivar Hesselberg Simonsen Part-of: (cherry picked from commit 9b4eb81162d946a967ec818a90ecfa29c198e108) --- .pick_status.json | 2 +- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 1 + src/panfrost/vulkan/panvk_vX_cmd_meta.c | 3 --- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 8ae85cf2855..42768d4d4d4 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -454,7 +454,7 @@ "description": "panvk: revised occlusion query pointer fix", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "24c692c981631276f3f20ff021931c665162e7e6", "notes": null diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 1d8d5182c8c..a044e09b908 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -1814,6 +1814,7 @@ static VkResult prepare_oq(struct panvk_cmd_buffer *cmdbuf) { if (!gfx_state_dirty(cmdbuf, OQ) || + cmdbuf->state.gfx.occlusion_query.mode == MALI_OCCLUSION_MODE_DISABLED || cmdbuf->state.gfx.occlusion_query.syncobj == cmdbuf->state.gfx.render.oq.last) return VK_SUCCESS; diff --git a/src/panfrost/vulkan/panvk_vX_cmd_meta.c b/src/panfrost/vulkan/panvk_vX_cmd_meta.c index bce4e65a23d..647102c329b 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_meta.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_meta.c @@ -103,9 +103,6 @@ panvk_per_arch(cmd_meta_gfx_start)( save_ctx->occlusion_query = cmdbuf->state.gfx.occlusion_query; /* Ensure occlusion queries are disabled */ -#if PAN_ARCH >= 10 - cmdbuf->state.gfx.occlusion_query.syncobj = 0; -#endif cmdbuf->state.gfx.occlusion_query.ptr = 0; cmdbuf->state.gfx.occlusion_query.mode = MALI_OCCLUSION_MODE_DISABLED; gfx_state_set_dirty(cmdbuf, OQ);