Fix more rendertarget leaks

Trac #19246 Issue=262 FBO rendertargets are explicitly refcounted. Signed-off-by: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@908 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 29217fad
#define MAJOR_VERSION 1 #define MAJOR_VERSION 1
#define MINOR_VERSION 0 #define MINOR_VERSION 0
#define BUILD_VERSION 0 #define BUILD_VERSION 0
#define BUILD_REVISION 906 #define BUILD_REVISION 908
#define STRINGIFY(x) #x #define STRINGIFY(x) #x
#define MACRO_STRINGIFY(x) STRINGIFY(x) #define MACRO_STRINGIFY(x) STRINGIFY(x)
......
...@@ -1668,15 +1668,11 @@ bool Context::applyRenderTarget(bool ignoreViewport) ...@@ -1668,15 +1668,11 @@ bool Context::applyRenderTarget(bool ignoreViewport)
return error(GL_INVALID_FRAMEBUFFER_OPERATION, false); return error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
} }
IDirect3DSurface9 *renderTarget = NULL;
IDirect3DSurface9 *depthStencil = NULL;
bool renderTargetChanged = false; bool renderTargetChanged = false;
unsigned int renderTargetSerial = framebufferObject->getRenderTargetSerial(); unsigned int renderTargetSerial = framebufferObject->getRenderTargetSerial();
if (renderTargetSerial != mAppliedRenderTargetSerial) if (renderTargetSerial != mAppliedRenderTargetSerial)
{ {
renderTarget = framebufferObject->getRenderTarget(); IDirect3DSurface9 *renderTarget = framebufferObject->getRenderTarget();
if (!renderTarget) if (!renderTarget)
{ {
return false; // Context must be lost return false; // Context must be lost
...@@ -1685,8 +1681,10 @@ bool Context::applyRenderTarget(bool ignoreViewport) ...@@ -1685,8 +1681,10 @@ bool Context::applyRenderTarget(bool ignoreViewport)
mAppliedRenderTargetSerial = renderTargetSerial; mAppliedRenderTargetSerial = renderTargetSerial;
mScissorStateDirty = true; // Scissor area must be clamped to render target's size-- this is different for different render targets. mScissorStateDirty = true; // Scissor area must be clamped to render target's size-- this is different for different render targets.
renderTargetChanged = true; renderTargetChanged = true;
renderTarget->Release();
} }
IDirect3DSurface9 *depthStencil = NULL;
unsigned int depthbufferSerial = 0; unsigned int depthbufferSerial = 0;
unsigned int stencilbufferSerial = 0; unsigned int stencilbufferSerial = 0;
if (framebufferObject->getDepthbufferType() != GL_NONE) if (framebufferObject->getDepthbufferType() != GL_NONE)
...@@ -1724,17 +1722,14 @@ bool Context::applyRenderTarget(bool ignoreViewport) ...@@ -1724,17 +1722,14 @@ bool Context::applyRenderTarget(bool ignoreViewport)
if (!mRenderTargetDescInitialized || renderTargetChanged) if (!mRenderTargetDescInitialized || renderTargetChanged)
{ {
IDirect3DSurface9 *renderTarget = framebufferObject->getRenderTarget();
if (!renderTarget) if (!renderTarget)
{ {
renderTarget = framebufferObject->getRenderTarget(); return false; // Context must be lost
if (!renderTarget)
{
return false; // Context must be lost
}
} }
renderTarget->GetDesc(&mRenderTargetDesc); renderTarget->GetDesc(&mRenderTargetDesc);
mRenderTargetDescInitialized = true; mRenderTargetDescInitialized = true;
renderTarget->Release();
} }
D3DVIEWPORT9 viewport; D3DVIEWPORT9 viewport;
...@@ -2248,7 +2243,6 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -2248,7 +2243,6 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
} }
IDirect3DSurface9 *renderTarget = framebuffer->getRenderTarget(); IDirect3DSurface9 *renderTarget = framebuffer->getRenderTarget();
if (!renderTarget) if (!renderTarget)
{ {
return; // Context must be lost, return silently return; // Context must be lost, return silently
...@@ -2260,6 +2254,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -2260,6 +2254,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
if (desc.MultiSampleType != D3DMULTISAMPLE_NONE) if (desc.MultiSampleType != D3DMULTISAMPLE_NONE)
{ {
UNIMPLEMENTED(); // FIXME: Requires resolve using StretchRect into non-multisampled render target UNIMPLEMENTED(); // FIXME: Requires resolve using StretchRect into non-multisampled render target
renderTarget->Release();
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
} }
...@@ -2292,8 +2287,8 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -2292,8 +2287,8 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
} }
result = mDevice->GetRenderTargetData(renderTarget, systemSurface); result = mDevice->GetRenderTargetData(renderTarget, systemSurface);
renderTarget->Release(); renderTarget->Release();
renderTarget = NULL;
if (FAILED(result)) if (FAILED(result))
{ {
...@@ -2602,7 +2597,6 @@ void Context::clear(GLbitfield mask) ...@@ -2602,7 +2597,6 @@ void Context::clear(GLbitfield mask)
int stencil = mState.stencilClearValue & 0x000000FF; int stencil = mState.stencilClearValue & 0x000000FF;
IDirect3DSurface9 *renderTarget = framebufferObject->getRenderTarget(); IDirect3DSurface9 *renderTarget = framebufferObject->getRenderTarget();
if (!renderTarget) if (!renderTarget)
{ {
return; // Context must be lost, return silently return; // Context must be lost, return silently
...@@ -2610,8 +2604,8 @@ void Context::clear(GLbitfield mask) ...@@ -2610,8 +2604,8 @@ void Context::clear(GLbitfield mask)
D3DSURFACE_DESC desc; D3DSURFACE_DESC desc;
renderTarget->GetDesc(&desc); renderTarget->GetDesc(&desc);
renderTarget->Release(); renderTarget->Release();
renderTarget = NULL;
bool alphaUnmasked = (dx2es::GetAlphaSize(desc.Format) == 0) || mState.colorMaskAlpha; bool alphaUnmasked = (dx2es::GetAlphaSize(desc.Format) == 0) || mState.colorMaskAlpha;
......
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