1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-24 13:54:17 +01:00

[d3d9] Pass display refresh rate around in windowed mode

This commit is contained in:
Philip Rebohle 2025-01-17 23:21:31 +01:00
parent a295c32b37
commit 066aedf085
2 changed files with 39 additions and 12 deletions

View File

@ -171,6 +171,7 @@ namespace dxvk {
// We aren't going to device loss simply because // We aren't going to device loss simply because
// 99% of D3D9 games don't handle this properly and // 99% of D3D9 games don't handle this properly and
// just end up crashing (like with alt-tab loss) // just end up crashing (like with alt-tab loss)
UpdateDisplayRefreshRate();
UpdateTargetFrameRate(presentInterval); UpdateTargetFrameRate(presentInterval);
PresentImage(presentInterval); PresentImage(presentInterval);
return D3D_OK; return D3D_OK;
@ -980,7 +981,11 @@ namespace dxvk {
m_latencyTracker = m_device->createLatencyTracker(entry->second.presenter); m_latencyTracker = m_device->createLatencyTracker(entry->second.presenter);
} }
m_wctx = &entry->second; if (m_wctx != &entry->second) {
m_wctx = &entry->second;
m_displayRefreshRateDirty = true;
}
return true; return true;
} }
@ -1168,9 +1173,35 @@ namespace dxvk {
} }
void D3D9SwapChainEx::NotifyDisplayRefreshRate( void D3D9SwapChainEx::UpdateDisplayRefreshRate() {
double RefreshRate) { if (!m_displayRefreshRateDirty)
m_displayRefreshRate = RefreshRate; return;
m_displayRefreshRateDirty = false;
if (!m_monitor && m_window != m_presentParams.hDeviceWindow) {
m_displayRefreshRate = 0.0;
return;
}
HMONITOR monitor = m_monitor;
if (!monitor)
monitor = wsi::getWindowMonitor(m_window);
if (!monitor) {
m_displayRefreshRate = 0.0;
return;
}
wsi::WsiMode wsiMode = { };
if (wsi::getCurrentDisplayMode(monitor, &wsiMode)) {
m_displayRefreshRate = double(wsiMode.refreshRate.numerator)
/ double(wsiMode.refreshRate.denominator);
} else {
m_displayRefreshRate = 0.0;
}
} }
@ -1250,11 +1281,7 @@ namespace dxvk {
if (!wsi::setWindowMode(monitor, m_window, &m_windowState, wsiMode)) if (!wsi::setWindowMode(monitor, m_window, &m_windowState, wsiMode))
return D3DERR_NOTAVAILABLE; return D3DERR_NOTAVAILABLE;
if (wsi::getCurrentDisplayMode(monitor, &wsiMode)) m_displayRefreshRateDirty = true;
NotifyDisplayRefreshRate(double(wsiMode.refreshRate.numerator) / double(wsiMode.refreshRate.denominator));
else
NotifyDisplayRefreshRate(0.0);
return D3D_OK; return D3D_OK;
} }
@ -1266,7 +1293,7 @@ namespace dxvk {
if (!wsi::restoreDisplayMode()) if (!wsi::restoreDisplayMode())
return D3DERR_NOTAVAILABLE; return D3DERR_NOTAVAILABLE;
NotifyDisplayRefreshRate(0.0); m_displayRefreshRateDirty = true;
return D3D_OK; return D3D_OK;
} }

View File

@ -173,6 +173,7 @@ namespace dxvk {
wsi::DxvkWindowState m_windowState; wsi::DxvkWindowState m_windowState;
bool m_displayRefreshRateDirty = true;
double m_displayRefreshRate = 0.0; double m_displayRefreshRate = 0.0;
double m_targetFrameRate = 0.0; double m_targetFrameRate = 0.0;
@ -215,8 +216,7 @@ namespace dxvk {
void NormalizePresentParameters(D3DPRESENT_PARAMETERS* pPresentParams); void NormalizePresentParameters(D3DPRESENT_PARAMETERS* pPresentParams);
void NotifyDisplayRefreshRate( void UpdateDisplayRefreshRate();
double RefreshRate);
HRESULT EnterFullscreenMode( HRESULT EnterFullscreenMode(
D3DPRESENT_PARAMETERS* pPresentParams, D3DPRESENT_PARAMETERS* pPresentParams,