From f6181c0d90eb7a6135353113ea153942df276bdc Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Sat, 19 Oct 2019 11:41:13 -0700 Subject: Reworked Draw and DispatchCompute commands (Updated API version to 240033) --- .../include/DeviceContextD3D11Impl.h | 15 +- .../src/DeviceContextD3D11Impl.cpp | 152 +++++++++++++-------- 2 files changed, 107 insertions(+), 60 deletions(-) (limited to 'Graphics/GraphicsEngineD3D11') diff --git a/Graphics/GraphicsEngineD3D11/include/DeviceContextD3D11Impl.h b/Graphics/GraphicsEngineD3D11/include/DeviceContextD3D11Impl.h index 8a438ae5..9da2c23e 100755 --- a/Graphics/GraphicsEngineD3D11/include/DeviceContextD3D11Impl.h +++ b/Graphics/GraphicsEngineD3D11/include/DeviceContextD3D11Impl.h @@ -91,9 +91,13 @@ public: ITextureView* pDepthStencil, RESOURCE_STATE_TRANSITION_MODE StateTransitionMode)override final; - virtual void Draw(DrawAttribs& DrawAttribs)override final; + virtual void Draw (const DrawAttribs& Attribs)override final; + virtual void DrawIndexed (const DrawIndexedAttribs& Attribs)override final; + virtual void DrawIndirect (const DrawIndirectAttribs& Attribs, IBuffer* pAttribsBuffer)override final; + virtual void DrawIndexedIndirect(const DrawIndexedIndirectAttribs& Attribs, IBuffer* pAttribsBuffer)override final; - virtual void DispatchCompute(const DispatchComputeAttribs& DispatchAttrs)override final; + virtual void DispatchCompute(const DispatchComputeAttribs& Attribs)override final; + virtual void DispatchComputeIndirect(const DispatchComputeIndirectAttribs& Attribs, IBuffer* pAttribsBuffer)override final; virtual void ClearDepthStencil(ITextureView* pView, CLEAR_DEPTH_STENCIL_FLAGS ClearFlags, @@ -218,6 +222,13 @@ private: /// Unbinds a texture from depth-stencil. void UnbindTextureFromDepthStencil(TextureBaseD3D11* pTexD3D11); + /// Prepares for a draw command + __forceinline void PrepareForDraw(DRAW_FLAGS Flags); + + /// Prepares for an indexed draw command + __forceinline void PrepareForIndexedDraw(DRAW_FLAGS Flags, VALUE_TYPE IndexType); + + template void TransitionAndCommitShaderResources(IPipelineState* pPSO, IShaderResourceBinding* pShaderResourceBinding, bool VerifyStates); diff --git a/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp b/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp index 1d5ce3d8..dd77731b 100755 --- a/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp +++ b/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp @@ -738,17 +738,13 @@ namespace Diligent m_bCommittedD3D11VBsUpToDate = true; } - void DeviceContextD3D11Impl::Draw( DrawAttribs &drawAttribs ) + void DeviceContextD3D11Impl::PrepareForDraw(DRAW_FLAGS Flags) { #ifdef DEVELOPMENT - if ((drawAttribs.Flags & DRAW_FLAG_VERIFY_DRAW_ATTRIBS) != 0 && !DvpVerifyDrawArguments(drawAttribs)) - return; - - if ((drawAttribs.Flags & DRAW_FLAG_VERIFY_RENDER_TARGETS) != 0) + if ((Flags & DRAW_FLAG_VERIFY_RENDER_TARGETS) != 0) DvpVerifyRenderTargets(); #endif - const bool VerifyStates = (drawAttribs.Flags & DRAW_FLAG_VERIFY_STATES) != 0; auto* pd3d11InputLayout = m_pPipelineState->GetD3D11InputLayout(); if (pd3d11InputLayout != nullptr && !m_bCommittedD3D11VBsUpToDate) { @@ -757,7 +753,7 @@ namespace Diligent } #ifdef DEVELOPMENT - if (VerifyStates) + if ((Flags & DRAW_FLAG_VERIFY_STATES) != 0) { for (UINT Slot = 0; Slot < m_NumVertexStreams; ++Slot) { @@ -771,30 +767,7 @@ namespace Diligent } } } -#endif - - if (drawAttribs.IsIndexed) - { - if (m_CommittedIBFormat != drawAttribs.IndexType) - m_bCommittedD3D11IBUpToDate = false; - if (!m_bCommittedD3D11IBUpToDate) - { - CommitD3D11IndexBuffer(drawAttribs.IndexType); - } -#ifdef DEVELOPMENT - if (VerifyStates) - { - if (m_pIndexBuffer->IsInKnownState() && m_pIndexBuffer->CheckState(RESOURCE_STATE_UNORDERED_ACCESS)) - { - LOG_ERROR_MESSAGE("Buffer '", m_pIndexBuffer->GetDesc().Name, "' used as index buffer is in RESOURCE_STATE_UNORDERED_ACCESS state." - " Use appropriate state transition mode or explicitly transition the buffer to RESOURCE_STATE_INDEX_BUFFER state."); - } - } -#endif - } - -#ifdef DEVELOPMENT if(m_DebugFlags & (Uint32)EngineD3D11DebugFlags::VerifyCommittedResourceRelevance) { // Verify bindings after all resources are set @@ -807,42 +780,89 @@ namespace Diligent dbgVerifyCommittedShaders(); } #endif + } - auto* pIndirectDrawAttribsD3D11 = ValidatedCast(drawAttribs.pIndirectDrawAttribs); - if (pIndirectDrawAttribsD3D11 != nullptr) + void DeviceContextD3D11Impl::PrepareForIndexedDraw(DRAW_FLAGS Flags, VALUE_TYPE IndexType) + { + if (m_CommittedIBFormat != IndexType) + m_bCommittedD3D11IBUpToDate = false; + if (!m_bCommittedD3D11IBUpToDate) { - ID3D11Buffer* pd3d11ArgsBuff = pIndirectDrawAttribsD3D11->m_pd3d11Buffer; - if (drawAttribs.IsIndexed) - m_pd3d11DeviceContext->DrawIndexedInstancedIndirect( pd3d11ArgsBuff, drawAttribs.IndirectDrawArgsOffset ); - else - m_pd3d11DeviceContext->DrawInstancedIndirect( pd3d11ArgsBuff, drawAttribs.IndirectDrawArgsOffset ); + CommitD3D11IndexBuffer(IndexType); } - else +#ifdef DEVELOPMENT + if (Flags & DRAW_FLAG_VERIFY_STATES) { - if (drawAttribs.NumInstances > 1) - { - if( drawAttribs.IsIndexed ) - m_pd3d11DeviceContext->DrawIndexedInstanced( drawAttribs.NumIndices, drawAttribs.NumInstances, drawAttribs.FirstIndexLocation, drawAttribs.BaseVertex, drawAttribs.FirstInstanceLocation ); - else - m_pd3d11DeviceContext->DrawInstanced( drawAttribs.NumVertices, drawAttribs.NumInstances, drawAttribs.StartVertexLocation, drawAttribs.FirstInstanceLocation ); - } - else + if (m_pIndexBuffer->IsInKnownState() && m_pIndexBuffer->CheckState(RESOURCE_STATE_UNORDERED_ACCESS)) { - if (drawAttribs.IsIndexed) - m_pd3d11DeviceContext->DrawIndexed( drawAttribs.NumIndices, drawAttribs.FirstIndexLocation, drawAttribs.BaseVertex ); - else - m_pd3d11DeviceContext->Draw( drawAttribs.NumVertices, drawAttribs.StartVertexLocation ); + LOG_ERROR_MESSAGE("Buffer '", m_pIndexBuffer->GetDesc().Name, "' used as index buffer is in RESOURCE_STATE_UNORDERED_ACCESS state." + " Use appropriate state transition mode or explicitly transition the buffer to RESOURCE_STATE_INDEX_BUFFER state."); + } } +#endif + // We need to commit index buffer first because PrepareForDraw + // may verify committed resources. + PrepareForDraw(Flags); } - void DeviceContextD3D11Impl::DispatchCompute( const DispatchComputeAttribs &DispatchAttrs ) + void DeviceContextD3D11Impl::Draw(const DrawAttribs& Attribs) { -#ifdef DEVELOPMENT - if (!DvpVerifyDispatchArguments(DispatchAttrs)) + if (!DvpVerifyDrawArguments(Attribs)) + return; + + PrepareForDraw(Attribs.Flags); + + if (Attribs.NumInstances > 1) + m_pd3d11DeviceContext->DrawInstanced(Attribs.NumVertices, Attribs.NumInstances, Attribs.StartVertexLocation, Attribs.FirstInstanceLocation); + else + m_pd3d11DeviceContext->Draw(Attribs.NumVertices, Attribs.StartVertexLocation); + } + + void DeviceContextD3D11Impl::DrawIndexed(const DrawIndexedAttribs& Attribs) + { + if (!DvpVerifyDrawIndexedArguments(Attribs)) return; + PrepareForIndexedDraw(Attribs.Flags, Attribs.IndexType); + if (Attribs.NumInstances > 1) + m_pd3d11DeviceContext->DrawIndexedInstanced(Attribs.NumIndices, Attribs.NumInstances, Attribs.FirstIndexLocation, Attribs.BaseVertex, Attribs.FirstInstanceLocation); + else + m_pd3d11DeviceContext->DrawIndexed(Attribs.NumIndices, Attribs.FirstIndexLocation, Attribs.BaseVertex); + } + + void DeviceContextD3D11Impl::DrawIndirect(const DrawIndirectAttribs& Attribs, IBuffer* pAttribsBuffer) + { + if (!DvpVerifyDrawIndirectArguments(Attribs, pAttribsBuffer)) + return; + + PrepareForDraw(Attribs.Flags); + + auto* pIndirectDrawAttribsD3D11 = ValidatedCast(pAttribsBuffer); + ID3D11Buffer* pd3d11ArgsBuff = pIndirectDrawAttribsD3D11->m_pd3d11Buffer; + m_pd3d11DeviceContext->DrawInstancedIndirect( pd3d11ArgsBuff, Attribs.IndirectDrawArgsOffset ); + } + + + void DeviceContextD3D11Impl::DrawIndexedIndirect(const DrawIndexedIndirectAttribs& Attribs, IBuffer* pAttribsBuffer) + { + if (!DvpVerifyDrawIndexedIndirectArguments(Attribs, pAttribsBuffer)) + return; + + PrepareForIndexedDraw(Attribs.Flags, Attribs.IndexType); + + auto* pIndirectDrawAttribsD3D11 = ValidatedCast(pAttribsBuffer); + ID3D11Buffer* pd3d11ArgsBuff = pIndirectDrawAttribsD3D11->m_pd3d11Buffer; + m_pd3d11DeviceContext->DrawIndexedInstancedIndirect( pd3d11ArgsBuff, Attribs.IndirectDrawArgsOffset ); + } + + void DeviceContextD3D11Impl::DispatchCompute(const DispatchComputeAttribs& Attribs) + { + if (!DvpVerifyDispatchArguments(Attribs)) + return; + +#ifdef DEVELOPMENT if (m_DebugFlags & (Uint32)EngineD3D11DebugFlags::VerifyCommittedResourceRelevance) { // Verify bindings @@ -854,15 +874,31 @@ namespace Diligent } #endif - if (DispatchAttrs.pIndirectDispatchAttribs) + m_pd3d11DeviceContext->Dispatch(Attribs.ThreadGroupCountX, Attribs.ThreadGroupCountY, Attribs.ThreadGroupCountZ); + } + + void DeviceContextD3D11Impl::DispatchComputeIndirect(const DispatchComputeIndirectAttribs& Attribs, IBuffer* pAttribsBuffer) + { + if (!DvpVerifyDispatchIndirectArguments(Attribs, pAttribsBuffer)) + return; + +#ifdef DEVELOPMENT + if (m_DebugFlags & (Uint32)EngineD3D11DebugFlags::VerifyCommittedResourceRelevance) { - auto* pd3d11Buff = ValidatedCast(DispatchAttrs.pIndirectDispatchAttribs)->GetD3D11Buffer(); - m_pd3d11DeviceContext->DispatchIndirect( pd3d11Buff, DispatchAttrs.DispatchArgsByteOffset ); + // Verify bindings + dbgVerifyCommittedSRVs(); + dbgVerifyCommittedUAVs(SHADER_TYPE_COMPUTE); + dbgVerifyCommittedSamplers(); + dbgVerifyCommittedCBs(); + dbgVerifyCommittedShaders(); } - else - m_pd3d11DeviceContext->Dispatch( DispatchAttrs.ThreadGroupCountX, DispatchAttrs.ThreadGroupCountY, DispatchAttrs.ThreadGroupCountZ ); +#endif + + auto* pd3d11Buff = ValidatedCast(pAttribsBuffer)->GetD3D11Buffer(); + m_pd3d11DeviceContext->DispatchIndirect(pd3d11Buff, Attribs.DispatchArgsByteOffset); } + void DeviceContextD3D11Impl::ClearDepthStencil(ITextureView* pView, CLEAR_DEPTH_STENCIL_FLAGS ClearFlags, float fDepth, -- cgit v1.2.3