1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-14 04:29:15 +01:00

[dxgi] Implement present count and frame statistics for swap chains

This commit is contained in:
Philip Rebohle 2021-05-20 22:46:21 +02:00 committed by Joshie
parent a3d1699823
commit db3654a07f
2 changed files with 22 additions and 13 deletions

View File

@ -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<void**>(&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<std::recursive_mutex> 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<std::mutex> lockBuf(m_lockBuffer);
try {
m_presentCount++;
return m_presenter->Present(SyncInterval, PresentFlags, nullptr);
} catch (const DxvkError& err) {
Logger::err(err.message());

View File

@ -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<IDXGIVkSwapChain> m_presenter;
HMONITOR m_monitor;