diff options
| author | azhirnov <zh1dron@gmail.com> | 2021-03-15 00:24:13 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2021-03-19 00:38:23 +0000 |
| commit | 408db3c96481ad05b686a5105cf92c9d58cfa5ba (patch) | |
| tree | a0d4c1c99665ff3e030477adf2b1dc93315c4d5c /Graphics/GraphicsEngineD3D12 | |
| parent | Added inline ray tracing & trace rays indirect command. (diff) | |
| download | DiligentCore-408db3c96481ad05b686a5105cf92c9d58cfa5ba.tar.gz DiligentCore-408db3c96481ad05b686a5105cf92c9d58cfa5ba.zip | |
Added DrawMeshIndirectCount command.
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
3 files changed, 57 insertions, 30 deletions
diff --git a/Graphics/GraphicsEngineD3D12/include/CommandContext.hpp b/Graphics/GraphicsEngineD3D12/include/CommandContext.hpp index 29bbaeb0..4c8919f5 100644 --- a/Graphics/GraphicsEngineD3D12/include/CommandContext.hpp +++ b/Graphics/GraphicsEngineD3D12/include/CommandContext.hpp @@ -174,6 +174,12 @@ public: m_pCommandList->ExecuteIndirect(pCmdSignature, 1, pBuff, ArgsOffset, nullptr, 0); } + void ExecuteIndirect(ID3D12CommandSignature* pCmdSignature, Uint32 MaxCommandCount, ID3D12Resource* pArgsBuff, Uint64 ArgsOffset, ID3D12Resource* pCountBuff, Uint64 CountOffset) + { + FlushResourceBarriers(); + m_pCommandList->ExecuteIndirect(pCmdSignature, MaxCommandCount, pArgsBuff, ArgsOffset, pCountBuff, CountOffset); + } + void SetID(const Char* ID) { m_ID = ID; } ID3D12GraphicsCommandList* GetCommandList() { return m_pCommandList; } diff --git a/Graphics/GraphicsEngineD3D12/include/DeviceContextD3D12Impl.hpp b/Graphics/GraphicsEngineD3D12/include/DeviceContextD3D12Impl.hpp index 1f453e6e..a502b748 100644 --- a/Graphics/GraphicsEngineD3D12/include/DeviceContextD3D12Impl.hpp +++ b/Graphics/GraphicsEngineD3D12/include/DeviceContextD3D12Impl.hpp @@ -144,6 +144,8 @@ public: virtual void DILIGENT_CALL_TYPE DrawMesh (const DrawMeshAttribs& Attribs) override final; /// Implementation of IDeviceContext::DrawMeshIndirect() in Direct3D12 backend. virtual void DILIGENT_CALL_TYPE DrawMeshIndirect (const DrawMeshIndirectAttribs& Attribs, IBuffer* pAttribsBuffer) override final; + /// Implementation of IDeviceContext::DrawMeshIndirectCount() in Direct3D12 backend. + virtual void DILIGENT_CALL_TYPE DrawMeshIndirectCount(const DrawMeshIndirectCountAttribs& Attribs, IBuffer* pAttribsBuffer, IBuffer* pCountBuffer) override final; /// Implementation of IDeviceContext::DispatchCompute() in Direct3D12 backend. @@ -376,12 +378,12 @@ private: __forceinline void PrepareForDispatchCompute(ComputeContext& GraphCtx); __forceinline void PrepareForDispatchRays(GraphicsContext& GraphCtx); - __forceinline void PrepareIndirectBuffer(GraphicsContext& GraphCtx, - IBuffer* pAttribsBuffer, - RESOURCE_STATE_TRANSITION_MODE BufferStateTransitionMode, - ID3D12Resource*& pd3d12ArgsBuff, - Uint64& BuffDataStartByteOffset, - const char* OpName); + __forceinline void PrepareIndirectAttribsBuffer(CommandContext& CmdCtx, + IBuffer* pAttribsBuffer, + RESOURCE_STATE_TRANSITION_MODE BufferStateTransitionMode, + ID3D12Resource*& pd3d12ArgsBuff, + Uint64& BuffDataStartByteOffset, + const char* OpName); struct RootTableInfo { diff --git a/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp index 5dd64710..1444919b 100644 --- a/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp @@ -133,6 +133,7 @@ DeviceContextD3D12Impl::DeviceContextD3D12Impl(IReferenceCounters* pRef IndirectArg.Type = D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH; hr = pd3d12Device->CreateCommandSignature(&CmdSignatureDesc, nullptr, __uuidof(m_pDrawMeshIndirectSignature), reinterpret_cast<void**>(static_cast<ID3D12CommandSignature**>(&m_pDrawMeshIndirectSignature))); CHECK_D3D_RESULT_THROW(hr, "Failed to create draw mesh indirect command signature"); + VERIFY_EXPR(CmdSignatureDesc.ByteStride == DrawMeshIndirectCommandStride); } #endif if (pDeviceD3D12Impl->GetDeviceCaps().Features.RayTracing2 == DEVICE_FEATURE_STATE_ENABLED) @@ -627,12 +628,12 @@ void DeviceContextD3D12Impl::DrawIndexed(const DrawIndexedAttribs& Attribs) ++m_State.NumCommands; } -void DeviceContextD3D12Impl::PrepareIndirectBuffer(GraphicsContext& GraphCtx, - IBuffer* pAttribsBuffer, - RESOURCE_STATE_TRANSITION_MODE BufferStateTransitionMode, - ID3D12Resource*& pd3d12ArgsBuff, - Uint64& BuffDataStartByteOffset, - const char* OpName) +void DeviceContextD3D12Impl::PrepareIndirectAttribsBuffer(CommandContext& CmdCtx, + IBuffer* pAttribsBuffer, + RESOURCE_STATE_TRANSITION_MODE BufferStateTransitionMode, + ID3D12Resource*& pd3d12ArgsBuff, + Uint64& BuffDataStartByteOffset, + const char* OpName) { DEV_CHECK_ERR(pAttribsBuffer != nullptr, "Indirect draw attribs buffer must not be null"); @@ -642,8 +643,9 @@ void DeviceContextD3D12Impl::PrepareIndirectBuffer(GraphicsContext& pIndirectDrawAttribsD3D12->DvpVerifyDynamicAllocation(this); #endif - TransitionOrVerifyBufferState(GraphCtx, *pIndirectDrawAttribsD3D12, BufferStateTransitionMode, - RESOURCE_STATE_INDIRECT_ARGUMENT, OpName); + TransitionOrVerifyBufferState(CmdCtx, *pIndirectDrawAttribsD3D12, BufferStateTransitionMode, + RESOURCE_STATE_INDIRECT_ARGUMENT, + OpName); pd3d12ArgsBuff = pIndirectDrawAttribsD3D12->GetD3D12Buffer(BuffDataStartByteOffset, this); } @@ -658,8 +660,8 @@ void DeviceContextD3D12Impl::DrawIndirect(const DrawIndirectAttribs& Attribs, IB ID3D12Resource* pd3d12ArgsBuff; Uint64 BuffDataStartByteOffset; - PrepareIndirectBuffer(GraphCtx, pAttribsBuffer, Attribs.IndirectAttribsBufferStateTransitionMode, pd3d12ArgsBuff, BuffDataStartByteOffset, - "Indirect draw (DeviceContextD3D12Impl::DrawIndirect)"); + PrepareIndirectAttribsBuffer(GraphCtx, pAttribsBuffer, Attribs.IndirectAttribsBufferStateTransitionMode, pd3d12ArgsBuff, BuffDataStartByteOffset, + "Indirect draw (DeviceContextD3D12Impl::DrawIndirect)"); GraphCtx.ExecuteIndirect(m_pDrawIndirectSignature, pd3d12ArgsBuff, Attribs.IndirectDrawArgsOffset + BuffDataStartByteOffset); ++m_State.NumCommands; @@ -675,8 +677,8 @@ void DeviceContextD3D12Impl::DrawIndexedIndirect(const DrawIndexedIndirectAttrib ID3D12Resource* pd3d12ArgsBuff; Uint64 BuffDataStartByteOffset; - PrepareIndirectBuffer(GraphCtx, pAttribsBuffer, Attribs.IndirectAttribsBufferStateTransitionMode, pd3d12ArgsBuff, BuffDataStartByteOffset, - "Indexed indirect draw (DeviceContextD3D12Impl::DrawIndexedIndirect)"); + PrepareIndirectAttribsBuffer(GraphCtx, pAttribsBuffer, Attribs.IndirectAttribsBufferStateTransitionMode, pd3d12ArgsBuff, BuffDataStartByteOffset, + "indexed Indirect draw (DeviceContextD3D12Impl::DrawIndexedIndirect)"); GraphCtx.ExecuteIndirect(m_pDrawIndexedIndirectSignature, pd3d12ArgsBuff, Attribs.IndirectDrawArgsOffset + BuffDataStartByteOffset); ++m_State.NumCommands; @@ -704,13 +706,36 @@ void DeviceContextD3D12Impl::DrawMeshIndirect(const DrawMeshIndirectAttribs& Att ID3D12Resource* pd3d12ArgsBuff; Uint64 BuffDataStartByteOffset; - PrepareIndirectBuffer(GraphCtx, pAttribsBuffer, Attribs.IndirectAttribsBufferStateTransitionMode, pd3d12ArgsBuff, BuffDataStartByteOffset, - "Indirect draw mesh (DeviceContextD3D12Impl::DrawMeshIndirect)"); + PrepareIndirectAttribsBuffer(GraphCtx, pAttribsBuffer, Attribs.IndirectAttribsBufferStateTransitionMode, pd3d12ArgsBuff, BuffDataStartByteOffset, + "Indirect draw mesh (DeviceContextD3D12Impl::DrawMeshIndirect)"); GraphCtx.ExecuteIndirect(m_pDrawMeshIndirectSignature, pd3d12ArgsBuff, Attribs.IndirectDrawArgsOffset + BuffDataStartByteOffset); ++m_State.NumCommands; } +void DeviceContextD3D12Impl::DrawMeshIndirectCount(const DrawMeshIndirectCountAttribs& Attribs, IBuffer* pAttribsBuffer, IBuffer* pCountBuffer) +{ + if (!DvpVerifyDrawMeshIndirectCountArguments(Attribs, pAttribsBuffer, pCountBuffer)) + return; + + auto& GraphCtx = GetCmdContext().AsGraphicsContext(); + PrepareForDraw(GraphCtx, Attribs.Flags); + + ID3D12Resource* pd3d12ArgsBuff; + ID3D12Resource* pd3d12CountBuff; + Uint64 ArgsBuffDataStartByteOffset; + Uint64 CountBuffDataStartByteOffset; + PrepareIndirectAttribsBuffer(GraphCtx, pAttribsBuffer, Attribs.IndirectAttribsBufferStateTransitionMode, pd3d12ArgsBuff, ArgsBuffDataStartByteOffset, + "Indirect buffer (DeviceContextD3D12Impl::DrawMeshIndirectCount)"); + PrepareIndirectAttribsBuffer(GraphCtx, pCountBuffer, Attribs.CountBufferStateTransitionMode, pd3d12CountBuff, CountBuffDataStartByteOffset, + "Count buffer (DeviceContextD3D12Impl::DrawMeshIndirectCount)"); + + GraphCtx.ExecuteIndirect(m_pDrawMeshIndirectSignature, Attribs.MaxCommandCount, + pd3d12ArgsBuff, Attribs.IndirectDrawArgsOffset + ArgsBuffDataStartByteOffset, + pd3d12CountBuff, Attribs.CountBufferOffset + CountBuffDataStartByteOffset); + ++m_State.NumCommands; +} + void DeviceContextD3D12Impl::PrepareForDispatchCompute(ComputeContext& ComputeCtx) { auto& RootInfo = GetRootTableInfo(PIPELINE_TYPE_COMPUTE); @@ -756,17 +781,11 @@ void DeviceContextD3D12Impl::DispatchComputeIndirect(const DispatchComputeIndire auto& ComputeCtx = GetCmdContext().AsComputeContext(); PrepareForDispatchCompute(ComputeCtx); - auto* pBufferD3D12 = ValidatedCast<BufferD3D12Impl>(pAttribsBuffer); - -#ifdef DILIGENT_DEVELOPMENT - if (pBufferD3D12->GetDesc().Usage == USAGE_DYNAMIC) - pBufferD3D12->DvpVerifyDynamicAllocation(this); -#endif - - TransitionOrVerifyBufferState(ComputeCtx, *pBufferD3D12, Attribs.IndirectAttribsBufferStateTransitionMode, - RESOURCE_STATE_INDIRECT_ARGUMENT, "Indirect dispatch (DeviceContextD3D12Impl::DispatchComputeIndirect)"); + ID3D12Resource* pd3d12ArgsBuff; Uint64 BuffDataStartByteOffset; - ID3D12Resource* pd3d12ArgsBuff = pBufferD3D12->GetD3D12Buffer(BuffDataStartByteOffset, this); + PrepareIndirectAttribsBuffer(ComputeCtx, pAttribsBuffer, Attribs.IndirectAttribsBufferStateTransitionMode, pd3d12ArgsBuff, BuffDataStartByteOffset, + "Indirect dispatch (DeviceContextD3D12Impl::DispatchComputeIndirect)"); + ComputeCtx.ExecuteIndirect(m_pDispatchIndirectSignature, pd3d12ArgsBuff, Attribs.DispatchArgsByteOffset + BuffDataStartByteOffset); ++m_State.NumCommands; } |
