@@ -122,15 +122,20 @@ void CRenderItemManager::OnDeviceCreate(IDirect3DDevice9* pDevice, float fViewpo
122122// //////////////////////////////////////////////////////////////
123123void CRenderItemManager::OnLostDevice ()
124124{
125- for (std::set<CRenderItem*>::iterator iter = m_CreatedItemList.begin (); iter != m_CreatedItemList.end (); iter++)
126- (*iter)->OnLostDevice ();
125+ for (std::set<CRenderItem*>::iterator iter = m_CreatedItemList.begin (); iter != m_CreatedItemList.end ();)
126+ {
127+ std::set<CRenderItem*>::iterator current = iter++;
128+ (*current)->OnLostDevice ();
129+ }
127130
128131 SAFE_RELEASE (m_pSavedSceneDepthSurface);
129132 SAFE_RELEASE (m_pSavedSceneRenderTargetAA);
130133 SAFE_RELEASE (g_pDeviceState->MainSceneState .DepthBuffer );
131134 SAFE_RELEASE (m_pNonAARenderTargetTexture);
132135 SAFE_RELEASE (m_pNonAARenderTarget);
133136 SAFE_RELEASE (m_pNonAADepthSurface2);
137+ SAFE_RELEASE (m_pDefaultD3DRenderTarget);
138+ SAFE_RELEASE (m_pDefaultD3DZStencilSurface);
134139}
135140
136141// //////////////////////////////////////////////////////////////
@@ -594,17 +599,40 @@ bool CRenderItemManager::SaveDefaultRenderTarget()
594599 SaveReadableDepthBuffer ();
595600
596601 // Update our info about what rendertarget is active
597- IDirect3DSurface9* pActiveD3DRenderTarget;
598- IDirect3DSurface9* pActiveD3DZStencilSurface;
599- m_pDevice->GetRenderTarget (0 , &pActiveD3DRenderTarget);
600- m_pDevice->GetDepthStencilSurface (&pActiveD3DZStencilSurface);
602+ IDirect3DSurface9* pActiveD3DRenderTarget = nullptr ;
603+ const HRESULT hrRenderTarget = m_pDevice->GetRenderTarget (0 , &pActiveD3DRenderTarget);
604+ if (FAILED (hrRenderTarget) || !pActiveD3DRenderTarget)
605+ {
606+ SAFE_RELEASE (pActiveD3DRenderTarget);
607+ SAFE_RELEASE (m_pDefaultD3DRenderTarget);
608+ SAFE_RELEASE (m_pDefaultD3DZStencilSurface);
609+ return false ;
610+ }
611+
612+ IDirect3DSurface9* pActiveD3DZStencilSurface = nullptr ;
613+ const HRESULT hrDepthStencil = m_pDevice->GetDepthStencilSurface (&pActiveD3DZStencilSurface);
614+ if (FAILED (hrDepthStencil) && hrDepthStencil != D3DERR_NOTFOUND)
615+ {
616+ SAFE_RELEASE (pActiveD3DRenderTarget);
617+ SAFE_RELEASE (pActiveD3DZStencilSurface);
618+ SAFE_RELEASE (m_pDefaultD3DRenderTarget);
619+ SAFE_RELEASE (m_pDefaultD3DZStencilSurface);
620+ return false ;
621+ }
622+
623+ SAFE_RELEASE (m_pDefaultD3DRenderTarget);
624+ SAFE_RELEASE (m_pDefaultD3DZStencilSurface);
601625
602626 m_pDefaultD3DRenderTarget = pActiveD3DRenderTarget;
627+ if (m_pDefaultD3DRenderTarget)
628+ m_pDefaultD3DRenderTarget->AddRef ();
629+
603630 m_pDefaultD3DZStencilSurface = pActiveD3DZStencilSurface;
631+ if (m_pDefaultD3DZStencilSurface)
632+ m_pDefaultD3DZStencilSurface->AddRef ();
604633
605- // Don't hold any refs because it goes all funny during fullscreen minimize/maximize, even if they are released at onLostDevice
606- SAFE_RELEASE (pActiveD3DRenderTarget)
607- SAFE_RELEASE (pActiveD3DZStencilSurface)
634+ SAFE_RELEASE (pActiveD3DRenderTarget);
635+ SAFE_RELEASE (pActiveD3DZStencilSurface);
608636
609637 // Do this in case dxSetRenderTarget is being called from some unexpected place
610638 CGraphics::GetSingleton ().MaybeEnteringMTARenderZone ();
@@ -625,7 +653,8 @@ bool CRenderItemManager::RestoreDefaultRenderTarget()
625653 {
626654 if (ChangeRenderTarget (m_uiDefaultViewportSizeX, m_uiDefaultViewportSizeY, m_pDefaultD3DRenderTarget, m_pDefaultD3DZStencilSurface))
627655 {
628- m_pDefaultD3DRenderTarget = nullptr ;
656+ SAFE_RELEASE (m_pDefaultD3DRenderTarget);
657+ SAFE_RELEASE (m_pDefaultD3DZStencilSurface);
629658
630659 // Do this in case dxSetRenderTarget is being called from some unexpected place
631660 CGraphics::GetSingleton ().MaybeLeavingMTARenderZone ();
@@ -668,26 +697,53 @@ bool CRenderItemManager::ChangeRenderTarget(uint uiSizeX, uint uiSizeY, IDirect3
668697 SaveReadableDepthBuffer ();
669698
670699 // Check if we need to change
671- IDirect3DSurface9* pCurrentRenderTarget;
672- IDirect3DSurface9* pCurrentZStencilSurface;
673- m_pDevice->GetRenderTarget (0 , &pCurrentRenderTarget);
674- m_pDevice->GetDepthStencilSurface (&pCurrentZStencilSurface);
700+ IDirect3DSurface9* pCurrentRenderTarget = nullptr ;
701+ HRESULT hrRenderTarget = m_pDevice->GetRenderTarget (0 , &pCurrentRenderTarget);
702+ if (FAILED (hrRenderTarget) || !pCurrentRenderTarget)
703+ {
704+ SAFE_RELEASE (pCurrentRenderTarget);
705+ return false ;
706+ }
675707
676- bool bAlreadySet = (pD3DRenderTarget == pCurrentRenderTarget && pD3DZStencilSurface == pCurrentZStencilSurface);
708+ IDirect3DSurface9* pCurrentZStencilSurface = nullptr ;
709+ HRESULT hrDepthStencil = m_pDevice->GetDepthStencilSurface (&pCurrentZStencilSurface);
710+ if (FAILED (hrDepthStencil) && hrDepthStencil != D3DERR_NOTFOUND)
711+ {
712+ SAFE_RELEASE (pCurrentRenderTarget);
713+ SAFE_RELEASE (pCurrentZStencilSurface);
714+ return false ;
715+ }
677716
678- SAFE_RELEASE (pCurrentRenderTarget);
679- SAFE_RELEASE (pCurrentZStencilSurface);
717+ const bool bAlreadySet = (pD3DRenderTarget == pCurrentRenderTarget && pD3DZStencilSurface == pCurrentZStencilSurface);
680718
681- // Already set?
682719 if (bAlreadySet)
720+ {
721+ SAFE_RELEASE (pCurrentRenderTarget);
722+ SAFE_RELEASE (pCurrentZStencilSurface);
683723 return true ;
724+ }
684725
685726 // Tell graphics things are about to change
686727 CGraphics::GetSingleton ().OnChangingRenderTarget (uiSizeX, uiSizeY);
687728
688729 // Do change
689- m_pDevice->SetRenderTarget (0 , pD3DRenderTarget);
690- m_pDevice->SetDepthStencilSurface (pD3DZStencilSurface);
730+ hrRenderTarget = m_pDevice->SetRenderTarget (0 , pD3DRenderTarget);
731+ if (FAILED (hrRenderTarget))
732+ {
733+ SAFE_RELEASE (pCurrentRenderTarget);
734+ SAFE_RELEASE (pCurrentZStencilSurface);
735+ return false ;
736+ }
737+
738+ HRESULT hrSetDepth = m_pDevice->SetDepthStencilSurface (pD3DZStencilSurface);
739+ if (FAILED (hrSetDepth))
740+ {
741+ m_pDevice->SetRenderTarget (0 , pCurrentRenderTarget);
742+ m_pDevice->SetDepthStencilSurface (pCurrentZStencilSurface);
743+ SAFE_RELEASE (pCurrentRenderTarget);
744+ SAFE_RELEASE (pCurrentZStencilSurface);
745+ return false ;
746+ }
691747
692748 D3DVIEWPORT9 viewport;
693749 viewport.X = 0 ;
@@ -698,6 +754,9 @@ bool CRenderItemManager::ChangeRenderTarget(uint uiSizeX, uint uiSizeY, IDirect3
698754 viewport.MaxZ = 1 .0f ;
699755 m_pDevice->SetViewport (&viewport);
700756
757+ SAFE_RELEASE (pCurrentRenderTarget);
758+ SAFE_RELEASE (pCurrentZStencilSurface);
759+
701760 return true ;
702761}
703762
0 commit comments