Skip to content

Commit bf11c4c

Browse files
committed
Fixed a bunch of vertex-related memory leaks
1 parent 1f68357 commit bf11c4c

File tree

6 files changed

+91
-11
lines changed

6 files changed

+91
-11
lines changed

Client/core/CAdditionalVertexStreamManager.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,17 @@ CAdditionalVertexStreamManager::CAdditionalVertexStreamManager()
6767
///////////////////////////////////////////////////////////////
6868
CAdditionalVertexStreamManager::~CAdditionalVertexStreamManager()
6969
{
70+
SAFE_RELEASE(m_pOldVertexDeclaration);
71+
72+
for (std::map<void*, SAdditionalStreamInfo>::iterator iter = m_AdditionalStreamInfoMap.begin(); iter != m_AdditionalStreamInfoMap.end(); ++iter)
73+
{
74+
SAdditionalStreamInfo& info = iter->second;
75+
SAFE_RELEASE(info.pStreamData);
76+
SAFE_RELEASE(info.pVertexDeclaration);
77+
}
78+
79+
m_AdditionalStreamInfoMap.clear();
80+
m_pDevice = NULL;
7081
}
7182

7283
///////////////////////////////////////////////////////////////
@@ -83,6 +94,20 @@ CAdditionalVertexStreamManager* CAdditionalVertexStreamManager::GetSingleton()
8394
return ms_Singleton;
8495
}
8596

97+
CAdditionalVertexStreamManager* CAdditionalVertexStreamManager::GetExistingSingleton()
98+
{
99+
return ms_Singleton;
100+
}
101+
102+
void CAdditionalVertexStreamManager::DestroySingleton()
103+
{
104+
if (ms_Singleton)
105+
{
106+
delete ms_Singleton;
107+
ms_Singleton = NULL;
108+
}
109+
}
110+
86111
///////////////////////////////////////////////////////////////
87112
//
88113
// CAdditionalVertexStreamManager::OnDeviceCreate
@@ -105,6 +130,9 @@ void CAdditionalVertexStreamManager::OnDeviceCreate(IDirect3DDevice9* pDevice)
105130
bool CAdditionalVertexStreamManager::MaybeSetAdditionalVertexStream(D3DPRIMITIVETYPE PrimitiveType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices,
106131
UINT startIndex, UINT primCount)
107132
{
133+
if (!m_pDevice)
134+
return false;
135+
108136
// Cache info
109137
SCurrentStateInfo state;
110138

@@ -188,6 +216,9 @@ void CAdditionalVertexStreamManager::SetAdditionalVertexStream(SCurrentStateInfo
188216
///////////////////////////////////////////////////////////////
189217
void CAdditionalVertexStreamManager::MaybeUnsetAdditionalVertexStream()
190218
{
219+
if (!m_pDevice)
220+
return;
221+
191222
HRESULT hr;
192223
if (m_pOldVertexDeclaration)
193224
{
@@ -360,6 +391,9 @@ bool CAdditionalVertexStreamManager::UpdateAdditionalStreamContent(SCurrentState
360391
/////////////////////////////////////////////////////////////
361392
bool CAdditionalVertexStreamManager::UpdateCurrentStateInfo(SCurrentStateInfo& state)
362393
{
394+
if (!m_pDevice)
395+
return false;
396+
363397
// Get vertex declaration
364398
if (FAILED(m_pDevice->GetVertexDeclaration(&state.decl.pVertexDeclaration)))
365399
return false;
@@ -472,7 +506,10 @@ SAdditionalStreamInfo* CAdditionalVertexStreamManager::CreateAdditionalStreamInf
472506
info.Stride = sizeof(float) * 3;
473507
UINT Size2 = ConvertPTSize(state.decl.VertexBufferDesc1.Size);
474508
if (FAILED(m_pDevice->CreateVertexBuffer(Size2, D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &info.pStreamData, NULL)))
509+
{
510+
SAFE_RELEASE(info.pVertexDeclaration);
475511
return nullptr;
512+
}
476513

477514
// Save info
478515
MapSet(m_AdditionalStreamInfoMap, state.stream1.pStreamData, info);

Client/core/CAdditionalVertexStreamManager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ class CAdditionalVertexStreamManager
8484
void OnVertexBufferRangeInvalidated(IDirect3DVertexBuffer9* pStreamData, uint Offset, uint Size);
8585

8686
static CAdditionalVertexStreamManager* GetSingleton();
87+
static CAdditionalVertexStreamManager* GetExistingSingleton();
88+
static void DestroySingleton();
8789

8890
protected:
8991
void SetAdditionalVertexStream(SCurrentStateInfo& renderState);

Client/core/CVertexStreamBoundingBoxManager.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ CVertexStreamBoundingBoxManager::CVertexStreamBoundingBoxManager()
5959
///////////////////////////////////////////////////////////////
6060
CVertexStreamBoundingBoxManager::~CVertexStreamBoundingBoxManager()
6161
{
62+
m_StreamBoundsInfoMap.clear();
63+
m_pDevice = NULL;
6264
}
6365

6466
///////////////////////////////////////////////////////////////
@@ -75,6 +77,20 @@ CVertexStreamBoundingBoxManager* CVertexStreamBoundingBoxManager::GetSingleton()
7577
return ms_Singleton;
7678
}
7779

80+
CVertexStreamBoundingBoxManager* CVertexStreamBoundingBoxManager::GetExistingSingleton()
81+
{
82+
return ms_Singleton;
83+
}
84+
85+
void CVertexStreamBoundingBoxManager::DestroySingleton()
86+
{
87+
if (ms_Singleton)
88+
{
89+
delete ms_Singleton;
90+
ms_Singleton = NULL;
91+
}
92+
}
93+
7894
///////////////////////////////////////////////////////////////
7995
//
8096
// CVertexStreamBoundingBoxManager::OnDeviceCreate
@@ -97,6 +113,9 @@ void CVertexStreamBoundingBoxManager::OnDeviceCreate(IDirect3DDevice9* pDevice)
97113
float CVertexStreamBoundingBoxManager::GetDistanceSqToGeometry(D3DPRIMITIVETYPE PrimitiveType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices,
98114
UINT startIndex, UINT primCount)
99115
{
116+
if (!m_pDevice)
117+
return 0.f;
118+
100119
// Cache info
101120
SCurrentStateInfo2 state;
102121

@@ -314,6 +333,9 @@ bool CVertexStreamBoundingBoxManager::ComputeVertexStreamBoundingBox(SCurrentSta
314333
/////////////////////////////////////////////////////////////
315334
bool CVertexStreamBoundingBoxManager::CheckCanDoThis(SCurrentStateInfo2& state)
316335
{
336+
if (!m_pDevice)
337+
return false;
338+
317339
// Only tri-lists and tri-strips
318340
if (state.args.PrimitiveType != D3DPT_TRIANGLESTRIP && state.args.PrimitiveType != D3DPT_TRIANGLELIST)
319341
return false;

Client/core/CVertexStreamBoundingBoxManager.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,19 @@ struct SCurrentStateInfo2
7575
SCurrentStateInfo2(const SCurrentStateInfo2& other);
7676
SCurrentStateInfo2& operator=(const SCurrentStateInfo2& other);
7777

78+
void ReleaseComReferences()
79+
{
80+
SAFE_RELEASE(stream.pStreamData);
81+
SAFE_RELEASE(pIndexData);
82+
SAFE_RELEASE(decl.pVertexDeclaration);
83+
}
84+
7885
public:
7986
SCurrentStateInfo2() { ZERO_POD_STRUCT(this); }
8087

8188
~SCurrentStateInfo2()
8289
{
83-
SAFE_RELEASE(stream.pStreamData);
84-
SAFE_RELEASE(pIndexData);
85-
SAFE_RELEASE(decl.pVertexDeclaration);
90+
ReleaseComReferences();
8691
}
8792

8893
// Info to DrawIndexPrimitive
@@ -132,6 +137,8 @@ class CVertexStreamBoundingBoxManager
132137
void OnVertexBufferRangeInvalidated(IDirect3DVertexBuffer9* pStreamData, uint Offset, uint Size);
133138

134139
static CVertexStreamBoundingBoxManager* GetSingleton();
140+
static CVertexStreamBoundingBoxManager* GetExistingSingleton();
141+
static void DestroySingleton();
135142

136143
protected:
137144
float CalcDistanceSq(const SCurrentStateInfo2& state, const CBox& boundingBox);

Client/core/DXHook/CDirect3DEvents9.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ void CDirect3DEvents9::OnDirect3DDeviceDestroy(IDirect3DDevice9* pDevice)
5757
// Destroy the GUI elements
5858
CLocalGUI::GetSingleton().DestroyObjects();
5959

60+
CAdditionalVertexStreamManager::DestroySingleton();
61+
CVertexStreamBoundingBoxManager::DestroySingleton();
62+
6063
// De-initialize the GUI manager (destroying is done on Exit)
6164
CCore::GetSingleton().DeinitGUI();
6265
}
@@ -491,8 +494,11 @@ HRESULT CDirect3DEvents9::DrawIndexedPrimitiveShader(IDirect3DDevice9* pDevice,
491494
if (pShaderInstance->m_pEffectWrap->m_pEffectTemplate->m_bRequiresNormals)
492495
{
493496
// Find/create/set additional vertex stream
494-
CAdditionalVertexStreamManager::GetSingleton()->MaybeSetAdditionalVertexStream(PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices,
495-
startIndex, primCount);
497+
if (CAdditionalVertexStreamManager* pAdditionalStreamManager = CAdditionalVertexStreamManager::GetExistingSingleton())
498+
{
499+
pAdditionalStreamManager->MaybeSetAdditionalVertexStream(PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex,
500+
primCount);
501+
}
496502
}
497503

498504
// Apply custom parameters
@@ -543,7 +549,8 @@ HRESULT CDirect3DEvents9::DrawIndexedPrimitiveShader(IDirect3DDevice9* pDevice,
543549
}
544550

545551
// Unset additional vertex stream
546-
CAdditionalVertexStreamManager::GetSingleton()->MaybeUnsetAdditionalVertexStream();
552+
if (CAdditionalVertexStreamManager* pAdditionalStreamManager = CAdditionalVertexStreamManager::GetExistingSingleton())
553+
pAdditionalStreamManager->MaybeUnsetAdditionalVertexStream();
547554
}
548555

549556
return D3D_OK;
@@ -574,7 +581,8 @@ void CDirect3DEvents9::CloseActiveShader()
574581
pDevice->SetPixelShader(NULL);
575582

576583
// Unset additional vertex stream
577-
CAdditionalVertexStreamManager::GetSingleton()->MaybeUnsetAdditionalVertexStream();
584+
if (CAdditionalVertexStreamManager* pAdditionalStreamManager = CAdditionalVertexStreamManager::GetExistingSingleton())
585+
pAdditionalStreamManager->MaybeUnsetAdditionalVertexStream();
578586
}
579587

580588
/////////////////////////////////////////////////////////////

Client/core/DXHook/CProxyDirect3DVertexBuffer.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ CProxyDirect3DVertexBuffer::CProxyDirect3DVertexBuffer(IDirect3DDevice9* InD3DDe
4646
/////////////////////////////////////////////////////////////
4747
CProxyDirect3DVertexBuffer::~CProxyDirect3DVertexBuffer()
4848
{
49-
CAdditionalVertexStreamManager::GetSingleton()->OnVertexBufferDestroy(m_pOriginal);
50-
CVertexStreamBoundingBoxManager::GetSingleton()->OnVertexBufferDestroy(m_pOriginal);
49+
if (CAdditionalVertexStreamManager* pManager = CAdditionalVertexStreamManager::GetExistingSingleton())
50+
pManager->OnVertexBufferDestroy(m_pOriginal);
51+
if (CVertexStreamBoundingBoxManager* pBoundingBoxManager = CVertexStreamBoundingBoxManager::GetExistingSingleton())
52+
pBoundingBoxManager->OnVertexBufferDestroy(m_pOriginal);
5153

5254
m_stats.iCurrentCount--;
5355
m_stats.iCurrentBytes -= m_iMemUsed;
@@ -105,8 +107,10 @@ HRESULT CProxyDirect3DVertexBuffer::Lock(UINT OffsetToLock, UINT SizeToLock, voi
105107

106108
if ((Flags & D3DLOCK_READONLY) == 0)
107109
{
108-
CAdditionalVertexStreamManager::GetSingleton()->OnVertexBufferRangeInvalidated(m_pOriginal, OffsetToLock, SizeToLock);
109-
CVertexStreamBoundingBoxManager::GetSingleton()->OnVertexBufferRangeInvalidated(m_pOriginal, OffsetToLock, SizeToLock);
110+
if (CAdditionalVertexStreamManager* pManager = CAdditionalVertexStreamManager::GetExistingSingleton())
111+
pManager->OnVertexBufferRangeInvalidated(m_pOriginal, OffsetToLock, SizeToLock);
112+
if (CVertexStreamBoundingBoxManager* pBoundingBoxManager = CVertexStreamBoundingBoxManager::GetExistingSingleton())
113+
pBoundingBoxManager->OnVertexBufferRangeInvalidated(m_pOriginal, OffsetToLock, SizeToLock);
110114
}
111115

112116
*ppbData = NULL;

0 commit comments

Comments
 (0)