mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-22 15:19:46 +01:00
[dxvk] Add stat counters for descriptor sets and pools
This commit is contained in:
parent
758ba5a80d
commit
d4a3b823a2
@ -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 });
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user