From 14a4a478c424f4f75ad1274b4b3428921e20ee52 Mon Sep 17 00:00:00 2001 From: Icenowy Zheng Date: Mon, 13 Apr 2026 13:39:48 +0800 Subject: [PATCH] pvr: skip emitting query program when copy result / reset with 0 queries When calling vkResetQueryPool() or vkCmdCopyQueryPoolResults() with a queryCount of 0, currently a query compute program with workgroup size 0*1*1 will be emited, which is ridiculous and will be rejected by some assertion in pvr_compute_generate_control_stream() . As the operation should be noop when queryCount is 0, the functions can and should just return in such cases. Fixes: 0aa9f32b95e6 ("pvr: Implement vkCmdResetQueryPool API.") Fixes: b6e8e1cf372f ("pvr: Implement vkCmdCopyQueryPoolResults API.") Signed-off-by: Icenowy Zheng Reviewed-by: Nick Hamilton (cherry picked from commit 01ba4867fa277628f53f03bfb140a89e030e572d) Part-of: --- .pick_status.json | 2 +- src/imagination/vulkan/pvr_arch_cmd_query.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 73b286ee622..a89ca9ea15c 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -124,7 +124,7 @@ "description": "pvr: skip emitting query program when copy result / reset with 0 queries", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "0aa9f32b95e6d05a7b9ccd737dba14df785159c7", "notes": null diff --git a/src/imagination/vulkan/pvr_arch_cmd_query.c b/src/imagination/vulkan/pvr_arch_cmd_query.c index 36bc1fd3781..139089a60b4 100644 --- a/src/imagination/vulkan/pvr_arch_cmd_query.c +++ b/src/imagination/vulkan/pvr_arch_cmd_query.c @@ -22,6 +22,9 @@ void PVR_PER_ARCH(CmdResetQueryPool)(VkCommandBuffer commandBuffer, PVR_CHECK_COMMAND_BUFFER_BUILDING_STATE(cmd_buffer); + if (queryCount == 0) + return; + query_info.type = PVR_QUERY_TYPE_RESET_QUERY_POOL; query_info.reset_query_pool.query_pool = queryPool; @@ -81,6 +84,9 @@ void PVR_PER_ARCH(CmdCopyQueryPoolResults)(VkCommandBuffer commandBuffer, PVR_CHECK_COMMAND_BUFFER_BUILDING_STATE(cmd_buffer); + if (queryCount == 0) + return; + query_info.type = PVR_QUERY_TYPE_COPY_QUERY_RESULTS; query_info.copy_query_results.query_pool = queryPool;