Skip to content

Commit e53f44e

Browse files
committed
Added another test fix for #9085 (Clone failed @ 'dxCreateShader')
1 parent 76bd22a commit e53f44e

File tree

4 files changed

+32
-23
lines changed

4 files changed

+32
-23
lines changed

MTA10/core/CRenderItem.EffectCloner.cpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ class CEffectClonerImpl : public CEffectCloner
2424
CEffectClonerImpl ( CRenderItemManager* pManager );
2525
virtual ~CEffectClonerImpl ( void );
2626
virtual void DoPulse ( void );
27-
virtual ID3DXEffect* CreateD3DEffect ( const SString& strFilename, const SString& strRootPath, SString& strOutStatus, bool& bOutUsesVertexShader, bool& bOutUsesDepthBuffer, bool bDebug );
28-
virtual void ReleaseD3DEffect ( ID3DXEffect* pD3DEffect );
27+
virtual ID3DXEffect** CreateD3DEffect ( const SString& strFilename, const SString& strRootPath, SString& strOutStatus, bool& bOutUsesVertexShader, bool& bOutUsesDepthBuffer, bool bDebug );
28+
virtual void ReleaseD3DEffect ( ID3DXEffect** pD3DEffect );
2929

3030
// CEffectClonerImpl
3131
void MaybeTidyUp ( bool bForceDrasticMeasures = false, CEffectTemplate* pKeepThis = NULL );
3232

3333
CElapsedTime m_TidyupTimer;
3434
CRenderItemManager* m_pManager;
35-
std::map < ID3DXEffect*, CEffectTemplate* > m_CloneMap;
35+
std::map < ID3DXEffect**, CEffectTemplate* > m_CloneMap;
3636
std::map < SString, CEffectTemplate* > m_ValidMap; // Active and files not changed since first created
3737
std::vector < CEffectTemplate* > m_OldList; // Active but files changed since first created
3838
uint m_uiCloneFailTotalCount;
@@ -84,7 +84,7 @@ CEffectClonerImpl::~CEffectClonerImpl ( void )
8484
//
8585
//
8686
////////////////////////////////////////////////////////////////
87-
ID3DXEffect* CEffectClonerImpl::CreateD3DEffect ( const SString& strFilename, const SString& strRootPath, SString& strOutStatus, bool& bOutUsesVertexShader, bool& bOutUsesDepthBuffer, bool bDebug )
87+
ID3DXEffect** CEffectClonerImpl::CreateD3DEffect ( const SString& strFilename, const SString& strRootPath, SString& strOutStatus, bool& bOutUsesVertexShader, bool& bOutUsesDepthBuffer, bool bDebug )
8888
{
8989
// Do we have a match with the initial path
9090
CEffectTemplate* pEffectTemplate = MapFindRef ( m_ValidMap, ConformPathForSorting ( strFilename ) );
@@ -134,7 +134,10 @@ ID3DXEffect* CEffectClonerImpl::CreateD3DEffect ( const SString& strFilename, co
134134
}
135135

136136
if ( !strReport.empty() )
137+
{
138+
strReport += SString( "[effects cur:%d created:%d dest:%d]", g_pDeviceState->MemoryState.Effect.iCurrentCount, g_pDeviceState->MemoryState.Effect.iCreatedCount, g_pDeviceState->MemoryState.Effect.iDestroyedCount );
137139
AddReportLog( 7544, SString( "NewEffectTemplate (call:%d) %s %s", uiCallCount, *strReport, *strFilename ) );
140+
}
138141
if ( !pEffectTemplate )
139142
return NULL;
140143
}
@@ -206,11 +209,14 @@ ID3DXEffect* CEffectClonerImpl::CreateD3DEffect ( const SString& strFilename, co
206209
}
207210
m_uiCloneSuccessTotalCount++;
208211

212+
ID3DXEffect** ppNewD3DEffect = new ID3DXEffect*;
213+
*ppNewD3DEffect = pNewD3DEffect;
214+
209215
// Cross ref clone with original
210-
MapSet ( m_CloneMap, pNewD3DEffect, pEffectTemplate );
216+
MapSet ( m_CloneMap, ppNewD3DEffect, pEffectTemplate );
211217

212218
// Return result
213-
return pNewD3DEffect;
219+
return ppNewD3DEffect;
214220
}
215221

216222

@@ -221,15 +227,17 @@ ID3DXEffect* CEffectClonerImpl::CreateD3DEffect ( const SString& strFilename, co
221227
// Remove all refs to the d3d effect
222228
//
223229
////////////////////////////////////////////////////////////////
224-
void CEffectClonerImpl::ReleaseD3DEffect ( ID3DXEffect* pD3DEffect )
230+
void CEffectClonerImpl::ReleaseD3DEffect ( ID3DXEffect** ppD3DEffect )
225231
{
226232
// Find pEffectTemplate from which this d3d effect was cloned from
227-
CEffectTemplate* pEffectTemplate = MapFindRef ( m_CloneMap, pD3DEffect );
233+
CEffectTemplate* pEffectTemplate = MapFindRef ( m_CloneMap, ppD3DEffect );
228234
assert ( pEffectTemplate );
229235

230236
// Remove from clone map
231-
MapRemove ( m_CloneMap, pD3DEffect );
237+
MapRemove ( m_CloneMap, ppD3DEffect );
232238

239+
ID3DXEffect* pD3DEffect = *ppD3DEffect;
240+
delete ppD3DEffect;
233241
// Remove from pEffectTemplate. This will alse release the d3d effect.
234242
pEffectTemplate->UnCloneD3DEffect ( pD3DEffect );
235243
}

MTA10/core/CRenderItem.EffectCloner.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ class CEffectCloner
2020
public:
2121
virtual ~CEffectCloner ( void ) {}
2222
virtual void DoPulse ( void ) = 0;
23-
virtual ID3DXEffect* CreateD3DEffect ( const SString& strFilename, const SString& strRootPath, SString& strOutStatus, bool& bOutUsesVertexShader, bool& bOutUsesDepthBuffer, bool bDebug ) = 0;
24-
virtual void ReleaseD3DEffect ( ID3DXEffect* pD3DEffect ) = 0;
23+
virtual ID3DXEffect** CreateD3DEffect ( const SString& strFilename, const SString& strRootPath, SString& strOutStatus, bool& bOutUsesVertexShader, bool& bOutUsesDepthBuffer, bool bDebug ) = 0;
24+
virtual void ReleaseD3DEffect ( ID3DXEffect** pD3DEffect ) = 0;
2525
};
2626

2727
CEffectCloner* NewEffectCloner ( CRenderItemManager* pManager );

MTA10/core/CRenderItem.EffectTemplate.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class CEffectTemplateImpl : public CEffectTemplate
4444
bool m_bHaveFilesChanged;
4545
std::map < SString, SString > m_FileMD5Map;
4646
CTickCount m_TickCountLastUsed;
47-
std::set < ID3DXEffect* > m_CloneList;
47+
uint m_uiCloneCount;
4848
SDebugInfo m_DebugInfo;
4949
HRESULT m_CreateHResult;
5050
};
@@ -193,7 +193,7 @@ void CEffectTemplateImpl::PreDestruct ( void )
193193
////////////////////////////////////////////////////////////////
194194
int CEffectTemplateImpl::GetTicksSinceLastUsed ( void )
195195
{
196-
if ( !m_CloneList.empty () )
196+
if ( m_uiCloneCount != 0 )
197197
return 0; // Used right now
198198

199199
CTickCount delta = CTickCount::Now ( true ) - m_TickCountLastUsed;
@@ -445,9 +445,9 @@ ID3DXEffect* CEffectTemplateImpl::CloneD3DEffect ( SString& strOutStatus, bool&
445445
{
446446
// Clone D3DXEffect
447447
ID3DXEffect* pNewD3DEffect = NULL;
448-
LPDIRECT3DDEVICE9 pDevice = NULL;
449-
m_pD3DEffect->GetDevice ( &pDevice );
450-
outHResult = m_pD3DEffect->CloneEffect ( pDevice, &pNewD3DEffect );
448+
outHResult = D3D_OK;
449+
pNewD3DEffect = m_pD3DEffect;
450+
pNewD3DEffect->AddRef();
451451

452452
m_DebugInfo.cloneResult = outHResult;
453453
if ( !pNewD3DEffect )
@@ -489,8 +489,7 @@ ID3DXEffect* CEffectTemplateImpl::CloneD3DEffect ( SString& strOutStatus, bool&
489489
bOutUsesDepthBuffer = m_bUsesDepthBuffer;
490490

491491
// Add to list of clones
492-
assert ( !MapContains ( m_CloneList, pNewD3DEffect ) );
493-
MapInsert ( m_CloneList, pNewD3DEffect );
492+
m_uiCloneCount++;
494493
return pNewD3DEffect;
495494
}
496495

@@ -504,10 +503,10 @@ ID3DXEffect* CEffectTemplateImpl::CloneD3DEffect ( SString& strOutStatus, bool&
504503
////////////////////////////////////////////////////////////////
505504
void CEffectTemplateImpl::UnCloneD3DEffect ( ID3DXEffect* pOldD3DEffect )
506505
{
507-
assert ( MapContains ( m_CloneList, pOldD3DEffect ) );
508-
MapRemove ( m_CloneList, pOldD3DEffect );
506+
assert( m_uiCloneCount > 0 );
507+
m_uiCloneCount--;
509508

510-
if ( m_CloneList.empty () )
509+
if ( m_uiCloneCount == 0 )
511510
m_TickCountLastUsed = CTickCount::Now ( true );
512511

513512
SAFE_RELEASE( pOldD3DEffect );

MTA10/core/CRenderItem.EffectWrap.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,8 @@ void CEffectWrapImpl::CreateUnderlyingData ( const SString& strFilename, const S
593593
m_uiSaveStateFlags = D3DXFX_DONOTSAVESHADERSTATE; // D3DXFX_DONOTSAVE(SHADER|SAMPLER)STATE
594594

595595
// Fetch compiled D3DEffect
596-
m_pD3DEffect = m_pManager->GetEffectCloner ()->CreateD3DEffect ( strFilename, strRootPath, strOutStatus, m_bUsesVertexShader, m_bUsesDepthBuffer, bDebug );
596+
m_ppD3DEffect = m_pManager->GetEffectCloner ()->CreateD3DEffect ( strFilename, strRootPath, strOutStatus, m_bUsesVertexShader, m_bUsesDepthBuffer, bDebug );
597+
m_pD3DEffect = m_ppD3DEffect ? *m_ppD3DEffect : NULL;
597598

598599
if ( !m_pD3DEffect )
599600
return;
@@ -628,7 +629,8 @@ void CEffectWrapImpl::ReleaseUnderlyingData ( void )
628629
{
629630
if ( m_pD3DEffect )
630631
{
631-
m_pManager->GetEffectCloner ()->ReleaseD3DEffect ( m_pD3DEffect );
632+
m_pManager->GetEffectCloner ()->ReleaseD3DEffect ( m_ppD3DEffect );
633+
m_ppD3DEffect = NULL;
632634
m_pD3DEffect = NULL;
633635
}
634636
}

0 commit comments

Comments
 (0)