From da6a31d6195e752032e100186dc4096a369602fd Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 27 Jan 2025 12:42:39 +0000 Subject: [PATCH] Fix validation issues around KHR performance query * Set sType for query-return structures. * Ignore pass boundaries to not mix queries inside and outside of renderpass boundaries. * Wait for idle before fetching KHR results (don't think it should be necessary with VK_QUERY_RESULT_WAIT_BIT but validation expects it). --- renderdoc/driver/vulkan/vk_counters.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/renderdoc/driver/vulkan/vk_counters.cpp b/renderdoc/driver/vulkan/vk_counters.cpp index e82bbc0b7..f58056fd7 100644 --- a/renderdoc/driver/vulkan/vk_counters.cpp +++ b/renderdoc/driver/vulkan/vk_counters.cpp @@ -165,6 +165,11 @@ rdcarray VulkanReplay::EnumerateCounters() m_KHRCounters.resize(khrCounters); m_KHRCountersDescriptions.resize(khrCounters); + for(VkPerformanceCounterKHR &count : m_KHRCounters) + count.sType = VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR; + for(VkPerformanceCounterDescriptionKHR &desc : m_KHRCountersDescriptions) + desc.sType = VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR; + ObjDisp(physDev)->EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR( Unwrap(physDev), 0, &khrCounters, &m_KHRCounters[0], &m_KHRCountersDescriptions[0]); @@ -629,14 +634,23 @@ struct VulkanKHRCallback : public VulkanActionCallback } void PreMisc(uint32_t eid, ActionFlags flags, VkCommandBuffer cmd) override { + // ignore renderpass boundaries as it's illegal to start and end queries across the boundary + if(flags & ActionFlags::PassBoundary) + return; PreDraw(eid, flags, cmd); } bool PostMisc(uint32_t eid, ActionFlags flags, VkCommandBuffer cmd) override { + // ignore renderpass boundaries as it's illegal to start and end queries across the boundary + if(flags & ActionFlags::PassBoundary) + return false; return PostDraw(eid, flags, cmd); } void PostRemisc(uint32_t eid, ActionFlags flags, VkCommandBuffer cmd) override { + // ignore renderpass boundaries as it's illegal to start and end queries across the boundary + if(flags & ActionFlags::PassBoundary) + return; PostRedraw(eid, flags, cmd); } void AliasEvent(uint32_t primary, uint32_t alias) override @@ -736,6 +750,8 @@ rdcarray VulkanReplay::FetchCountersKHR(const rdcarraySetSubmitChain(NULL); } + m_pDriver->vkDeviceWaitIdle(dev); + rdcarray perfResults; perfResults.resize(cb.m_Results.size() * counters.size());