Skip to content

Commit

Permalink
[dxgi] Forward IDXGIOutput::GetFrameStatistics to full-screen swap chain
Browse files Browse the repository at this point in the history
Testing on Windows reveals that this function does not work with windowed
mode swap chains even in flip model.
  • Loading branch information
doitsujin committed Jul 31, 2023
1 parent 228615b commit 9b019d2
Showing 1 changed file with 10 additions and 23 deletions.
33 changes: 10 additions & 23 deletions src/dxgi/dxgi_output.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -362,31 +362,18 @@ namespace dxvk {
if (FAILED(hr))
return hr;

static bool s_errorShown = false;

if (!std::exchange(s_errorShown, true))
Logger::warn("DxgiOutput::GetFrameStatistics: Frame statistics may be inaccurate");

// Estimate vblank count based on last known display mode. Querying
// the display mode on every call would be prohibitively expensive.
auto refreshPeriod = computeRefreshPeriod(
monitorInfo->LastMode.RefreshRate.Numerator,
monitorInfo->LastMode.RefreshRate.Denominator);

// We don't really have a way to query time since boot
auto t1Counter = dxvk::high_resolution_clock::get_counter();

auto t0 = dxvk::high_resolution_clock::get_time_from_counter(monitorInfo->FrameStats.SyncQPCTime.QuadPart);
auto t1 = dxvk::high_resolution_clock::get_time_from_counter(t1Counter);
// Need to acquire swap chain and unlock monitor data, since querying
// frame statistics from the swap chain will also access monitor data.
Com<IDXGISwapChain> swapChain = monitorInfo->pSwapChain;
m_monitorInfo->ReleaseMonitorData();

pStats->PresentCount = monitorInfo->FrameStats.PresentCount;
pStats->PresentRefreshCount = monitorInfo->FrameStats.PresentRefreshCount;
pStats->SyncRefreshCount = monitorInfo->FrameStats.SyncRefreshCount + computeRefreshCount(t0, t1, refreshPeriod);
pStats->SyncQPCTime.QuadPart = t1Counter;
pStats->SyncGPUTime.QuadPart = 0;
// This API only works if there is a full-screen swap chain active.
if (swapChain == nullptr) {
*pStats = DXGI_FRAME_STATISTICS();
return S_OK;
}

m_monitorInfo->ReleaseMonitorData();
return S_OK;
return swapChain->GetFrameStatistics(pStats);
}


Expand Down

0 comments on commit 9b019d2

Please sign in to comment.