Skip to content

Commit 9ab3d81

Browse files
Synchronize changes from 1.6 branch [ci skip]
4343e49 D3D fix-ups after refactors #1
2 parents 6a82926 + 4343e49 commit 9ab3d81

File tree

2 files changed

+71
-33
lines changed

2 files changed

+71
-33
lines changed

Client/core/DXHook/CDirect3DEvents9.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "CProxyDirect3DVertexBuffer.h"
1717
#include "CProxyDirect3DIndexBuffer.h"
1818
#include "CProxyDirect3DTexture.h"
19+
#include "CProxyDirect3DDevice9.h"
1920
#include "CAdditionalVertexStreamManager.h"
2021
#include "CVertexStreamBoundingBoxManager.h"
2122
#include "CProxyDirect3DVertexDeclaration.h"
@@ -173,9 +174,9 @@ void CDirect3DEvents9::OnInvalidate(IDirect3DDevice9* pDevice)
173174

174175
if (bInAnyScene)
175176
{
176-
const HRESULT hrEndScene = pDevice->EndScene();
177-
if (FAILED(hrEndScene))
178-
WriteDebugEvent(SString("OnInvalidate: EndScene failed: %08x", hrEndScene));
177+
const ESceneOwner owner = bInMTAScene ? ESceneOwner::MTA : (bInGTAScene ? ESceneOwner::GTA : ESceneOwner::None);
178+
if (owner != ESceneOwner::None && !EndSceneWithoutProxy(pDevice, owner))
179+
WriteDebugEvent("OnInvalidate: EndSceneWithoutProxy failed");
179180
}
180181
}
181182
else
@@ -222,16 +223,12 @@ void CDirect3DEvents9::OnPresent(IDirect3DDevice9* pDevice)
222223
// Start a new scene. This isn't ideal and is not really recommended by MSDN.
223224
// I tried disabling EndScene from GTA and just end it after this code ourselves
224225
// before present, but that caused graphical issues randomly with the sky.
225-
const HRESULT hrBeginScene = pDevice->BeginScene();
226-
if (FAILED(hrBeginScene))
226+
if (!BeginSceneWithoutProxy(pDevice, ESceneOwner::MTA))
227227
{
228-
WriteDebugEvent(SString("OnPresent: BeginScene failed: %08x", hrBeginScene));
229-
g_bInMTAScene.store(false, std::memory_order_release);
228+
WriteDebugEvent("OnPresent: BeginSceneWithoutProxy failed");
230229
return;
231230
}
232231

233-
g_bInMTAScene.store(true, std::memory_order_release);
234-
235232
// Reset samplers on first call
236233
static bool bDoneReset = false;
237234
if (!bDoneReset)
@@ -301,8 +298,8 @@ void CDirect3DEvents9::OnPresent(IDirect3DDevice9* pDevice)
301298
// End the scene that we started.
302299
if (g_bInMTAScene.load(std::memory_order_acquire))
303300
{
304-
pDevice->EndScene();
305-
g_bInMTAScene.store(false, std::memory_order_release);
301+
if (!EndSceneWithoutProxy(pDevice, ESceneOwner::MTA))
302+
WriteDebugEvent("OnPresent: EndSceneWithoutProxy failed");
306303
}
307304

308305
// Update incase settings changed

Client/core/Graphics/CGraphics.cpp

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)