From db3654a07f1cf9017cf3ad9e04c17ab86474fa0c Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 20 May 2021 22:46:21 +0200 Subject: [PATCH] [dxgi] Implement present count and frame statistics for swap chains --- src/dxgi/dxgi_swapchain.cpp | 29 ++++++++++++++++++----------- src/dxgi/dxgi_swapchain.h | 6 ++++-- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/dxgi/dxgi_swapchain.cpp b/src/dxgi/dxgi_swapchain.cpp index 4d90fa6f..54ef286d 100644 --- a/src/dxgi/dxgi_swapchain.cpp +++ b/src/dxgi/dxgi_swapchain.cpp @@ -14,15 +14,9 @@ namespace dxvk { m_window (hWnd), m_desc (*pDesc), m_descFs (*pFullscreenDesc), + m_presentCount(0u), m_presenter (pPresenter), m_monitor (nullptr) { - // Initialize frame statistics - m_stats.PresentCount = 0; - m_stats.PresentRefreshCount = 0; - m_stats.SyncRefreshCount = 0; - m_stats.SyncQPCTime.QuadPart = 0; - m_stats.SyncGPUTime.QuadPart = 0; - if (FAILED(m_presenter->GetAdapter(__uuidof(IDXGIAdapter), reinterpret_cast(&m_adapter)))) throw DxvkError("DXGI: Failed to get adapter for present device"); @@ -171,10 +165,22 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE DxgiSwapChain::GetFrameStatistics(DXGI_FRAME_STATISTICS* pStats) { - if (pStats == nullptr) + std::lock_guard lock(m_lockWindow); + + if (!pStats) return E_INVALIDARG; - - *pStats = m_stats; + + static bool s_errorShown = false; + + if (!std::exchange(s_errorShown, true)) + Logger::warn("DxgiSwapChain::GetFrameStatistics: Semi-stub"); + + // TODO deal with the refresh counts at some point + pStats->PresentCount = m_presentCount; + pStats->PresentRefreshCount = 0; + pStats->SyncRefreshCount = 0; + pStats->SyncQPCTime.QuadPart = dxvk::high_resolution_clock::getCounter(); + pStats->SyncGPUTime.QuadPart = 0; return S_OK; } @@ -228,7 +234,7 @@ namespace dxvk { if (pLastPresentCount == nullptr) return E_INVALIDARG; - *pLastPresentCount = m_stats.PresentCount; + *pLastPresentCount = m_presentCount; return S_OK; } @@ -259,6 +265,7 @@ namespace dxvk { std::lock_guard lockBuf(m_lockBuffer); try { + m_presentCount++; return m_presenter->Present(SyncInterval, PresentFlags, nullptr); } catch (const DxvkError& err) { Logger::err(err.message()); diff --git a/src/dxgi/dxgi_swapchain.h b/src/dxgi/dxgi_swapchain.h index b39ff6f4..a071ae4a 100644 --- a/src/dxgi/dxgi_swapchain.h +++ b/src/dxgi/dxgi_swapchain.h @@ -11,6 +11,8 @@ #include "../spirv/spirv_module.h" +#include "../util/util_time.h" + namespace dxvk { class DxgiDevice; @@ -184,8 +186,8 @@ namespace dxvk { HWND m_window; DXGI_SWAP_CHAIN_DESC1 m_desc; DXGI_SWAP_CHAIN_FULLSCREEN_DESC m_descFs; - DXGI_FRAME_STATISTICS m_stats; - + UINT m_presentCount; + Com m_presenter; HMONITOR m_monitor;