Commit e0e009fe by Jamie Madill Committed by Commit Bot

D3D11: Consolidate SRV allocation.

This change also moves all SRV storage to use the custom smart pointer classes in ResourceManager11. Every single SRV is now allocated in ResourceManager11. For TextureStorage11 and RenderTarget11, we use a shared pointer type since the SRVs use shared ownership by both classes. BUG=angleproject:2034 Change-Id: I90666fbbbc23ff10870b7401f3da09ef79258136 Reviewed-on: https://chromium-review.googlesource.com/503250Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 39b826fc
......@@ -582,7 +582,7 @@ Blit11::Blit11(Renderer11 *renderer)
mResolveStencilPS(g_PS_ResolveStencil,
ArraySize(g_PS_ResolveStencil),
"Blit11::mResolveStencilPS"),
mStencilSRV(nullptr),
mStencilSRV(),
mResolvedDepthStencilRTView()
{
}
......@@ -981,7 +981,7 @@ Blit11::ShaderSupport Blit11::getShaderSupport(const Shader &shader)
return support;
}
gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source,
gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source,
const d3d11::RenderTargetView &dest,
const gl::Extents &size,
const gl::SwizzleState &swizzleTarget)
......@@ -992,7 +992,7 @@ gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source,
ID3D11DeviceContext *deviceContext = mRenderer->getDeviceContext();
D3D11_SHADER_RESOURCE_VIEW_DESC sourceSRVDesc;
source->GetDesc(&sourceSRVDesc);
source.get()->GetDesc(&sourceSRVDesc);
GLenum componentType = d3d11::GetComponentType(sourceSRVDesc.Format);
if (componentType == GL_NONE)
......@@ -1109,7 +1109,7 @@ gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source,
deviceContext->RSSetViewports(1, &viewport);
// Apply textures
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, source);
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, source.get());
// Apply samplers
deviceContext->PSSetSamplers(0, 1, mPointSampler.GetAddressOf());
......@@ -1129,7 +1129,7 @@ gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source,
return gl::NoError();
}
gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source,
gl::Error Blit11::copyTexture(const d3d11::SharedSRV &source,
const gl::Box &sourceArea,
const gl::Extents &sourceSize,
const d3d11::RenderTargetView &dest,
......@@ -1150,7 +1150,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source,
// Determine if the source format is a signed integer format, the destFormat will already
// be GL_XXXX_INTEGER but it does not tell us if it is signed or unsigned.
D3D11_SHADER_RESOURCE_VIEW_DESC sourceSRVDesc;
source->GetDesc(&sourceSRVDesc);
source.get()->GetDesc(&sourceSRVDesc);
GLenum componentType = d3d11::GetComponentType(sourceSRVDesc.Format);
......@@ -1245,7 +1245,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source,
deviceContext->RSSetViewports(1, &viewport);
// Apply textures
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, source);
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, source.get());
// Apply samplers
ID3D11SamplerState *sampler = nullptr;
......@@ -1293,7 +1293,7 @@ gl::Error Blit11::copyStencil(const TextureHelper11 &source,
destSubresource, destArea, destSize, scissor, true);
}
gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source,
gl::Error Blit11::copyDepth(const d3d11::SharedSRV &source,
const gl::Box &sourceArea,
const gl::Extents &sourceSize,
const d3d11::DepthStencilView &dest,
......@@ -1382,7 +1382,7 @@ gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source,
deviceContext->RSSetViewports(1, &viewport);
// Apply textures
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, source);
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, source.get());
// Apply samplers
deviceContext->PSSetSamplers(0, 1, mPointSampler.GetAddressOf());
......@@ -2000,7 +2000,7 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveDepth(RenderTarget11 *depth)
viewport.MaxDepth = 1.0f;
context->RSSetViewports(1, &viewport);
ID3D11ShaderResourceView *pixelViews[] = {depth->getShaderResourceView()};
ID3D11ShaderResourceView *pixelViews[] = {depth->getShaderResourceView().get()};
context->PSSetShaderResources(0, 1, pixelViews);
......@@ -2128,32 +2128,27 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(RenderTarget11 *depthS
ID3D11Resource *stencilResource = depthStencil->getTexture();
// Check if we need to re-create the stencil SRV.
if (mStencilSRV)
if (mStencilSRV.valid())
{
ID3D11Resource *priorResource = nullptr;
mStencilSRV->GetResource(&priorResource);
mStencilSRV.get()->GetResource(&priorResource);
if (stencilResource != priorResource)
{
mStencilSRV.Reset();
mStencilSRV.reset();
}
SafeRelease(priorResource);
}
if (mStencilSRV == nullptr)
if (!mStencilSRV.valid())
{
D3D11_SHADER_RESOURCE_VIEW_DESC srViewDesc;
srViewDesc.Format = GetStencilSRVFormat(depthStencil->getFormatSet());
srViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMS;
HRESULT hr = device->CreateShaderResourceView(stencilResource, &srViewDesc,
mStencilSRV.GetAddressOf());
if (FAILED(hr))
{
return gl::OutOfMemory() << "Error creating Blit11 stencil SRV, " << hr;
}
d3d11::SetDebugName(mStencilSRV, "Blit11::mStencilSRV");
ANGLE_TRY(mRenderer->allocateResource(srViewDesc, stencilResource, &mStencilSRV));
mStencilSRV.setDebugName("Blit11::mStencilSRV");
}
// Notify the Renderer that all state should be invalidated.
......@@ -2182,7 +2177,7 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(RenderTarget11 *depthS
context->RSSetViewports(1, &viewport);
ID3D11ShaderResourceView *pixelViews[] = {
depthStencil->getShaderResourceView(), mStencilSRV.Get(),
depthStencil->getShaderResourceView().get(), mStencilSRV.get(),
};
context->PSSetShaderResources(0, 2, pixelViews);
......@@ -2222,7 +2217,7 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(RenderTarget11 *depthS
void Blit11::releaseResolveDepthStencilResources()
{
mStencilSRV.Reset();
mStencilSRV.reset();
mResolvedDepthStencilRTView.reset();
}
......
......@@ -27,12 +27,12 @@ class Blit11 : angle::NonCopyable
explicit Blit11(Renderer11 *renderer);
~Blit11();
gl::Error swizzleTexture(ID3D11ShaderResourceView *source,
gl::Error swizzleTexture(const d3d11::SharedSRV &source,
const d3d11::RenderTargetView &dest,
const gl::Extents &size,
const gl::SwizzleState &swizzleTarget);
gl::Error copyTexture(ID3D11ShaderResourceView *source,
gl::Error copyTexture(const d3d11::SharedSRV &source,
const gl::Box &sourceArea,
const gl::Extents &sourceSize,
const d3d11::RenderTargetView &dest,
......@@ -55,7 +55,7 @@ class Blit11 : angle::NonCopyable
const gl::Extents &destSize,
const gl::Rectangle *scissor);
gl::Error copyDepth(ID3D11ShaderResourceView *source,
gl::Error copyDepth(const d3d11::SharedSRV &source,
const gl::Box &sourceArea,
const gl::Extents &sourceSize,
const d3d11::DepthStencilView &dest,
......@@ -286,7 +286,7 @@ class Blit11 : angle::NonCopyable
d3d11::LazyShader<ID3D11PixelShader> mResolveDepthPS;
d3d11::LazyShader<ID3D11PixelShader> mResolveDepthStencilPS;
d3d11::LazyShader<ID3D11PixelShader> mResolveStencilPS;
angle::ComPtr<ID3D11ShaderResourceView> mStencilSRV;
d3d11::ShaderResourceView mStencilSRV;
TextureHelper11 mResolvedDepthStencil;
d3d11::RenderTargetView mResolvedDepthStencilRTView;
TextureHelper11 mResolvedDepth;
......
......@@ -172,7 +172,7 @@ class Buffer11::NativeStorage : public Buffer11::BufferStorage
ID3D11Buffer *mNativeStorage;
const OnBufferDataDirtyChannel *mOnStorageChanged;
std::map<DXGI_FORMAT, ID3D11ShaderResourceView *> mBufferResourceViews;
std::map<DXGI_FORMAT, d3d11::ShaderResourceView> mBufferResourceViews;
};
// A emulated indexed buffer storage represents an underlying D3D11 buffer for data
......@@ -1181,12 +1181,9 @@ gl::ErrorOrResult<ID3D11ShaderResourceView *> Buffer11::NativeStorage::getSRVFor
if (bufferSRVIt != mBufferResourceViews.end())
{
return bufferSRVIt->second;
return bufferSRVIt->second.get();
}
ID3D11Device *device = mRenderer->getDevice();
ID3D11ShaderResourceView *bufferSRV = nullptr;
const d3d11::DXGIFormatSize &dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(srvFormat);
D3D11_SHADER_RESOURCE_VIEW_DESC bufferSRVDesc;
......@@ -1195,25 +1192,14 @@ gl::ErrorOrResult<ID3D11ShaderResourceView *> Buffer11::NativeStorage::getSRVFor
bufferSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
bufferSRVDesc.Format = srvFormat;
HRESULT result = device->CreateShaderResourceView(mNativeStorage, &bufferSRVDesc, &bufferSRV);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY,
"Error creating buffer SRV in Buffer11::NativeStorage::getSRVForFormat");
}
mBufferResourceViews[srvFormat] = bufferSRV;
ANGLE_TRY(mRenderer->allocateResource(bufferSRVDesc, mNativeStorage,
&mBufferResourceViews[srvFormat]));
return bufferSRV;
return mBufferResourceViews[srvFormat].get();
}
void Buffer11::NativeStorage::clearSRVs()
{
for (auto &srv : mBufferResourceViews)
{
SafeRelease(srv.second);
}
mBufferResourceViews.clear();
}
......
......@@ -213,8 +213,8 @@ void RenderTarget11::signalDirty()
TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
ID3D11Resource *resource,
ID3D11ShaderResourceView *srv,
ID3D11ShaderResourceView *blitSRV,
const d3d11::SharedSRV &srv,
const d3d11::SharedSRV &blitSRV,
GLenum internalFormat,
const d3d11::Format &formatSet,
GLsizei width,
......@@ -239,16 +239,6 @@ TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
mTexture->AddRef();
}
if (mShaderResource)
{
mShaderResource->AddRef();
}
if (mBlitShaderResource)
{
mBlitShaderResource->AddRef();
}
if (mRenderTarget.valid() && mTexture)
{
mSubresourceIndex = GetRTVSubresourceIndex(mTexture, mRenderTarget.get());
......@@ -258,7 +248,7 @@ TextureRenderTarget11::TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
TextureRenderTarget11::TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
ID3D11Resource *resource,
ID3D11ShaderResourceView *srv,
const d3d11::SharedSRV &srv,
GLenum internalFormat,
const d3d11::Format &formatSet,
GLsizei width,
......@@ -276,18 +266,13 @@ TextureRenderTarget11::TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
mRenderTarget(),
mDepthStencil(std::move(dsv)),
mShaderResource(srv),
mBlitShaderResource(nullptr)
mBlitShaderResource()
{
if (mTexture)
{
mTexture->AddRef();
}
if (mShaderResource)
{
mShaderResource->AddRef();
}
if (mDepthStencil.valid() && mTexture)
{
mSubresourceIndex = GetDSVSubresourceIndex(mTexture, mDepthStencil.get());
......@@ -298,8 +283,6 @@ TextureRenderTarget11::TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
TextureRenderTarget11::~TextureRenderTarget11()
{
SafeRelease(mTexture);
SafeRelease(mShaderResource);
SafeRelease(mBlitShaderResource);
}
ID3D11Resource *TextureRenderTarget11::getTexture() const
......@@ -317,12 +300,12 @@ const d3d11::DepthStencilView &TextureRenderTarget11::getDepthStencilView() cons
return mDepthStencil;
}
ID3D11ShaderResourceView *TextureRenderTarget11::getShaderResourceView() const
const d3d11::SharedSRV &TextureRenderTarget11::getShaderResourceView() const
{
return mShaderResource;
}
ID3D11ShaderResourceView *TextureRenderTarget11::getBlitShaderResourceView() const
const d3d11::SharedSRV &TextureRenderTarget11::getBlitShaderResourceView() const
{
return mBlitShaderResource;
}
......@@ -413,13 +396,13 @@ const d3d11::DepthStencilView &SurfaceRenderTarget11::getDepthStencilView() cons
return mSwapChain->getDepthStencil();
}
ID3D11ShaderResourceView *SurfaceRenderTarget11::getShaderResourceView() const
const d3d11::SharedSRV &SurfaceRenderTarget11::getShaderResourceView() const
{
return (mDepth ? mSwapChain->getDepthStencilShaderResource()
: mSwapChain->getRenderTargetShaderResource());
}
ID3D11ShaderResourceView *SurfaceRenderTarget11::getBlitShaderResourceView() const
const d3d11::SharedSRV &SurfaceRenderTarget11::getBlitShaderResourceView() const
{
// The SurfaceRenderTargetView format should always be such that the normal SRV works for blits.
return getShaderResourceView();
......
......@@ -27,10 +27,10 @@ class RenderTarget11 : public RenderTargetD3D
virtual ~RenderTarget11();
virtual ID3D11Resource *getTexture() const = 0;
virtual const d3d11::RenderTargetView &getRenderTargetView() const = 0;
virtual const d3d11::DepthStencilView &getDepthStencilView() const = 0;
virtual ID3D11ShaderResourceView *getShaderResourceView() const = 0;
virtual ID3D11ShaderResourceView *getBlitShaderResourceView() const = 0;
virtual const d3d11::RenderTargetView &getRenderTargetView() const = 0;
virtual const d3d11::DepthStencilView &getDepthStencilView() const = 0;
virtual const d3d11::SharedSRV &getShaderResourceView() const = 0;
virtual const d3d11::SharedSRV &getBlitShaderResourceView() const = 0;
virtual unsigned int getSubresourceIndex() const = 0;
......@@ -50,8 +50,8 @@ class TextureRenderTarget11 : public RenderTarget11
// TextureRenderTarget11 takes ownership of any D3D11 resources it is given and will AddRef them
TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
ID3D11Resource *resource,
ID3D11ShaderResourceView *srv,
ID3D11ShaderResourceView *blitSRV,
const d3d11::SharedSRV &srv,
const d3d11::SharedSRV &blitSRV,
GLenum internalFormat,
const d3d11::Format &formatSet,
GLsizei width,
......@@ -60,7 +60,7 @@ class TextureRenderTarget11 : public RenderTarget11
GLsizei samples);
TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
ID3D11Resource *resource,
ID3D11ShaderResourceView *srv,
const d3d11::SharedSRV &srv,
GLenum internalFormat,
const d3d11::Format &formatSet,
GLsizei width,
......@@ -78,8 +78,8 @@ class TextureRenderTarget11 : public RenderTarget11
ID3D11Resource *getTexture() const override;
const d3d11::RenderTargetView &getRenderTargetView() const override;
const d3d11::DepthStencilView &getDepthStencilView() const override;
ID3D11ShaderResourceView *getShaderResourceView() const override;
ID3D11ShaderResourceView *getBlitShaderResourceView() const override;
const d3d11::SharedSRV &getShaderResourceView() const override;
const d3d11::SharedSRV &getBlitShaderResourceView() const override;
unsigned int getSubresourceIndex() const override;
......@@ -94,11 +94,11 @@ class TextureRenderTarget11 : public RenderTarget11
ID3D11Resource *mTexture;
d3d11::RenderTargetView mRenderTarget;
d3d11::DepthStencilView mDepthStencil;
ID3D11ShaderResourceView *mShaderResource;
d3d11::SharedSRV mShaderResource;
// Shader resource view to use with internal blit shaders. Not set for depth/stencil render
// targets.
ID3D11ShaderResourceView *mBlitShaderResource;
d3d11::SharedSRV mBlitShaderResource;
};
class SurfaceRenderTarget11 : public RenderTarget11
......@@ -116,8 +116,8 @@ class SurfaceRenderTarget11 : public RenderTarget11
ID3D11Resource *getTexture() const override;
const d3d11::RenderTargetView &getRenderTargetView() const override;
const d3d11::DepthStencilView &getDepthStencilView() const override;
ID3D11ShaderResourceView *getShaderResourceView() const override;
ID3D11ShaderResourceView *getBlitShaderResourceView() const override;
const d3d11::SharedSRV &getShaderResourceView() const override;
const d3d11::SharedSRV &getBlitShaderResourceView() const override;
unsigned int getSubresourceIndex() const override;
......
......@@ -1512,7 +1512,7 @@ gl::Error Renderer11::setSamplerState(gl::SamplerType type,
gl::Error Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *texture)
{
ID3D11ShaderResourceView *textureSRV = nullptr;
d3d11::SharedSRV textureSRV;
if (texture)
{
......@@ -1530,7 +1530,7 @@ gl::Error Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *t
// If we get NULL back from getSRV here, something went wrong in the texture class and we're
// unexpectedly missing the shader resource view
ASSERT(textureSRV != nullptr);
ASSERT(textureSRV.valid());
textureImpl->resetDirty();
}
......@@ -1540,7 +1540,7 @@ gl::Error Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *t
(type == gl::SAMPLER_VERTEX &&
static_cast<unsigned int>(index) < getNativeCaps().maxVertexTextureImageUnits));
mStateManager.setShaderResource(type, index, textureSRV);
mStateManager.setShaderResource(type, index, textureSRV.get());
return gl::NoError();
}
......@@ -3257,8 +3257,8 @@ gl::Error Renderer11::copyImageInternal(const gl::Framebuffer *framebuffer,
ANGLE_TRY(colorAttachment->getRenderTarget(&sourceRenderTarget));
ASSERT(sourceRenderTarget);
ID3D11ShaderResourceView *source = sourceRenderTarget->getBlitShaderResourceView();
ASSERT(source);
const d3d11::SharedSRV &source = sourceRenderTarget->getBlitShaderResourceView();
ASSERT(source.valid());
const d3d11::RenderTargetView &dest =
GetAs<RenderTarget11>(destRenderTarget)->getRenderTargetView();
......@@ -3429,7 +3429,7 @@ gl::Error Renderer11::copyTexture(const gl::Texture *source,
}
else
{
ID3D11ShaderResourceView *sourceSRV = nullptr;
d3d11::SharedSRV sourceSRV;
ANGLE_TRY(sourceStorage11->getSRVLevels(sourceLevel, sourceLevel, &sourceSRV));
gl::ImageIndex destIndex = gl::ImageIndex::Make2D(destLevel);
......@@ -3561,8 +3561,8 @@ gl::Error Renderer11::createRenderTarget(int width,
"Failed to create render target texture, result: 0x%X.", result);
}
ID3D11ShaderResourceView *srv = nullptr;
ID3D11ShaderResourceView *blitSRV = nullptr;
d3d11::SharedSRV srv;
d3d11::SharedSRV blitSRV;
if (bindSRV)
{
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
......@@ -3572,14 +3572,11 @@ gl::Error Renderer11::createRenderTarget(int width,
srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = 1;
result = mDevice->CreateShaderResourceView(texture, &srvDesc, &srv);
if (FAILED(result))
gl::Error err = allocateResource(srvDesc, texture, &srv);
if (err.isError())
{
ASSERT(result == E_OUTOFMEMORY);
SafeRelease(texture);
return gl::Error(
GL_OUT_OF_MEMORY,
"Failed to create render target shader resource view, result: 0x%X.", result);
return err;
}
if (formatInfo.blitSRVFormat != formatInfo.srvFormat)
......@@ -3592,22 +3589,16 @@ gl::Error Renderer11::createRenderTarget(int width,
blitSRVDesc.Texture2D.MostDetailedMip = 0;
blitSRVDesc.Texture2D.MipLevels = 1;
result = mDevice->CreateShaderResourceView(texture, &blitSRVDesc, &blitSRV);
if (FAILED(result))
err = allocateResource(blitSRVDesc, texture, &blitSRV);
if (err.isError())
{
ASSERT(result == E_OUTOFMEMORY);
SafeRelease(texture);
SafeRelease(srv);
return gl::Error(GL_OUT_OF_MEMORY,
"Failed to create render target shader resource view for "
"blits, result: 0x%X.",
result);
return err;
}
}
else
{
blitSRV = srv;
srv->AddRef();
}
}
......@@ -3625,8 +3616,6 @@ gl::Error Renderer11::createRenderTarget(int width,
if (err.isError())
{
SafeRelease(texture);
SafeRelease(srv);
SafeRelease(blitSRV);
return err;
}
......@@ -3646,8 +3635,6 @@ gl::Error Renderer11::createRenderTarget(int width,
if (err.isError())
{
SafeRelease(texture);
SafeRelease(srv);
SafeRelease(blitSRV);
return err;
}
......@@ -3666,13 +3653,11 @@ gl::Error Renderer11::createRenderTarget(int width,
}
SafeRelease(texture);
SafeRelease(srv);
SafeRelease(blitSRV);
}
else
{
*outRT = new TextureRenderTarget11(
d3d11::RenderTargetView(), nullptr, nullptr, nullptr, format,
d3d11::RenderTargetView(), nullptr, d3d11::SharedSRV(), d3d11::SharedSRV(), format,
d3d11::Format::Get(GL_NONE, mRenderer11DeviceCaps), width, height, 1, supportedSamples);
}
......@@ -4006,11 +3991,11 @@ gl::Error Renderer11::generateMipmapUsingD3D(TextureStorage *storage,
ASSERT(storage11->isRenderTarget());
ASSERT(storage11->supportsNativeMipmapFunction());
ID3D11ShaderResourceView *srv;
d3d11::SharedSRV srv;
ANGLE_TRY(storage11->getSRVLevels(textureState.getEffectiveBaseLevel(),
textureState.getEffectiveMaxLevel(), &srv));
mDeviceContext->GenerateMips(srv);
mDeviceContext->GenerateMips(srv.get());
return gl::NoError();
}
......@@ -4278,7 +4263,7 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
TextureHelper11 readTexture;
unsigned int readSubresource = 0;
ID3D11ShaderResourceView *readSRV = nullptr;
d3d11::SharedSRV readSRV;
if (readRenderTarget->getSamples() > 1)
{
......@@ -4295,14 +4280,7 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
viewDesc.Texture2D.MipLevels = 1;
viewDesc.Texture2D.MostDetailedMip = 0;
HRESULT hresult =
mDevice->CreateShaderResourceView(readTexture.getResource(), &viewDesc, &readSRV);
if (FAILED(hresult))
{
return gl::OutOfMemory()
<< "Renderer11::blitRenderbufferRect: Failed to create temporary SRV, "
<< hresult;
}
ANGLE_TRY(allocateResource(viewDesc, readTexture.getResource(), &readSRV));
}
}
else
......@@ -4312,17 +4290,16 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
readRenderTarget11->getFormatSet());
readSubresource = readRenderTarget11->getSubresourceIndex();
readSRV = readRenderTarget11->getBlitShaderResourceView();
if (readSRV == nullptr)
if (!readSRV.valid())
{
ASSERT(depthBlit || stencilBlit);
readSRV = readRenderTarget11->getShaderResourceView();
}
ASSERT(readSRV);
readSRV->AddRef();
ASSERT(readSRV.valid());
}
// Stencil blits don't use shaders.
ASSERT(readSRV || stencilBlit);
ASSERT(readSRV.valid() || stencilBlit);
const gl::Extents readSize(readRenderTarget->getWidth(), readRenderTarget->getHeight(), 1);
const gl::Extents drawSize(drawRenderTarget->getWidth(), drawRenderTarget->getHeight(), 1);
......@@ -4494,8 +4471,7 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
else if (depthBlit)
{
const d3d11::DepthStencilView &drawDSV = drawRenderTarget11->getDepthStencilView();
ASSERT(readSRV);
ASSERT(readSRV.valid());
ANGLE_TRY(mBlit->copyDepth(readSRV, readArea, readSize, drawDSV, drawArea, drawSize,
scissor));
}
......@@ -4511,15 +4487,13 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRectIn,
// We don't currently support masking off any other channel than alpha
bool maskOffAlpha = colorMaskingNeeded && colorMask.alpha;
ASSERT(readSRV);
ASSERT(readSRV.valid());
ANGLE_TRY(mBlit->copyTexture(readSRV, readArea, readSize, drawRTV, drawArea, drawSize,
scissor, destFormatInfo.format, filter, maskOffAlpha,
false, false));
}
}
SafeRelease(readSRV);
return gl::NoError();
}
......
......@@ -26,9 +26,9 @@ size_t ComputeMemoryUsage(const T *desc)
HRESULT CreateResource(ID3D11Device *device,
const D3D11_DEPTH_STENCIL_VIEW_DESC *desc,
ID3D11Resource *resource,
ID3D11DepthStencilView **depthStencilView)
ID3D11DepthStencilView **resourceOut)
{
return device->CreateDepthStencilView(resource, desc, depthStencilView);
return device->CreateDepthStencilView(resource, desc, resourceOut);
}
HRESULT CreateResource(ID3D11Device *device,
......@@ -39,6 +39,14 @@ HRESULT CreateResource(ID3D11Device *device,
return device->CreateRenderTargetView(resource, desc, renderTargetView);
}
HRESULT CreateResource(ID3D11Device *device,
const D3D11_SHADER_RESOURCE_VIEW_DESC *desc,
ID3D11Resource *resource,
ID3D11ShaderResourceView **resourceOut)
{
return device->CreateShaderResourceView(resource, desc, resourceOut);
}
#define ANGLE_RESOURCE_STRINGIFY_OP(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) #RESTYPE
constexpr std::array<const char *, NumResourceTypes> kResourceTypeNames = {
......
......@@ -20,12 +20,16 @@ namespace rx
{
class Renderer11;
class ResourceManager11;
template <typename T>
class SharedResource11;
// 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, \
#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) \
OP(NAME, ShaderResourceView, ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC, \
ID3D11Resource)
#define ANGLE_RESOURCE_TYPE_LIST(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) RESTYPE,
......@@ -153,8 +157,6 @@ class Resource11Base : angle::NonCopyable
void reset() { mData.reset(new DataT()); }
protected:
friend class TextureHelper11;
Resource11Base() : mData(new DataT()) {}
Resource11Base(Resource11Base &&movedObj) : mData(new DataT())
......@@ -192,6 +194,8 @@ class Resource11 : public Resource11Base<ResourceT, UniquePtr, TypedData<Resourc
}
private:
template <typename T>
friend class SharedResource11;
friend class ResourceManager11;
Resource11(ResourceT *object, ResourceManager11 *manager)
......@@ -201,6 +205,43 @@ class Resource11 : public Resource11Base<ResourceT, UniquePtr, TypedData<Resourc
}
};
template <typename T>
class SharedResource11 : public Resource11Base<T, std::shared_ptr, TypedData<T>>
{
public:
SharedResource11() {}
SharedResource11(SharedResource11 &&movedObj)
: Resource11Base<T, std::shared_ptr, TypedData<T>>(std::move(movedObj))
{
}
SharedResource11 &operator=(SharedResource11 &&other)
{
std::swap(this->mData, other.mData);
return *this;
}
SharedResource11(const SharedResource11 &sharedObj) { this->mData = sharedObj.mData; }
SharedResource11 &operator=(const SharedResource11 &sharedObj)
{
this->mData = sharedObj.mData;
return *this;
}
private:
friend class ResourceManager11;
SharedResource11(Resource11<T> &&obj) : Resource11Base<T, std::shared_ptr, TypedData<T>>()
{
std::swap(this->mData->manager, obj.mData->manager);
// Can't use std::swap because of ID3D11Resource.
auto temp = this->mData->object;
this->mData->object = obj.mData->object;
obj.mData->object = static_cast<T *>(temp);
}
};
class ResourceManager11 final : angle::NonCopyable
{
public:
......@@ -214,6 +255,18 @@ class ResourceManager11 final : angle::NonCopyable
Resource11<T> *resourceOut);
template <typename T>
gl::Error allocate(Renderer11 *renderer,
const GetDescFromD3D11<T> *desc,
GetInitDataFromD3D11<T> *initData,
SharedResource11<T> *sharedRes)
{
Resource11<T> res;
ANGLE_TRY(allocate(renderer, desc, initData, &res));
*sharedRes = std::move(res);
return gl::NoError();
}
template <typename T>
void onRelease(T *resource);
private:
......@@ -244,6 +297,8 @@ TypedData<ResourceT>::~TypedData()
namespace d3d11
{
ANGLE_RESOURCE_TYPE_OP(ClassList, ANGLE_RESOURCE_TYPE_CLASS)
using SharedSRV = SharedResource11<ID3D11ShaderResourceView>;
} // namespace d3d11
#undef ANGLE_RESOURCE_TYPE_CLASS
......
......@@ -72,14 +72,14 @@ SwapChain11::SwapChain11(Renderer11 *renderer,
mKeyedMutex(nullptr),
mBackBufferTexture(nullptr),
mBackBufferRTView(),
mBackBufferSRView(nullptr),
mBackBufferSRView(),
mNeedsOffscreenTexture(NeedsOffscreenTexture(renderer, nativeWindow, orientation)),
mOffscreenTexture(nullptr),
mOffscreenRTView(),
mOffscreenSRView(nullptr),
mOffscreenSRView(),
mDepthStencilTexture(nullptr),
mDepthStencilDSView(),
mDepthStencilSRView(nullptr),
mDepthStencilSRView(),
mQuadVB(nullptr),
mPassThroughSampler(nullptr),
mPassThroughIL(nullptr),
......@@ -113,13 +113,13 @@ void SwapChain11::release()
SafeRelease(mKeyedMutex);
SafeRelease(mBackBufferTexture);
mBackBufferRTView.reset();
SafeRelease(mBackBufferSRView);
mBackBufferSRView.reset();
SafeRelease(mOffscreenTexture);
mOffscreenRTView.reset();
SafeRelease(mOffscreenSRView);
mOffscreenSRView.reset();
SafeRelease(mDepthStencilTexture);
mDepthStencilDSView.reset();
SafeRelease(mDepthStencilSRView);
mDepthStencilSRView.reset();
SafeRelease(mQuadVB);
SafeRelease(mPassThroughSampler);
SafeRelease(mPassThroughIL);
......@@ -137,14 +137,14 @@ void SwapChain11::releaseOffscreenColorBuffer()
{
SafeRelease(mOffscreenTexture);
mOffscreenRTView.reset();
SafeRelease(mOffscreenSRView);
mOffscreenSRView.reset();
}
void SwapChain11::releaseOffscreenDepthBuffer()
{
SafeRelease(mDepthStencilTexture);
mDepthStencilDSView.reset();
SafeRelease(mDepthStencilSRView);
mDepthStencilSRView.reset();
}
EGLint SwapChain11::resetOffscreenBuffers(int backbufferWidth, int backbufferHeight)
......@@ -308,10 +308,9 @@ EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbuffe
if (offscreenTextureDesc.BindFlags & D3D11_BIND_SHADER_RESOURCE)
{
HRESULT result = device->CreateShaderResourceView(mOffscreenTexture, &offscreenSRVDesc,
&mOffscreenSRView);
ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mOffscreenSRView, "Offscreen back buffer shader resource");
err = mRenderer->allocateResource(offscreenSRVDesc, mOffscreenTexture, &mOffscreenSRView);
ASSERT(!err.isError());
mOffscreenSRView.setDebugName("Offscreen back buffer shader resource");
}
if (previousOffscreenTexture != nullptr)
......@@ -410,9 +409,10 @@ EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbuffe
depthStencilSRVDesc.Texture2D.MostDetailedMip = 0;
depthStencilSRVDesc.Texture2D.MipLevels = static_cast<UINT>(-1);
result = device->CreateShaderResourceView(mDepthStencilTexture, &depthStencilSRVDesc, &mDepthStencilSRView);
ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mDepthStencilSRView, "Offscreen depth stencil shader resource");
err = mRenderer->allocateResource(depthStencilSRVDesc, mDepthStencilTexture,
&mDepthStencilSRView);
ASSERT(!err.isError());
mDepthStencilSRView.setDebugName("Offscreen depth stencil shader resource");
}
}
......@@ -442,11 +442,12 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight)
}
// Can only call resize if we have already created our swap buffer and resources
ASSERT(mSwapChain && mBackBufferTexture && mBackBufferRTView.valid() && mBackBufferSRView);
ASSERT(mSwapChain && mBackBufferTexture && mBackBufferRTView.valid() &&
mBackBufferSRView.valid());
SafeRelease(mBackBufferTexture);
mBackBufferRTView.reset();
SafeRelease(mBackBufferSRView);
mBackBufferSRView.reset();
// Resize swap chain
DXGI_SWAP_CHAIN_DESC desc;
......@@ -485,12 +486,9 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight)
ASSERT(!err.isError());
mBackBufferRTView.setDebugName("Back buffer render target");
result = device->CreateShaderResourceView(mBackBufferTexture, nullptr, &mBackBufferSRView);
ASSERT(SUCCEEDED(result));
if (SUCCEEDED(result))
{
d3d11::SetDebugName(mBackBufferSRView, "Back buffer shader resource");
}
err = mRenderer->allocateResourceNoDesc(mBackBufferTexture, &mBackBufferSRView);
ASSERT(!err.isError());
mBackBufferSRView.setDebugName("Back buffer shader resource");
}
mFirstSwap = true;
......@@ -599,9 +597,9 @@ EGLint SwapChain11::reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLin
ASSERT(!err.isError());
mBackBufferRTView.setDebugName("Back buffer render target");
result = device->CreateShaderResourceView(mBackBufferTexture, nullptr, &mBackBufferSRView);
ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mBackBufferSRView, "Back buffer shader resource view");
err = mRenderer->allocateResourceNoDesc(mBackBufferTexture, &mBackBufferSRView);
ASSERT(!err.isError());
mBackBufferSRView.setDebugName("Back buffer shader resource view");
}
mFirstSwap = true;
......@@ -811,7 +809,7 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
deviceContext->RSSetViewports(1, &viewport);
// Apply textures
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, mOffscreenSRView);
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, mOffscreenSRView.get());
deviceContext->PSSetSamplers(0, 1, &mPassThroughSampler);
// Draw
......@@ -901,7 +899,7 @@ const d3d11::RenderTargetView &SwapChain11::getRenderTarget()
return mNeedsOffscreenTexture ? mOffscreenRTView : mBackBufferRTView;
}
ID3D11ShaderResourceView *SwapChain11::getRenderTargetShaderResource()
const d3d11::SharedSRV &SwapChain11::getRenderTargetShaderResource()
{
return mNeedsOffscreenTexture ? mOffscreenSRView : mBackBufferSRView;
}
......@@ -911,7 +909,7 @@ const d3d11::DepthStencilView &SwapChain11::getDepthStencil()
return mDepthStencilDSView;
}
ID3D11ShaderResourceView * SwapChain11::getDepthStencilShaderResource()
const d3d11::SharedSRV &SwapChain11::getDepthStencilShaderResource()
{
return mDepthStencilSRView;
}
......
......@@ -41,11 +41,11 @@ class SwapChain11 final : public SwapChainD3D
ID3D11Texture2D *getOffscreenTexture();
const d3d11::RenderTargetView &getRenderTarget();
ID3D11ShaderResourceView *getRenderTargetShaderResource();
const d3d11::SharedSRV &getRenderTargetShaderResource();
ID3D11Texture2D *getDepthStencilTexture();
const d3d11::DepthStencilView &getDepthStencil();
ID3D11ShaderResourceView *getDepthStencilShaderResource();
const d3d11::SharedSRV &getDepthStencilShaderResource();
EGLint getWidth() const { return mWidth; }
EGLint getHeight() const { return mHeight; }
......@@ -87,16 +87,16 @@ class SwapChain11 final : public SwapChainD3D
ID3D11Texture2D *mBackBufferTexture;
d3d11::RenderTargetView mBackBufferRTView;
ID3D11ShaderResourceView *mBackBufferSRView;
d3d11::SharedSRV mBackBufferSRView;
const bool mNeedsOffscreenTexture;
ID3D11Texture2D *mOffscreenTexture;
d3d11::RenderTargetView mOffscreenRTView;
ID3D11ShaderResourceView *mOffscreenSRView;
d3d11::SharedSRV mOffscreenSRView;
ID3D11Texture2D *mDepthStencilTexture;
d3d11::DepthStencilView mDepthStencilDSView;
ID3D11ShaderResourceView *mDepthStencilSRView;
d3d11::SharedSRV mDepthStencilSRView;
ID3D11Buffer *mQuadVB;
ID3D11SamplerState *mPassThroughSampler;
......
......@@ -45,7 +45,7 @@ class TextureStorage11 : public TextureStorage
UINT getBindFlags() const;
UINT getMiscFlags() const;
const d3d11::Format &getFormatSet() const;
gl::Error getSRVLevels(GLint baseLevel, GLint maxLevel, ID3D11ShaderResourceView **outSRV);
gl::Error getSRVLevels(GLint baseLevel, GLint maxLevel, d3d11::SharedSRV *outSRV);
gl::Error generateSwizzles(const gl::SwizzleState &swizzleTarget);
void markLevelDirty(int mipLevel);
void markDirty();
......@@ -72,8 +72,7 @@ class TextureStorage11 : public TextureStorage
const gl::PixelUnpackState &unpack,
const uint8_t *pixelData) override;
virtual gl::Error getSRV(const gl::TextureState &textureState,
ID3D11ShaderResourceView **outSRV);
virtual gl::Error getSRV(const gl::TextureState &textureState, d3d11::SharedSRV *outSRV);
virtual UINT getSubresourceIndex(const gl::ImageIndex &index) const;
virtual gl::Error getResource(ID3D11Resource **outResource) = 0;
virtual void associateImage(Image11* image, const gl::ImageIndex &index) = 0;
......@@ -94,7 +93,7 @@ class TextureStorage11 : public TextureStorage
virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture) = 0;
virtual gl::Error getSwizzleRenderTarget(int mipLevel,
const d3d11::RenderTargetView **outRTV) = 0;
gl::Error getSRVLevel(int mipLevel, bool blitSRV, ID3D11ShaderResourceView **outSRV);
gl::Error getSRVLevel(int mipLevel, bool blitSRV, const d3d11::SharedSRV **outSRV);
// Get a version of a depth texture with only depth information, not stencil.
enum DropStencil
......@@ -106,8 +105,11 @@ class TextureStorage11 : public TextureStorage
gl::Error initDropStencilTexture(const gl::ImageIndexIterator &it);
// The baseLevel parameter should *not* have mTopLevel applied.
virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const = 0;
virtual gl::Error createSRV(int baseLevel,
int mipLevels,
DXGI_FORMAT format,
ID3D11Resource *texture,
d3d11::SharedSRV *outSRV) const = 0;
void verifySwizzleExists(const gl::SwizzleState &swizzleState);
......@@ -141,13 +143,13 @@ class TextureStorage11 : public TextureStorage
bool swizzle = false;
bool dropStencil = false;
};
typedef std::map<SRVKey, ID3D11ShaderResourceView *> SRVCache;
typedef std::map<SRVKey, d3d11::SharedSRV> SRVCache;
gl::Error getCachedOrCreateSRV(const SRVKey &key, ID3D11ShaderResourceView **outSRV);
gl::Error getCachedOrCreateSRV(const SRVKey &key, d3d11::SharedSRV *outSRV);
SRVCache mSrvCache;
std::array<ID3D11ShaderResourceView *, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS> mLevelSRVs;
std::array<ID3D11ShaderResourceView *, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS> mLevelBlitSRVs;
std::array<d3d11::SharedSRV, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS> mLevelSRVs;
std::array<d3d11::SharedSRV, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS> mLevelBlitSRVs;
};
class TextureStorage11_2D : public TextureStorage11
......@@ -183,7 +185,7 @@ class TextureStorage11_2D : public TextureStorage11
int mipLevels,
DXGI_FORMAT format,
ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const override;
d3d11::SharedSRV *outSRV) const override;
ID3D11Texture2D *mTexture;
RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
......@@ -237,7 +239,7 @@ class TextureStorage11_External : public TextureStorage11
int mipLevels,
DXGI_FORMAT format,
ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const override;
d3d11::SharedSRV *outSRV) const override;
ID3D11Texture2D *mTexture;
int mSubresourceIndex;
......@@ -255,8 +257,7 @@ class TextureStorage11_EGLImage final : public TextureStorage11
~TextureStorage11_EGLImage() override;
gl::Error getResource(ID3D11Resource **outResource) override;
gl::Error getSRV(const gl::TextureState &textureState,
ID3D11ShaderResourceView **outSRV) override;
gl::Error getSRV(const gl::TextureState &textureState, d3d11::SharedSRV *outSRV) override;
gl::Error getMippedResource(ID3D11Resource **outResource) override;
gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTargetD3D **outRT) override;
......@@ -282,7 +283,7 @@ class TextureStorage11_EGLImage final : public TextureStorage11
int mipLevels,
DXGI_FORMAT format,
ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const override;
d3d11::SharedSRV *outSRV) const override;
gl::Error getImageRenderTarget(RenderTarget11 **outRT) const;
......@@ -328,11 +329,11 @@ class TextureStorage11_Cube : public TextureStorage11
int mipLevels,
DXGI_FORMAT format,
ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const override;
d3d11::SharedSRV *outSRV) const override;
gl::Error createRenderTargetSRV(ID3D11Resource *texture,
const gl::ImageIndex &index,
DXGI_FORMAT resourceFormat,
ID3D11ShaderResourceView **srv) const;
d3d11::SharedSRV *srv) const;
static const size_t CUBE_FACE_COUNT = 6;
......@@ -376,7 +377,7 @@ class TextureStorage11_3D : public TextureStorage11
int mipLevels,
DXGI_FORMAT format,
ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const override;
d3d11::SharedSRV *outSRV) const override;
typedef std::pair<int, int> LevelLayerKey;
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
......@@ -417,11 +418,11 @@ class TextureStorage11_2DArray : public TextureStorage11
int mipLevels,
DXGI_FORMAT format,
ID3D11Resource *texture,
ID3D11ShaderResourceView **outSRV) const override;
d3d11::SharedSRV *outSRV) const override;
gl::Error createRenderTargetSRV(ID3D11Resource *texture,
const gl::ImageIndex &index,
DXGI_FORMAT resourceFormat,
ID3D11ShaderResourceView **srv) const;
d3d11::SharedSRV *srv) const;
typedef std::pair<int, int> LevelLayerKey;
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
......
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