summaryrefslogtreecommitdiff
path: root/tools/gfx/d3d11/render-d3d11.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2021-04-08 21:10:30 -0700
committerGitHub <noreply@github.com>2021-04-08 21:10:30 -0700
commit8a71039475212fb1e1a6dd2fd2911d02769637ef (patch)
tree0faa6e773d6b40c3dcbf0eed08217c629f8ebccf /tools/gfx/d3d11/render-d3d11.cpp
parentd27557d9b770810402a0bf99bcd891c145a1a69d (diff)
Improve robustness of gfx lifetime management. (#1788)
* Improve robustness of gfx lifetime management. * fix clang error * fix clang error * Fix clang warning
Diffstat (limited to 'tools/gfx/d3d11/render-d3d11.cpp')
-rw-r--r--tools/gfx/d3d11/render-d3d11.cpp117
1 files changed, 59 insertions, 58 deletions
diff --git a/tools/gfx/d3d11/render-d3d11.cpp b/tools/gfx/d3d11/render-d3d11.cpp
index a099d98c7..f5dbcc0a7 100644
--- a/tools/gfx/d3d11/render-d3d11.cpp
+++ b/tools/gfx/d3d11/render-d3d11.cpp
@@ -107,7 +107,7 @@ public:
ShaderObjectLayoutBase** outLayout) override;
virtual Result createShaderObject(ShaderObjectLayoutBase* layout, IShaderObject** outObject)
override;
- virtual Result createRootShaderObject(IShaderProgram* program, IShaderObject** outObject)
+ virtual Result createRootShaderObject(IShaderProgram* program, ShaderObjectBase** outObject)
override;
virtual void bindRootShaderObject(IShaderObject* shaderObject) override;
@@ -203,10 +203,10 @@ protected:
};
- class SamplerStateImpl : public ISamplerState, public RefObject
+ class SamplerStateImpl : public ISamplerState, public ComObject
{
public:
- SLANG_REF_OBJECT_IUNKNOWN_ALL
+ SLANG_COM_OBJECT_IUNKNOWN_ALL
ISamplerState* getInterface(const Guid& guid)
{
if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_ISamplerState)
@@ -218,10 +218,10 @@ protected:
};
- class ResourceViewImpl : public IResourceView, public RefObject
+ class ResourceViewImpl : public IResourceView, public ComObject
{
public:
- SLANG_REF_OBJECT_IUNKNOWN_ALL
+ SLANG_COM_OBJECT_IUNKNOWN_ALL
IResourceView* getInterface(const Guid& guid)
{
if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_IResourceView)
@@ -267,10 +267,10 @@ protected:
class FramebufferLayoutImpl
: public IFramebufferLayout
- , public RefObject
+ , public ComObject
{
public:
- SLANG_REF_OBJECT_IUNKNOWN_ALL
+ SLANG_COM_OBJECT_IUNKNOWN_ALL
IFramebufferLayout* getInterface(const Guid& guid)
{
if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_IFramebufferLayout)
@@ -286,10 +286,10 @@ protected:
class FramebufferImpl
: public IFramebuffer
- , public RefObject
+ , public ComObject
{
public:
- SLANG_REF_OBJECT_IUNKNOWN_ALL
+ SLANG_COM_OBJECT_IUNKNOWN_ALL
IFramebuffer* getInterface(const Guid& guid)
{
if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_IFramebuffer)
@@ -309,7 +309,7 @@ protected:
public:
ComPtr<ID3D11Device> m_device;
ComPtr<IDXGIFactory> m_dxgiFactory;
- D3D11Device* m_renderer;
+ RefPtr<D3D11Device> m_renderer;
Result init(D3D11Device* renderer, const ISwapchain::Desc& swapchainDesc, WindowHandle window)
{
m_renderer = renderer;
@@ -330,11 +330,9 @@ protected:
RefPtr<TextureResourceImpl> image =
new TextureResourceImpl(imageDesc, IResource::Usage::RenderTarget);
image->m_resource = d3dResource;
- ComPtr<ITextureResource> imageResourcePtr;
- imageResourcePtr = image.Ptr();
for (uint32_t i = 0; i < m_desc.imageCount; i++)
{
- m_images.add(imageResourcePtr);
+ m_images.add(image);
}
}
virtual IDXGIFactory* getDXGIFactory() override { return m_dxgiFactory; }
@@ -347,10 +345,10 @@ protected:
}
};
- class InputLayoutImpl: public IInputLayout, public RefObject
+ class InputLayoutImpl: public IInputLayout, public ComObject
{
public:
- SLANG_REF_OBJECT_IUNKNOWN_ALL
+ SLANG_COM_OBJECT_IUNKNOWN_ALL
IInputLayout* getInterface(const Guid& guid)
{
if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_IInputLayout)
@@ -561,7 +559,7 @@ protected:
RefPtr<ShaderObjectLayoutImpl>(new ShaderObjectLayoutImpl());
SLANG_RETURN_ON_FAIL(layout->_init(this));
- *outLayout = layout.detach();
+ returnRefPtrMove(outLayout, layout);
return SLANG_OK;
}
};
@@ -654,7 +652,7 @@ protected:
RefPtr<RootShaderObjectLayoutImpl> layout = new RootShaderObjectLayoutImpl();
SLANG_RETURN_ON_FAIL(layout->_init(this));
- *outLayout = layout.detach();
+ returnRefPtrMove(outLayout, layout);
return SLANG_OK;
}
@@ -733,10 +731,10 @@ protected:
ShaderObjectLayoutImpl* layout,
ShaderObjectImpl** outShaderObject)
{
- auto object = ComPtr<ShaderObjectImpl>(new ShaderObjectImpl());
+ auto object = RefPtr<ShaderObjectImpl>(new ShaderObjectImpl());
SLANG_RETURN_ON_FAIL(object->init(device, layout));
- *outShaderObject = object.detach();
+ returnRefPtrMove(outShaderObject, object);
return SLANG_OK;
}
@@ -908,9 +906,7 @@ protected:
return SLANG_E_INVALID_ARG;
auto& bindingRange = layout->getBindingRange(offset.bindingRangeIndex);
- auto object = m_objects[bindingRange.baseIndex + offset.bindingArrayIndex].Ptr();
- object->addRef();
- *outObject = object;
+ returnComPtr(outObject, m_objects[bindingRange.baseIndex + offset.bindingArrayIndex]);
return SLANG_OK;
}
@@ -1310,7 +1306,7 @@ protected:
{
SLANG_RETURN_ON_FAIL(_createSpecializedLayout(m_specializedLayout.writeRef()));
}
- *outLayout = RefPtr<ShaderObjectLayoutImpl>(m_specializedLayout).detach();
+ returnRefPtr(outLayout, m_specializedLayout);
return SLANG_OK;
}
@@ -1324,10 +1320,11 @@ protected:
SLANG_RETURN_ON_FAIL(getSpecializedShaderObjectType(&extendedType));
auto renderer = getRenderer();
- RefPtr<ShaderObjectLayoutBase> layout;
- SLANG_RETURN_ON_FAIL(renderer->getShaderObjectLayout(extendedType.slangType, layout.writeRef()));
+ RefPtr<ShaderObjectLayoutImpl> layout;
+ SLANG_RETURN_ON_FAIL(renderer->getShaderObjectLayout(
+ extendedType.slangType, (ShaderObjectLayoutBase**)layout.writeRef()));
- *outLayout = static_cast<ShaderObjectLayoutImpl*>(layout.detach());
+ returnRefPtrMove(outLayout, layout);
return SLANG_OK;
}
@@ -1339,12 +1336,17 @@ protected:
typedef ShaderObjectImpl Super;
public:
+ // Override default reference counting behavior to disable lifetime management via ComPtr.
+ // Root objects are managed by command buffer and does not need to be freed by the user.
+ SLANG_NO_THROW uint32_t SLANG_MCALL addRef() override { return 1; }
+ SLANG_NO_THROW uint32_t SLANG_MCALL release() override { return 1; }
+ public:
static Result create(IDevice* device, RootShaderObjectLayoutImpl* layout, RootShaderObjectImpl** outShaderObject)
{
RefPtr<RootShaderObjectImpl> object = new RootShaderObjectImpl();
SLANG_RETURN_ON_FAIL(object->init(device, layout));
- *outShaderObject = object.detach();
+ returnRefPtrMove(outShaderObject, object);
return SLANG_OK;
}
@@ -1353,8 +1355,7 @@ protected:
UInt SLANG_MCALL getEntryPointCount() SLANG_OVERRIDE { return (UInt)m_entryPoints.getCount(); }
SlangResult SLANG_MCALL getEntryPoint(UInt index, IShaderObject** outEntryPoint) SLANG_OVERRIDE
{
- *outEntryPoint = m_entryPoints[index];
- m_entryPoints[index]->addRef();
+ returnComPtr(outEntryPoint, m_entryPoints[index]);
return SLANG_OK;
}
@@ -1473,7 +1474,7 @@ protected:
entryPointVars->m_specializedLayout = entryPointInfo.layout;
}
- *outLayout = specializedLayout.detach();
+ returnRefPtrMove(outLayout, specializedLayout);
return SLANG_OK;
}
@@ -1496,7 +1497,7 @@ protected:
RefPtr<FramebufferImpl> m_currentFramebuffer;
- ComPtr<PipelineStateImpl> m_currentPipelineState;
+ RefPtr<PipelineStateImpl> m_currentPipelineState;
RootBindingState m_rootBindingState;
@@ -1517,7 +1518,7 @@ SlangResult SLANG_MCALL createD3D11Device(const IDevice::Desc* desc, IDevice** o
{
RefPtr<D3D11Device> result = new D3D11Device();
SLANG_RETURN_ON_FAIL(result->initialize(*desc));
- *outDevice = result.detach();
+ returnComPtr(outDevice, result);
return SLANG_OK;
}
@@ -1782,7 +1783,7 @@ Result D3D11Device::createSwapchain(
{
RefPtr<SwapchainImpl> swapchain = new SwapchainImpl();
SLANG_RETURN_ON_FAIL(swapchain->init(this, desc, window));
- *outSwapchain = swapchain.detach();
+ returnComPtr(outSwapchain, swapchain);
return SLANG_OK;
}
@@ -1805,7 +1806,7 @@ Result D3D11Device::createFramebufferLayout(
{
layout->m_hasDepthStencil = false;
}
- *outLayout = layout.detach();
+ returnComPtr(outLayout, layout);
return SLANG_OK;
}
@@ -1822,7 +1823,7 @@ Result D3D11Device::createFramebuffer(
}
framebuffer->depthStencilView = static_cast<DepthStencilViewImpl*>(desc.depthStencilView);
framebuffer->d3dDepthStencilView = framebuffer->depthStencilView->m_dsv;
- *outFramebuffer = framebuffer.detach();
+ returnComPtr(outFramebuffer, framebuffer);
return SLANG_OK;
}
@@ -1909,7 +1910,7 @@ SlangResult D3D11Device::readTextureResource(
}
// Make sure to unmap
m_immediateContext->Unmap(stagingTexture, 0);
- *outBlob = blob.detach();
+ returnComPtr(outBlob, blob);
return SLANG_OK;
}
}
@@ -2076,7 +2077,7 @@ Result D3D11Device::createTextureResource(IResource::Usage initialUsage, const I
return SLANG_FAIL;
}
- *outResource = texture.detach();
+ returnComPtr(outResource, texture);
return SLANG_OK;
}
@@ -2167,7 +2168,7 @@ Result D3D11Device::createBufferResource(IResource::Usage initialUsage, const IB
SLANG_RETURN_ON_FAIL(m_device->CreateBuffer(&bufDesc, nullptr, buffer->m_staging.writeRef()));
}
- *outResource = buffer.detach();
+ returnComPtr(outResource, buffer);
return SLANG_OK;
}
@@ -2287,7 +2288,7 @@ Result D3D11Device::createSamplerState(ISamplerState::Desc const& desc, ISampler
RefPtr<SamplerStateImpl> samplerImpl = new SamplerStateImpl();
samplerImpl->m_sampler = sampler;
- *outSampler = samplerImpl.detach();
+ returnComPtr(outSampler, samplerImpl);
return SLANG_OK;
}
@@ -2312,7 +2313,7 @@ Result D3D11Device::createTextureView(ITextureResource* texture, IResourceView::
viewImpl->m_clearValue,
&resourceImpl->getDesc()->optimalClearValue.color,
sizeof(float) * 4);
- *outView = viewImpl.detach();
+ returnComPtr(outView, viewImpl);
return SLANG_OK;
}
break;
@@ -2326,7 +2327,7 @@ Result D3D11Device::createTextureView(ITextureResource* texture, IResourceView::
viewImpl->m_type = ResourceViewImpl::Type::DSV;
viewImpl->m_dsv = dsv;
viewImpl->m_clearValue = resourceImpl->getDesc()->optimalClearValue.depthStencil;
- *outView = viewImpl.detach();
+ returnComPtr(outView, viewImpl);
return SLANG_OK;
}
break;
@@ -2339,7 +2340,7 @@ Result D3D11Device::createTextureView(ITextureResource* texture, IResourceView::
RefPtr<UnorderedAccessViewImpl> viewImpl = new UnorderedAccessViewImpl();
viewImpl->m_type = ResourceViewImpl::Type::UAV;
viewImpl->m_uav = uav;
- *outView = viewImpl.detach();
+ returnComPtr(outView, viewImpl);
return SLANG_OK;
}
break;
@@ -2352,7 +2353,7 @@ Result D3D11Device::createTextureView(ITextureResource* texture, IResourceView::
RefPtr<ShaderResourceViewImpl> viewImpl = new ShaderResourceViewImpl();
viewImpl->m_type = ResourceViewImpl::Type::SRV;
viewImpl->m_srv = srv;
- *outView = viewImpl.detach();
+ returnComPtr(outView, viewImpl);
return SLANG_OK;
}
break;
@@ -2397,7 +2398,7 @@ Result D3D11Device::createBufferView(IBufferResource* buffer, IResourceView::Des
RefPtr<UnorderedAccessViewImpl> viewImpl = new UnorderedAccessViewImpl();
viewImpl->m_type = ResourceViewImpl::Type::UAV;
viewImpl->m_uav = uav;
- *outView = viewImpl.detach();
+ returnComPtr(outView, viewImpl);
return SLANG_OK;
}
break;
@@ -2442,7 +2443,7 @@ Result D3D11Device::createBufferView(IBufferResource* buffer, IResourceView::Des
RefPtr<ShaderResourceViewImpl> viewImpl = new ShaderResourceViewImpl();
viewImpl->m_type = ResourceViewImpl::Type::SRV;
viewImpl->m_srv = srv;
- *outView = viewImpl.detach();
+ returnComPtr(outView, viewImpl);
return SLANG_OK;
}
break;
@@ -2512,7 +2513,7 @@ Result D3D11Device::createInputLayout(const InputElementDesc* inputElementsIn, U
RefPtr<InputLayoutImpl> impl = new InputLayoutImpl;
impl->m_layout.swap(inputLayout);
- *outLayout = impl.detach();
+ returnComPtr(outLayout, impl);
return SLANG_OK;
}
@@ -2661,7 +2662,7 @@ void D3D11Device::setPipelineState(IPipelineState* state)
case PipelineType::Graphics:
{
auto stateImpl = (GraphicsPipelineStateImpl*) state;
- auto programImpl = static_cast<ShaderProgramImpl*>(stateImpl->m_program.get());
+ auto programImpl = static_cast<ShaderProgramImpl*>(stateImpl->m_program.Ptr());
// TODO: We could conceivably do some lightweight state
// differencing here (e.g., check if `programImpl` is the
@@ -2705,7 +2706,7 @@ void D3D11Device::setPipelineState(IPipelineState* state)
case PipelineType::Compute:
{
auto stateImpl = (ComputePipelineStateImpl*) state;
- auto programImpl = static_cast<ShaderProgramImpl*>(stateImpl->m_program.get());
+ auto programImpl = static_cast<ShaderProgramImpl*>(stateImpl->m_program.Ptr());
// CS
@@ -2739,7 +2740,7 @@ Result D3D11Device::createProgram(const IShaderProgram::Desc& desc, IShaderProgr
// For a specializable program, we don't invoke any actual slang compilation yet.
RefPtr<ShaderProgramImpl> shaderProgram = new ShaderProgramImpl();
shaderProgram->slangProgram = desc.slangProgram;
- *outProgram = shaderProgram.detach();
+ returnComPtr(outProgram, shaderProgram);
return SLANG_OK;
}
@@ -2802,7 +2803,7 @@ Result D3D11Device::createProgram(const IShaderProgram::Desc& desc, IShaderProgr
SLANG_ASSERT(!"pipeline stage not implemented");
}
}
- *outProgram = shaderProgram.detach();
+ returnComPtr(outProgram, shaderProgram);
return SLANG_OK;
}
@@ -2940,7 +2941,7 @@ Result D3D11Device::createShaderObjectLayout(
RefPtr<ShaderObjectLayoutImpl> layout;
SLANG_RETURN_ON_FAIL(ShaderObjectLayoutImpl::createForElementType(
this, typeLayout, layout.writeRef()));
- *outLayout = layout.detach();
+ returnRefPtrMove(outLayout, layout);
return SLANG_OK;
}
@@ -2949,11 +2950,11 @@ Result D3D11Device::createShaderObject(ShaderObjectLayoutBase* layout, IShaderOb
RefPtr<ShaderObjectImpl> shaderObject;
SLANG_RETURN_ON_FAIL(ShaderObjectImpl::create(this,
static_cast<ShaderObjectLayoutImpl*>(layout), shaderObject.writeRef()));
- *outObject = shaderObject.detach();
+ returnComPtr(outObject, shaderObject);
return SLANG_OK;
}
-Result D3D11Device::createRootShaderObject(IShaderProgram* program, IShaderObject** outObject)
+Result D3D11Device::createRootShaderObject(IShaderProgram* program, ShaderObjectBase** outObject)
{
auto programImpl = static_cast<ShaderProgramImpl*>(program);
RefPtr<RootShaderObjectImpl> shaderObject;
@@ -2962,7 +2963,7 @@ Result D3D11Device::createRootShaderObject(IShaderProgram* program, IShaderObjec
this, programImpl->slangProgram, programImpl->slangProgram->getLayout(), rootLayout.writeRef()));
SLANG_RETURN_ON_FAIL(RootShaderObjectImpl::create(
this, rootLayout.Ptr(), shaderObject.writeRef()));
- *outObject = shaderObject.detach();
+ returnRefPtrMove(outObject, shaderObject);
return SLANG_OK;
}
@@ -3123,7 +3124,7 @@ Result D3D11Device::createGraphicsPipelineState(const GraphicsPipelineStateDesc&
state->m_blendColor[3] = 0;
state->m_sampleMask = 0xFFFFFFFF;
state->init(desc);
- *outState = state.detach();
+ returnComPtr(outState, state);
return SLANG_OK;
}
@@ -3133,7 +3134,7 @@ Result D3D11Device::createComputePipelineState(const ComputePipelineStateDesc& i
RefPtr<ComputePipelineStateImpl> state = new ComputePipelineStateImpl();
state->init(desc);
- *outState = state.detach();
+ returnComPtr(outState, state);
return SLANG_OK;
}
@@ -3167,7 +3168,7 @@ void D3D11Device::_flushGraphicsState()
m_framebufferBindingDirty = false;
m_shaderBindingDirty = false;
- auto pipelineState = static_cast<GraphicsPipelineStateImpl*>(m_currentPipelineState.get());
+ auto pipelineState = static_cast<GraphicsPipelineStateImpl*>(m_currentPipelineState.Ptr());
auto rtvCount = (UINT)m_currentFramebuffer->renderTargetViews.getCount();
auto uavCount = (UINT)m_rootBindingState.uavBindings.getCount();
m_immediateContext->OMSetRenderTargetsAndUnorderedAccessViews(
@@ -3182,7 +3183,7 @@ void D3D11Device::_flushGraphicsState()
if (m_depthStencilStateDirty)
{
m_depthStencilStateDirty = false;
- auto pipelineState = static_cast<GraphicsPipelineStateImpl*>(m_currentPipelineState.get());
+ auto pipelineState = static_cast<GraphicsPipelineStateImpl*>(m_currentPipelineState.Ptr());
m_immediateContext->OMSetDepthStencilState(
pipelineState->m_depthStencilState, m_stencilRef);
}