summaryrefslogtreecommitdiff
path: root/tools/gfx/d3d11/render-d3d11.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2021-04-24 00:17:43 -0700
committerGitHub <noreply@github.com>2021-04-24 00:17:43 -0700
commit9a5672d7b8a155117a2c3f8375e3b8a5b43d91b7 (patch)
tree9be3ea214ea735e41e8fdaef9824e84212a30cbb /tools/gfx/d3d11/render-d3d11.cpp
parent697017e6fae8c252638abc298ec1556de2e41314 (diff)
Remove resource `Usage` from `gfx` interface. (#1813)
* Fix `model-viewer` crash when using Vulkan. Fixing an issue in shader object layout creation for to make sure a correct descriptor set layout is calculated for types that need an implicit constant buffer. * Fix formatting. * Fixes. * Fix memory leak in vulkan. * Remove resource `Usage` from `gfx` interface.
Diffstat (limited to 'tools/gfx/d3d11/render-d3d11.cpp')
-rw-r--r--tools/gfx/d3d11/render-d3d11.cpp118
1 files changed, 65 insertions, 53 deletions
diff --git a/tools/gfx/d3d11/render-d3d11.cpp b/tools/gfx/d3d11/render-d3d11.cpp
index a011f2760..bbc213bb6 100644
--- a/tools/gfx/d3d11/render-d3d11.cpp
+++ b/tools/gfx/d3d11/render-d3d11.cpp
@@ -75,12 +75,10 @@ public:
virtual void setStencilReference(uint32_t referenceValue) override;
virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
- IResource::Usage initialUsage,
const ITextureResource::Desc& desc,
const ITextureResource::SubresourceData* initData,
ITextureResource** outResource) override;
virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
- IResource::Usage initialUsage,
const IBufferResource::Desc& desc,
const void* initData,
IBufferResource** outResource) override;
@@ -177,14 +175,12 @@ protected:
public:
typedef BufferResource Parent;
- BufferResourceImpl(const IBufferResource::Desc& desc, IResource::Usage initialUsage):
- Parent(desc),
- m_initialUsage(initialUsage)
+ BufferResourceImpl(const IBufferResource::Desc& desc):
+ Parent(desc)
{
}
MapFlavor m_mapFlavor;
- Usage m_initialUsage;
ComPtr<ID3D11Buffer> m_buffer;
ComPtr<ID3D11Buffer> m_staging;
};
@@ -193,12 +189,10 @@ protected:
public:
typedef TextureResource Parent;
- TextureResourceImpl(const Desc& desc, Usage initialUsage) :
- Parent(desc),
- m_initialUsage(initialUsage)
+ TextureResourceImpl(const Desc& desc)
+ : Parent(desc)
{
}
- Usage m_initialUsage;
ComPtr<ID3D11Resource> m_resource;
};
@@ -314,10 +308,19 @@ protected:
ComPtr<ID3D11Resource> d3dResource;
m_swapChain->GetBuffer(0, IID_PPV_ARGS(d3dResource.writeRef()));
ITextureResource::Desc imageDesc = {};
- imageDesc.init2D(
- IResource::Type::Texture2D, m_desc.format, m_desc.width, m_desc.height, 0);
- RefPtr<TextureResourceImpl> image =
- new TextureResourceImpl(imageDesc, IResource::Usage::RenderTarget);
+ imageDesc.type = IResource::Type::Texture2D;
+ imageDesc.arraySize = 0;
+ imageDesc.numMipLevels = 1;
+ imageDesc.size.width = m_desc.width;
+ imageDesc.size.height = m_desc.height;
+ imageDesc.size.depth = 1;
+ imageDesc.format = m_desc.format;
+ imageDesc.defaultState = ResourceState::Present;
+ imageDesc.allowedStates = ResourceStateSet(
+ ResourceState::Present,
+ ResourceState::CopyDestination,
+ ResourceState::RenderTarget);
+ RefPtr<TextureResourceImpl> image = new TextureResourceImpl(imageDesc);
image->m_resource = d3dResource;
for (uint32_t i = 0; i < m_desc.imageCount; i++)
{
@@ -1199,11 +1202,15 @@ protected:
//
ComPtr<IBufferResource> bufferResourcePtr;
- IBufferResource::Desc bufferDesc;
- bufferDesc.init(specializedOrdinaryDataSize);
+ IBufferResource::Desc bufferDesc = {};
+ bufferDesc.type = IResource::Type::Buffer;
+ bufferDesc.sizeInBytes = specializedOrdinaryDataSize;
+ bufferDesc.defaultState = ResourceState::ConstantBuffer;
+ bufferDesc.allowedStates =
+ ResourceStateSet(ResourceState::ConstantBuffer, ResourceState::CopyDestination);
bufferDesc.cpuAccessFlags |= IResource::AccessFlag::Write;
- SLANG_RETURN_ON_FAIL(device->createBufferResource(
- IResource::Usage::ConstantBuffer, bufferDesc, nullptr, bufferResourcePtr.writeRef()));
+ SLANG_RETURN_ON_FAIL(
+ device->createBufferResource(bufferDesc, nullptr, bufferResourcePtr.writeRef()));
m_ordinaryDataBuffer = static_cast<BufferResourceImpl*>(bufferResourcePtr.get());
// Once the buffer is allocated, we can use `_writeOrdinaryData` to fill it in.
@@ -1896,33 +1903,40 @@ SlangResult D3D11Device::readTextureResource(
}
}
-static D3D11_BIND_FLAG _calcResourceFlag(IResource::BindFlag::Enum bindFlag)
+static D3D11_BIND_FLAG _calcResourceFlag(ResourceState state)
{
- typedef IResource::BindFlag BindFlag;
- switch (bindFlag)
- {
- case BindFlag::VertexBuffer: return D3D11_BIND_VERTEX_BUFFER;
- case BindFlag::IndexBuffer: return D3D11_BIND_INDEX_BUFFER;
- case BindFlag::ConstantBuffer: return D3D11_BIND_CONSTANT_BUFFER;
- case BindFlag::StreamOutput: return D3D11_BIND_STREAM_OUTPUT;
- case BindFlag::RenderTarget: return D3D11_BIND_RENDER_TARGET;
- case BindFlag::DepthStencil: return D3D11_BIND_DEPTH_STENCIL;
- case BindFlag::UnorderedAccess: return D3D11_BIND_UNORDERED_ACCESS;
- case BindFlag::PixelShaderResource: return D3D11_BIND_SHADER_RESOURCE;
- case BindFlag::NonPixelShaderResource: return D3D11_BIND_SHADER_RESOURCE;
- default: return D3D11_BIND_FLAG(0);
+ switch (state)
+ {
+ case ResourceState::VertexBuffer:
+ return D3D11_BIND_VERTEX_BUFFER;
+ case ResourceState::IndexBuffer:
+ return D3D11_BIND_INDEX_BUFFER;
+ case ResourceState::ConstantBuffer:
+ return D3D11_BIND_CONSTANT_BUFFER;
+ case ResourceState::StreamOutput:
+ return D3D11_BIND_STREAM_OUTPUT;
+ case ResourceState::RenderTarget:
+ return D3D11_BIND_RENDER_TARGET;
+ case ResourceState::DepthRead:
+ case ResourceState::DepthWrite:
+ return D3D11_BIND_DEPTH_STENCIL;
+ case ResourceState::UnorderedAccess:
+ return D3D11_BIND_UNORDERED_ACCESS;
+ case ResourceState::ShaderResource:
+ return D3D11_BIND_SHADER_RESOURCE;
+ default:
+ return D3D11_BIND_FLAG(0);
}
}
-static int _calcResourceBindFlags(int bindFlags)
+static int _calcResourceBindFlags(ResourceStateSet allowedStates)
{
int dstFlags = 0;
- while (bindFlags)
+ for (uint32_t i = 0; i < (uint32_t)ResourceState::_Count; i++)
{
- int lsb = bindFlags & -bindFlags;
-
- dstFlags |= _calcResourceFlag(IResource::BindFlag::Enum(lsb));
- bindFlags &= ~lsb;
+ auto state = (ResourceState)i;
+ if (allowedStates.contains(state))
+ dstFlags |= _calcResourceFlag(state);
}
return dstFlags;
}
@@ -1940,12 +1954,11 @@ static int _calcResourceAccessFlags(int accessFlags)
}
}
-Result D3D11Device::createTextureResource(IResource::Usage initialUsage, const ITextureResource::Desc& descIn, const ITextureResource::SubresourceData* initData, ITextureResource** outResource)
+Result D3D11Device::createTextureResource(const ITextureResource::Desc& descIn, const ITextureResource::SubresourceData* initData, ITextureResource** outResource)
{
- TextureResource::Desc srcDesc(descIn);
- srcDesc.setDefaults(initialUsage);
+ TextureResource::Desc srcDesc = fixupTextureDesc(descIn);
- const int effectiveArraySize = srcDesc.calcEffectiveArraySize();
+ const int effectiveArraySize = calcEffectiveArraySize(srcDesc);
const DXGI_FORMAT format = D3DUtil::getMapFormat(srcDesc.format);
if (format == DXGI_FORMAT_UNKNOWN)
@@ -1953,7 +1966,7 @@ Result D3D11Device::createTextureResource(IResource::Usage initialUsage, const I
return SLANG_FAIL;
}
- const int bindFlags = _calcResourceBindFlags(srcDesc.bindFlags);
+ const int bindFlags = _calcResourceBindFlags(srcDesc.allowedStates);
// Set up the initialize data
List<D3D11_SUBRESOURCE_DATA> subRes;
@@ -1967,7 +1980,7 @@ Result D3D11Device::createTextureResource(IResource::Usage initialUsage, const I
{
for (int j = 0; j < srcDesc.numMipLevels; j++)
{
- const int mipHeight = ITextureResource::Size::calcMipSize(srcDesc.size.height, j);
+ const int mipHeight = calcMipSize(srcDesc.size.height, j);
D3D11_SUBRESOURCE_DATA& data = subRes[subResourceIndex];
auto& srcData = initData[subResourceIndex];
@@ -1985,7 +1998,7 @@ Result D3D11Device::createTextureResource(IResource::Usage initialUsage, const I
const int accessFlags = _calcResourceAccessFlags(srcDesc.cpuAccessFlags);
- RefPtr<TextureResourceImpl> texture(new TextureResourceImpl(srcDesc, initialUsage));
+ RefPtr<TextureResourceImpl> texture(new TextureResourceImpl(srcDesc));
switch (srcDesc.type)
{
@@ -2062,12 +2075,11 @@ Result D3D11Device::createTextureResource(IResource::Usage initialUsage, const I
return SLANG_OK;
}
-Result D3D11Device::createBufferResource(IResource::Usage initialUsage, const IBufferResource::Desc& descIn, const void* initData, IBufferResource** outResource)
+Result D3D11Device::createBufferResource(const IBufferResource::Desc& descIn, const void* initData, IBufferResource** outResource)
{
- IBufferResource::Desc srcDesc(descIn);
- srcDesc.setDefaults(initialUsage);
+ IBufferResource::Desc srcDesc = fixupBufferDesc(descIn);
- auto d3dBindFlags = _calcResourceBindFlags(srcDesc.bindFlags);
+ auto d3dBindFlags = _calcResourceBindFlags(srcDesc.allowedStates);
size_t alignedSizeInBytes = srcDesc.sizeInBytes;
@@ -2096,14 +2108,14 @@ Result D3D11Device::createBufferResource(IResource::Usage initialUsage, const IB
// If written by CPU, make it dynamic
if ((descIn.cpuAccessFlags & IResource::AccessFlag::Write) &&
- ((descIn.bindFlags & IResource::BindFlag::UnorderedAccess) == 0))
+ !descIn.allowedStates.contains(ResourceState::UnorderedAccess))
{
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
}
- switch (initialUsage)
+ switch (descIn.defaultState)
{
- case IResource::Usage::ConstantBuffer:
+ case ResourceState::ConstantBuffer:
{
// We'll just assume ConstantBuffers are dynamic for now
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
@@ -2134,7 +2146,7 @@ Result D3D11Device::createBufferResource(IResource::Usage initialUsage, const IB
D3D11_SUBRESOURCE_DATA subResourceData = { 0 };
subResourceData.pSysMem = initData;
- RefPtr<BufferResourceImpl> buffer(new BufferResourceImpl(srcDesc, initialUsage));
+ RefPtr<BufferResourceImpl> buffer(new BufferResourceImpl(srcDesc));
SLANG_RETURN_ON_FAIL(m_device->CreateBuffer(&bufferDesc, initData ? &subResourceData : nullptr, buffer->m_buffer.writeRef()));