Commit 764a1e76 by Jamie Madill Committed by Commit Bot

D3D11: Consolidate DSV allocation.

This uses the new classes introduced in ResourceManager11. Smart pointers mean we can use ANGLE_TRY in more places, and don't need to manually release these views. There is now a single point in the D3D11 back-end where depth stencil views are allocated. BUG=angleproject:2034 Change-Id: If0de2529ece1298e8babf24c07cc4be9849cc4de Reviewed-on: https://chromium-review.googlesource.com/503249Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent df682a8e
...@@ -1296,7 +1296,7 @@ gl::Error Blit11::copyStencil(const TextureHelper11 &source, ...@@ -1296,7 +1296,7 @@ gl::Error Blit11::copyStencil(const TextureHelper11 &source,
gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source, gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source,
const gl::Box &sourceArea, const gl::Box &sourceArea,
const gl::Extents &sourceSize, const gl::Extents &sourceSize,
ID3D11DepthStencilView *dest, const d3d11::DepthStencilView &dest,
const gl::Box &destArea, const gl::Box &destArea,
const gl::Extents &destSize, const gl::Extents &destSize,
const gl::Rectangle *scissor) const gl::Rectangle *scissor)
...@@ -1369,7 +1369,7 @@ gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source, ...@@ -1369,7 +1369,7 @@ gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source,
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
// Apply render target // Apply render target
stateManager->setOneTimeRenderTarget(nullptr, dest); stateManager->setOneTimeRenderTarget(nullptr, dest.get());
// Set the viewport // Set the viewport
D3D11_VIEWPORT viewport; D3D11_VIEWPORT viewport;
...@@ -1987,7 +1987,7 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveDepth(RenderTarget11 *depth) ...@@ -1987,7 +1987,7 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveDepth(RenderTarget11 *depth)
context->GSSetShader(nullptr, nullptr, 0); context->GSSetShader(nullptr, nullptr, 0);
context->RSSetState(nullptr); context->RSSetState(nullptr);
context->OMSetDepthStencilState(mDepthStencilState.Get(), 0xFFFFFFFF); context->OMSetDepthStencilState(mDepthStencilState.Get(), 0xFFFFFFFF);
context->OMSetRenderTargets(0, nullptr, mResolvedDepthDSView.Get()); context->OMSetRenderTargets(0, nullptr, mResolvedDepthDSView.get());
context->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF); context->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
// Set the viewport // Set the viewport
...@@ -2052,18 +2052,14 @@ gl::Error Blit11::initResolveDepthOnly(const d3d11::Format &format, const gl::Ex ...@@ -2052,18 +2052,14 @@ gl::Error Blit11::initResolveDepthOnly(const d3d11::Format &format, const gl::Ex
dsvDesc.Texture2D.MipSlice = 0; dsvDesc.Texture2D.MipSlice = 0;
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
hr = device->CreateDepthStencilView(mResolvedDepth.getResource(), &dsvDesc, ANGLE_TRY(
mResolvedDepthDSView.ReleaseAndGetAddressOf()); mRenderer->allocateResource(dsvDesc, mResolvedDepth.getResource(), &mResolvedDepthDSView));
if (FAILED(hr)) mResolvedDepthDSView.setDebugName("Blit11::mResolvedDepthDSView");
{
return gl::OutOfMemory() << "Failed to allocate Blit11::mResolvedDepthDSView, " << hr;
}
d3d11::SetDebugName(mResolvedDepthDSView, "Blit11::mResolvedDepthDSView");
// Possibly D3D11 bug or undefined behaviour: Clear the DSV so that our first render // Possibly D3D11 bug or undefined behaviour: Clear the DSV so that our first render
// works as expected. Otherwise the results of the first use seem to be incorrect. // works as expected. Otherwise the results of the first use seem to be incorrect.
auto context = mRenderer->getDeviceContext(); auto context = mRenderer->getDeviceContext();
context->ClearDepthStencilView(mResolvedDepthDSView.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0); context->ClearDepthStencilView(mResolvedDepthDSView.get(), D3D11_CLEAR_DEPTH, 1.0f, 0);
return gl::NoError(); return gl::NoError();
} }
......
...@@ -58,7 +58,7 @@ class Blit11 : angle::NonCopyable ...@@ -58,7 +58,7 @@ class Blit11 : angle::NonCopyable
gl::Error copyDepth(ID3D11ShaderResourceView *source, gl::Error copyDepth(ID3D11ShaderResourceView *source,
const gl::Box &sourceArea, const gl::Box &sourceArea,
const gl::Extents &sourceSize, const gl::Extents &sourceSize,
ID3D11DepthStencilView *dest, const d3d11::DepthStencilView &dest,
const gl::Box &destArea, const gl::Box &destArea,
const gl::Extents &destSize, const gl::Extents &destSize,
const gl::Rectangle *scissor); const gl::Rectangle *scissor);
...@@ -290,7 +290,7 @@ class Blit11 : angle::NonCopyable ...@@ -290,7 +290,7 @@ class Blit11 : angle::NonCopyable
TextureHelper11 mResolvedDepthStencil; TextureHelper11 mResolvedDepthStencil;
d3d11::RenderTargetView mResolvedDepthStencilRTView; d3d11::RenderTargetView mResolvedDepthStencilRTView;
TextureHelper11 mResolvedDepth; TextureHelper11 mResolvedDepth;
angle::ComPtr<ID3D11DepthStencilView> mResolvedDepthDSView; d3d11::DepthStencilView mResolvedDepthDSView;
}; };
} // namespace rx } // namespace rx
......
...@@ -496,7 +496,7 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams, ...@@ -496,7 +496,7 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
if (depthStencilRenderTarget) if (depthStencilRenderTarget)
{ {
dsv = depthStencilRenderTarget->getDepthStencilView(); dsv = depthStencilRenderTarget->getDepthStencilView().get();
if (!dsv) if (!dsv)
{ {
......
...@@ -230,7 +230,7 @@ TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv, ...@@ -230,7 +230,7 @@ TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
mSubresourceIndex(0), mSubresourceIndex(0),
mTexture(resource), mTexture(resource),
mRenderTarget(std::move(rtv)), mRenderTarget(std::move(rtv)),
mDepthStencil(nullptr), mDepthStencil(),
mShaderResource(srv), mShaderResource(srv),
mBlitShaderResource(blitSRV) mBlitShaderResource(blitSRV)
{ {
...@@ -256,7 +256,7 @@ TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv, ...@@ -256,7 +256,7 @@ TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
ASSERT(mFormatSet.formatID != angle::Format::ID::NONE || mWidth == 0 || mHeight == 0); ASSERT(mFormatSet.formatID != angle::Format::ID::NONE || mWidth == 0 || mHeight == 0);
} }
TextureRenderTarget11::TextureRenderTarget11(ID3D11DepthStencilView *dsv, TextureRenderTarget11::TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
ID3D11Resource *resource, ID3D11Resource *resource,
ID3D11ShaderResourceView *srv, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLenum internalFormat,
...@@ -274,7 +274,7 @@ TextureRenderTarget11::TextureRenderTarget11(ID3D11DepthStencilView *dsv, ...@@ -274,7 +274,7 @@ TextureRenderTarget11::TextureRenderTarget11(ID3D11DepthStencilView *dsv,
mSubresourceIndex(0), mSubresourceIndex(0),
mTexture(resource), mTexture(resource),
mRenderTarget(), mRenderTarget(),
mDepthStencil(dsv), mDepthStencil(std::move(dsv)),
mShaderResource(srv), mShaderResource(srv),
mBlitShaderResource(nullptr) mBlitShaderResource(nullptr)
{ {
...@@ -283,19 +283,14 @@ TextureRenderTarget11::TextureRenderTarget11(ID3D11DepthStencilView *dsv, ...@@ -283,19 +283,14 @@ TextureRenderTarget11::TextureRenderTarget11(ID3D11DepthStencilView *dsv,
mTexture->AddRef(); mTexture->AddRef();
} }
if (mDepthStencil)
{
mDepthStencil->AddRef();
}
if (mShaderResource) if (mShaderResource)
{ {
mShaderResource->AddRef(); mShaderResource->AddRef();
} }
if (mDepthStencil && mTexture) if (mDepthStencil.valid() && mTexture)
{ {
mSubresourceIndex = GetDSVSubresourceIndex(mTexture, mDepthStencil); mSubresourceIndex = GetDSVSubresourceIndex(mTexture, mDepthStencil.get());
} }
ASSERT(mFormatSet.formatID != angle::Format::ID::NONE || mWidth == 0 || mHeight == 0); ASSERT(mFormatSet.formatID != angle::Format::ID::NONE || mWidth == 0 || mHeight == 0);
} }
...@@ -303,7 +298,6 @@ TextureRenderTarget11::TextureRenderTarget11(ID3D11DepthStencilView *dsv, ...@@ -303,7 +298,6 @@ TextureRenderTarget11::TextureRenderTarget11(ID3D11DepthStencilView *dsv,
TextureRenderTarget11::~TextureRenderTarget11() TextureRenderTarget11::~TextureRenderTarget11()
{ {
SafeRelease(mTexture); SafeRelease(mTexture);
SafeRelease(mDepthStencil);
SafeRelease(mShaderResource); SafeRelease(mShaderResource);
SafeRelease(mBlitShaderResource); SafeRelease(mBlitShaderResource);
} }
...@@ -318,7 +312,7 @@ const d3d11::RenderTargetView &TextureRenderTarget11::getRenderTargetView() cons ...@@ -318,7 +312,7 @@ const d3d11::RenderTargetView &TextureRenderTarget11::getRenderTargetView() cons
return mRenderTarget; return mRenderTarget;
} }
ID3D11DepthStencilView *TextureRenderTarget11::getDepthStencilView() const const d3d11::DepthStencilView &TextureRenderTarget11::getDepthStencilView() const
{ {
return mDepthStencil; return mDepthStencil;
} }
...@@ -413,9 +407,10 @@ const d3d11::RenderTargetView &SurfaceRenderTarget11::getRenderTargetView() cons ...@@ -413,9 +407,10 @@ const d3d11::RenderTargetView &SurfaceRenderTarget11::getRenderTargetView() cons
return mSwapChain->getRenderTarget(); return mSwapChain->getRenderTarget();
} }
ID3D11DepthStencilView *SurfaceRenderTarget11::getDepthStencilView() const const d3d11::DepthStencilView &SurfaceRenderTarget11::getDepthStencilView() const
{ {
return (mDepth ? mSwapChain->getDepthStencil() : nullptr); ASSERT(mDepth);
return mSwapChain->getDepthStencil();
} }
ID3D11ShaderResourceView *SurfaceRenderTarget11::getShaderResourceView() const ID3D11ShaderResourceView *SurfaceRenderTarget11::getShaderResourceView() const
......
...@@ -28,7 +28,7 @@ class RenderTarget11 : public RenderTargetD3D ...@@ -28,7 +28,7 @@ class RenderTarget11 : public RenderTargetD3D
virtual ID3D11Resource *getTexture() const = 0; virtual ID3D11Resource *getTexture() const = 0;
virtual const d3d11::RenderTargetView &getRenderTargetView() const = 0; virtual const d3d11::RenderTargetView &getRenderTargetView() const = 0;
virtual ID3D11DepthStencilView *getDepthStencilView() const = 0; virtual const d3d11::DepthStencilView &getDepthStencilView() const = 0;
virtual ID3D11ShaderResourceView *getShaderResourceView() const = 0; virtual ID3D11ShaderResourceView *getShaderResourceView() const = 0;
virtual ID3D11ShaderResourceView *getBlitShaderResourceView() const = 0; virtual ID3D11ShaderResourceView *getBlitShaderResourceView() const = 0;
...@@ -58,7 +58,7 @@ class TextureRenderTarget11 : public RenderTarget11 ...@@ -58,7 +58,7 @@ class TextureRenderTarget11 : public RenderTarget11
GLsizei height, GLsizei height,
GLsizei depth, GLsizei depth,
GLsizei samples); GLsizei samples);
TextureRenderTarget11(ID3D11DepthStencilView *dsv, TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
ID3D11Resource *resource, ID3D11Resource *resource,
ID3D11ShaderResourceView *srv, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLenum internalFormat,
...@@ -77,7 +77,7 @@ class TextureRenderTarget11 : public RenderTarget11 ...@@ -77,7 +77,7 @@ class TextureRenderTarget11 : public RenderTarget11
ID3D11Resource *getTexture() const override; ID3D11Resource *getTexture() const override;
const d3d11::RenderTargetView &getRenderTargetView() const override; const d3d11::RenderTargetView &getRenderTargetView() const override;
ID3D11DepthStencilView *getDepthStencilView() const override; const d3d11::DepthStencilView &getDepthStencilView() const override;
ID3D11ShaderResourceView *getShaderResourceView() const override; ID3D11ShaderResourceView *getShaderResourceView() const override;
ID3D11ShaderResourceView *getBlitShaderResourceView() const override; ID3D11ShaderResourceView *getBlitShaderResourceView() const override;
...@@ -93,7 +93,7 @@ class TextureRenderTarget11 : public RenderTarget11 ...@@ -93,7 +93,7 @@ class TextureRenderTarget11 : public RenderTarget11
unsigned int mSubresourceIndex; unsigned int mSubresourceIndex;
ID3D11Resource *mTexture; ID3D11Resource *mTexture;
d3d11::RenderTargetView mRenderTarget; d3d11::RenderTargetView mRenderTarget;
ID3D11DepthStencilView *mDepthStencil; d3d11::DepthStencilView mDepthStencil;
ID3D11ShaderResourceView *mShaderResource; ID3D11ShaderResourceView *mShaderResource;
// Shader resource view to use with internal blit shaders. Not set for depth/stencil render // Shader resource view to use with internal blit shaders. Not set for depth/stencil render
...@@ -115,7 +115,7 @@ class SurfaceRenderTarget11 : public RenderTarget11 ...@@ -115,7 +115,7 @@ class SurfaceRenderTarget11 : public RenderTarget11
ID3D11Resource *getTexture() const override; ID3D11Resource *getTexture() const override;
const d3d11::RenderTargetView &getRenderTargetView() const override; const d3d11::RenderTargetView &getRenderTargetView() const override;
ID3D11DepthStencilView *getDepthStencilView() const override; const d3d11::DepthStencilView &getDepthStencilView() const override;
ID3D11ShaderResourceView *getShaderResourceView() const override; ID3D11ShaderResourceView *getShaderResourceView() const override;
ID3D11ShaderResourceView *getBlitShaderResourceView() const override; ID3D11ShaderResourceView *getBlitShaderResourceView() const override;
......
...@@ -3620,23 +3620,18 @@ gl::Error Renderer11::createRenderTarget(int width, ...@@ -3620,23 +3620,18 @@ gl::Error Renderer11::createRenderTarget(int width,
dsvDesc.Texture2D.MipSlice = 0; dsvDesc.Texture2D.MipSlice = 0;
dsvDesc.Flags = 0; dsvDesc.Flags = 0;
ID3D11DepthStencilView *dsv = nullptr; d3d11::DepthStencilView dsv;
result = mDevice->CreateDepthStencilView(texture, &dsvDesc, &dsv); gl::Error err = allocateResource(dsvDesc, texture, &dsv);
if (FAILED(result)) if (err.isError())
{ {
ASSERT(result == E_OUTOFMEMORY);
SafeRelease(texture); SafeRelease(texture);
SafeRelease(srv); SafeRelease(srv);
SafeRelease(blitSRV); SafeRelease(blitSRV);
return gl::Error(GL_OUT_OF_MEMORY, return err;
"Failed to create render target depth stencil view, result: 0x%X.",
result);
} }
*outRT = new TextureRenderTarget11(dsv, texture, srv, format, formatInfo, width, height, *outRT = new TextureRenderTarget11(std::move(dsv), texture, srv, format, formatInfo,
1, supportedSamples); width, height, 1, supportedSamples);
SafeRelease(dsv);
} }
else if (bindRTV) else if (bindRTV)
{ {
...@@ -4273,7 +4268,6 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn, ...@@ -4273,7 +4268,6 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
TextureHelper11 drawTexture = TextureHelper11::MakeAndReference( TextureHelper11 drawTexture = TextureHelper11::MakeAndReference(
drawRenderTarget11->getTexture(), drawRenderTarget11->getFormatSet()); drawRenderTarget11->getTexture(), drawRenderTarget11->getFormatSet());
unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex(); unsigned int drawSubresource = drawRenderTarget11->getSubresourceIndex();
ID3D11DepthStencilView *drawDSV = drawRenderTarget11->getDepthStencilView();
RenderTarget11 *readRenderTarget11 = GetAs<RenderTarget11>(readRenderTarget); RenderTarget11 *readRenderTarget11 = GetAs<RenderTarget11>(readRenderTarget);
if (!readRenderTarget11) if (!readRenderTarget11)
...@@ -4499,6 +4493,8 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn, ...@@ -4499,6 +4493,8 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
} }
else if (depthBlit) else if (depthBlit)
{ {
const d3d11::DepthStencilView &drawDSV = drawRenderTarget11->getDepthStencilView();
ASSERT(readSRV); ASSERT(readSRV);
ANGLE_TRY(mBlit->copyDepth(readSRV, readArea, readSize, drawDSV, drawArea, drawSize, ANGLE_TRY(mBlit->copyDepth(readSRV, readArea, readSize, drawDSV, drawArea, drawSize,
scissor)); scissor));
......
...@@ -24,6 +24,14 @@ size_t ComputeMemoryUsage(const T *desc) ...@@ -24,6 +24,14 @@ size_t ComputeMemoryUsage(const T *desc)
} }
HRESULT CreateResource(ID3D11Device *device, HRESULT CreateResource(ID3D11Device *device,
const D3D11_DEPTH_STENCIL_VIEW_DESC *desc,
ID3D11Resource *resource,
ID3D11DepthStencilView **depthStencilView)
{
return device->CreateDepthStencilView(resource, desc, depthStencilView);
}
HRESULT CreateResource(ID3D11Device *device,
const D3D11_RENDER_TARGET_VIEW_DESC *desc, const D3D11_RENDER_TARGET_VIEW_DESC *desc,
ID3D11Resource *resource, ID3D11Resource *resource,
ID3D11RenderTargetView **renderTargetView) ID3D11RenderTargetView **renderTargetView)
......
...@@ -23,6 +23,8 @@ class ResourceManager11; ...@@ -23,6 +23,8 @@ class ResourceManager11;
// Format: ResourceType, D3D11 type, DESC type, init data type. // Format: ResourceType, D3D11 type, DESC type, init data type.
#define ANGLE_RESOURCE_TYPE_OP(NAME, OP) \ #define ANGLE_RESOURCE_TYPE_OP(NAME, OP) \
OP(NAME, DepthStencilView, ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, \
ID3D11Resource) \
OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \ OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \
ID3D11Resource) ID3D11Resource)
......
...@@ -1071,7 +1071,7 @@ gl::Error StateManager11::syncFramebuffer(ContextImpl *contextImpl, gl::Framebuf ...@@ -1071,7 +1071,7 @@ gl::Error StateManager11::syncFramebuffer(ContextImpl *contextImpl, gl::Framebuf
const auto *depthStencilRenderTarget = framebuffer11->getCachedDepthStencilRenderTarget(); const auto *depthStencilRenderTarget = framebuffer11->getCachedDepthStencilRenderTarget();
if (depthStencilRenderTarget) if (depthStencilRenderTarget)
{ {
framebufferDSV = depthStencilRenderTarget->getDepthStencilView(); framebufferDSV = depthStencilRenderTarget->getDepthStencilView().get();
ASSERT(framebufferDSV); ASSERT(framebufferDSV);
// If there is no render buffer, the width, height and format values come from // If there is no render buffer, the width, height and format values come from
......
...@@ -78,7 +78,7 @@ SwapChain11::SwapChain11(Renderer11 *renderer, ...@@ -78,7 +78,7 @@ SwapChain11::SwapChain11(Renderer11 *renderer,
mOffscreenRTView(), mOffscreenRTView(),
mOffscreenSRView(nullptr), mOffscreenSRView(nullptr),
mDepthStencilTexture(nullptr), mDepthStencilTexture(nullptr),
mDepthStencilDSView(nullptr), mDepthStencilDSView(),
mDepthStencilSRView(nullptr), mDepthStencilSRView(nullptr),
mQuadVB(nullptr), mQuadVB(nullptr),
mPassThroughSampler(nullptr), mPassThroughSampler(nullptr),
...@@ -118,7 +118,7 @@ void SwapChain11::release() ...@@ -118,7 +118,7 @@ void SwapChain11::release()
mOffscreenRTView.reset(); mOffscreenRTView.reset();
SafeRelease(mOffscreenSRView); SafeRelease(mOffscreenSRView);
SafeRelease(mDepthStencilTexture); SafeRelease(mDepthStencilTexture);
SafeRelease(mDepthStencilDSView); mDepthStencilDSView.reset();
SafeRelease(mDepthStencilSRView); SafeRelease(mDepthStencilSRView);
SafeRelease(mQuadVB); SafeRelease(mQuadVB);
SafeRelease(mPassThroughSampler); SafeRelease(mPassThroughSampler);
...@@ -143,7 +143,7 @@ void SwapChain11::releaseOffscreenColorBuffer() ...@@ -143,7 +143,7 @@ void SwapChain11::releaseOffscreenColorBuffer()
void SwapChain11::releaseOffscreenDepthBuffer() void SwapChain11::releaseOffscreenDepthBuffer()
{ {
SafeRelease(mDepthStencilTexture); SafeRelease(mDepthStencilTexture);
SafeRelease(mDepthStencilDSView); mDepthStencilDSView.reset();
SafeRelease(mDepthStencilSRView); SafeRelease(mDepthStencilSRView);
} }
...@@ -395,9 +395,10 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe ...@@ -395,9 +395,10 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe
depthStencilDesc.Flags = 0; depthStencilDesc.Flags = 0;
depthStencilDesc.Texture2D.MipSlice = 0; depthStencilDesc.Texture2D.MipSlice = 0;
result = device->CreateDepthStencilView(mDepthStencilTexture, &depthStencilDesc, &mDepthStencilDSView); gl::Error err = mRenderer->allocateResource(depthStencilDesc, mDepthStencilTexture,
ASSERT(SUCCEEDED(result)); &mDepthStencilDSView);
d3d11::SetDebugName(mDepthStencilDSView, "Offscreen depth stencil view"); ASSERT(!err.isError());
mDepthStencilDSView.setDebugName("Offscreen depth stencil view");
if (depthBufferFormatInfo.srvFormat != DXGI_FORMAT_UNKNOWN) if (depthBufferFormatInfo.srvFormat != DXGI_FORMAT_UNKNOWN)
{ {
...@@ -905,7 +906,7 @@ ID3D11ShaderResourceView *SwapChain11::getRenderTargetShaderResource() ...@@ -905,7 +906,7 @@ ID3D11ShaderResourceView *SwapChain11::getRenderTargetShaderResource()
return mNeedsOffscreenTexture ? mOffscreenSRView : mBackBufferSRView; return mNeedsOffscreenTexture ? mOffscreenSRView : mBackBufferSRView;
} }
ID3D11DepthStencilView *SwapChain11::getDepthStencil() const d3d11::DepthStencilView &SwapChain11::getDepthStencil()
{ {
return mDepthStencilDSView; return mDepthStencilDSView;
} }
......
...@@ -44,7 +44,7 @@ class SwapChain11 final : public SwapChainD3D ...@@ -44,7 +44,7 @@ class SwapChain11 final : public SwapChainD3D
ID3D11ShaderResourceView *getRenderTargetShaderResource(); ID3D11ShaderResourceView *getRenderTargetShaderResource();
ID3D11Texture2D *getDepthStencilTexture(); ID3D11Texture2D *getDepthStencilTexture();
ID3D11DepthStencilView *getDepthStencil(); const d3d11::DepthStencilView &getDepthStencil();
ID3D11ShaderResourceView *getDepthStencilShaderResource(); ID3D11ShaderResourceView *getDepthStencilShaderResource();
EGLint getWidth() const { return mWidth; } EGLint getWidth() const { return mWidth; }
...@@ -95,7 +95,7 @@ class SwapChain11 final : public SwapChainD3D ...@@ -95,7 +95,7 @@ class SwapChain11 final : public SwapChainD3D
ID3D11ShaderResourceView *mOffscreenSRView; ID3D11ShaderResourceView *mOffscreenSRView;
ID3D11Texture2D *mDepthStencilTexture; ID3D11Texture2D *mDepthStencilTexture;
ID3D11DepthStencilView *mDepthStencilDSView; d3d11::DepthStencilView mDepthStencilDSView;
ID3D11ShaderResourceView *mDepthStencilSRView; ID3D11ShaderResourceView *mDepthStencilSRView;
ID3D11Buffer *mQuadVB; ID3D11Buffer *mQuadVB;
......
...@@ -1075,8 +1075,6 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -1075,8 +1075,6 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
ID3D11ShaderResourceView *blitSRV = nullptr; ID3D11ShaderResourceView *blitSRV = nullptr;
ANGLE_TRY(getSRVLevel(level, true, &blitSRV)); ANGLE_TRY(getSRVLevel(level, true, &blitSRV));
ID3D11Device *device = mRenderer->getDevice();
if (mUseLevelZeroTexture) if (mUseLevelZeroTexture)
{ {
if (!mLevelZeroRenderTarget) if (!mLevelZeroRenderTarget)
...@@ -1124,24 +1122,12 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -1124,24 +1122,12 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
dsvDesc.Texture2D.MipSlice = mTopLevel + level; dsvDesc.Texture2D.MipSlice = mTopLevel + level;
dsvDesc.Flags = 0; dsvDesc.Flags = 0;
ID3D11DepthStencilView *dsv; d3d11::DepthStencilView dsv;
HRESULT result = device->CreateDepthStencilView(texture, &dsvDesc, &dsv); ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture, &dsv));
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{
return gl::Error(
GL_OUT_OF_MEMORY,
"Failed to create internal depth stencil view for texture storage, result: 0x%X.",
result);
}
mRenderTarget[level] =
new TextureRenderTarget11(dsv, texture, srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources mRenderTarget[level] = new TextureRenderTarget11(
SafeRelease(dsv); std::move(dsv), texture, srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0);
*outRT = mRenderTarget[level]; *outRT = mRenderTarget[level];
return gl::NoError(); return gl::NoError();
...@@ -2063,9 +2049,6 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, ...@@ -2063,9 +2049,6 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
if (!mRenderTarget[faceIndex][level]) if (!mRenderTarget[faceIndex][level])
{ {
ID3D11Device *device = mRenderer->getDevice();
HRESULT result;
ID3D11Resource *texture = nullptr; ID3D11Resource *texture = nullptr;
ANGLE_TRY(getResource(&texture)); ANGLE_TRY(getResource(&texture));
...@@ -2152,28 +2135,21 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, ...@@ -2152,28 +2135,21 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index,
dsvDesc.Texture2DArray.FirstArraySlice = faceIndex; dsvDesc.Texture2DArray.FirstArraySlice = faceIndex;
dsvDesc.Texture2DArray.ArraySize = 1; dsvDesc.Texture2DArray.ArraySize = 1;
ID3D11DepthStencilView *dsv; d3d11::DepthStencilView dsv;
result = device->CreateDepthStencilView(texture, &dsvDesc, &dsv); gl::Error err = mRenderer->allocateResource(dsvDesc, texture, &dsv);
if (err.isError())
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{ {
SafeRelease(srv); SafeRelease(srv);
SafeRelease(blitSRV); SafeRelease(blitSRV);
return gl::Error(GL_OUT_OF_MEMORY, return err;
"Failed to create internal depth stencil view for texture "
"storage, result: 0x%X.",
result);
} }
dsv.setDebugName("TexStorageCube.RenderTargetDSV");
d3d11::SetDebugName(dsv, "TexStorageCube.RenderTargetDSV");
mRenderTarget[faceIndex][level] = new TextureRenderTarget11( mRenderTarget[faceIndex][level] = new TextureRenderTarget11(
dsv, texture, srv, mFormatInfo.internalFormat, getFormatSet(), getLevelWidth(level), std::move(dsv), texture, srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelHeight(level), 1, 0); getLevelWidth(level), getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
SafeRelease(dsv);
SafeRelease(srv); SafeRelease(srv);
SafeRelease(blitSRV); SafeRelease(blitSRV);
} }
...@@ -2965,9 +2941,6 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index, ...@@ -2965,9 +2941,6 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
LevelLayerKey key(mipLevel, layer); LevelLayerKey key(mipLevel, layer);
if (mRenderTargets.find(key) == mRenderTargets.end()) if (mRenderTargets.find(key) == mRenderTargets.end())
{ {
ID3D11Device *device = mRenderer->getDevice();
HRESULT result;
ID3D11Resource *texture = nullptr; ID3D11Resource *texture = nullptr;
ANGLE_TRY(getResource(&texture)); ANGLE_TRY(getResource(&texture));
ID3D11ShaderResourceView *srv; ID3D11ShaderResourceView *srv;
...@@ -3031,26 +3004,22 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index, ...@@ -3031,26 +3004,22 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
dsvDesc.Texture2DArray.ArraySize = 1; dsvDesc.Texture2DArray.ArraySize = 1;
dsvDesc.Flags = 0; dsvDesc.Flags = 0;
ID3D11DepthStencilView *dsv; d3d11::DepthStencilView dsv;
result = device->CreateDepthStencilView(texture, &dsvDesc, &dsv); gl::Error err = mRenderer->allocateResource(dsvDesc, texture, &dsv);
if (err.isError())
ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
if (FAILED(result))
{ {
SafeRelease(srv); SafeRelease(srv);
SafeRelease(blitSRV); SafeRelease(blitSRV);
return gl::Error(GL_OUT_OF_MEMORY, return err;
"Failed to create TexStorage2DArray DSV. Result: 0x%X.", result);
} }
d3d11::SetDebugName(dsv, "TexStorage2DArray.RenderTargetDSV"); dsv.setDebugName("TexStorage2DArray.RenderTargetDSV");
mRenderTargets[key] = new TextureRenderTarget11( mRenderTargets[key] = new TextureRenderTarget11(
dsv, texture, srv, mFormatInfo.internalFormat, getFormatSet(), std::move(dsv), texture, srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0); getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
// RenderTarget will take ownership of these resources // RenderTarget will take ownership of these resources
SafeRelease(dsv);
SafeRelease(srv); SafeRelease(srv);
SafeRelease(blitSRV); SafeRelease(blitSRV);
} }
......
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