summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineD3D12
diff options
context:
space:
mode:
authorazhirnov <zh1dron@gmail.com>2021-03-15 00:24:13 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-03-19 00:38:23 +0000
commit408db3c96481ad05b686a5105cf92c9d58cfa5ba (patch)
treea0d4c1c99665ff3e030477adf2b1dc93315c4d5c /Graphics/GraphicsEngineD3D12
parentAdded inline ray tracing & trace rays indirect command. (diff)
downloadDiligentCore-408db3c96481ad05b686a5105cf92c9d58cfa5ba.tar.gz
DiligentCore-408db3c96481ad05b686a5105cf92c9d58cfa5ba.zip
Added DrawMeshIndirectCount command.
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
-rw-r--r--Graphics/GraphicsEngineD3D12/include/CommandContext.hpp6
-rw-r--r--Graphics/GraphicsEngineD3D12/include/DeviceContextD3D12Impl.hpp14
-rw-r--r--Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp67
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;
}