From 3f4c9a3bb5cfb87daee3a235f30176ff01f29e19 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 18 Jul 2019 23:23:36 +0200 Subject: [PATCH] [hud] Add GPU load monitor --- src/dxvk/hud/dxvk_hud_config.cpp | 1 + src/dxvk/hud/dxvk_hud_config.h | 7 +++--- src/dxvk/hud/dxvk_hud_stats.cpp | 41 ++++++++++++++++++++++++++++++++ src/dxvk/hud/dxvk_hud_stats.h | 13 ++++++++++ 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/dxvk/hud/dxvk_hud_config.cpp b/src/dxvk/hud/dxvk_hud_config.cpp index f9ed06a03..fe1745bd3 100644 --- a/src/dxvk/hud/dxvk_hud_config.cpp +++ b/src/dxvk/hud/dxvk_hud_config.cpp @@ -12,6 +12,7 @@ namespace dxvk::hud { { "submissions", HudElement::StatSubmissions }, { "pipelines", HudElement::StatPipelines }, { "memory", HudElement::StatMemory }, + { "gpuload", HudElement::StatGpuLoad }, { "version", HudElement::DxvkVersion }, { "api", HudElement::DxvkClientApi }, { "compiler", HudElement::CompilerActivity }, diff --git a/src/dxvk/hud/dxvk_hud_config.h b/src/dxvk/hud/dxvk_hud_config.h index bd763a31b..05a1e4b6f 100644 --- a/src/dxvk/hud/dxvk_hud_config.h +++ b/src/dxvk/hud/dxvk_hud_config.h @@ -18,9 +18,10 @@ namespace dxvk::hud { StatSubmissions = 4, StatPipelines = 5, StatMemory = 6, - DxvkVersion = 7, - DxvkClientApi = 8, - CompilerActivity = 9, + StatGpuLoad = 7, + DxvkVersion = 8, + DxvkClientApi = 9, + CompilerActivity = 10, }; using HudElements = Flags; diff --git a/src/dxvk/hud/dxvk_hud_stats.cpp b/src/dxvk/hud/dxvk_hud_stats.cpp index 7160f7009..995f186bf 100644 --- a/src/dxvk/hud/dxvk_hud_stats.cpp +++ b/src/dxvk/hud/dxvk_hud_stats.cpp @@ -21,6 +21,11 @@ namespace dxvk::hud { DxvkStatCounters nextCounters = device->getStatCounters(); m_diffCounters = nextCounters.diff(m_prevCounters); m_prevCounters = nextCounters; + + // GPU load is a bit more complex than that since + // we don't want to update this every frame + if (m_elements.test(HudElement::StatGpuLoad)) + this->updateGpuLoad(); } @@ -40,6 +45,9 @@ namespace dxvk::hud { if (m_elements.test(HudElement::StatMemory)) position = this->printMemoryStats(context, renderer, position); + if (m_elements.test(HudElement::StatGpuLoad)) + position = this->printGpuLoad(context, renderer, position); + if (m_elements.test(HudElement::CompilerActivity)) { this->printCompilerActivity(context, renderer, { position.x, float(renderer.surfaceSize().height) - 20.0f }); @@ -49,6 +57,25 @@ namespace dxvk::hud { } + void HudStats::updateGpuLoad() { + auto now = std::chrono::high_resolution_clock::now(); + uint64_t ticks = std::chrono::duration_cast(now - m_gpuLoadUpdateTime).count(); + + if (ticks >= 500'000) { + m_gpuLoadUpdateTime = now; + + m_diffGpuIdleTicks = m_prevCounters.getCtr(DxvkStatCounter::GpuIdleTicks) - m_prevGpuIdleTicks; + m_prevGpuIdleTicks = m_prevCounters.getCtr(DxvkStatCounter::GpuIdleTicks); + + uint64_t busyTicks = ticks > m_diffGpuIdleTicks + ? uint64_t(ticks - m_diffGpuIdleTicks) + : uint64_t(0); + + m_gpuLoadString = str::format("GPU: ", (100 * busyTicks) / ticks, "%"); + } + } + + HudPos HudStats::printDrawCallStats( const Rc& context, HudRenderer& renderer, @@ -150,6 +177,19 @@ namespace dxvk::hud { } + HudPos HudStats::printGpuLoad( + const Rc& context, + HudRenderer& renderer, + HudPos position) { + renderer.drawText(context, 16.0f, + { position.x, position.y }, + { 1.0f, 1.0f, 1.0f, 1.0f }, + m_gpuLoadString); + + return { position.x, position.y + 24.0f }; + } + + HudPos HudStats::printCompilerActivity( const Rc& context, HudRenderer& renderer, @@ -183,6 +223,7 @@ namespace dxvk::hud { HudElement::StatSubmissions, HudElement::StatPipelines, HudElement::StatMemory, + HudElement::StatGpuLoad, HudElement::CompilerActivity); } diff --git a/src/dxvk/hud/dxvk_hud_stats.h b/src/dxvk/hud/dxvk_hud_stats.h index 89009af5a..227f600cd 100644 --- a/src/dxvk/hud/dxvk_hud_stats.h +++ b/src/dxvk/hud/dxvk_hud_stats.h @@ -38,7 +38,15 @@ namespace dxvk::hud { DxvkStatCounters m_prevCounters; DxvkStatCounters m_diffCounters; + std::chrono::high_resolution_clock::time_point m_gpuLoadUpdateTime; std::chrono::high_resolution_clock::time_point m_compilerShowTime; + + uint64_t m_prevGpuIdleTicks = 0; + uint64_t m_diffGpuIdleTicks = 0; + + std::string m_gpuLoadString = "GPU: "; + + void updateGpuLoad(); HudPos printDrawCallStats( const Rc& context, @@ -60,6 +68,11 @@ namespace dxvk::hud { HudRenderer& renderer, HudPos position); + HudPos printGpuLoad( + const Rc& context, + HudRenderer& renderer, + HudPos position); + HudPos printCompilerActivity( const Rc& context, HudRenderer& renderer,