diff options
| author | JMC47 <JMC4789@gmail.com> | 2022-12-19 03:15:48 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-19 03:15:48 -0500 |
| commit | fb8aa9744e9dacf63dc95b01b8ec915c357c29d0 (patch) | |
| tree | 65f56c38a94954089c8df86b05d188834b89716a /Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp | |
| parent | 9f4d9994bcb2f68831a5963845a67d711e5d6034 (diff) | |
| parent | 35a6d16d9e2ac4a6924ffdea0184a92da5e6bf60 (diff) | |
Merge pull request #11286 from K0bin/vk-query-fix
VideoBackends: Query fixes and cleanups
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; |
