Skip to content

Commit 6fb8da4

Browse files
committed
Fix reference count with ShadowBackbuffer
1 parent 4f5747e commit 6fb8da4

File tree

6 files changed

+43
-26
lines changed

6 files changed

+43
-26
lines changed

Dllmain/BuildNo.rc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
#define BUILD_NUMBER 8067
1+
#define BUILD_NUMBER 8068

d3d9/IDirect3DDevice9Ex.cpp

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ HRESULT m_IDirect3DDevice9Ex::GetBackBuffer(THIS_ UINT iSwapChain, UINT iBackBuf
451451
{
452452
Logging::LogDebug() << __FUNCTION__ << " (" << this << ")";
453453

454-
if (iSwapChain == 0 && ppBackBuffer && ShadowBackbuffer.Count())
454+
if (iSwapChain == 0 && ppBackBuffer && ShadowBackbuffer->Count())
455455
{
456456
*ppBackBuffer = nullptr;
457457

@@ -466,7 +466,7 @@ HRESULT m_IDirect3DDevice9Ex::GetBackBuffer(THIS_ UINT iSwapChain, UINT iBackBuf
466466
}
467467

468468
// For stereo buffers, we just return the mono shadow for simplicity
469-
IDirect3DSurface9* pSurface = ShadowBackbuffer.GetSurface(iBackBuffer);
469+
IDirect3DSurface9* pSurface = ShadowBackbuffer->GetSurface(iBackBuffer);
470470
if (!pSurface)
471471
{
472472
return D3DERR_INVALIDCALL;
@@ -907,7 +907,7 @@ HRESULT m_IDirect3DDevice9Ex::GetFrontBufferData(THIS_ UINT iSwapChain, IDirect3
907907
}
908908
else
909909
{
910-
if (iSwapChain == 0 && ShadowBackbuffer.Count())
910+
if (iSwapChain == 0 && ShadowBackbuffer->Count())
911911
{
912912
return GetFrontBufferShadowData(iSwapChain, pDestSurface);
913913
}
@@ -1012,7 +1012,7 @@ HRESULT m_IDirect3DDevice9Ex::SetRenderTarget(THIS_ DWORD RenderTargetIndex, IDi
10121012
pRenderTarget = static_cast<m_IDirect3DSurface9*>(pRenderTarget)->GetProxyInterface();
10131013
}
10141014

1015-
if (ShadowBackbuffer.Count() && pRenderTarget)
1015+
if (ShadowBackbuffer->Count() && pRenderTarget)
10161016
{
10171017
if (std::find(BackBufferList.begin(), BackBufferList.end(), pRenderTarget) != BackBufferList.end())
10181018
{
@@ -1031,7 +1031,7 @@ HRESULT m_IDirect3DDevice9Ex::GetRenderTarget(THIS_ DWORD RenderTargetIndex, IDi
10311031

10321032
HRESULT hr = ProxyInterface->GetRenderTarget(RenderTargetIndex, ppRenderTarget);
10331033

1034-
if (ShadowBackbuffer.Count() && ppRenderTarget)
1034+
if (ShadowBackbuffer->Count() && ppRenderTarget)
10351035
{
10361036
auto it = std::find(BackBufferList.begin(), BackBufferList.end(), *ppRenderTarget);
10371037
if (it != BackBufferList.end())
@@ -1040,7 +1040,7 @@ HRESULT m_IDirect3DDevice9Ex::GetRenderTarget(THIS_ DWORD RenderTargetIndex, IDi
10401040

10411041
(*ppRenderTarget)->Release();
10421042

1043-
*ppRenderTarget = ShadowBackbuffer.GetCurrentBackBuffer();
1043+
*ppRenderTarget = ShadowBackbuffer->GetCurrentBackBuffer();
10441044

10451045
if (!*ppRenderTarget)
10461046
{
@@ -2475,7 +2475,7 @@ void m_IDirect3DDevice9Ex::ApplyPrePresentFixes()
24752475
}
24762476

24772477
// Apply brightness level
2478-
if (ShadowBackbuffer.Count() || IsGammaSet)
2478+
if (ShadowBackbuffer->Count() || IsGammaSet)
24792479
{
24802480
ApplyBrightnessLevel();
24812481
}
@@ -2523,26 +2523,26 @@ void m_IDirect3DDevice9Ex::ApplyPrePresentFixes()
25232523

25242524
void m_IDirect3DDevice9Ex::ApplyPostPresentFixes()
25252525
{
2526-
if (ShadowBackbuffer.Count())
2526+
if (ShadowBackbuffer->Count())
25272527
{
25282528
if (SHARED.BackBufferCount == 1)
25292529
{
2530-
if (FAILED(ProxyInterface->StretchRect(ShadowBackbuffer.GetCurrentBackBuffer()->GetProxyInterface(), nullptr, ShadowBackbuffer.GetCurrentFrontBuffer()->GetProxyInterface(), nullptr, D3DTEXF_NONE)))
2530+
if (FAILED(ProxyInterface->StretchRect(ShadowBackbuffer->GetCurrentBackBuffer()->GetProxyInterface(), nullptr, ShadowBackbuffer->GetCurrentFrontBuffer()->GetProxyInterface(), nullptr, D3DTEXF_NONE)))
25312531
{
25322532
LOG_LIMIT(100, __FUNCTION__ << " Warning: Failed to copy shadow backbuffer into shadow front buffer!");
25332533
}
25342534
}
25352535
else
25362536
{
2537-
ShadowBackbuffer.Rotate();
2537+
ShadowBackbuffer->Rotate();
25382538

25392539
ComPtr<IDirect3DSurface9> pSurface;
25402540
if (SUCCEEDED(ProxyInterface->GetRenderTarget(0, pSurface.GetAddressOf())))
25412541
{
2542-
if (pSurface.Get() == ShadowBackbuffer.GetCurrentFrontBuffer()->GetProxyInterface() ||
2542+
if (pSurface.Get() == ShadowBackbuffer->GetCurrentFrontBuffer()->GetProxyInterface() ||
25432543
std::find(BackBufferList.begin(), BackBufferList.end(), pSurface.Get()) != BackBufferList.end())
25442544
{
2545-
ProxyInterface->SetRenderTarget(0, ShadowBackbuffer.GetCurrentBackBuffer()->GetProxyInterface());
2545+
ProxyInterface->SetRenderTarget(0, ShadowBackbuffer->GetCurrentBackBuffer()->GetProxyInterface());
25462546
}
25472547
}
25482548
}
@@ -2601,6 +2601,11 @@ void m_IDirect3DDevice9Ex::BeforeEndScene()
26012601
#endif
26022602
}
26032603

2604+
bool m_IDirect3DDevice9Ex::RequirePresentHandling() const
2605+
{
2606+
return ((Config.WindowModeGammaShader && IsGammaSet) || Config.ShowFPSCounter || ShadowBackbuffer->Count());
2607+
}
2608+
26042609
void m_IDirect3DDevice9Ex::LimitFrameRate() const
26052610
{
26062611
// Count the number of frames
@@ -3059,7 +3064,7 @@ DWORD m_IDirect3DDevice9Ex::GetResourceRefCount()
30593064
(pFont ? 1 + FontRefCount : 0) +
30603065
(pSprite ? 2 + SprintRefCount : 0) +
30613066
(pStateBlock ? 1 : 0) +
3062-
ShadowBackbuffer.Count();
3067+
ShadowBackbuffer->GetRefCount();
30633068
}
30643069

30653070
void m_IDirect3DDevice9Ex::ReleaseResources(bool isReset)
@@ -3314,7 +3319,7 @@ void m_IDirect3DDevice9Ex::ReInitInterface()
33143319
DefaultRampData.blue[i] = value;
33153320
}
33163321

3317-
ShadowBackbuffer.ReleaseAll();
3322+
ShadowBackbuffer->ReleaseAll();
33183323

33193324
if (!SHARED.IsDirectDrawDevice && Config.UseShadowBackbuffer)
33203325
{
@@ -3354,18 +3359,18 @@ void m_IDirect3DDevice9Ex::CreateShadowBackbuffer()
33543359
}
33553360
}
33563361

3357-
ShadowBackbuffer.Initialize(BackBufferCount);
3362+
ShadowBackbuffer->Initialize(BackBufferCount);
33583363

33593364
for (size_t i = 0; i < BackBufferCount; ++i)
33603365
{
33613366
m_IDirect3DSurface9* surf = nullptr;
33623367
if (FAILED(CreateRenderTarget(Desc.Width, Desc.Height, Desc.Format, Desc.MultiSampleType, Desc.MultiSampleQuality, FALSE, reinterpret_cast<IDirect3DSurface9**>(&surf), nullptr)))
33633368
{
33643369
Logging::Log() << __FUNCTION__ << " Error: failed to create render target!";
3365-
ShadowBackbuffer.ReleaseAll();
3370+
ShadowBackbuffer->ReleaseAll();
33663371
return;
33673372
}
3368-
ShadowBackbuffer.SetSurface(i, surf);
3373+
ShadowBackbuffer->SetSurface(i, surf);
33693374

33703375
ComPtr<IDirect3DSurface9> pBackbuffer;
33713376
if (SUCCEEDED(ProxyInterface->GetBackBuffer(0, i, D3DBACKBUFFER_TYPE_MONO, pBackbuffer.GetAddressOf())))
@@ -3374,20 +3379,20 @@ void m_IDirect3DDevice9Ex::CreateShadowBackbuffer()
33743379
}
33753380
}
33763381

3377-
ProxyInterface->SetRenderTarget(0, ShadowBackbuffer.GetCurrentBackBuffer()->GetProxyInterface());
3382+
ProxyInterface->SetRenderTarget(0, ShadowBackbuffer->GetCurrentBackBuffer()->GetProxyInterface());
33783383
}
33793384

33803385
void m_IDirect3DDevice9Ex::ReleaseShadowBackbuffer()
33813386
{
3382-
if (ShadowBackbuffer.Count())
3387+
if (ShadowBackbuffer->Count())
33833388
{
33843389
ComPtr<IDirect3DSurface9> pBackbuffer;
33853390
if (SUCCEEDED(ProxyInterface->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, pBackbuffer.GetAddressOf())))
33863391
{
33873392
ProxyInterface->SetRenderTarget(0, pBackbuffer.Get());
33883393
}
33893394

3390-
ShadowBackbuffer.ReleaseAll();
3395+
ShadowBackbuffer->ReleaseAll();
33913396
}
33923397
}
33933398

@@ -3723,7 +3728,7 @@ HRESULT m_IDirect3DDevice9Ex::FakeGetFrontBufferData(THIS_ UINT iSwapChain, IDir
37233728
}
37243729

37253730
// Get FrontBuffer data to new surface
3726-
HRESULT hr = ShadowBackbuffer.Count() ?
3731+
HRESULT hr = ShadowBackbuffer->Count() ?
37273732
GetFrontBufferShadowData(iSwapChain, pSourceSurface.Get()) :
37283733
ProxyInterface->GetFrontBufferData(iSwapChain, pSourceSurface.Get());
37293734
if (FAILED(hr))
@@ -3808,7 +3813,7 @@ HRESULT m_IDirect3DDevice9Ex::GetFrontBufferShadowData(THIS_ UINT iSwapChain, ID
38083813
return D3DERR_INVALIDCALL;
38093814
}
38103815

3811-
IDirect3DSurface9* pShadowSurface = ShadowBackbuffer.GetCurrentFrontBuffer()->GetProxyInterface();
3816+
IDirect3DSurface9* pShadowSurface = ShadowBackbuffer->GetCurrentFrontBuffer()->GetProxyInterface();
38123817

38133818
// Copy shadow buffer into destination
38143819
return ProxyInterface->StretchRect(pShadowSurface, nullptr, pDestSurface, nullptr, D3DTEXF_NONE);

d3d9/IDirect3DDevice9Ex.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class m_IDirect3DDevice9Ex : public IDirect3DDevice9Ex, public AddressLookupTabl
7070
LPDIRECT3DDEVICE9EX ProxyInterfaceEx = nullptr;
7171
m_IDirect3D9Ex* m_pD3DEx;
7272
const IID WrapperID;
73-
ShadowSurfaceStorage ShadowBackbuffer;
73+
std::unique_ptr<ShadowSurfaceStorage> ShadowBackbuffer = std::make_unique<ShadowSurfaceStorage>();
7474
std::vector<IDirect3DSurface9*> BackBufferList;
7575

7676
UINT DDKey;
@@ -127,7 +127,7 @@ class m_IDirect3DDevice9Ex : public IDirect3DDevice9Ex, public AddressLookupTabl
127127
void AfterBeginScene();
128128
void BeforeEndScene();
129129

130-
inline bool RequirePresentHandling() const { return ((Config.WindowModeGammaShader && IsGammaSet) || Config.ShowFPSCounter || ShadowBackbuffer.Count()); }
130+
bool RequirePresentHandling() const;
131131

132132
// Limit frame rate
133133
void LimitFrameRate() const;

d3d9/IDirect3DSurface9.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class m_IDirect3DSurface9 : public IDirect3DSurface9, public AddressLookupTableD
6767
// Information functions
6868
LPDIRECT3DSURFACE9 GetProxyInterface() const { return ProxyInterface; }
6969
bool IsEmulatedSurface() const { return (Desc.MultiSampleType && DeviceMultiSampleFlag && !(Desc.Usage & D3DUSAGE_DEPTHSTENCIL)); };
70+
ULONG GetSurfaceCount() const { return Emu.pSurface ? 2 : 1; }
7071

7172
// Helper functions
7273
void InitInterface(m_IDirect3DDevice9Ex* Device, REFIID, void*);

d3d9/ShadowSurfaceStorage.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,16 @@ class ShadowSurfaceStorage
7272
return false;
7373
}
7474

75+
ULONG GetRefCount() const
76+
{
77+
ULONG ref = 0;
78+
for (auto* s : surfaces)
79+
{
80+
if (s) ref += s->GetSurfaceCount();
81+
}
82+
return ref;
83+
}
84+
7585
// Release everything
7686
void ReleaseAll()
7787
{

d3d9/d3d9.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ class m_IDirect3DVolume9;
2626
class m_IDirect3DVolumeTexture9;
2727
class m_IDirect3DVideoDevice9;
2828
class m_IDirect3DDXVADevice9;
29+
class ShadowSurfaceStorage;
2930

3031
#include "AddressLookupTable.h"
31-
#include "ShadowSurfaceStorage.h"
3232
#include "IClassFactory\IClassFactory.h"
3333
#include "GDI\GDI.h"
3434
#include "Utils\Utils.h"
@@ -135,3 +135,4 @@ namespace D3d9Wrapper
135135
#include "IDirect3DVolumeTexture9.h"
136136
#include "IDirect3DVideoDevice9.h"
137137
#include "IDirect3DDXVADevice9.h"
138+
#include "ShadowSurfaceStorage.h"

0 commit comments

Comments
 (0)