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 ...@@ -565,6 +565,8 @@ EGLint Surface::isPostSubBufferSupported() const
return mPostSubBufferSupported; return mPostSubBufferSupported;
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Surface::getRenderTarget() IDirect3DSurface9 *Surface::getRenderTarget()
{ {
if (mRenderTarget) if (mRenderTarget)
...@@ -575,6 +577,8 @@ IDirect3DSurface9 *Surface::getRenderTarget() ...@@ -575,6 +577,8 @@ IDirect3DSurface9 *Surface::getRenderTarget()
return mRenderTarget; return mRenderTarget;
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Surface::getDepthStencil() IDirect3DSurface9 *Surface::getDepthStencil()
{ {
if (mDepthStencil) if (mDepthStencil)
......
...@@ -1893,6 +1893,11 @@ bool Context::applyRenderTarget(bool ignoreViewport) ...@@ -1893,6 +1893,11 @@ bool Context::applyRenderTarget(bool ignoreViewport)
mDepthStencilInitialized = true; mDepthStencilInitialized = true;
} }
if (depthStencil)
{
depthStencil->Release();
}
if (!mRenderTargetDescInitialized || renderTargetChanged) if (!mRenderTargetDescInitialized || renderTargetChanged)
{ {
IDirect3DSurface9 *renderTarget = framebufferObject->getRenderTarget(); IDirect3DSurface9 *renderTarget = framebufferObject->getRenderTarget();
...@@ -2458,6 +2463,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -2458,6 +2463,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
if (FAILED(result)) if (FAILED(result))
{ {
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
renderTarget->Release();
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
} }
} }
...@@ -2745,6 +2751,7 @@ void Context::clear(GLbitfield mask) ...@@ -2745,6 +2751,7 @@ void Context::clear(GLbitfield mask)
D3DSURFACE_DESC desc; D3DSURFACE_DESC desc;
depthStencil->GetDesc(&desc); depthStencil->GetDesc(&desc);
depthStencil->Release();
unsigned int stencilSize = dx2es::GetStencilSize(desc.Format); unsigned int stencilSize = dx2es::GetStencilSize(desc.Format);
stencilUnmasked = (0x1 << stencilSize) - 1; stencilUnmasked = (0x1 << stencilSize) - 1;
...@@ -4055,7 +4062,13 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1 ...@@ -4055,7 +4062,13 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1
if (blitDepthStencil) 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)) if (FAILED(result))
{ {
......
...@@ -128,6 +128,8 @@ unsigned int Framebuffer::getRenderTargetSerial() ...@@ -128,6 +128,8 @@ unsigned int Framebuffer::getRenderTargetSerial()
return 0; return 0;
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Framebuffer::getRenderTarget() IDirect3DSurface9 *Framebuffer::getRenderTarget()
{ {
Renderbuffer *colorbuffer = mColorbufferPointer.get(); Renderbuffer *colorbuffer = mColorbufferPointer.get();
...@@ -140,6 +142,8 @@ IDirect3DSurface9 *Framebuffer::getRenderTarget() ...@@ -140,6 +142,8 @@ IDirect3DSurface9 *Framebuffer::getRenderTarget()
return NULL; return NULL;
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Framebuffer::getDepthStencil() IDirect3DSurface9 *Framebuffer::getDepthStencil()
{ {
Renderbuffer *depthstencilbuffer = mDepthbufferPointer.get(); Renderbuffer *depthstencilbuffer = mDepthbufferPointer.get();
......
...@@ -87,11 +87,15 @@ void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy) ...@@ -87,11 +87,15 @@ void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
mTexture2D->releaseProxy(proxy); mTexture2D->releaseProxy(proxy);
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTexture2D::getRenderTarget() IDirect3DSurface9 *RenderbufferTexture2D::getRenderTarget()
{ {
return mTexture2D->getRenderTarget(mTarget); return mTexture2D->getRenderTarget(mTarget);
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTexture2D::getDepthStencil() IDirect3DSurface9 *RenderbufferTexture2D::getDepthStencil()
{ {
return NULL; return NULL;
...@@ -151,11 +155,15 @@ void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy) ...@@ -151,11 +155,15 @@ void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
mTextureCubeMap->releaseProxy(proxy); mTextureCubeMap->releaseProxy(proxy);
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTextureCubeMap::getRenderTarget() IDirect3DSurface9 *RenderbufferTextureCubeMap::getRenderTarget()
{ {
return mTextureCubeMap->getRenderTarget(mTarget); return mTextureCubeMap->getRenderTarget(mTarget);
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTextureCubeMap::getDepthStencil() IDirect3DSurface9 *RenderbufferTextureCubeMap::getDepthStencil()
{ {
return NULL; return NULL;
...@@ -220,11 +228,15 @@ void Renderbuffer::release() const ...@@ -220,11 +228,15 @@ void Renderbuffer::release() const
RefCountObject::release(); RefCountObject::release();
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Renderbuffer::getRenderTarget() IDirect3DSurface9 *Renderbuffer::getRenderTarget()
{ {
return mInstance->getRenderTarget(); return mInstance->getRenderTarget();
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Renderbuffer::getDepthStencil() IDirect3DSurface9 *Renderbuffer::getDepthStencil()
{ {
return mInstance->getDepthStencil(); return mInstance->getDepthStencil();
...@@ -311,11 +323,15 @@ RenderbufferStorage::~RenderbufferStorage() ...@@ -311,11 +323,15 @@ RenderbufferStorage::~RenderbufferStorage()
{ {
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferStorage::getRenderTarget() IDirect3DSurface9 *RenderbufferStorage::getRenderTarget()
{ {
return NULL; return NULL;
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferStorage::getDepthStencil() IDirect3DSurface9 *RenderbufferStorage::getDepthStencil()
{ {
return NULL; return NULL;
...@@ -424,6 +440,8 @@ Colorbuffer::~Colorbuffer() ...@@ -424,6 +440,8 @@ Colorbuffer::~Colorbuffer()
} }
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Colorbuffer::getRenderTarget() IDirect3DSurface9 *Colorbuffer::getRenderTarget()
{ {
if (mRenderTarget) if (mRenderTarget)
...@@ -496,8 +514,15 @@ DepthStencilbuffer::~DepthStencilbuffer() ...@@ -496,8 +514,15 @@ DepthStencilbuffer::~DepthStencilbuffer()
} }
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil() IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil()
{ {
if (mDepthStencil)
{
mDepthStencil->AddRef();
}
return mDepthStencil; return mDepthStencil;
} }
......
...@@ -1725,6 +1725,8 @@ TextureStorage2D::~TextureStorage2D() ...@@ -1725,6 +1725,8 @@ TextureStorage2D::~TextureStorage2D()
} }
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *TextureStorage2D::getSurfaceLevel(int level) IDirect3DSurface9 *TextureStorage2D::getSurfaceLevel(int level)
{ {
IDirect3DSurface9 *surface = NULL; IDirect3DSurface9 *surface = NULL;
...@@ -2269,8 +2271,8 @@ void Texture2D::convertToRenderTarget() ...@@ -2269,8 +2271,8 @@ void Texture2D::convertToRenderTarget()
if (!copyToRenderTarget(dest, source, mTexStorage->isManaged())) if (!copyToRenderTarget(dest, source, mTexStorage->isManaged()))
{ {
delete newTexStorage; delete newTexStorage;
source->Release(); if (source) source->Release();
dest->Release(); if (dest) dest->Release();
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
} }
...@@ -2358,6 +2360,8 @@ Renderbuffer *Texture2D::getRenderbuffer(GLenum target) ...@@ -2358,6 +2360,8 @@ Renderbuffer *Texture2D::getRenderbuffer(GLenum target)
return mColorbufferProxy; return mColorbufferProxy;
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Texture2D::getRenderTarget(GLenum target) IDirect3DSurface9 *Texture2D::getRenderTarget(GLenum target)
{ {
ASSERT(target == GL_TEXTURE_2D); ASSERT(target == GL_TEXTURE_2D);
...@@ -2417,6 +2421,8 @@ TextureStorageCubeMap::~TextureStorageCubeMap() ...@@ -2417,6 +2421,8 @@ TextureStorageCubeMap::~TextureStorageCubeMap()
} }
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(GLenum faceTarget, int level) IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(GLenum faceTarget, int level)
{ {
IDirect3DSurface9 *surface = NULL; IDirect3DSurface9 *surface = NULL;
...@@ -2802,8 +2808,8 @@ void TextureCubeMap::convertToRenderTarget() ...@@ -2802,8 +2808,8 @@ void TextureCubeMap::convertToRenderTarget()
if (!copyToRenderTarget(dest, source, mTexStorage->isManaged())) if (!copyToRenderTarget(dest, source, mTexStorage->isManaged()))
{ {
delete newTexStorage; delete newTexStorage;
source->Release(); if (source) source->Release();
dest->Release(); if (dest) dest->Release();
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
} }
...@@ -3098,6 +3104,8 @@ Renderbuffer *TextureCubeMap::getRenderbuffer(GLenum target) ...@@ -3098,6 +3104,8 @@ Renderbuffer *TextureCubeMap::getRenderbuffer(GLenum target)
return mFaceProxies[face]; return mFaceProxies[face];
} }
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *TextureCubeMap::getRenderTarget(GLenum target) IDirect3DSurface9 *TextureCubeMap::getRenderTarget(GLenum target)
{ {
ASSERT(IsCubemapTextureTarget(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