@@ -171,6 +171,7 @@ namespace dxvk {
171
171
// We aren't going to device loss simply because
172
172
// 99% of D3D9 games don't handle this properly and
173
173
// just end up crashing (like with alt-tab loss)
174
+ UpdateDisplayRefreshRate ();
174
175
UpdateTargetFrameRate (presentInterval);
175
176
PresentImage (presentInterval);
176
177
return D3D_OK;
@@ -982,7 +983,11 @@ namespace dxvk {
982
983
m_latencyTracker = m_device->createLatencyTracker (entry->second .presenter );
983
984
}
984
985
985
- m_wctx = &entry->second ;
986
+ if (m_wctx != &entry->second ) {
987
+ m_wctx = &entry->second ;
988
+ m_displayRefreshRateDirty = true ;
989
+ }
990
+
986
991
return true ;
987
992
}
988
993
@@ -1170,9 +1175,35 @@ namespace dxvk {
1170
1175
}
1171
1176
1172
1177
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
+ }
1176
1207
}
1177
1208
1178
1209
@@ -1252,11 +1283,7 @@ namespace dxvk {
1252
1283
if (!wsi::setWindowMode (monitor, m_window, &m_windowState, wsiMode))
1253
1284
return D3DERR_NOTAVAILABLE;
1254
1285
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 ;
1260
1287
return D3D_OK;
1261
1288
}
1262
1289
@@ -1268,7 +1295,7 @@ namespace dxvk {
1268
1295
if (!wsi::restoreDisplayMode ())
1269
1296
return D3DERR_NOTAVAILABLE;
1270
1297
1271
- NotifyDisplayRefreshRate ( 0.0 ) ;
1298
+ m_displayRefreshRateDirty = true ;
1272
1299
return D3D_OK;
1273
1300
}
1274
1301
0 commit comments