From 6ba757387727fdfd2e749c692a160e7a485506de Mon Sep 17 00:00:00 2001 From: Robin Kertels Date: Wed, 16 Nov 2022 17:34:41 +0100 Subject: VideoBackends:Vulkan: Fix queries Fixes both checking whether queries are done and actually resets query pools. --- Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp b/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp index c882587b71..1237bd6c15 100644 --- a/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp +++ b/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp @@ -35,6 +35,9 @@ bool PerfQuery::Initialize() return false; } + // Vulkan requires query pools to be reset after creation + ResetQuery(); + return true; } @@ -55,6 +58,7 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) ActiveQuery& entry = m_query_buffer[m_query_next_pos]; DEBUG_ASSERT(!entry.has_value); entry.has_value = true; + entry.query_type = type; // Use precise queries if supported, otherwise boolean (which will be incorrect). VkQueryControlFlags flags = @@ -72,6 +76,9 @@ void PerfQuery::DisableQuery(PerfQueryGroup type) if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { vkCmdEndQuery(g_command_buffer_mgr->GetCurrentCommandBuffer(), m_query_pool, m_query_next_pos); + ActiveQuery& entry = m_query_buffer[m_query_next_pos]; + entry.fence_counter = g_command_buffer_mgr->GetCurrentFenceCounter(); + m_query_next_pos = (m_query_next_pos + 1) % PERF_QUERY_BUFFER_SIZE; m_query_count.fetch_add(1, std::memory_order_relaxed); } @@ -119,8 +126,10 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type) void PerfQuery::FlushResults() { - while (!IsFlushed()) + if (!IsFlushed()) PartialFlush(true); + + ASSERT(IsFlushed()); } bool PerfQuery::IsFlushed() const @@ -185,13 +194,17 @@ void PerfQuery::ReadbackQueries(u32 query_count) (m_query_readback_pos + query_count) <= PERF_QUERY_BUFFER_SIZE); // Read back from the GPU. - VkResult res = - vkGetQueryPoolResults(g_vulkan_context->GetDevice(), m_query_pool, m_query_readback_pos, - query_count, query_count * sizeof(PerfQueryDataType), - m_query_result_buffer.data(), sizeof(PerfQueryDataType), 0); + VkResult res = vkGetQueryPoolResults( + g_vulkan_context->GetDevice(), m_query_pool, m_query_readback_pos, query_count, + query_count * sizeof(PerfQueryDataType), m_query_result_buffer.data(), + sizeof(PerfQueryDataType), VK_QUERY_RESULT_WAIT_BIT); if (res != VK_SUCCESS) LOG_VULKAN_ERROR(res, "vkGetQueryPoolResults failed: "); + StateTracker::GetInstance()->EndRenderPass(); + vkCmdResetQueryPool(g_command_buffer_mgr->GetCurrentCommandBuffer(), m_query_pool, + m_query_readback_pos, query_count); + // Remove pending queries. for (u32 i = 0; i < query_count; i++) { -- cgit v1.2.3 From 35a6d16d9e2ac4a6924ffdea0184a92da5e6bf60 Mon Sep 17 00:00:00 2001 From: Robin Kertels Date: Thu, 17 Nov 2022 21:54:43 +0100 Subject: VideoBackends: Rename query_type to query_group --- Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp') diff --git a/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp b/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp index 1237bd6c15..9571c69677 100644 --- a/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp +++ b/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp @@ -41,7 +41,7 @@ bool PerfQuery::Initialize() return true; } -void PerfQuery::EnableQuery(PerfQueryGroup type) +void PerfQuery::EnableQuery(PerfQueryGroup group) { // Block if there are no free slots. // Otherwise, try to keep half of them available. @@ -53,12 +53,12 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) // a buffer with open queries. StateTracker::GetInstance()->Bind(); - if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) + if (group == PQG_ZCOMP_ZCOMPLOC || group == PQG_ZCOMP) { ActiveQuery& entry = m_query_buffer[m_query_next_pos]; DEBUG_ASSERT(!entry.has_value); entry.has_value = true; - entry.query_type = type; + entry.query_group = group; // Use precise queries if supported, otherwise boolean (which will be incorrect). VkQueryControlFlags flags = @@ -71,9 +71,9 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) } } -void PerfQuery::DisableQuery(PerfQueryGroup type) +void PerfQuery::DisableQuery(PerfQueryGroup group) { - if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) + if (group == PQG_ZCOMP_ZCOMPLOC || group == PQG_ZCOMP) { vkCmdEndQuery(g_command_buffer_mgr->GetCurrentCommandBuffer(), m_query_pool, m_query_next_pos); ActiveQuery& entry = m_query_buffer[m_query_next_pos]; @@ -220,8 +220,8 @@ void PerfQuery::ReadbackQueries(u32 query_count) const u64 native_res_result = static_cast(m_query_result_buffer[i]) * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight(); - m_results[entry.query_type].fetch_add(static_cast(native_res_result), - std::memory_order_relaxed); + m_results[entry.query_group].fetch_add(static_cast(native_res_result), + std::memory_order_relaxed); } m_query_readback_pos = (m_query_readback_pos + query_count) % PERF_QUERY_BUFFER_SIZE; -- cgit v1.2.3