Commit 5978e28d by Jamie Madill Committed by Commit Bot

D3D11: Consolidate InputLayout allocation.

This introduces a helper type to act as the initialization data type for input element arrays. A WrappedArray class acts as a helper class to wrap a C array and size into a C++ class, similar to std::array but without the data storage. Also move resource deallocation memory counting into a single code path. BUG=angleproject:2034 Change-Id: I5e108254777f0df65f5f60fe26e760c71b95b542 Reviewed-on: https://chromium-review.googlesource.com/506775Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 8d4db1fa
...@@ -47,6 +47,27 @@ constexpr inline size_t ArraySize(T (&)[N]) ...@@ -47,6 +47,27 @@ constexpr inline size_t ArraySize(T (&)[N])
return N; return N;
} }
template <typename T>
class WrappedArray final : angle::NonCopyable
{
public:
template <size_t N>
constexpr WrappedArray(const T (&data)[N]) : mArray(&data[0]), mSize(N)
{
}
constexpr WrappedArray() : mArray(nullptr), mSize(0) {}
constexpr WrappedArray(const T *data, size_t size) : mArray(data), mSize(size) {}
~WrappedArray() {}
constexpr const T *get() const { return mArray; }
constexpr size_t size() const { return mSize; }
private:
const T *mArray;
size_t mSize;
};
template <typename T, unsigned int N> template <typename T, unsigned int N>
void SafeRelease(T (&resourceBlock)[N]) void SafeRelease(T (&resourceBlock)[N])
{ {
......
...@@ -597,11 +597,9 @@ Blit11::Blit11(Renderer11 *renderer) ...@@ -597,11 +597,9 @@ Blit11::Blit11(Renderer11 *renderer)
Blit11::~Blit11() Blit11::~Blit11()
{ {
mQuad2DIL.release();
mQuad2DVS.release(); mQuad2DVS.release();
mDepthPS.release(); mDepthPS.release();
mQuad3DIL.release();
mQuad3DVS.release(); mQuad3DVS.release();
mQuad3DGS.release(); mQuad3DGS.release();
...@@ -955,28 +953,29 @@ Blit11::SwizzleShaderType Blit11::GetSwizzleShaderType(GLenum type, ...@@ -955,28 +953,29 @@ Blit11::SwizzleShaderType Blit11::GetSwizzleShaderType(GLenum type,
} }
} }
Blit11::ShaderSupport Blit11::getShaderSupport(const Shader &shader) gl::Error Blit11::getShaderSupport(const Shader &shader, Blit11::ShaderSupport *supportOut)
{ {
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
ShaderSupport support;
if (shader.dimension == SHADER_2D) if (shader.dimension == SHADER_2D)
{ {
support.inputLayout = mQuad2DIL.resolve(device); ANGLE_TRY(mQuad2DIL.resolve(mRenderer));
support.vertexShader = mQuad2DVS.resolve(device); supportOut->inputLayout = mQuad2DIL.get();
support.geometryShader = nullptr; supportOut->vertexShader = mQuad2DVS.resolve(device);
support.vertexWriteFunction = Write2DVertices; supportOut->geometryShader = nullptr;
supportOut->vertexWriteFunction = Write2DVertices;
} }
else else
{ {
ASSERT(shader.dimension == SHADER_3D); ASSERT(shader.dimension == SHADER_3D);
support.inputLayout = mQuad3DIL.resolve(device); ANGLE_TRY(mQuad3DIL.resolve(mRenderer));
support.vertexShader = mQuad3DVS.resolve(device); supportOut->inputLayout = mQuad2DIL.get();
support.geometryShader = mQuad3DGS.resolve(device); supportOut->vertexShader = mQuad3DVS.resolve(device);
support.vertexWriteFunction = Write3DVertices; supportOut->geometryShader = mQuad3DGS.resolve(device);
supportOut->vertexWriteFunction = Write3DVertices;
} }
return support; return gl::NoError();
} }
gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source, gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source,
...@@ -1041,7 +1040,8 @@ gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source, ...@@ -1041,7 +1040,8 @@ gl::Error Blit11::swizzleTexture(const d3d11::SharedSRV &source,
return gl::OutOfMemory() << "Failed to map internal vertex buffer for swizzle, " << result; return gl::OutOfMemory() << "Failed to map internal vertex buffer for swizzle, " << result;
} }
const ShaderSupport &support = getShaderSupport(*shader); ShaderSupport support;
ANGLE_TRY(getShaderSupport(*shader, &support));
UINT stride = 0; UINT stride = 0;
UINT startIdx = 0; UINT startIdx = 0;
...@@ -1167,7 +1167,8 @@ gl::Error Blit11::copyTexture(const d3d11::SharedSRV &source, ...@@ -1167,7 +1167,8 @@ gl::Error Blit11::copyTexture(const d3d11::SharedSRV &source,
ANGLE_TRY(getBlitShader(destFormat, sourceFormat, isSigned, unpackPremultiplyAlpha, ANGLE_TRY(getBlitShader(destFormat, sourceFormat, isSigned, unpackPremultiplyAlpha,
unpackUnmultiplyAlpha, dimension, &shader)); unpackUnmultiplyAlpha, dimension, &shader));
const ShaderSupport &support = getShaderSupport(*shader); ShaderSupport support;
ANGLE_TRY(getShaderSupport(*shader, &support));
// Set vertices // Set vertices
D3D11_MAPPED_SUBRESOURCE mappedResource; D3D11_MAPPED_SUBRESOURCE mappedResource;
...@@ -1361,7 +1362,8 @@ gl::Error Blit11::copyDepth(const d3d11::SharedSRV &source, ...@@ -1361,7 +1362,8 @@ gl::Error Blit11::copyDepth(const d3d11::SharedSRV &source,
} }
// Apply shaders // Apply shaders
deviceContext->IASetInputLayout(mQuad2DIL.resolve(device)); ANGLE_TRY(mQuad2DIL.resolve(mRenderer));
deviceContext->IASetInputLayout(mQuad2DIL.get());
deviceContext->IASetPrimitiveTopology(topology); deviceContext->IASetPrimitiveTopology(topology);
deviceContext->VSSetShader(quad2DVS, nullptr, 0); deviceContext->VSSetShader(quad2DVS, nullptr, 0);
......
...@@ -195,7 +195,7 @@ class Blit11 : angle::NonCopyable ...@@ -195,7 +195,7 @@ class Blit11 : angle::NonCopyable
gl::Error initResources(); gl::Error initResources();
ShaderSupport getShaderSupport(const Shader &shader); gl::Error getShaderSupport(const Shader &shader, ShaderSupport *supportOut);
static BlitShaderType GetBlitShaderType(GLenum destinationFormat, static BlitShaderType GetBlitShaderType(GLenum destinationFormat,
GLenum sourceFormat, GLenum sourceFormat,
......
...@@ -82,7 +82,7 @@ bool UpdateDataCache(RtvDsvClearInfo<T> *dataCache, ...@@ -82,7 +82,7 @@ bool UpdateDataCache(RtvDsvClearInfo<T> *dataCache,
} // anonymous namespace } // anonymous namespace
Clear11::ShaderManager::ShaderManager() Clear11::ShaderManager::ShaderManager()
: mIl9(nullptr), : mIl9(),
mVs9(g_VS_Clear_FL9, ArraySize(g_VS_Clear_FL9), "Clear11 VS FL9"), mVs9(g_VS_Clear_FL9, ArraySize(g_VS_Clear_FL9), "Clear11 VS FL9"),
mPsFloat9(g_PS_ClearFloat_FL9, ArraySize(g_PS_ClearFloat_FL9), "Clear11 PS FloatFL9"), mPsFloat9(g_PS_ClearFloat_FL9, ArraySize(g_PS_ClearFloat_FL9), "Clear11 PS FloatFL9"),
mVs(g_VS_Clear, ArraySize(g_VS_Clear), "Clear11 VS"), mVs(g_VS_Clear, ArraySize(g_VS_Clear), "Clear11 VS"),
...@@ -102,31 +102,35 @@ Clear11::ShaderManager::~ShaderManager() ...@@ -102,31 +102,35 @@ Clear11::ShaderManager::~ShaderManager()
mPsSInt.release(); mPsSInt.release();
} }
void Clear11::ShaderManager::getShadersAndLayout(ID3D11Device *device, gl::Error Clear11::ShaderManager::getShadersAndLayout(Renderer11 *renderer,
D3D_FEATURE_LEVEL featureLevel, const INT clearType,
const INT clearType, ID3D11InputLayout **il,
ID3D11InputLayout **il, ID3D11VertexShader **vs,
ID3D11VertexShader **vs, ID3D11PixelShader **ps)
ID3D11PixelShader **ps)
{ {
auto featureLevel = renderer->getRenderer11DeviceCaps().featureLevel;
auto device = renderer->getDevice();
if (featureLevel <= D3D_FEATURE_LEVEL_9_3) if (featureLevel <= D3D_FEATURE_LEVEL_9_3)
{ {
ASSERT(clearType == GL_FLOAT); ASSERT(clearType == GL_FLOAT);
*vs = mVs9.resolve(device); *vs = mVs9.resolve(device);
if (mIl9.Get() == nullptr) if (!mIl9.valid())
{ {
const D3D11_INPUT_ELEMENT_DESC ilDesc = { const D3D11_INPUT_ELEMENT_DESC ilDesc[] = {
"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}; {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}};
InputElementArray ilDescArray(ilDesc);
ShaderData vertexShader(g_VS_Clear_FL9);
device->CreateInputLayout(&ilDesc, 1, g_VS_Clear_FL9, ArraySize(g_PS_ClearFloat_FL9), ANGLE_TRY(renderer->allocateResource(ilDescArray, &vertexShader, &mIl9));
mIl9.GetAddressOf());
} }
*il = mIl9.Get(); *il = mIl9.get();
*ps = mPsFloat9.resolve(device); *ps = mPsFloat9.resolve(device);
return; return gl::NoError();
} }
*vs = mVs.resolve(device); *vs = mVs.resolve(device);
...@@ -147,6 +151,8 @@ void Clear11::ShaderManager::getShadersAndLayout(ID3D11Device *device, ...@@ -147,6 +151,8 @@ void Clear11::ShaderManager::getShadersAndLayout(ID3D11Device *device,
UNREACHABLE(); UNREACHABLE();
break; break;
} }
return gl::NoError();
} }
Clear11::Clear11(Renderer11 *renderer) Clear11::Clear11(Renderer11 *renderer)
...@@ -692,13 +698,11 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams, ...@@ -692,13 +698,11 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams,
} }
// Get Shaders // Get Shaders
const D3D_FEATURE_LEVEL fl = mRenderer->getRenderer11DeviceCaps().featureLevel; ID3D11VertexShader *vs = nullptr;
ID3D11Device *device = mRenderer->getDevice(); ID3D11InputLayout *il = nullptr;
ID3D11VertexShader *vs; ID3D11PixelShader *ps = nullptr;
ID3D11InputLayout *il;
ID3D11PixelShader *ps;
mShaderManager.getShadersAndLayout(device, fl, clearParams.colorType, &il, &vs, &ps); ANGLE_TRY(mShaderManager.getShadersAndLayout(mRenderer, clearParams.colorType, &il, &vs, &ps));
// Apply Shaders // Apply Shaders
deviceContext->VSSetShader(vs, nullptr, 0); deviceContext->VSSetShader(vs, nullptr, 0);
......
...@@ -47,15 +47,14 @@ class Clear11 : angle::NonCopyable ...@@ -47,15 +47,14 @@ class Clear11 : angle::NonCopyable
public: public:
ShaderManager(); ShaderManager();
~ShaderManager(); ~ShaderManager();
void getShadersAndLayout(ID3D11Device *device, gl::Error getShadersAndLayout(Renderer11 *renderer,
D3D_FEATURE_LEVEL featureLevel, const INT clearType,
const INT clearType, ID3D11InputLayout **il,
ID3D11InputLayout **il, ID3D11VertexShader **vs,
ID3D11VertexShader **vs, ID3D11PixelShader **ps);
ID3D11PixelShader **ps);
private: private:
angle::ComPtr<ID3D11InputLayout> mIl9; d3d11::InputLayout mIl9;
d3d11::LazyShader<ID3D11VertexShader> mVs9; d3d11::LazyShader<ID3D11VertexShader> mVs9;
d3d11::LazyShader<ID3D11PixelShader> mPsFloat9; d3d11::LazyShader<ID3D11PixelShader> mPsFloat9;
d3d11::LazyShader<ID3D11VertexShader> mVs; d3d11::LazyShader<ID3D11VertexShader> mVs;
......
...@@ -195,10 +195,6 @@ void InputLayoutCache::initialize() ...@@ -195,10 +195,6 @@ void InputLayoutCache::initialize()
void InputLayoutCache::clear() void InputLayoutCache::clear()
{ {
for (auto &layout : mLayoutMap)
{
SafeRelease(layout.second);
}
mLayoutMap.clear(); mLayoutMap.clear();
mPointSpriteVertexBuffer.reset(); mPointSpriteVertexBuffer.reset();
mPointSpriteIndexBuffer.reset(); mPointSpriteIndexBuffer.reset();
...@@ -504,12 +500,13 @@ gl::Error InputLayoutCache::updateInputLayout(Renderer11 *renderer, ...@@ -504,12 +500,13 @@ gl::Error InputLayoutCache::updateInputLayout(Renderer11 *renderer,
auto layoutMapIt = mLayoutMap.find(layout); auto layoutMapIt = mLayoutMap.find(layout);
if (layoutMapIt != mLayoutMap.end()) if (layoutMapIt != mLayoutMap.end())
{ {
inputLayout = layoutMapIt->second; inputLayout = layoutMapIt->second.get();
} }
else else
{ {
d3d11::InputLayout newInputLayout;
ANGLE_TRY(createInputLayout(renderer, sortedSemanticIndices, mode, program, ANGLE_TRY(createInputLayout(renderer, sortedSemanticIndices, mode, program,
numIndicesPerInstance, &inputLayout)); numIndicesPerInstance, &newInputLayout));
if (mLayoutMap.size() >= mCacheSize) if (mLayoutMap.size() >= mCacheSize)
{ {
WARN() << "Overflowed the limit of " << mCacheSize WARN() << "Overflowed the limit of " << mCacheSize
...@@ -523,13 +520,13 @@ gl::Error InputLayoutCache::updateInputLayout(Renderer11 *renderer, ...@@ -523,13 +520,13 @@ gl::Error InputLayoutCache::updateInputLayout(Renderer11 *renderer,
if (it != mLayoutMap.end()) if (it != mLayoutMap.end())
{ {
// c++11 erase allows us to easily delete the current iterator. // c++11 erase allows us to easily delete the current iterator.
SafeRelease(it->second);
it = mLayoutMap.erase(it); it = mLayoutMap.erase(it);
} }
} }
} }
mLayoutMap[layout] = inputLayout; inputLayout = newInputLayout.get();
mLayoutMap[layout] = std::move(newInputLayout);
} }
} }
...@@ -548,7 +545,7 @@ gl::Error InputLayoutCache::createInputLayout(Renderer11 *renderer, ...@@ -548,7 +545,7 @@ gl::Error InputLayoutCache::createInputLayout(Renderer11 *renderer,
GLenum mode, GLenum mode,
gl::Program *program, gl::Program *program,
GLsizei numIndicesPerInstance, GLsizei numIndicesPerInstance,
ID3D11InputLayout **inputLayoutOut) d3d11::InputLayout *inputLayoutOut)
{ {
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program); ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
auto featureLevel = renderer->getRenderer11DeviceCaps().featureLevel; auto featureLevel = renderer->getRenderer11DeviceCaps().featureLevel;
...@@ -638,15 +635,10 @@ gl::Error InputLayoutCache::createInputLayout(Renderer11 *renderer, ...@@ -638,15 +635,10 @@ gl::Error InputLayoutCache::createInputLayout(Renderer11 *renderer,
ShaderExecutableD3D *shader11 = GetAs<ShaderExecutable11>(shader); ShaderExecutableD3D *shader11 = GetAs<ShaderExecutable11>(shader);
ID3D11Device *device = renderer->getDevice(); InputElementArray inputElementArray(inputElements.data(), inputElementCount);
HRESULT result = ShaderData vertexShaderData(shader11->getFunction(), shader11->getLength());
device->CreateInputLayout(inputElements.data(), inputElementCount, shader11->getFunction(),
shader11->getLength(), inputLayoutOut); ANGLE_TRY(renderer->allocateResource(inputElementArray, &vertexShaderData, inputLayoutOut));
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY,
"Failed to create internal input layout, HRESULT: 0x%08x", result);
}
return gl::NoError(); return gl::NoError();
} }
......
...@@ -101,9 +101,9 @@ class InputLayoutCache : angle::NonCopyable ...@@ -101,9 +101,9 @@ class InputLayoutCache : angle::NonCopyable
GLenum mode, GLenum mode,
gl::Program *program, gl::Program *program,
GLsizei numIndicesPerInstance, GLsizei numIndicesPerInstance,
ID3D11InputLayout **inputLayoutOut); d3d11::InputLayout *inputLayoutOut);
std::map<PackedAttributeLayout, ID3D11InputLayout *> mLayoutMap; std::map<PackedAttributeLayout, d3d11::InputLayout> mLayoutMap;
uintptr_t mCurrentIL; uintptr_t mCurrentIL;
std::array<ID3D11Buffer *, gl::MAX_VERTEX_ATTRIBS> mCurrentBuffers; std::array<ID3D11Buffer *, gl::MAX_VERTEX_ATTRIBS> mCurrentBuffers;
......
...@@ -121,6 +121,15 @@ HRESULT CreateResource(ID3D11Device *device, ...@@ -121,6 +121,15 @@ HRESULT CreateResource(ID3D11Device *device,
} }
HRESULT CreateResource(ID3D11Device *device, HRESULT CreateResource(ID3D11Device *device,
const InputElementArray *desc,
const ShaderData *initData,
ID3D11InputLayout **resourceOut)
{
return device->CreateInputLayout(desc->get(), static_cast<UINT>(desc->size()), initData->get(),
initData->size(), resourceOut);
}
HRESULT CreateResource(ID3D11Device *device,
const D3D11_RASTERIZER_DESC *desc, const D3D11_RASTERIZER_DESC *desc,
void * /*initData*/, void * /*initData*/,
ID3D11RasterizerState **rasterizerState) ID3D11RasterizerState **rasterizerState)
...@@ -337,30 +346,13 @@ void ResourceManager11::decrResource(ResourceType resourceType, size_t memorySiz ...@@ -337,30 +346,13 @@ void ResourceManager11::decrResource(ResourceType resourceType, size_t memorySiz
mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] -= memorySize; mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] -= memorySize;
} }
void ResourceManager11::onReleaseResource(ResourceType resourceType, ID3D11Resource *resource) void ResourceManager11::onReleaseGeneric(ResourceType resourceType, ID3D11DeviceChild *resource)
{ {
ASSERT(resource); ASSERT(resource);
decrResource(resourceType, ComputeGenericMemoryUsage(resourceType, resource)); decrResource(resourceType, ComputeGenericMemoryUsage(resourceType, resource));
} }
template <> template <>
void ResourceManager11::onRelease(ID3D11Resource *resource)
{
// For untyped ID3D11Resource, they must call onReleaseResource.
UNREACHABLE();
}
template <typename T>
void ResourceManager11::onRelease(T *resource)
{
ASSERT(resource);
GetDescFromD3D11<T> desc;
resource->GetDesc(&desc);
decrResource(GetResourceTypeFromD3D11<T>(), ComputeMemoryUsage(&desc));
}
template <>
const D3D11_SUBRESOURCE_DATA *ResourceManager11::createInitDataIfNeeded<ID3D11Texture2D>( const D3D11_SUBRESOURCE_DATA *ResourceManager11::createInitDataIfNeeded<ID3D11Texture2D>(
const D3D11_TEXTURE2D_DESC *desc) const D3D11_TEXTURE2D_DESC *desc)
{ {
...@@ -456,21 +448,12 @@ GetInitDataFromD3D11<T> *ResourceManager11::createInitDataIfNeeded(const GetDesc ...@@ -456,21 +448,12 @@ GetInitDataFromD3D11<T> *ResourceManager11::createInitDataIfNeeded(const GetDesc
return nullptr; return nullptr;
} }
#define ANGLE_INSTANTIATE_OP(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \ #define ANGLE_INSTANTIATE_OP(NAME, RESTYPE, D3D11TYPE, DESCTYPE, INITDATATYPE) \
\
template gl::Error \
ResourceManager11::allocate(\
Renderer11 *, \
\
const DESCTYPE *, \
\
INITDATATYPE *, \
\
Resource11<D3D11TYPE> *); \
\ \
\ template \
template void \ gl::Error \
ResourceManager11::onRelease(D3D11TYPE *); ResourceManager11::allocate(Renderer11 *, const DESCTYPE *, INITDATATYPE *, \
Resource11<D3D11TYPE> *);
ANGLE_RESOURCE_TYPE_OP(Instantitate, ANGLE_INSTANTIATE_OP) ANGLE_RESOURCE_TYPE_OP(Instantitate, ANGLE_INSTANTIATE_OP)
} // namespace rx } // namespace rx
...@@ -25,6 +25,9 @@ template <typename T> ...@@ -25,6 +25,9 @@ template <typename T>
class SharedResource11; class SharedResource11;
class TextureHelper11; class TextureHelper11;
using InputElementArray = WrappedArray<D3D11_INPUT_ELEMENT_DESC>;
using ShaderData = WrappedArray<uint8_t>;
// 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, BlendState, ID3D11BlendState, D3D11_BLEND_DESC, void) \ OP(NAME, BlendState, ID3D11BlendState, D3D11_BLEND_DESC, void) \
...@@ -32,6 +35,7 @@ class TextureHelper11; ...@@ -32,6 +35,7 @@ class TextureHelper11;
OP(NAME, DepthStencilState, ID3D11DepthStencilState, D3D11_DEPTH_STENCIL_DESC, void) \ OP(NAME, DepthStencilState, ID3D11DepthStencilState, D3D11_DEPTH_STENCIL_DESC, void) \
OP(NAME, DepthStencilView, ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, \ OP(NAME, DepthStencilView, ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, \
ID3D11Resource) \ ID3D11Resource) \
OP(NAME, InputLayout, ID3D11InputLayout, InputElementArray, const ShaderData) \
OP(NAME, RasterizerState, ID3D11RasterizerState, D3D11_RASTERIZER_DESC, void) \ OP(NAME, RasterizerState, ID3D11RasterizerState, D3D11_RASTERIZER_DESC, void) \
OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \ OP(NAME, RenderTargetView, ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, \
ID3D11Resource) \ ID3D11Resource) \
...@@ -277,8 +281,12 @@ class ResourceManager11 final : angle::NonCopyable ...@@ -277,8 +281,12 @@ class ResourceManager11 final : angle::NonCopyable
} }
template <typename T> template <typename T>
void onRelease(T *resource); void onRelease(T *resource)
void onReleaseResource(ResourceType resourceType, ID3D11Resource *resource); {
onReleaseGeneric(GetResourceTypeFromD3D11<T>(), resource);
}
void onReleaseGeneric(ResourceType resourceType, ID3D11DeviceChild *resource);
private: private:
void incrResource(ResourceType resourceType, size_t memorySize); void incrResource(ResourceType resourceType, size_t memorySize);
......
...@@ -82,7 +82,7 @@ SwapChain11::SwapChain11(Renderer11 *renderer, ...@@ -82,7 +82,7 @@ SwapChain11::SwapChain11(Renderer11 *renderer,
mDepthStencilSRView(), mDepthStencilSRView(),
mQuadVB(), mQuadVB(),
mPassThroughSampler(), mPassThroughSampler(),
mPassThroughIL(nullptr), mPassThroughIL(),
mPassThroughVS(nullptr), mPassThroughVS(nullptr),
mPassThroughPS(nullptr), mPassThroughPS(nullptr),
mPassThroughRS(), mPassThroughRS(),
...@@ -122,7 +122,7 @@ void SwapChain11::release() ...@@ -122,7 +122,7 @@ void SwapChain11::release()
mDepthStencilSRView.reset(); mDepthStencilSRView.reset();
mQuadVB.reset(); mQuadVB.reset();
mPassThroughSampler.reset(); mPassThroughSampler.reset();
SafeRelease(mPassThroughIL); mPassThroughIL.reset();
SafeRelease(mPassThroughVS); SafeRelease(mPassThroughVS);
SafeRelease(mPassThroughPS); SafeRelease(mPassThroughPS);
mPassThroughRS.reset(); mPassThroughRS.reset();
...@@ -612,7 +612,7 @@ void SwapChain11::initPassThroughResources() ...@@ -612,7 +612,7 @@ void SwapChain11::initPassThroughResources()
// Make sure our resources are all not allocated, when we create // Make sure our resources are all not allocated, when we create
ASSERT(!mQuadVB.valid() && !mPassThroughSampler.valid()); ASSERT(!mQuadVB.valid() && !mPassThroughSampler.valid());
ASSERT(mPassThroughIL == nullptr && mPassThroughVS == nullptr && mPassThroughPS == nullptr); ASSERT(!mPassThroughIL.valid() && mPassThroughVS == nullptr && mPassThroughPS == nullptr);
D3D11_BUFFER_DESC vbDesc; D3D11_BUFFER_DESC vbDesc;
vbDesc.ByteWidth = sizeof(d3d11::PositionTexCoordVertex) * 4; vbDesc.ByteWidth = sizeof(d3d11::PositionTexCoordVertex) * 4;
...@@ -651,13 +651,15 @@ void SwapChain11::initPassThroughResources() ...@@ -651,13 +651,15 @@ void SwapChain11::initPassThroughResources()
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0 },
}; };
HRESULT result = device->CreateInputLayout(quadLayout, 2, g_VS_Passthrough2D, InputElementArray quadElements(quadLayout);
sizeof(g_VS_Passthrough2D), &mPassThroughIL); ShaderData vertexShaderData(g_VS_Passthrough2D);
ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mPassThroughIL, "Swap chain pass through layout"); err = mRenderer->allocateResource(quadElements, &vertexShaderData, &mPassThroughIL);
ASSERT(!err.isError());
mPassThroughIL.setDebugName("Swap chain pass through layout");
result = device->CreateVertexShader(g_VS_Passthrough2D, sizeof(g_VS_Passthrough2D), nullptr, HRESULT result = device->CreateVertexShader(g_VS_Passthrough2D, sizeof(g_VS_Passthrough2D),
&mPassThroughVS); nullptr, &mPassThroughVS);
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mPassThroughVS, "Swap chain pass through vertex shader"); d3d11::SetDebugName(mPassThroughVS, "Swap chain pass through vertex shader");
...@@ -782,7 +784,7 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width, ...@@ -782,7 +784,7 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
deviceContext->RSSetState(mPassThroughRS.get()); deviceContext->RSSetState(mPassThroughRS.get());
// Apply shaders // Apply shaders
deviceContext->IASetInputLayout(mPassThroughIL); deviceContext->IASetInputLayout(mPassThroughIL.get());
deviceContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); deviceContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
deviceContext->VSSetShader(mPassThroughVS, nullptr, 0); deviceContext->VSSetShader(mPassThroughVS, nullptr, 0);
deviceContext->PSSetShader(mPassThroughPS, nullptr, 0); deviceContext->PSSetShader(mPassThroughPS, nullptr, 0);
......
...@@ -100,7 +100,7 @@ class SwapChain11 final : public SwapChainD3D ...@@ -100,7 +100,7 @@ class SwapChain11 final : public SwapChainD3D
d3d11::Buffer mQuadVB; d3d11::Buffer mQuadVB;
d3d11::SamplerState mPassThroughSampler; d3d11::SamplerState mPassThroughSampler;
ID3D11InputLayout *mPassThroughIL; d3d11::InputLayout mPassThroughIL;
ID3D11VertexShader *mPassThroughVS; ID3D11VertexShader *mPassThroughVS;
ID3D11PixelShader *mPassThroughPS; ID3D11PixelShader *mPassThroughPS;
d3d11::RasterizerState mPassThroughRS; d3d11::RasterizerState mPassThroughRS;
......
...@@ -1940,36 +1940,9 @@ HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name) ...@@ -1940,36 +1940,9 @@ HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name)
#endif #endif
} }
LazyInputLayout::LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc, gl::Error LazyInputLayout::resolve(Renderer11 *renderer)
size_t inputDescLen,
const BYTE *byteCode,
size_t byteCodeLen,
const char *debugName)
: mInputDesc(inputDescLen),
mByteCodeLen(byteCodeLen),
mByteCode(byteCode),
mDebugName(debugName)
{ {
if (inputDesc) return resolveImpl(renderer, mInputDesc, &mByteCode, mDebugName);
{
memcpy(&mInputDesc[0], inputDesc, sizeof(D3D11_INPUT_ELEMENT_DESC) * inputDescLen);
}
}
ID3D11InputLayout *LazyInputLayout::resolve(ID3D11Device *device)
{
checkAssociatedDevice(device);
if (mResource == nullptr && mByteCode != nullptr)
{
HRESULT result =
device->CreateInputLayout(&mInputDesc[0], static_cast<UINT>(mInputDesc.size()),
mByteCode, mByteCodeLen, &mResource);
ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mResource, mDebugName);
}
return mResource;
} }
LazyBlendState::LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName) LazyBlendState::LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName)
...@@ -1979,7 +1952,7 @@ LazyBlendState::LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugNa ...@@ -1979,7 +1952,7 @@ LazyBlendState::LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugNa
gl::Error LazyBlendState::resolve(Renderer11 *renderer) gl::Error LazyBlendState::resolve(Renderer11 *renderer)
{ {
return resolveImpl(renderer, mDesc, mDebugName); return resolveImpl(renderer, mDesc, nullptr, mDebugName);
} }
angle::WorkaroundsD3D GenerateWorkarounds(const Renderer11DeviceCaps &deviceCaps, angle::WorkaroundsD3D GenerateWorkarounds(const Renderer11DeviceCaps &deviceCaps,
......
...@@ -262,7 +262,7 @@ template <ResourceType ResourceT> ...@@ -262,7 +262,7 @@ template <ResourceType ResourceT>
class LazyResource2 : angle::NonCopyable class LazyResource2 : angle::NonCopyable
{ {
public: public:
LazyResource2() : mResource() {} constexpr LazyResource2() : mResource() {}
virtual ~LazyResource2() {} virtual ~LazyResource2() {}
virtual gl::Error resolve(Renderer11 *renderer) = 0; virtual gl::Error resolve(Renderer11 *renderer) = 0;
...@@ -276,11 +276,12 @@ class LazyResource2 : angle::NonCopyable ...@@ -276,11 +276,12 @@ class LazyResource2 : angle::NonCopyable
protected: protected:
gl::Error resolveImpl(Renderer11 *renderer, gl::Error resolveImpl(Renderer11 *renderer,
const GetDescType<ResourceT> &desc, const GetDescType<ResourceT> &desc,
GetInitDataType<ResourceT> *initData,
const char *name) const char *name)
{ {
if (!mResource.valid()) if (!mResource.valid())
{ {
ANGLE_TRY(renderer->allocateResource(desc, &mResource)); ANGLE_TRY(renderer->allocateResource(desc, initData, &mResource));
mResource.setDebugName(name); mResource.setDebugName(name);
} }
return gl::NoError(); return gl::NoError();
...@@ -351,21 +352,25 @@ inline ID3D11PixelShader *LazyShader<ID3D11PixelShader>::resolve(ID3D11Device *d ...@@ -351,21 +352,25 @@ inline ID3D11PixelShader *LazyShader<ID3D11PixelShader>::resolve(ID3D11Device *d
return mResource; return mResource;
} }
class LazyInputLayout final : public LazyResource<ID3D11InputLayout> class LazyInputLayout final : public LazyResource2<ResourceType::InputLayout>
{ {
public: public:
LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc, constexpr LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc,
size_t inputDescLen, size_t inputDescLen,
const BYTE *byteCode, const BYTE *byteCode,
size_t byteCodeLen, size_t byteCodeLen,
const char *debugName); const char *debugName)
: mInputDesc(inputDesc, inputDescLen),
mByteCode(byteCode, byteCodeLen),
mDebugName(debugName)
{
}
ID3D11InputLayout *resolve(ID3D11Device *device) override; gl::Error resolve(Renderer11 *renderer) override;
private: private:
std::vector<D3D11_INPUT_ELEMENT_DESC> mInputDesc; InputElementArray mInputDesc;
size_t mByteCodeLen; ShaderData mByteCode;
const BYTE *mByteCode;
const char *mDebugName; const char *mDebugName;
}; };
...@@ -420,7 +425,7 @@ struct GenericData ...@@ -420,7 +425,7 @@ struct GenericData
// We can have a nullptr factory when holding passed-in resources. // We can have a nullptr factory when holding passed-in resources.
if (manager) if (manager)
{ {
manager->onReleaseResource(resourceType, object); manager->onReleaseGeneric(resourceType, object);
manager = nullptr; manager = nullptr;
} }
object->Release(); object->Release();
......
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