Commit 472a30e4 authored by nadro's avatar nadro

- Fixed crash in CD3D9RenderTarget::generateSurfaces(). Thx CuteAlien for report.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@5240 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 81a4c3d9
......@@ -2821,15 +2821,33 @@ bool CD3D9Driver::reset()
for (i = 0; i<RenderTargets.size(); ++i)
{
if (RenderTargets[i]->getDriverType() == EDT_DIRECT3D9)
{
static_cast<CD3D9RenderTarget*>(RenderTargets[i])->releaseSurfaces();
const core::array<ITexture*> texArray = RenderTargets[i]->getTexture();
for (u32 j = 0; j < texArray.size(); ++j)
{
CD3D9Texture* tex = static_cast<CD3D9Texture*>(texArray[j]);
if (tex)
tex->releaseTexture();
}
CD3D9Texture* tex = static_cast<CD3D9Texture*>(RenderTargets[i]->getDepthStencil());
if (tex)
tex->releaseTexture();
}
}
for (i=0; i<Textures.size(); ++i)
{
if (Textures[i].Surface->isRenderTarget())
{
IDirect3DBaseTexture9* tex = ((CD3D9Texture*)(Textures[i].Surface))->getDX9BaseTexture();
CD3D9Texture* tex = static_cast<CD3D9Texture*>(Textures[i].Surface);
if (tex)
tex->Release();
tex->releaseTexture();
}
}
for (i=0; i<OcclusionQueries.size(); ++i)
......@@ -2878,7 +2896,24 @@ bool CD3D9Driver::reset()
for (i = 0; i<RenderTargets.size(); ++i)
{
if (RenderTargets[i]->getDriverType() == EDT_DIRECT3D9)
{
const core::array<ITexture*> texArray = RenderTargets[i]->getTexture();
for (u32 j = 0; j < texArray.size(); ++j)
{
CD3D9Texture* tex = static_cast<CD3D9Texture*>(texArray[j]);
if (tex)
tex->generateRenderTarget();
}
CD3D9Texture* tex = static_cast<CD3D9Texture*>(RenderTargets[i]->getDepthStencil());
if (tex)
tex->generateRenderTarget();
static_cast<CD3D9RenderTarget*>(RenderTargets[i])->generateSurfaces();
}
}
// restore occlusion queries
......
......@@ -138,14 +138,7 @@ CD3D9Texture::CD3D9Texture(CD3D9Driver* driver, const core::dimension2d<u32>& si
CD3D9Texture::~CD3D9Texture()
{
if (Texture)
Texture->Release();
if (CubeTexture)
CubeTexture->Release();
if (RTTSurface)
RTTSurface->Release();
releaseTexture();
if (Device)
Device->Release();
......@@ -307,22 +300,46 @@ IDirect3DCubeTexture9* CD3D9Texture::getDX9CubeTexture() const
return CubeTexture;
}
void CD3D9Texture::generateRenderTarget()
void CD3D9Texture::releaseTexture()
{
DWORD flag = (IImage::isDepthFormat(ColorFormat)) ? D3DUSAGE_DEPTHSTENCIL : D3DUSAGE_RENDERTARGET;
if (RTTSurface)
{
if (RTTSurface->Release() == 0)
RTTSurface = 0;
}
HRESULT hr = Device->CreateTexture(Size.Width, Size.Height, 1, flag, InternalFormat, D3DPOOL_DEFAULT, &Texture, NULL);
if (Texture)
{
if (Texture->Release() == 0)
Texture = 0;
}
if (FAILED(hr))
if (CubeTexture)
{
if (D3DERR_INVALIDCALL == hr)
os::Printer::log("Could not create render target texture", "Invalid Call");
else if (D3DERR_OUTOFVIDEOMEMORY == hr)
os::Printer::log("Could not create render target texture", "Out of Video Memory");
else if (E_OUTOFMEMORY == hr)
os::Printer::log("Could not create render target texture", "Out of Memory");
else
os::Printer::log("Could not create render target texture");
if (CubeTexture->Release() == 0)
CubeTexture = 0;
}
}
void CD3D9Texture::generateRenderTarget()
{
if (!Texture)
{
DWORD flag = (IImage::isDepthFormat(ColorFormat)) ? D3DUSAGE_DEPTHSTENCIL : D3DUSAGE_RENDERTARGET;
HRESULT hr = Device->CreateTexture(Size.Width, Size.Height, 1, flag, InternalFormat, D3DPOOL_DEFAULT, &Texture, NULL);
if (FAILED(hr))
{
if (D3DERR_INVALIDCALL == hr)
os::Printer::log("Could not create render target texture", "Invalid Call");
else if (D3DERR_OUTOFVIDEOMEMORY == hr)
os::Printer::log("Could not create render target texture", "Out of Video Memory");
else if (E_OUTOFMEMORY == hr)
os::Printer::log("Could not create render target texture", "Out of Memory");
else
os::Printer::log("Could not create render target texture");
}
}
}
......
......@@ -45,6 +45,8 @@ public:
private:
friend class CD3D9Driver;
void releaseTexture();
void generateRenderTarget();
ECOLOR_FORMAT getBestColorFormat(ECOLOR_FORMAT format);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment