From 43200010c194aaeff4d06991888ed7391abda41f Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 18 Feb 2018 17:14:02 +0100 Subject: [PATCH] [dxvk] Implemented query allocation --- src/dxvk/dxvk_context.cpp | 27 +++++++++++++++++++++------ src/dxvk/dxvk_context.h | 7 +++---- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index a8eca9420..243b27f6b 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -64,7 +64,7 @@ namespace dxvk { void DxvkContext::beginQuery(const DxvkQueryRevision& query) { - DxvkQueryHandle handle = this->allocateQuery(query); + DxvkQueryHandle handle = this->allocQuery(query); m_cmd->cmdBeginQuery( handle.queryPool, @@ -1198,7 +1198,7 @@ namespace dxvk { void DxvkContext::writeTimestamp(const DxvkQueryRevision& query) { - DxvkQueryHandle handle = this->allocateQuery(query); + DxvkQueryHandle handle = this->allocQuery(query); m_cmd->cmdWriteTimestamp( VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, @@ -1624,9 +1624,24 @@ namespace dxvk { - DxvkQueryHandle DxvkContext::allocateQuery(const DxvkQueryRevision& query) { - // TODO implement - return DxvkQueryHandle(); + DxvkQueryHandle DxvkContext::allocQuery(const DxvkQueryRevision& query) { + const VkQueryType queryType = query.query->type(); + + DxvkQueryHandle queryHandle = { VK_NULL_HANDLE, 0 }; + Rc queryPool = m_queryPools[queryType]; + + if (queryPool != nullptr) + queryHandle = queryPool->allocQuery(query); + + if (queryHandle.queryPool == VK_NULL_HANDLE) { + m_queryPools[queryType] = m_device->createQueryPool(queryType, MaxNumQueryCountPerPool); + queryPool = m_queryPools[queryType]; + + this->resetQueryPool(queryPool); + queryHandle = queryPool->allocQuery(query); + } + + return queryHandle; } @@ -1639,7 +1654,7 @@ namespace dxvk { void DxvkContext::beginActiveQueries() { for (const DxvkQueryRevision& query : m_activeQueries) { - DxvkQueryHandle handle = this->allocateQuery(query); + DxvkQueryHandle handle = this->allocQuery(query); m_cmd->cmdBeginQuery( handle.queryPool, diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 755d1041d..5ef47e905 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -558,9 +558,8 @@ namespace dxvk { DxvkContextState m_state; DxvkBarrierSet m_barriers; - Rc m_occlusionQueries; - Rc m_statisticQueries; - Rc m_timestampQueries; + // TODO implement this properly... + Rc m_queryPools[3] = { nullptr, nullptr, nullptr }; VkPipeline m_gpActivePipeline = VK_NULL_HANDLE; VkPipeline m_cpActivePipeline = VK_NULL_HANDLE; @@ -607,7 +606,7 @@ namespace dxvk { void commitComputeBarriers(); - DxvkQueryHandle allocateQuery( + DxvkQueryHandle allocQuery( const DxvkQueryRevision& query); void resetQueryPool(