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() ...@@ -2821,15 +2821,33 @@ bool CD3D9Driver::reset()
for (i = 0; i<RenderTargets.size(); ++i) for (i = 0; i<RenderTargets.size(); ++i)
{ {
if (RenderTargets[i]->getDriverType() == EDT_DIRECT3D9) if (RenderTargets[i]->getDriverType() == EDT_DIRECT3D9)
{
static_cast<CD3D9RenderTarget*>(RenderTargets[i])->releaseSurfaces(); 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) for (i=0; i<Textures.size(); ++i)
{ {
if (Textures[i].Surface->isRenderTarget()) if (Textures[i].Surface->isRenderTarget())
{ {
IDirect3DBaseTexture9* tex = ((CD3D9Texture*)(Textures[i].Surface))->getDX9BaseTexture(); CD3D9Texture* tex = static_cast<CD3D9Texture*>(Textures[i].Surface);
if (tex) if (tex)
tex->Release(); tex->releaseTexture();
} }
} }
for (i=0; i<OcclusionQueries.size(); ++i) for (i=0; i<OcclusionQueries.size(); ++i)
...@@ -2878,7 +2896,24 @@ bool CD3D9Driver::reset() ...@@ -2878,7 +2896,24 @@ bool CD3D9Driver::reset()
for (i = 0; i<RenderTargets.size(); ++i) for (i = 0; i<RenderTargets.size(); ++i)
{ {
if (RenderTargets[i]->getDriverType() == EDT_DIRECT3D9) 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(); static_cast<CD3D9RenderTarget*>(RenderTargets[i])->generateSurfaces();
}
} }
// restore occlusion queries // restore occlusion queries
......
...@@ -138,14 +138,7 @@ CD3D9Texture::CD3D9Texture(CD3D9Driver* driver, const core::dimension2d<u32>& si ...@@ -138,14 +138,7 @@ CD3D9Texture::CD3D9Texture(CD3D9Driver* driver, const core::dimension2d<u32>& si
CD3D9Texture::~CD3D9Texture() CD3D9Texture::~CD3D9Texture()
{ {
if (Texture) releaseTexture();
Texture->Release();
if (CubeTexture)
CubeTexture->Release();
if (RTTSurface)
RTTSurface->Release();
if (Device) if (Device)
Device->Release(); Device->Release();
...@@ -307,22 +300,46 @@ IDirect3DCubeTexture9* CD3D9Texture::getDX9CubeTexture() const ...@@ -307,22 +300,46 @@ IDirect3DCubeTexture9* CD3D9Texture::getDX9CubeTexture() const
return CubeTexture; 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) if (CubeTexture->Release() == 0)
os::Printer::log("Could not create render target texture", "Invalid Call"); CubeTexture = 0;
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"); void CD3D9Texture::generateRenderTarget()
else {
os::Printer::log("Could not create render target texture"); 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: ...@@ -45,6 +45,8 @@ public:
private: private:
friend class CD3D9Driver; friend class CD3D9Driver;
void releaseTexture();
void generateRenderTarget(); void generateRenderTarget();
ECOLOR_FORMAT getBestColorFormat(ECOLOR_FORMAT format); 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