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