From 707ddd63a1fc9c0c0875a785d8fb9367152ff9c6 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 27 Sep 2024 17:04:37 +0200 Subject: [PATCH] [dxvk] Add stat counter for samplers --- src/dxvk/dxvk_device.h | 8 ++++++++ src/dxvk/dxvk_sampler.cpp | 12 +++++++++++- src/dxvk/dxvk_sampler.h | 29 ++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/dxvk/dxvk_device.h b/src/dxvk/dxvk_device.h index 26ea98bc3..9876aafb5 100644 --- a/src/dxvk/dxvk_device.h +++ b/src/dxvk/dxvk_device.h @@ -401,6 +401,14 @@ namespace dxvk { */ DxvkSharedAllocationCacheStats getMemoryAllocationStats(DxvkMemoryAllocationStats& stats); + /** + * \brief Queries sampler statistics + * \returns Sampler stats + */ + DxvkSamplerStats getSamplerStats() { + return m_objects.samplerPool().getStats(); + } + /** * \brief Retreves current frame ID * \returns Current frame ID diff --git a/src/dxvk/dxvk_sampler.cpp b/src/dxvk/dxvk_sampler.cpp index 7555034ea..f2ae525f3 100644 --- a/src/dxvk/dxvk_sampler.cpp +++ b/src/dxvk/dxvk_sampler.cpp @@ -151,6 +151,8 @@ namespace dxvk { sampler->m_lruPrev = nullptr; sampler->m_lruNext = nullptr; + + m_samplersLive.store(m_samplersLive.load() + 1u); } // We already took a reference, forward the pointer as-is @@ -163,9 +165,13 @@ namespace dxvk { destroyLeastRecentlyUsedSampler(); // Create new sampler object - return &m_samplers.emplace(std::piecewise_construct, + DxvkSampler* sampler = &m_samplers.emplace(std::piecewise_construct, std::forward_as_tuple(key), std::forward_as_tuple(this, key)).first->second; + + m_samplersTotal.store(m_samplers.size()); + m_samplersLive.store(m_samplersLive.load() + 1u); + return sampler; } @@ -195,6 +201,9 @@ namespace dxvk { m_lruTail = sampler; + // Don't need an atomic add for these + m_samplersLive.store(m_samplersLive.load() - 1u); + // Try to keep some samplers available for subsequent allocations if (m_samplers.size() > MinSamplerCount) destroyLeastRecentlyUsedSampler(); @@ -213,6 +222,7 @@ namespace dxvk { m_lruTail = nullptr; m_samplers.erase(sampler->key()); + m_samplersTotal.store(m_samplers.size()); } } diff --git a/src/dxvk/dxvk_sampler.h b/src/dxvk/dxvk_sampler.h index 5ae7a475c..80589e5f7 100644 --- a/src/dxvk/dxvk_sampler.h +++ b/src/dxvk/dxvk_sampler.h @@ -195,7 +195,18 @@ namespace dxvk { VkBorderColor determineBorderColorType() const; }; - + + + /** + * \brief Sampler statistics + */ + struct DxvkSamplerStats { + /// Number of sampler objects created + uint32_t totalCount = 0u; + /// Number of samplers currently in use + uint32_t liveCount = 0u; + }; + /** * \brief Sampler pool @@ -225,6 +236,19 @@ namespace dxvk { */ Rc createSampler(const DxvkSamplerKey& key); + /** + * \brief Retrieves sampler statistics + * + * Note that these might be out of date immediately. + * \returns Sampler counts + */ + DxvkSamplerStats getStats() const { + DxvkSamplerStats stats = { }; + stats.totalCount = m_samplersTotal.load(); + stats.liveCount = m_samplersLive.load(); + return stats; + } + private: DxvkDevice* m_device; @@ -236,6 +260,9 @@ namespace dxvk { DxvkSampler* m_lruHead = nullptr; DxvkSampler* m_lruTail = nullptr; + std::atomic m_samplersLive = { 0u }; + std::atomic m_samplersTotal = { 0u }; + void releaseSampler(DxvkSampler* sampler); void destroyLeastRecentlyUsedSampler();