diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index 4a3b5b625..cfb4840de 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -758,6 +758,7 @@ namespace dxvk { void trackDescriptorPool( const Rc& pool, const Rc& manager) { + pool->updateStats(m_statCounters); m_descriptorPools.push_back({ pool, manager }); } diff --git a/src/dxvk/dxvk_descriptor.cpp b/src/dxvk/dxvk_descriptor.cpp index 0516baeeb..fa1e1e77d 100644 --- a/src/dxvk/dxvk_descriptor.cpp +++ b/src/dxvk/dxvk_descriptor.cpp @@ -35,8 +35,9 @@ namespace dxvk { DxvkDescriptorPool::DxvkDescriptorPool( DxvkDevice* device, - DxvkDescriptorManager* manager) - : m_device(device), m_manager(manager), + DxvkDescriptorManager* manager, + DxvkContextType contextType) + : m_device(device), m_manager(manager), m_contextType(contextType), m_cachedEntry(nullptr, nullptr) { } @@ -47,6 +48,13 @@ namespace dxvk { for (auto pool : m_descriptorPools) vk->vkDestroyDescriptorPool(vk->device(), pool, nullptr); + + if (m_contextType == DxvkContextType::Primary) { + m_device->addStatCtr(DxvkStatCounter::DescriptorPoolCount, + uint64_t(-int64_t(m_descriptorPools.size()))); + m_device->addStatCtr(DxvkStatCounter::DescriptorSetCount, + uint64_t(-int64_t(m_setsAllocated))); + } } @@ -133,6 +141,16 @@ namespace dxvk { } + void DxvkDescriptorPool::updateStats(DxvkStatCounters& counters) { + if (m_contextType == DxvkContextType::Primary) { + counters.addCtr(DxvkStatCounter::DescriptorSetCount, + uint64_t(int64_t(m_setsAllocated) - int64_t(m_prevSetsAllocated))); + } + + m_prevSetsAllocated = m_setsAllocated; + } + + DxvkDescriptorSetMap* DxvkDescriptorPool::getSetMapCached( const DxvkBindingLayoutObjects* layout) { if (likely(m_cachedEntry.first == layout)) @@ -181,7 +199,7 @@ namespace dxvk { VkDescriptorSet DxvkDescriptorPool::allocSet( - DxvkDescriptorSetList* list, + DxvkDescriptorSetList* list, VkDescriptorSetLayout layout) { VkDescriptorSet set = list->alloc(); @@ -239,6 +257,11 @@ namespace dxvk { for (size_t i = 0; i < m_vkPoolCount; i++) vk->vkDestroyDescriptorPool(vk->device(), m_vkPools[i], nullptr); + + if (m_contextType == DxvkContextType::Primary) { + m_device->addStatCtr(DxvkStatCounter::DescriptorPoolCount, + uint64_t(-int64_t(m_vkPoolCount))); + } } @@ -246,7 +269,7 @@ namespace dxvk { Rc pool = m_pools.retrieveObject(); if (pool == nullptr) - pool = new DxvkDescriptorPool(m_device, this); + pool = new DxvkDescriptorPool(m_device, this, m_contextType); return pool; } @@ -295,6 +318,8 @@ namespace dxvk { if (vk->vkCreateDescriptorPool(vk->device(), &info, nullptr, &pool) != VK_SUCCESS) throw DxvkError("DxvkDescriptorPool: Failed to create descriptor pool"); + if (m_contextType == DxvkContextType::Primary) + m_device->addStatCtr(DxvkStatCounter::DescriptorPoolCount, 1); return pool; } @@ -311,6 +336,9 @@ namespace dxvk { } } + if (m_contextType == DxvkContextType::Primary) + m_device->addStatCtr(DxvkStatCounter::DescriptorPoolCount, uint64_t(-1ll)); + vk->vkDestroyDescriptorPool(vk->device(), pool, nullptr); } diff --git a/src/dxvk/dxvk_descriptor.h b/src/dxvk/dxvk_descriptor.h index 05534f0f2..7c874f65d 100644 --- a/src/dxvk/dxvk_descriptor.h +++ b/src/dxvk/dxvk_descriptor.h @@ -5,6 +5,7 @@ #include "dxvk_include.h" #include "dxvk_pipelayout.h" #include "dxvk_recycler.h" +#include "dxvk_stats.h" namespace dxvk { @@ -84,7 +85,8 @@ namespace dxvk { DxvkDescriptorPool( DxvkDevice* device, - DxvkDescriptorManager* manager); + DxvkDescriptorManager* manager, + DxvkContextType contextType); ~DxvkDescriptorPool(); @@ -122,10 +124,17 @@ namespace dxvk { */ void reset(); + /** + * \brief Updates stat counters with set count + * \param [out] counters Stat counters + */ + void updateStats(DxvkStatCounters& counters); + private: DxvkDevice* m_device; DxvkDescriptorManager* m_manager; + DxvkContextType m_contextType; std::vector m_descriptorPools; std::unordered_map m_setLists; @@ -134,6 +143,9 @@ namespace dxvk { uint32_t m_setsAllocated = 0; uint32_t m_setsUsed = 0; + + uint32_t m_prevSetsAllocated = 0; + uint32_t m_lowUsageFrames = 0; DxvkDescriptorSetMap* getSetMapCached( diff --git a/src/dxvk/dxvk_stats.h b/src/dxvk/dxvk_stats.h index 9138c7c6f..4d274bba4 100644 --- a/src/dxvk/dxvk_stats.h +++ b/src/dxvk/dxvk_stats.h @@ -26,6 +26,8 @@ namespace dxvk { CsSyncCount, ///< CS thread synchronizations CsSyncTicks, ///< Time spent waiting on CS CsChunkCount, ///< Submitted CS chunks + DescriptorPoolCount, ///< Descriptor pool count + DescriptorSetCount, ///< Descriptor sets allocated NumCounters, ///< Number of counters available };