[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(
const Rc<DxvkDescriptorPool>& pool,
const Rc<DxvkDescriptorManager>& manager) {
pool->updateStats(m_statCounters);
m_descriptorPools.push_back({ pool, manager });
}

View File

@ -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<DxvkDescriptorPool> 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);
}

View File

@ -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<VkDescriptorPool> m_descriptorPools;
std::unordered_map<VkDescriptorSetLayout, DxvkDescriptorSetList> 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(

View File

@ -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
};