@@ -2144,12 +2144,49 @@ void CGraphics::DrawProgressMessage(bool bPreserveBackbuffer)
21442144 if (m_LastLostDeviceTimer.Get () < 1000 )
21452145 return ;
21462146
2147- const bool bWasInScene = g_bInGTAScene.load (std::memory_order_acquire) ||
2148- g_bInMTAScene.load (std::memory_order_acquire);
2149- bool bInScene = bWasInScene;
2147+ const auto determineOwner = []() -> ESceneOwner {
2148+ if (g_bInMTAScene.load (std::memory_order_acquire))
2149+ return ESceneOwner::MTA;
2150+ if (g_bInGTAScene.load (std::memory_order_acquire))
2151+ return ESceneOwner::GTA;
2152+ return ESceneOwner::None;
2153+ };
2154+
2155+ const ESceneOwner originalOwner = determineOwner ();
2156+ ESceneOwner currentOwner = originalOwner;
2157+
2158+ auto inScene = [&]() { return currentOwner != ESceneOwner::None; };
2159+
2160+ auto endCurrentScene = [&](const char * context) -> bool {
2161+ if (!inScene ())
2162+ return true ;
2163+ if (!EndSceneWithoutProxy (m_pDevice, currentOwner))
2164+ {
2165+ SString msg;
2166+ msg.Format (" %s: EndSceneWithoutProxy failed for owner %d" , context, static_cast <int >(currentOwner));
2167+ WriteDebugEvent (msg);
2168+ return false ;
2169+ }
2170+ currentOwner = ESceneOwner::None;
2171+ return true ;
2172+ };
21502173
2151- // Skip of not in a scene and not forced with always flag
2152- if (!bInScene && !g_pCore->GetDummyProgressUpdateAlways ())
2174+ auto beginSceneAs = [&](ESceneOwner owner, const char * context) -> bool {
2175+ if (owner == ESceneOwner::None)
2176+ return true ;
2177+ if (!BeginSceneWithoutProxy (m_pDevice, owner))
2178+ {
2179+ SString msg;
2180+ msg.Format (" %s: BeginSceneWithoutProxy failed for owner %d" , context, static_cast <int >(owner));
2181+ WriteDebugEvent (msg);
2182+ return false ;
2183+ }
2184+ currentOwner = owner;
2185+ return true ;
2186+ };
2187+
2188+ // Skip if not in a scene and not forced with always flag
2189+ if (!inScene () && !g_pCore->GetDummyProgressUpdateAlways ())
21532190 return ;
21542191
21552192 // Check if disabled
@@ -2177,10 +2214,10 @@ void CGraphics::DrawProgressMessage(bool bPreserveBackbuffer)
21772214 {
21782215 if (bPreserveBackbuffer)
21792216 {
2180- if (bInScene )
2217+ if (inScene () )
21812218 {
2182- m_pDevice-> EndScene ();
2183- bInScene = false ;
2219+ if (! endCurrentScene ( " CGraphics::DrawProgressMessage (preserve setup) " ))
2220+ break ;
21842221 }
21852222
21862223 // Get backbuffer surface
@@ -2237,10 +2274,10 @@ void CGraphics::DrawProgressMessage(bool bPreserveBackbuffer)
22372274 break ;
22382275 }
22392276
2240- if (!bInScene )
2277+ if (!inScene () )
22412278 {
2242- m_pDevice-> BeginScene ();
2243- bInScene = true ;
2279+ if (! beginSceneAs (ESceneOwner::MTA, " CGraphics::DrawProgressMessage (draw setup) " ))
2280+ break ;
22442281 }
22452282
22462283 // Draw progress graphics on backbuffer surface
@@ -2281,8 +2318,11 @@ void CGraphics::DrawProgressMessage(bool bPreserveBackbuffer)
22812318
22822319 if (bPreserveBackbuffer)
22832320 {
2284- m_pDevice->EndScene ();
2285- bInScene = false ;
2321+ if (inScene ())
2322+ {
2323+ if (!endCurrentScene (" CGraphics::DrawProgressMessage (pre-present)" ))
2324+ break ;
2325+ }
22862326
22872327 // Flip backbuffer onto front buffer
22882328 SAFE_RELEASE (pD3DBackBufferSurface);
@@ -2296,23 +2336,24 @@ void CGraphics::DrawProgressMessage(bool bPreserveBackbuffer)
22962336 break ;
22972337 hr = m_pDevice->StretchRect (m_pTempBackBufferData->m_pD3DRenderTargetSurface , NULL , pD3DBackBufferSurface, NULL , D3DTEXF_POINT);
22982338
2299- m_pDevice-> BeginScene ();
2300- bInScene = true ;
2339+ if (! beginSceneAs (ESceneOwner::MTA, " CGraphics::DrawProgressMessage (post-present) " ))
2340+ break ;
23012341 }
23022342 } while (false );
23032343
23042344 // Tidy
23052345 SAFE_RELEASE (pTempFrontBufferData);
23062346 SAFE_RELEASE (pD3DBackBufferSurface);
23072347
2308- // Ensure scene status is restored
2309- if (bInScene != bWasInScene )
2348+ // Ensure scene status is restored to its original owner
2349+ if (currentOwner != originalOwner )
23102350 {
2311- if (bWasInScene)
2312- m_pDevice->BeginScene ();
2313- else
2314- m_pDevice->EndScene ();
2315- bInScene = bWasInScene;
2351+ bool restorePossible = true ;
2352+ if (currentOwner != ESceneOwner::None)
2353+ restorePossible = endCurrentScene (" CGraphics::DrawProgressMessage (restore current)" );
2354+
2355+ if (restorePossible && originalOwner != ESceneOwner::None && currentOwner != originalOwner)
2356+ beginSceneAs (originalOwner, " CGraphics::DrawProgressMessage (restore original)" );
23162357 }
23172358
23182359 //
0 commit comments