From bb7baeae6cd37a31989d4725592c8a1d2c114371 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 4da15a864e8..ff1d529b52d 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -4074,7 +4074,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 205957aa234..bcf3909d51d 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -1838,6 +1838,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 99ceb4eb546..9ad416a2d48 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_meta.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_meta.c @@ -112,9 +112,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);