Skip to content

Commit 958b610

Browse files
committed
[d3d9] Pass display refresh rate around in windowed mode
1 parent 2d4a4bd commit 958b610

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed

src/d3d9/d3d9_swapchain.cpp

+37-10
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ namespace dxvk {
171171
// We aren't going to device loss simply because
172172
// 99% of D3D9 games don't handle this properly and
173173
// just end up crashing (like with alt-tab loss)
174+
UpdateDisplayRefreshRate();
174175
UpdateTargetFrameRate(presentInterval);
175176
PresentImage(presentInterval);
176177
return D3D_OK;
@@ -982,7 +983,11 @@ namespace dxvk {
982983
m_latencyTracker = m_device->createLatencyTracker(entry->second.presenter);
983984
}
984985

985-
m_wctx = &entry->second;
986+
if (m_wctx != &entry->second) {
987+
m_wctx = &entry->second;
988+
m_displayRefreshRateDirty = true;
989+
}
990+
986991
return true;
987992
}
988993

@@ -1170,9 +1175,35 @@ namespace dxvk {
11701175
}
11711176

11721177

1173-
void D3D9SwapChainEx::NotifyDisplayRefreshRate(
1174-
double RefreshRate) {
1175-
m_displayRefreshRate = RefreshRate;
1178+
void D3D9SwapChainEx::UpdateDisplayRefreshRate() {
1179+
if (!m_displayRefreshRateDirty)
1180+
return;
1181+
1182+
m_displayRefreshRateDirty = false;
1183+
1184+
if (!m_monitor && m_window != m_presentParams.hDeviceWindow) {
1185+
m_displayRefreshRate = 0.0;
1186+
return;
1187+
}
1188+
1189+
HMONITOR monitor = m_monitor;
1190+
1191+
if (!monitor)
1192+
monitor = wsi::getWindowMonitor(m_window);
1193+
1194+
if (!monitor) {
1195+
m_displayRefreshRate = 0.0;
1196+
return;
1197+
}
1198+
1199+
wsi::WsiMode wsiMode = { };
1200+
1201+
if (wsi::getCurrentDisplayMode(monitor, &wsiMode)) {
1202+
m_displayRefreshRate = double(wsiMode.refreshRate.numerator)
1203+
/ double(wsiMode.refreshRate.denominator);
1204+
} else {
1205+
m_displayRefreshRate = 0.0;
1206+
}
11761207
}
11771208

11781209

@@ -1252,11 +1283,7 @@ namespace dxvk {
12521283
if (!wsi::setWindowMode(monitor, m_window, &m_windowState, wsiMode))
12531284
return D3DERR_NOTAVAILABLE;
12541285

1255-
if (wsi::getCurrentDisplayMode(monitor, &wsiMode))
1256-
NotifyDisplayRefreshRate(double(wsiMode.refreshRate.numerator) / double(wsiMode.refreshRate.denominator));
1257-
else
1258-
NotifyDisplayRefreshRate(0.0);
1259-
1286+
m_displayRefreshRateDirty = true;
12601287
return D3D_OK;
12611288
}
12621289

@@ -1268,7 +1295,7 @@ namespace dxvk {
12681295
if (!wsi::restoreDisplayMode())
12691296
return D3DERR_NOTAVAILABLE;
12701297

1271-
NotifyDisplayRefreshRate(0.0);
1298+
m_displayRefreshRateDirty = true;
12721299
return D3D_OK;
12731300
}
12741301

src/d3d9/d3d9_swapchain.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ namespace dxvk {
173173

174174
wsi::DxvkWindowState m_windowState;
175175

176+
bool m_displayRefreshRateDirty = true;
176177
double m_displayRefreshRate = 0.0;
177178
double m_targetFrameRate = 0.0;
178179

@@ -215,8 +216,7 @@ namespace dxvk {
215216

216217
void NormalizePresentParameters(D3DPRESENT_PARAMETERS* pPresentParams);
217218

218-
void NotifyDisplayRefreshRate(
219-
double RefreshRate);
219+
void UpdateDisplayRefreshRate();
220220

221221
HRESULT EnterFullscreenMode(
222222
D3DPRESENT_PARAMETERS* pPresentParams,

0 commit comments

Comments
 (0)