From 3f9afa31e6e15ff2aede1d37b877fc3d544af542 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 14 Apr 2019 12:15:43 +0200 Subject: [PATCH] [dxvk] Add stat counter for shader compiler activity --- src/dxvk/dxvk_device.cpp | 3 ++- src/dxvk/dxvk_pipemanager.cpp | 6 ++++++ src/dxvk/dxvk_pipemanager.h | 7 +++++++ src/dxvk/dxvk_state_cache.cpp | 18 +++++++++++++----- src/dxvk/dxvk_state_cache.h | 9 +++++++++ src/dxvk/dxvk_stats.h | 1 + 6 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/dxvk/dxvk_device.cpp b/src/dxvk/dxvk_device.cpp index e0704313..fc77c295 100644 --- a/src/dxvk/dxvk_device.cpp +++ b/src/dxvk/dxvk_device.cpp @@ -219,7 +219,8 @@ namespace dxvk { result.setCtr(DxvkStatCounter::MemoryUsed, mem.memoryUsed); result.setCtr(DxvkStatCounter::PipeCountGraphics, pipe.numGraphicsPipelines); result.setCtr(DxvkStatCounter::PipeCountCompute, pipe.numComputePipelines); - + result.setCtr(DxvkStatCounter::PipeCompilerBusy, m_pipelineManager->isCompilingShaders()); + std::lock_guard lock(m_statLock); result.merge(m_statCounters); return result; diff --git a/src/dxvk/dxvk_pipemanager.cpp b/src/dxvk/dxvk_pipemanager.cpp index dd98f767..682db83d 100644 --- a/src/dxvk/dxvk_pipemanager.cpp +++ b/src/dxvk/dxvk_pipemanager.cpp @@ -121,5 +121,11 @@ namespace dxvk { result.numGraphicsPipelines = m_numGraphicsPipelines.load(); return result; } + + + bool DxvkPipelineManager::isCompilingShaders() const { + return m_stateCache != nullptr + && m_stateCache->isCompilingShaders(); + } } diff --git a/src/dxvk/dxvk_pipemanager.h b/src/dxvk/dxvk_pipemanager.h index e6356fa7..fb62cb9a 100644 --- a/src/dxvk/dxvk_pipemanager.h +++ b/src/dxvk/dxvk_pipemanager.h @@ -127,6 +127,13 @@ namespace dxvk { * \returns Number of compute/graphics pipelines */ DxvkPipelineCount getPipelineCount() const; + + /** + * \brief Checks whether async compiler is busy + * \returns \c true if shaders are being compiled + */ + bool isCompilingShaders() const; + private: const DxvkDevice* m_device; diff --git a/src/dxvk/dxvk_state_cache.cpp b/src/dxvk/dxvk_state_cache.cpp index 6c5f79dd..4f1ac4c4 100644 --- a/src/dxvk/dxvk_state_cache.cpp +++ b/src/dxvk/dxvk_state_cache.cpp @@ -80,6 +80,8 @@ namespace dxvk { Logger::info(str::format("DXVK: Using ", numWorkers, " compiler threads")); // Start the worker threads and the file writer + m_workerBusy.store(numWorkers); + for (uint32_t i = 0; i < numWorkers; i++) { m_workerThreads.emplace_back([this] () { workerFunc(); }); m_workerThreads[i].set_priority(ThreadPriority::Lowest); @@ -410,12 +412,18 @@ namespace dxvk { { std::unique_lock lock(m_workerLock); - m_workerCond.wait(lock, [this] () { - return m_workerQueue.size() - || m_stopThreads.load(); - }); + if (m_workerQueue.empty()) { + m_workerBusy -= 1; + m_workerCond.wait(lock, [this] () { + return m_workerQueue.size() + || m_stopThreads.load(); + }); - if (m_workerQueue.size() == 0) + if (!m_workerQueue.empty()) + m_workerBusy += 1; + } + + if (m_workerQueue.empty()) break; item = m_workerQueue.front(); diff --git a/src/dxvk/dxvk_state_cache.h b/src/dxvk/dxvk_state_cache.h index de3b4104..3ae54b3e 100644 --- a/src/dxvk/dxvk_state_cache.h +++ b/src/dxvk/dxvk_state_cache.h @@ -125,6 +125,14 @@ namespace dxvk { */ void registerShader( const Rc& shader); + + /** + * \brief Checks whether compiler threads are busy + * \returns \c true if we're compiling shaders + */ + bool isCompilingShaders() { + return m_workerBusy.load() > 0; + } private: @@ -162,6 +170,7 @@ namespace dxvk { std::mutex m_workerLock; std::condition_variable m_workerCond; std::queue m_workerQueue; + std::atomic m_workerBusy; std::vector m_workerThreads; std::mutex m_writerLock; diff --git a/src/dxvk/dxvk_stats.h b/src/dxvk/dxvk_stats.h index e0342841..5c5243aa 100644 --- a/src/dxvk/dxvk_stats.h +++ b/src/dxvk/dxvk_stats.h @@ -19,6 +19,7 @@ namespace dxvk { MemoryUsed, ///< Amount of memory used PipeCountGraphics, ///< Number of graphics pipelines PipeCountCompute, ///< Number of compute pipelines + PipeCompilerBusy, ///< Boolean indicating compiler activity QueueSubmitCount, ///< Number of command buffer submissions QueuePresentCount, ///< Number of present calls / frames NumCounters, ///< Number of counters available