Commit 4d782730 by Geoff Lang

RenderTarget11::get* calls no longer add references to the D3D resources.

Issue #451 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Geoff Lang
parent 4c09586e
...@@ -403,36 +403,18 @@ ID3D11Resource *RenderTarget11::getTexture() const ...@@ -403,36 +403,18 @@ ID3D11Resource *RenderTarget11::getTexture() const
return mTexture; return mTexture;
} }
// Adds reference, caller must call Release
ID3D11RenderTargetView *RenderTarget11::getRenderTargetView() const ID3D11RenderTargetView *RenderTarget11::getRenderTargetView() const
{ {
if (mRenderTarget)
{
mRenderTarget->AddRef();
}
return mRenderTarget; return mRenderTarget;
} }
// Adds reference, caller must call Release
ID3D11DepthStencilView *RenderTarget11::getDepthStencilView() const ID3D11DepthStencilView *RenderTarget11::getDepthStencilView() const
{ {
if (mDepthStencil)
{
mDepthStencil->AddRef();
}
return mDepthStencil; return mDepthStencil;
} }
// Adds reference, caller must call Release
ID3D11ShaderResourceView *RenderTarget11::getShaderResourceView() const ID3D11ShaderResourceView *RenderTarget11::getShaderResourceView() const
{ {
if (mShaderResource)
{
mShaderResource->AddRef();
}
return mShaderResource; return mShaderResource;
} }
......
...@@ -29,16 +29,9 @@ class RenderTarget11 : public RenderTarget ...@@ -29,16 +29,9 @@ class RenderTarget11 : public RenderTarget
virtual void invalidate(GLint x, GLint y, GLsizei width, GLsizei height); virtual void invalidate(GLint x, GLint y, GLsizei width, GLsizei height);
// Adds reference, caller must call Release
ID3D11Resource *getTexture() const; ID3D11Resource *getTexture() const;
// Adds reference, caller must call Release
ID3D11RenderTargetView *getRenderTargetView() const; ID3D11RenderTargetView *getRenderTargetView() const;
// Adds reference, caller must call Release
ID3D11DepthStencilView *getDepthStencilView() const; ID3D11DepthStencilView *getDepthStencilView() const;
// Adds reference, caller must call Release
ID3D11ShaderResourceView *getShaderResourceView() const; ID3D11ShaderResourceView *getShaderResourceView() const;
unsigned int getSubresourceIndex() const; unsigned int getSubresourceIndex() const;
......
...@@ -1045,9 +1045,6 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer) ...@@ -1045,9 +1045,6 @@ bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
mDepthStencilInitialized = true; mDepthStencilInitialized = true;
} }
SafeRelease(framebufferRTVs);
SafeRelease(framebufferDSV);
return true; return true;
} }
...@@ -1597,8 +1594,6 @@ void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer * ...@@ -1597,8 +1594,6 @@ void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *
clearParams.colorClearValue.blue, clearParams.colorClearValue.blue,
clearParams.colorClearValue.alpha }; clearParams.colorClearValue.alpha };
mDeviceContext->ClearRenderTargetView(framebufferRTV, clearValues); mDeviceContext->ClearRenderTargetView(framebufferRTV, clearValues);
framebufferRTV->Release();
} }
} }
} }
...@@ -1636,8 +1631,6 @@ void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer * ...@@ -1636,8 +1631,6 @@ void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *
UINT8 stencilClear = clearParams.stencilClearValue & 0x000000FF; UINT8 stencilClear = clearParams.stencilClearValue & 0x000000FF;
mDeviceContext->ClearDepthStencilView(framebufferDSV, clearFlags, depthClear, stencilClear); mDeviceContext->ClearDepthStencilView(framebufferDSV, clearFlags, depthClear, stencilClear);
framebufferDSV->Release();
} }
} }
} }
...@@ -2686,7 +2679,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2686,7 +2679,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
TextureStorage11_2D *storage11 = TextureStorage11_2D::makeTextureStorage11_2D(storage->getStorageInstance()); TextureStorage11_2D *storage11 = TextureStorage11_2D::makeTextureStorage11_2D(storage->getStorageInstance());
if (!storage11) if (!storage11)
{ {
source->Release();
ERR("Failed to retrieve the texture storage from the destination."); ERR("Failed to retrieve the texture storage from the destination.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
...@@ -2694,7 +2686,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2694,7 +2686,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(level)); RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTarget(level));
if (!destRenderTarget) if (!destRenderTarget)
{ {
source->Release();
ERR("Failed to retrieve the render target from the destination storage."); ERR("Failed to retrieve the render target from the destination storage.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
...@@ -2702,7 +2693,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2702,7 +2693,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
ID3D11RenderTargetView *dest = destRenderTarget->getRenderTargetView(); ID3D11RenderTargetView *dest = destRenderTarget->getRenderTargetView();
if (!dest) if (!dest)
{ {
source->Release();
ERR("Failed to retrieve the render target view from the destination render target."); ERR("Failed to retrieve the render target view from the destination render target.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
...@@ -2718,9 +2708,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2718,9 +2708,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize,
destFormat, GL_NEAREST); destFormat, GL_NEAREST);
source->Release();
dest->Release();
return ret; return ret;
} }
...@@ -2751,7 +2738,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2751,7 +2738,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
TextureStorage11_Cube *storage11 = TextureStorage11_Cube::makeTextureStorage11_Cube(storage->getStorageInstance()); TextureStorage11_Cube *storage11 = TextureStorage11_Cube::makeTextureStorage11_Cube(storage->getStorageInstance());
if (!storage11) if (!storage11)
{ {
source->Release();
ERR("Failed to retrieve the texture storage from the destination."); ERR("Failed to retrieve the texture storage from the destination.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
...@@ -2759,7 +2745,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2759,7 +2745,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTargetFace(target, level)); RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTargetFace(target, level));
if (!destRenderTarget) if (!destRenderTarget)
{ {
source->Release();
ERR("Failed to retrieve the render target from the destination storage."); ERR("Failed to retrieve the render target from the destination storage.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
...@@ -2767,7 +2752,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2767,7 +2752,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
ID3D11RenderTargetView *dest = destRenderTarget->getRenderTargetView(); ID3D11RenderTargetView *dest = destRenderTarget->getRenderTargetView();
if (!dest) if (!dest)
{ {
source->Release();
ERR("Failed to retrieve the render target view from the destination render target."); ERR("Failed to retrieve the render target view from the destination render target.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
...@@ -2783,9 +2767,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2783,9 +2767,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize,
destFormat, GL_NEAREST); destFormat, GL_NEAREST);
source->Release();
dest->Release();
return ret; return ret;
} }
...@@ -2816,7 +2797,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2816,7 +2797,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
TextureStorage11_3D *storage11 = TextureStorage11_3D::makeTextureStorage11_3D(storage->getStorageInstance()); TextureStorage11_3D *storage11 = TextureStorage11_3D::makeTextureStorage11_3D(storage->getStorageInstance());
if (!storage11) if (!storage11)
{ {
source->Release();
ERR("Failed to retrieve the texture storage from the destination."); ERR("Failed to retrieve the texture storage from the destination.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
...@@ -2824,7 +2804,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2824,7 +2804,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTargetLayer(level, zOffset)); RenderTarget11 *destRenderTarget = RenderTarget11::makeRenderTarget11(storage11->getRenderTargetLayer(level, zOffset));
if (!destRenderTarget) if (!destRenderTarget)
{ {
source->Release();
ERR("Failed to retrieve the render target from the destination storage."); ERR("Failed to retrieve the render target from the destination storage.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
...@@ -2832,7 +2811,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2832,7 +2811,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
ID3D11RenderTargetView *dest = destRenderTarget->getRenderTargetView(); ID3D11RenderTargetView *dest = destRenderTarget->getRenderTargetView();
if (!dest) if (!dest)
{ {
source->Release();
ERR("Failed to retrieve the render target view from the destination render target."); ERR("Failed to retrieve the render target view from the destination render target.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
...@@ -2848,9 +2826,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2848,9 +2826,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize,
destFormat, GL_NEAREST); destFormat, GL_NEAREST);
source->Release();
dest->Release();
return ret; return ret;
} }
...@@ -2897,7 +2872,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2897,7 +2872,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
ID3D11RenderTargetView *dest = destRenderTarget->getRenderTargetView(); ID3D11RenderTargetView *dest = destRenderTarget->getRenderTargetView();
if (!dest) if (!dest)
{ {
source->Release();
ERR("Failed to retrieve the render target view from the destination render target."); ERR("Failed to retrieve the render target view from the destination render target.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
...@@ -2913,9 +2887,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so ...@@ -2913,9 +2887,6 @@ bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &so
bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize,
destFormat, GL_NEAREST); destFormat, GL_NEAREST);
source->Release();
dest->Release();
return ret; return ret;
} }
...@@ -3087,7 +3058,6 @@ bool Renderer11::getRenderTargetResource(gl::Renderbuffer *colorbuffer, unsigned ...@@ -3087,7 +3058,6 @@ bool Renderer11::getRenderTargetResource(gl::Renderbuffer *colorbuffer, unsigned
{ {
ID3D11Resource *textureResource = NULL; ID3D11Resource *textureResource = NULL;
colorBufferRTV->GetResource(&textureResource); colorBufferRTV->GetResource(&textureResource);
colorBufferRTV->Release();
if (textureResource) if (textureResource)
{ {
...@@ -3409,6 +3379,18 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R ...@@ -3409,6 +3379,18 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R
bool result = true; bool result = true;
RenderTarget11 *drawRenderTarget11 = RenderTarget11::makeRenderTarget11(drawRenderTarget);
if (!drawRenderTarget)
{
ERR("Failed to retrieve the draw render target from the draw framebuffer.");
return gl::error(GL_OUT_OF_MEMORY, false);
}
ID3D11Resource *drawTexture = drawRenderTarget11->getTexture();
unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex();
ID3D11RenderTargetView *drawRTV = drawRenderTarget11->getRenderTargetView();
ID3D11DepthStencilView *drawDSV = drawRenderTarget11->getDepthStencilView();
RenderTarget11 *readRenderTarget11 = RenderTarget11::makeRenderTarget11(readRenderTarget); RenderTarget11 *readRenderTarget11 = RenderTarget11::makeRenderTarget11(readRenderTarget);
if (!readRenderTarget) if (!readRenderTarget)
{ {
...@@ -3423,7 +3405,6 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R ...@@ -3423,7 +3405,6 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R
{ {
ID3D11Resource *unresolvedResource = readRenderTarget11->getTexture(); ID3D11Resource *unresolvedResource = readRenderTarget11->getTexture();
ID3D11Texture2D *unresolvedTexture = d3d11::DynamicCastComObject<ID3D11Texture2D>(unresolvedResource); ID3D11Texture2D *unresolvedTexture = d3d11::DynamicCastComObject<ID3D11Texture2D>(unresolvedResource);
unresolvedResource->Release();
if (unresolvedTexture) if (unresolvedTexture)
{ {
...@@ -3443,29 +3424,20 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R ...@@ -3443,29 +3424,20 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R
else else
{ {
readTexture = readRenderTarget11->getTexture(); readTexture = readRenderTarget11->getTexture();
readTexture->AddRef();
readSubresource = readRenderTarget11->getSubresourceIndex(); readSubresource = readRenderTarget11->getSubresourceIndex();
readSRV = readRenderTarget11->getShaderResourceView(); readSRV = readRenderTarget11->getShaderResourceView();
readSRV->AddRef();
} }
if (!readTexture) if (!readTexture || !readSRV)
{ {
SafeRelease(readTexture);
SafeRelease(readSRV);
ERR("Failed to retrieve the read render target view from the read render target."); ERR("Failed to retrieve the read render target view from the read render target.");
return gl::error(GL_OUT_OF_MEMORY, false); return gl::error(GL_OUT_OF_MEMORY, false);
} }
RenderTarget11 *drawRenderTarget11 = RenderTarget11::makeRenderTarget11(drawRenderTarget);
if (!drawRenderTarget)
{
readTexture->Release();
ERR("Failed to retrieve the draw render target from the draw framebuffer.");
return gl::error(GL_OUT_OF_MEMORY, false);
}
ID3D11Resource *drawTexture = drawRenderTarget11->getTexture();
unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex();
ID3D11RenderTargetView *drawRTV = drawRenderTarget11->getRenderTargetView();
ID3D11DepthStencilView *drawDSV = drawRenderTarget11->getDepthStencilView();
bool wholeBufferCopy = readRect.x == 0 && readRect.width == readRenderTarget11->getWidth() && bool wholeBufferCopy = readRect.x == 0 && readRect.width == readRenderTarget11->getWidth() &&
readRect.y == 0 && readRect.height == readRenderTarget11->getHeight() && readRect.y == 0 && readRect.height == readRenderTarget11->getHeight() &&
drawRect.x == 0 && drawRect.width == drawRenderTarget->getWidth() && drawRect.x == 0 && drawRect.width == drawRenderTarget->getWidth() &&
...@@ -3523,9 +3495,6 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R ...@@ -3523,9 +3495,6 @@ bool Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const gl::R
SafeRelease(readTexture); SafeRelease(readTexture);
SafeRelease(readSRV); SafeRelease(readSRV);
SafeRelease(drawTexture);
SafeRelease(drawRTV);
SafeRelease(drawDSV);
return result; return result;
} }
......
...@@ -157,9 +157,6 @@ void TextureStorage11::generateMipmapLayer(RenderTarget11 *source, RenderTarget1 ...@@ -157,9 +157,6 @@ void TextureStorage11::generateMipmapLayer(RenderTarget11 *source, RenderTarget1
gl::GetFormat(source->getInternalFormat(), mRenderer->getCurrentClientVersion()), gl::GetFormat(source->getInternalFormat(), mRenderer->getCurrentClientVersion()),
GL_LINEAR); GL_LINEAR);
} }
SafeRelease(sourceSRV);
SafeRelease(destRTV);
} }
} }
......
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