summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorRobin Kertels <robin.kertels@gmail.com>2022-11-16 17:34:41 +0100
committerRobin Kertels <robin.kertels@gmail.com>2022-11-29 23:14:07 +0100
commit6ba757387727fdfd2e749c692a160e7a485506de (patch)
tree7bacce2d9769f2c1001a9f2e3a7a4c8a7d5b8bbc /Source
parent8a1c28be6318c9d3cd373bcee3f80969d466e9b1 (diff)
VideoBackends:Vulkan: Fix queries
Fixes both checking whether queries are done and actually resets query pools.
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp23
-rw-r--r--Source/Core/VideoBackends/Vulkan/VKPerfQuery.h2
2 files changed, 19 insertions, 6 deletions
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++)
{
diff --git a/Source/Core/VideoBackends/Vulkan/VKPerfQuery.h b/Source/Core/VideoBackends/Vulkan/VKPerfQuery.h
index e4488683be..6d5fc00914 100644
--- a/Source/Core/VideoBackends/Vulkan/VKPerfQuery.h
+++ b/Source/Core/VideoBackends/Vulkan/VKPerfQuery.h
@@ -40,7 +40,7 @@ private:
struct ActiveQuery
{
u64 fence_counter;
- PerfQueryType query_type;
+ PerfQueryGroup query_type;
bool has_value;
};