summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/PerfQuery.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/PerfQuery.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/PerfQuery.cpp39
1 files changed, 15 insertions, 24 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/PerfQuery.cpp b/Source/Core/VideoBackends/Vulkan/PerfQuery.cpp
index 3a84f2e571..1934c78410 100644
--- a/Source/Core/VideoBackends/Vulkan/PerfQuery.cpp
+++ b/Source/Core/VideoBackends/Vulkan/PerfQuery.cpp
@@ -24,8 +24,6 @@ PerfQuery::PerfQuery() = default;
PerfQuery::~PerfQuery()
{
- g_command_buffer_mgr->RemoveFenceSignaledCallback(this);
-
if (m_query_pool != VK_NULL_HANDLE)
vkDestroyQueryPool(g_vulkan_context->GetDevice(), m_query_pool, nullptr);
}
@@ -49,9 +47,6 @@ bool PerfQuery::Initialize()
return false;
}
- g_command_buffer_mgr->AddFenceSignaledCallback(
- this, std::bind(&PerfQuery::OnFenceSignaled, this, std::placeholders::_1));
-
return true;
}
@@ -113,7 +108,7 @@ void PerfQuery::ResetQuery()
for (auto& entry : m_query_buffer)
{
- entry.pending_fence = VK_NULL_HANDLE;
+ entry.fence_counter = 0;
entry.available = false;
entry.active = false;
}
@@ -217,7 +212,7 @@ void PerfQuery::QueueCopyQueryResults(u32 start_index, u32 query_count)
{
u32 index = start_index + i;
ActiveQuery& entry = m_query_buffer[index];
- entry.pending_fence = g_command_buffer_mgr->GetCurrentCommandBufferFence();
+ entry.fence_counter = g_command_buffer_mgr->GetCurrentFenceCounter();
entry.available = true;
entry.active = false;
}
@@ -261,8 +256,10 @@ void PerfQuery::FlushQueries()
QueueCopyQueryResults(copy_start_index, copy_count);
}
-void PerfQuery::OnFenceSignaled(VkFence fence)
+void PerfQuery::ProcessPendingResults()
{
+ const u64 completed_fence_counter = g_command_buffer_mgr->GetCurrentFenceCounter();
+
// Need to save these since ProcessResults will modify them.
u32 query_read_pos = m_query_read_pos;
u32 query_count = m_query_count;
@@ -273,7 +270,7 @@ void PerfQuery::OnFenceSignaled(VkFence fence)
for (u32 i = 0; i < query_count; i++)
{
u32 index = (query_read_pos + i) % PERF_QUERY_BUFFER_SIZE;
- if (m_query_buffer[index].pending_fence != fence)
+ if (m_query_buffer[index].fence_counter > completed_fence_counter)
{
// These should be grouped together, at the end.
break;
@@ -314,8 +311,8 @@ void PerfQuery::ProcessResults(u32 start_index, u32 query_count)
ActiveQuery& entry = m_query_buffer[index];
// Should have a fence associated with it (waiting for a result).
- ASSERT(entry.pending_fence != VK_NULL_HANDLE);
- entry.pending_fence = VK_NULL_HANDLE;
+ ASSERT(entry.fence_counter != 0);
+ entry.fence_counter = 0;
entry.available = false;
entry.active = false;
@@ -340,9 +337,11 @@ void PerfQuery::NonBlockingPartialFlush()
return;
// Submit a command buffer in the background if the front query is not bound to one.
- // Ideally this will complete before the buffer fills.
- if (m_query_buffer[m_query_read_pos].pending_fence == VK_NULL_HANDLE)
+ ActiveQuery& entry = m_query_buffer[m_query_read_pos];
+ if (entry.fence_counter == g_command_buffer_mgr->GetCurrentFenceCounter())
Renderer::GetInstance()->ExecuteCommandBuffer(true, false);
+
+ ProcessPendingResults();
}
void PerfQuery::BlockingPartialFlush()
@@ -352,17 +351,9 @@ void PerfQuery::BlockingPartialFlush()
// If the first pending query is needing command buffer execution, do that.
ActiveQuery& entry = m_query_buffer[m_query_read_pos];
- if (entry.pending_fence == VK_NULL_HANDLE)
- {
- // This will callback OnCommandBufferQueued which will set the fence on the entry.
- // We wait for completion, which will also call OnCommandBufferExecuted, and clear the fence.
+ if (entry.fence_counter == g_command_buffer_mgr->GetCurrentFenceCounter())
Renderer::GetInstance()->ExecuteCommandBuffer(false, true);
- }
- else
- {
- // The command buffer has been submitted, but is awaiting completion.
- // Wait for the fence to complete, which will call OnCommandBufferExecuted.
- g_command_buffer_mgr->WaitForFence(entry.pending_fence);
- }
+
+ ProcessPendingResults();
}
} // namespace Vulkan