mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-11 19:24:11 +01:00
[dxgi] Forward IDXGIOutput::GetFrameStatistics to full-screen swap chain
Testing on Windows reveals that this function does not work with windowed mode swap chains even in flip model.
This commit is contained in:
parent
228615b639
commit
9b019d26ac
@ -362,31 +362,18 @@ namespace dxvk {
|
|||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
static bool s_errorShown = false;
|
// Need to acquire swap chain and unlock monitor data, since querying
|
||||||
|
// frame statistics from the swap chain will also access monitor data.
|
||||||
if (!std::exchange(s_errorShown, true))
|
Com<IDXGISwapChain> swapChain = monitorInfo->pSwapChain;
|
||||||
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);
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
m_monitorInfo->ReleaseMonitorData();
|
m_monitorInfo->ReleaseMonitorData();
|
||||||
return S_OK;
|
|
||||||
|
// This API only works if there is a full-screen swap chain active.
|
||||||
|
if (swapChain == nullptr) {
|
||||||
|
*pStats = DXGI_FRAME_STATISTICS();
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return swapChain->GetFrameStatistics(pStats);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user