diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index c035eb7cd9..d24505624d 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -157,10 +157,10 @@ public: ReserveHostQuery(); scheduler.Record([query_pool = current_query_pool, - query_index = current_bank_slot](vk::CommandBuffer cmdbuf) { + query_index = current_bank_slot](vk::CommandBuffer cmdbuf) { const bool use_precise = Settings::IsGPULevelHigh(); cmdbuf.BeginQuery(query_pool, static_cast(query_index), - use_precise ? VK_QUERY_CONTROL_PRECISE_BIT : 0); + use_precise ? VK_QUERY_CONTROL_PRECISE_BIT : 0); }); has_started = true; @@ -454,6 +454,11 @@ private: void ReserveHostQuery() { size_t new_slot = ReserveBankSlot(); + scheduler.RecordWithUploadBuffer([query_pool = current_query_pool, + query_index = current_bank_slot](vk::CommandBuffer, + vk::CommandBuffer upload_cmdbuf) { + upload_cmdbuf.ResetQueryPool(query_pool, static_cast(query_index), 1); + }); current_bank->AddReference(1); num_slots_used++; if (current_query) { diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 534a11edd4..840d4df62b 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -127,6 +127,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { X(vkCmdPipelineBarrier); X(vkCmdPushConstants); X(vkCmdPushDescriptorSetWithTemplateKHR); + X(vkCmdResetQueryPool); X(vkCmdSetBlendConstants); X(vkCmdSetDepthBias); X(vkCmdSetDepthBias2EXT); diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index 04b9420d98..7af047e5cd 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -228,6 +228,7 @@ struct DeviceDispatch : InstanceDispatch { PFN_vkCmdPushConstants vkCmdPushConstants{}; PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR{}; PFN_vkCmdResolveImage vkCmdResolveImage{}; + PFN_vkCmdResetQueryPool vkCmdResetQueryPool{}; PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants{}; PFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT{}; PFN_vkCmdSetDepthBias vkCmdSetDepthBias{}; @@ -1164,6 +1165,10 @@ public: dld->vkCmdBeginQuery(handle, query_pool, query, flags); } + void ResetQueryPool(VkQueryPool query_pool, u32 first, u32 count) const noexcept { + dld->vkCmdResetQueryPool(handle, query_pool, first, count); + } + void EndQuery(VkQueryPool query_pool, u32 query) const noexcept { dld->vkCmdEndQuery(handle, query_pool, query); }