Fixes places where TextureStorage could have leaked memory during initialization.

TRAC #22250 Author: Shannon Woods git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1661 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent b50d5302
...@@ -152,6 +152,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch ...@@ -152,6 +152,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch
ID3D11Texture2D *surfaceTexture = swapchain->getOffscreenTexture(); ID3D11Texture2D *surfaceTexture = swapchain->getOffscreenTexture();
mTexture = surfaceTexture; mTexture = surfaceTexture;
mSRV = NULL; mSRV = NULL;
mRenderTarget = NULL;
D3D11_TEXTURE2D_DESC desc; D3D11_TEXTURE2D_DESC desc;
surfaceTexture->GetDesc(&desc); surfaceTexture->GetDesc(&desc);
...@@ -165,6 +166,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum ...@@ -165,6 +166,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum
{ {
mTexture = NULL; mTexture = NULL;
mSRV = NULL; mSRV = NULL;
mRenderTarget = NULL;
DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat); DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat);
// if the width or height is not positive this should be treated as an incomplete texture // if the width or height is not positive this should be treated as an incomplete texture
// we handle that here by skipping the d3d texture creation // we handle that here by skipping the d3d texture creation
...@@ -237,7 +239,7 @@ void TextureStorage11_2D::generateMipmap(int level) ...@@ -237,7 +239,7 @@ void TextureStorage11_2D::generateMipmap(int level)
void TextureStorage11_2D::initializeRenderTarget(DXGI_FORMAT format, int width, int height) void TextureStorage11_2D::initializeRenderTarget(DXGI_FORMAT format, int width, int height)
{ {
mRenderTarget = NULL; ASSERT(mRenderTarget == NULL);
if (mTexture != NULL && isRenderTarget()) if (mTexture != NULL && isRenderTarget())
{ {
...@@ -299,6 +301,12 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLe ...@@ -299,6 +301,12 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLe
{ {
mTexture = NULL; mTexture = NULL;
mSRV = NULL; mSRV = NULL;
for (int i = 0; i < 6; ++i)
{
mRenderTarget[i] = NULL;
}
DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat); DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat);
// if the size is not positive this should be treated as an incomplete texture // if the size is not positive this should be treated as an incomplete texture
// we handle that here by skipping the d3d texture creation // we handle that here by skipping the d3d texture creation
...@@ -372,11 +380,6 @@ void TextureStorage11_Cube::generateMipmap(int face, int level) ...@@ -372,11 +380,6 @@ void TextureStorage11_Cube::generateMipmap(int face, int level)
void TextureStorage11_Cube::initializeRenderTarget(DXGI_FORMAT format, int size) void TextureStorage11_Cube::initializeRenderTarget(DXGI_FORMAT format, int size)
{ {
for (int i = 0; i < 6; ++i)
{
mRenderTarget[i] = NULL;
}
if (mTexture != NULL && isRenderTarget()) if (mTexture != NULL && isRenderTarget())
{ {
if (getBindFlags() & D3D11_BIND_RENDER_TARGET) if (getBindFlags() & D3D11_BIND_RENDER_TARGET)
...@@ -386,6 +389,7 @@ void TextureStorage11_Cube::initializeRenderTarget(DXGI_FORMAT format, int size) ...@@ -386,6 +389,7 @@ void TextureStorage11_Cube::initializeRenderTarget(DXGI_FORMAT format, int size)
for (int i = 0; i < 6; ++i) for (int i = 0; i < 6; ++i)
{ {
ASSERT(mRenderTarget[i] == NULL);
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = format; rtvDesc.Format = format;
rtvDesc.Texture2DArray.MipSlice = 0; rtvDesc.Texture2DArray.MipSlice = 0;
......
...@@ -112,6 +112,7 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain ...@@ -112,6 +112,7 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain
{ {
IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture(); IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture();
mTexture = surfaceTexture; mTexture = surfaceTexture;
mRenderTarget = NULL;
initializeRenderTarget(); initializeRenderTarget();
} }
...@@ -120,6 +121,7 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, int levels, GLenum in ...@@ -120,6 +121,7 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, int levels, GLenum in
: TextureStorage9(renderer, GetTextureUsage(Renderer9::makeRenderer9(renderer)->ConvertTextureInternalFormat(internalformat), usage, forceRenderable)) : TextureStorage9(renderer, GetTextureUsage(Renderer9::makeRenderer9(renderer)->ConvertTextureInternalFormat(internalformat), usage, forceRenderable))
{ {
mTexture = NULL; mTexture = NULL;
mRenderTarget = NULL;
// if the width or height is not positive this should be treated as an incomplete texture // if the width or height is not positive this should be treated as an incomplete texture
// we handle that here by skipping the d3d texture creation // we handle that here by skipping the d3d texture creation
if (width > 0 && height > 0) if (width > 0 && height > 0)
...@@ -202,22 +204,25 @@ IDirect3DBaseTexture9 *TextureStorage9_2D::getBaseTexture() const ...@@ -202,22 +204,25 @@ IDirect3DBaseTexture9 *TextureStorage9_2D::getBaseTexture() const
void TextureStorage9_2D::initializeRenderTarget() void TextureStorage9_2D::initializeRenderTarget()
{ {
ASSERT(mRenderTarget == NULL);
if (mTexture != NULL && isRenderTarget()) if (mTexture != NULL && isRenderTarget())
{ {
IDirect3DSurface9 *surface = getSurfaceLevel(0, false); IDirect3DSurface9 *surface = getSurfaceLevel(0, false);
mRenderTarget = new RenderTarget9(mRenderer, surface); mRenderTarget = new RenderTarget9(mRenderer, surface);
} }
else
{
mRenderTarget = NULL;
}
} }
TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size) TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size)
: TextureStorage9(renderer, GetTextureUsage(Renderer9::makeRenderer9(renderer)->ConvertTextureInternalFormat(internalformat), usage, forceRenderable)) : TextureStorage9(renderer, GetTextureUsage(Renderer9::makeRenderer9(renderer)->ConvertTextureInternalFormat(internalformat), usage, forceRenderable))
{ {
mTexture = NULL; mTexture = NULL;
for (int i = 0; i < 6; ++i)
{
mRenderTarget[i] = NULL;
}
// if the size is not positive this should be treated as an incomplete texture // if the size is not positive this should be treated as an incomplete texture
// we handle that here by skipping the d3d texture creation // we handle that here by skipping the d3d texture creation
if (size > 0) if (size > 0)
...@@ -311,18 +316,13 @@ void TextureStorage9_Cube::initializeRenderTarget() ...@@ -311,18 +316,13 @@ void TextureStorage9_Cube::initializeRenderTarget()
for (int i = 0; i < 6; ++i) for (int i = 0; i < 6; ++i)
{ {
ASSERT(mRenderTarget[i] == NULL);
surface = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, false); surface = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, false);
mRenderTarget[i] = new RenderTarget9(mRenderer, surface); mRenderTarget[i] = new RenderTarget9(mRenderer, surface);
} }
} }
else
{
for (int i = 0; i < 6; ++i)
{
mRenderTarget[i] = NULL;
}
}
} }
} }
\ No newline at end of file
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