diff options
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp b/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp index c882587b71..9571c69677 100644 --- a/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp +++ b/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp @@ -35,10 +35,13 @@ bool PerfQuery::Initialize() return false; } + // Vulkan requires query pools to be reset after creation + ResetQuery(); + 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. @@ -50,11 +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_group = group; // Use precise queries if supported, otherwise boolean (which will be incorrect). VkQueryControlFlags flags = @@ -67,11 +71,14 @@ 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]; + 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++) { @@ -207,8 +220,8 @@ void PerfQuery::ReadbackQueries(u32 query_count) const u64 native_res_result = static_cast<u64>(m_query_result_buffer[i]) * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight(); - m_results[entry.query_type].fetch_add(static_cast<u32>(native_res_result), - std::memory_order_relaxed); + m_results[entry.query_group].fetch_add(static_cast<u32>(native_res_result), + std::memory_order_relaxed); } m_query_readback_pos = (m_query_readback_pos + query_count) % PERF_QUERY_BUFFER_SIZE; |
