Skip to content

Commit c029a6f

Browse files
committed
Round #1: Fix 10 memory leaks in Client\core\Graphics
1 parent 55847eb commit c029a6f

11 files changed

+81
-8
lines changed

Client/core/Graphics/CGraphics.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,6 +1837,7 @@ void CGraphics::DrawQueueItem(const sDrawQueueItem& Item)
18371837
const sDrawQueuePrimitiveMaterial primitive = Item.PrimitiveMaterial;
18381838
CheckModes(EDrawMode::PRIMITIVE_MATERIAL, Item.blendMode);
18391839
m_pPrimitiveMaterialBatcher->AddPrimitive(primitive.eType, primitive.pMaterial, primitive.pVecVertices);
1840+
RemoveQueueRef(primitive.pMaterial);
18401841
break;
18411842
}
18421843
}
@@ -1873,9 +1874,25 @@ void CGraphics::ClearDrawQueue(std::vector<sDrawQueueItem>& Queue)
18731874
{
18741875
const sDrawQueueItem& item = *iter;
18751876
if (item.eType == QUEUE_TEXTURE || item.eType == QUEUE_SHADER)
1877+
{
18761878
RemoveQueueRef(item.Texture.pMaterial);
1879+
}
1880+
else if (item.eType == QUEUE_PRIMITIVEMATERIAL)
1881+
{
1882+
if (item.PrimitiveMaterial.pMaterial)
1883+
RemoveQueueRef(item.PrimitiveMaterial.pMaterial);
1884+
// Flush any queued geometry that never reached the batcher
1885+
delete item.PrimitiveMaterial.pVecVertices;
1886+
}
1887+
else if (item.eType == QUEUE_PRIMITIVE)
1888+
{
1889+
// Prevent per-primitive allocations from leaking when we clear the queue early
1890+
delete item.Primitive.pVecVertices;
1891+
}
18771892
else if (item.eType == QUEUE_TEXT)
1893+
{
18781894
RemoveQueueRef(item.Text.pDXFont);
1895+
}
18791896
}
18801897
Queue.clear();
18811898
}

Client/core/Graphics/CMaterialLine3DBatcher.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ CMaterialLine3DBatcher::CMaterialLine3DBatcher(bool bPreGUI)
3636
////////////////////////////////////////////////////////////////
3737
CMaterialLine3DBatcher::~CMaterialLine3DBatcher()
3838
{
39+
for (SMaterialLine3DItem& item : m_LineList)
40+
{
41+
if (item.pMaterial)
42+
item.pMaterial->Release();
43+
}
44+
m_LineList.clear();
3945
}
4046

4147
////////////////////////////////////////////////////////////////

Client/core/Graphics/CMaterialPrimitive3DBatcher.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
CMaterialPrimitive3DBatcher::CMaterialPrimitive3DBatcher(bool bPreGUI, CGraphics* pGraphics) : m_bPreGUI(bPreGUI), m_pGraphics(pGraphics)
2222
{
2323
}
24+
25+
CMaterialPrimitive3DBatcher::~CMaterialPrimitive3DBatcher()
26+
{
27+
ClearQueue();
28+
}
2429
////////////////////////////////////////////////////////////////
2530
//
2631
// CMaterialPrimitive3DBatcher::OnDeviceCreate
@@ -158,6 +163,7 @@ void CMaterialPrimitive3DBatcher::Flush()
158163
}
159164
pLastMaterial = pMaterial;
160165
pMaterial->Release();
166+
primitive.pMaterial = nullptr;
161167
}
162168

163169
// Clean up
@@ -175,7 +181,9 @@ void CMaterialPrimitive3DBatcher::ClearQueue()
175181
// Clean up
176182
for (auto& primitive : m_primitiveList)
177183
{
184+
SAFE_RELEASE(primitive.pMaterial);
178185
delete primitive.pVecVertices;
186+
primitive.pVecVertices = nullptr;
179187
}
180188

181189
m_primitiveList.clear();

Client/core/Graphics/CMaterialPrimitive3DBatcher.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class CMaterialPrimitive3DBatcher
2626
{
2727
public:
2828
CMaterialPrimitive3DBatcher(bool bPreGUI, CGraphics* pGraphics);
29+
~CMaterialPrimitive3DBatcher();
2930
void OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewportSizeX, float fViewportSizeY);
3031
void Flush();
3132
void AddPrimitive(D3DPRIMITIVETYPE eType, CMaterialItem* pMaterial, std::vector<PrimitiveMaterialVertice>* pVecVertices);

Client/core/Graphics/CPrimitive3DBatcher.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
CPrimitive3DBatcher::CPrimitive3DBatcher(bool bPreGUI) : m_bPreGUI(bPreGUI)
2222
{
2323
}
24+
25+
CPrimitive3DBatcher::~CPrimitive3DBatcher()
26+
{
27+
ClearQueue();
28+
}
2429
////////////////////////////////////////////////////////////////
2530
//
2631
// CPrimitive3DBatcher::OnDeviceCreate
@@ -97,13 +102,8 @@ void CPrimitive3DBatcher::Flush()
97102
DrawPrimitive(primitive.eType, primitive.pVecVertices->size(), &primitive.pVecVertices->at(0), VertexStreamZeroStride);
98103
}
99104

100-
// Clean up
101-
for (auto& primitive : m_primitiveList)
102-
{
103-
delete primitive.pVecVertices;
104-
}
105-
106-
m_primitiveList.clear();
105+
// Clean up queued primitives now that they are flushed
106+
ClearQueue();
107107

108108
if (g_pDeviceState->AdapterState.bRequiresClipping)
109109
m_pDevice->SetRenderState(D3DRS_CLIPPING, FALSE);
@@ -156,3 +156,14 @@ void CPrimitive3DBatcher::AddPrimitive(D3DPRIMITIVETYPE eType, std::vector<Primi
156156
{
157157
m_primitiveList.push_back({eType, pVecVertices});
158158
}
159+
160+
void CPrimitive3DBatcher::ClearQueue()
161+
{
162+
for (auto& primitive : m_primitiveList)
163+
{
164+
delete primitive.pVecVertices;
165+
primitive.pVecVertices = nullptr;
166+
}
167+
168+
m_primitiveList.clear();
169+
}

Client/core/Graphics/CPrimitive3DBatcher.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@ class CPrimitive3DBatcher
2525
{
2626
public:
2727
CPrimitive3DBatcher(bool bPreGUI);
28+
~CPrimitive3DBatcher();
2829
void OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewportSizeX, float fViewportSizeY);
2930
void Flush();
3031
void AddPrimitive(D3DPRIMITIVETYPE eType, std::vector<PrimitiveVertice>* pVecVertices);
3132
void DrawPrimitive(D3DPRIMITIVETYPE eType, size_t iCollectionSize, const void* pDataAddr, size_t uiVertexStride);
3233
bool HasItems() const { return !m_primitiveList.empty(); }
34+
void ClearQueue();
3335

3436
protected:
3537
bool m_bPreGUI;

Client/core/Graphics/CPrimitiveBatcher.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ CPrimitiveBatcher::CPrimitiveBatcher()
3030
////////////////////////////////////////////////////////////////
3131
CPrimitiveBatcher::~CPrimitiveBatcher()
3232
{
33+
ClearQueue();
3334
}
3435
////////////////////////////////////////////////////////////////
3536
//
@@ -195,6 +196,7 @@ void CPrimitiveBatcher::ClearQueue()
195196
for (auto& primitive : m_primitiveList)
196197
{
197198
delete primitive.pVecVertices;
199+
primitive.pVecVertices = nullptr;
198200
}
199201
size_t prevSize = m_primitiveList.size();
200202
m_primitiveList.clear();

Client/core/Graphics/CPrimitiveMaterialBatcher.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ CPrimitiveMaterialBatcher::CPrimitiveMaterialBatcher(CGraphics* graphics)
3030
////////////////////////////////////////////////////////////////
3131
CPrimitiveMaterialBatcher::~CPrimitiveMaterialBatcher()
3232
{
33+
ClearQueue();
3334
}
3435
////////////////////////////////////////////////////////////////
3536
//
@@ -203,6 +204,7 @@ void CPrimitiveMaterialBatcher::Flush()
203204
}
204205
pLastMaterial = pMaterial;
205206
m_pGraphics->RemoveQueueRef(pMaterial);
207+
primitive.pMaterial = nullptr;
206208
}
207209

208210
// Clean up
@@ -257,7 +259,13 @@ void CPrimitiveMaterialBatcher::ClearQueue()
257259
// Clean up
258260
for (auto& primitive : m_primitiveList)
259261
{
262+
if (primitive.pMaterial)
263+
{
264+
m_pGraphics->RemoveQueueRef(primitive.pMaterial);
265+
primitive.pMaterial = nullptr;
266+
}
260267
delete primitive.pVecVertices;
268+
primitive.pVecVertices = nullptr;
261269
}
262270

263271
size_t prevSize = m_primitiveList.size();
@@ -273,5 +281,7 @@ void CPrimitiveMaterialBatcher::ClearQueue()
273281
////////////////////////////////////////////////////////////////
274282
void CPrimitiveMaterialBatcher::AddPrimitive(D3DPRIMITIVETYPE eType, CMaterialItem* pMaterial, std::vector<PrimitiveMaterialVertice>* pVecVertices)
275283
{
284+
if (pMaterial)
285+
m_pGraphics->AddQueueRef(pMaterial);
276286
m_primitiveList.push_back({eType, pMaterial, pVecVertices});
277287
}

Client/core/Graphics/CRenderItem.EffectCloner.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,21 @@ CEffectCloner::CEffectCloner(CRenderItemManager* pManager)
2424
m_pManager = pManager;
2525
}
2626

27+
CEffectCloner::~CEffectCloner()
28+
{
29+
for (auto& entry : m_ValidMap)
30+
{
31+
SAFE_RELEASE(entry.second);
32+
}
33+
m_ValidMap.clear();
34+
35+
for (CEffectTemplate* pTemplate : m_OldList)
36+
{
37+
SAFE_RELEASE(pTemplate);
38+
}
39+
m_OldList.clear();
40+
}
41+
2742
////////////////////////////////////////////////////////////////
2843
//
2944
// CEffectCloner::CreateD3DEffect

Client/core/Graphics/CRenderItem.EffectCloner.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class CEffectCloner
4646
{
4747
public:
4848
CEffectCloner(CRenderItemManager* pManager);
49+
~CEffectCloner();
4950
void DoPulse();
5051
CEffectWrap* CreateD3DEffect(const SString& strFile, const SString& strRootPath, bool bIsRawData, SString& strOutStatus, bool bDebug,
5152
const EffectMacroList& macros);

0 commit comments

Comments
 (0)