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