Ensure all getDepthStencil and getRenderTarget calls consistently handle…

Ensure all getDepthStencil and getRenderTarget calls consistently handle references to the underlying d3d surfaces Trac #20875 Signed-off-by: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@1114 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 6b7c84cd
......@@ -565,6 +565,8 @@ EGLint Surface::isPostSubBufferSupported() const
return mPostSubBufferSupported;
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Surface::getRenderTarget()
{
if (mRenderTarget)
......@@ -575,6 +577,8 @@ IDirect3DSurface9 *Surface::getRenderTarget()
return mRenderTarget;
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Surface::getDepthStencil()
{
if (mDepthStencil)
......
......@@ -1893,6 +1893,11 @@ bool Context::applyRenderTarget(bool ignoreViewport)
mDepthStencilInitialized = true;
}
if (depthStencil)
{
depthStencil->Release();
}
if (!mRenderTargetDescInitialized || renderTargetChanged)
{
IDirect3DSurface9 *renderTarget = framebufferObject->getRenderTarget();
......@@ -2458,6 +2463,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
renderTarget->Release();
return error(GL_OUT_OF_MEMORY);
}
}
......@@ -2745,6 +2751,7 @@ void Context::clear(GLbitfield mask)
D3DSURFACE_DESC desc;
depthStencil->GetDesc(&desc);
depthStencil->Release();
unsigned int stencilSize = dx2es::GetStencilSize(desc.Format);
stencilUnmasked = (0x1 << stencilSize) - 1;
......@@ -4055,7 +4062,13 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1
if (blitDepthStencil)
{
HRESULT result = mDevice->StretchRect(readFramebuffer->getDepthStencil(), NULL, drawFramebuffer->getDepthStencil(), NULL, D3DTEXF_NONE);
IDirect3DSurface9* readDepthStencil = readFramebuffer->getDepthStencil();
IDirect3DSurface9* drawDepthStencil = drawFramebuffer->getDepthStencil();
HRESULT result = mDevice->StretchRect(readDepthStencil, NULL, drawDepthStencil, NULL, D3DTEXF_NONE);
readDepthStencil->Release();
drawDepthStencil->Release();
if (FAILED(result))
{
......
......@@ -128,6 +128,8 @@ unsigned int Framebuffer::getRenderTargetSerial()
return 0;
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Framebuffer::getRenderTarget()
{
Renderbuffer *colorbuffer = mColorbufferPointer.get();
......@@ -140,6 +142,8 @@ IDirect3DSurface9 *Framebuffer::getRenderTarget()
return NULL;
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Framebuffer::getDepthStencil()
{
Renderbuffer *depthstencilbuffer = mDepthbufferPointer.get();
......
......@@ -87,11 +87,15 @@ void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
mTexture2D->releaseProxy(proxy);
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTexture2D::getRenderTarget()
{
return mTexture2D->getRenderTarget(mTarget);
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTexture2D::getDepthStencil()
{
return NULL;
......@@ -151,11 +155,15 @@ void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
mTextureCubeMap->releaseProxy(proxy);
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTextureCubeMap::getRenderTarget()
{
return mTextureCubeMap->getRenderTarget(mTarget);
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTextureCubeMap::getDepthStencil()
{
return NULL;
......@@ -220,11 +228,15 @@ void Renderbuffer::release() const
RefCountObject::release();
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Renderbuffer::getRenderTarget()
{
return mInstance->getRenderTarget();
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Renderbuffer::getDepthStencil()
{
return mInstance->getDepthStencil();
......@@ -311,11 +323,15 @@ RenderbufferStorage::~RenderbufferStorage()
{
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferStorage::getRenderTarget()
{
return NULL;
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferStorage::getDepthStencil()
{
return NULL;
......@@ -424,6 +440,8 @@ Colorbuffer::~Colorbuffer()
}
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Colorbuffer::getRenderTarget()
{
if (mRenderTarget)
......@@ -496,8 +514,15 @@ DepthStencilbuffer::~DepthStencilbuffer()
}
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil()
{
if (mDepthStencil)
{
mDepthStencil->AddRef();
}
return mDepthStencil;
}
......
......@@ -1725,6 +1725,8 @@ TextureStorage2D::~TextureStorage2D()
}
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *TextureStorage2D::getSurfaceLevel(int level)
{
IDirect3DSurface9 *surface = NULL;
......@@ -2269,8 +2271,8 @@ void Texture2D::convertToRenderTarget()
if (!copyToRenderTarget(dest, source, mTexStorage->isManaged()))
{
delete newTexStorage;
source->Release();
dest->Release();
if (source) source->Release();
if (dest) dest->Release();
return error(GL_OUT_OF_MEMORY);
}
......@@ -2358,6 +2360,8 @@ Renderbuffer *Texture2D::getRenderbuffer(GLenum target)
return mColorbufferProxy;
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Texture2D::getRenderTarget(GLenum target)
{
ASSERT(target == GL_TEXTURE_2D);
......@@ -2417,6 +2421,8 @@ TextureStorageCubeMap::~TextureStorageCubeMap()
}
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(GLenum faceTarget, int level)
{
IDirect3DSurface9 *surface = NULL;
......@@ -2802,8 +2808,8 @@ void TextureCubeMap::convertToRenderTarget()
if (!copyToRenderTarget(dest, source, mTexStorage->isManaged()))
{
delete newTexStorage;
source->Release();
dest->Release();
if (source) source->Release();
if (dest) dest->Release();
return error(GL_OUT_OF_MEMORY);
}
......@@ -3098,6 +3104,8 @@ Renderbuffer *TextureCubeMap::getRenderbuffer(GLenum target)
return mFaceProxies[face];
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *TextureCubeMap::getRenderTarget(GLenum target)
{
ASSERT(IsCubemapTextureTarget(target));
......
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