1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-29 04:06:24 +01:00

[dxvk] Add stat counters for descriptor sets and pools

This commit is contained in:
Philip Rebohle 2022-06-23 00:41:42 +02:00
parent 758ba5a80d
commit d4a3b823a2
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
4 changed files with 48 additions and 5 deletions

View File

@ -758,6 +758,7 @@ namespace dxvk {
void trackDescriptorPool( void trackDescriptorPool(
const Rc<DxvkDescriptorPool>& pool, const Rc<DxvkDescriptorPool>& pool,
const Rc<DxvkDescriptorManager>& manager) { const Rc<DxvkDescriptorManager>& manager) {
pool->updateStats(m_statCounters);
m_descriptorPools.push_back({ pool, manager }); m_descriptorPools.push_back({ pool, manager });
} }

View File

@ -35,8 +35,9 @@ namespace dxvk {
DxvkDescriptorPool::DxvkDescriptorPool( DxvkDescriptorPool::DxvkDescriptorPool(
DxvkDevice* device, DxvkDevice* device,
DxvkDescriptorManager* manager) DxvkDescriptorManager* manager,
: m_device(device), m_manager(manager), DxvkContextType contextType)
: m_device(device), m_manager(manager), m_contextType(contextType),
m_cachedEntry(nullptr, nullptr) { m_cachedEntry(nullptr, nullptr) {
} }
@ -47,6 +48,13 @@ namespace dxvk {
for (auto pool : m_descriptorPools) for (auto pool : m_descriptorPools)
vk->vkDestroyDescriptorPool(vk->device(), pool, nullptr); 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( DxvkDescriptorSetMap* DxvkDescriptorPool::getSetMapCached(
const DxvkBindingLayoutObjects* layout) { const DxvkBindingLayoutObjects* layout) {
if (likely(m_cachedEntry.first == layout)) if (likely(m_cachedEntry.first == layout))
@ -181,7 +199,7 @@ namespace dxvk {
VkDescriptorSet DxvkDescriptorPool::allocSet( VkDescriptorSet DxvkDescriptorPool::allocSet(
DxvkDescriptorSetList* list, DxvkDescriptorSetList* list,
VkDescriptorSetLayout layout) { VkDescriptorSetLayout layout) {
VkDescriptorSet set = list->alloc(); VkDescriptorSet set = list->alloc();
@ -239,6 +257,11 @@ namespace dxvk {
for (size_t i = 0; i < m_vkPoolCount; i++) for (size_t i = 0; i < m_vkPoolCount; i++)
vk->vkDestroyDescriptorPool(vk->device(), m_vkPools[i], nullptr); 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<DxvkDescriptorPool> pool = m_pools.retrieveObject(); Rc<DxvkDescriptorPool> pool = m_pools.retrieveObject();
if (pool == nullptr) if (pool == nullptr)
pool = new DxvkDescriptorPool(m_device, this); pool = new DxvkDescriptorPool(m_device, this, m_contextType);
return pool; return pool;
} }
@ -295,6 +318,8 @@ namespace dxvk {
if (vk->vkCreateDescriptorPool(vk->device(), &info, nullptr, &pool) != VK_SUCCESS) if (vk->vkCreateDescriptorPool(vk->device(), &info, nullptr, &pool) != VK_SUCCESS)
throw DxvkError("DxvkDescriptorPool: Failed to create descriptor pool"); throw DxvkError("DxvkDescriptorPool: Failed to create descriptor pool");
if (m_contextType == DxvkContextType::Primary)
m_device->addStatCtr(DxvkStatCounter::DescriptorPoolCount, 1);
return pool; 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); vk->vkDestroyDescriptorPool(vk->device(), pool, nullptr);
} }

View File

@ -5,6 +5,7 @@
#include "dxvk_include.h" #include "dxvk_include.h"
#include "dxvk_pipelayout.h" #include "dxvk_pipelayout.h"
#include "dxvk_recycler.h" #include "dxvk_recycler.h"
#include "dxvk_stats.h"
namespace dxvk { namespace dxvk {
@ -84,7 +85,8 @@ namespace dxvk {
DxvkDescriptorPool( DxvkDescriptorPool(
DxvkDevice* device, DxvkDevice* device,
DxvkDescriptorManager* manager); DxvkDescriptorManager* manager,
DxvkContextType contextType);
~DxvkDescriptorPool(); ~DxvkDescriptorPool();
@ -122,10 +124,17 @@ namespace dxvk {
*/ */
void reset(); void reset();
/**
* \brief Updates stat counters with set count
* \param [out] counters Stat counters
*/
void updateStats(DxvkStatCounters& counters);
private: private:
DxvkDevice* m_device; DxvkDevice* m_device;
DxvkDescriptorManager* m_manager; DxvkDescriptorManager* m_manager;
DxvkContextType m_contextType;
std::vector<VkDescriptorPool> m_descriptorPools; std::vector<VkDescriptorPool> m_descriptorPools;
std::unordered_map<VkDescriptorSetLayout, DxvkDescriptorSetList> m_setLists; std::unordered_map<VkDescriptorSetLayout, DxvkDescriptorSetList> m_setLists;
@ -134,6 +143,9 @@ namespace dxvk {
uint32_t m_setsAllocated = 0; uint32_t m_setsAllocated = 0;
uint32_t m_setsUsed = 0; uint32_t m_setsUsed = 0;
uint32_t m_prevSetsAllocated = 0;
uint32_t m_lowUsageFrames = 0; uint32_t m_lowUsageFrames = 0;
DxvkDescriptorSetMap* getSetMapCached( DxvkDescriptorSetMap* getSetMapCached(

View File

@ -26,6 +26,8 @@ namespace dxvk {
CsSyncCount, ///< CS thread synchronizations CsSyncCount, ///< CS thread synchronizations
CsSyncTicks, ///< Time spent waiting on CS CsSyncTicks, ///< Time spent waiting on CS
CsChunkCount, ///< Submitted CS chunks CsChunkCount, ///< Submitted CS chunks
DescriptorPoolCount, ///< Descriptor pool count
DescriptorSetCount, ///< Descriptor sets allocated
NumCounters, ///< Number of counters available NumCounters, ///< Number of counters available
}; };