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:
parent
758ba5a80d
commit
d4a3b823a2
@ -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 });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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(
|
||||||
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user