diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2018-12-03 15:59:56 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2018-12-03 15:59:56 +0000 |
| commit | b055f0861083429bc2e6533332352f668b715493 (patch) | |
| tree | 93b8844b51b9a1ab6d992c33c8b5ece5982c4248 /Graphics/GraphicsEngineVulkan | |
| parent | Made DeviceContextBase template class little more readable by keeping only tw... (diff) | |
| download | DiligentCore-b055f0861083429bc2e6533332352f668b715493.tar.gz DiligentCore-b055f0861083429bc2e6533332352f668b715493.zip | |
Removed DRAW_FLAG_TRANSITION_VERTEX_BUFFERS, DRAW_FLAG_TRANSITION_INDEX_BUFFER, and DRAW_FLAG_TRANSITION_INDIRECT_ARGS_BUFFER flags
Removed DISPATCH_FLAGS enum
Added IndirectAttribsBufferStateTransitionMode member to DrawAttribs and DispatchComputeAttribs
Added StateTransitionMode parameter to SetVertexBuffers and SetIndexBuffer methods
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h | 16 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp | 137 |
2 files changed, 47 insertions, 106 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h index dbc8226c..19659935 100644 --- a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h +++ b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h @@ -80,15 +80,16 @@ public: virtual void SetBlendFactors(const float* pBlendFactors = nullptr)override final; - virtual void SetVertexBuffers( Uint32 StartSlot, - Uint32 NumBuffersSet, - IBuffer** ppBuffers, - Uint32* pOffsets, - SET_VERTEX_BUFFERS_FLAGS Flags )override final; + virtual void SetVertexBuffers( Uint32 StartSlot, + Uint32 NumBuffersSet, + IBuffer** ppBuffers, + Uint32* pOffsets, + RESOURCE_STATE_TRANSITION_MODE StateTransitionMode, + SET_VERTEX_BUFFERS_FLAGS Flags )override final; virtual void InvalidateState()override final; - virtual void SetIndexBuffer( IBuffer* pIndexBuffer, Uint32 ByteOffset )override final; + virtual void SetIndexBuffer( IBuffer* pIndexBuffer, Uint32 ByteOffset, RESOURCE_STATE_TRANSITION_MODE StateTransitionMode )override final; virtual void SetViewports( Uint32 NumViewports, const Viewport* pViewports, Uint32 RTWidth, Uint32 RTHeight )override final; @@ -245,8 +246,7 @@ public: private: void TransitionRenderTargets(SET_RENDER_TARGETS_FLAGS Flags); inline void CommitRenderPassAndFramebuffer(); - void CommitVkVertexBuffers(bool TransitionBuffers, bool VerifyStates); - void TransitionVkVertexBuffers(); + void CommitVkVertexBuffers(); void CommitViewports(); void CommitScissorRects(); diff --git a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp index 2530235b..26a5fa06 100644 --- a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp @@ -289,24 +289,7 @@ namespace Diligent } } - void DeviceContextVkImpl::TransitionVkVertexBuffers() - { - for ( Uint32 Buff = 0; Buff < m_NumVertexStreams; ++Buff ) - { - auto& CurrStream = m_VertexStreams[Buff]; - auto* pBufferVk = CurrStream.pBuffer.RawPtr(); - if (pBufferVk != nullptr && pBufferVk->IsInKnownState()) - { - if (!pBufferVk->CheckState(RESOURCE_STATE_VERTEX_BUFFER)) - { - TransitionBufferState(*pBufferVk, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_VERTEX_BUFFER, true); - } - VERIFY_EXPR(pBufferVk->CheckAccessFlags(VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT)); - } - } - } - - void DeviceContextVkImpl::CommitVkVertexBuffers(bool TransitionBuffers, bool VerifyStates) + void DeviceContextVkImpl::CommitVkVertexBuffers() { #ifdef DEVELOPMENT if (m_NumVertexStreams < m_pPipelineState->GetNumBufferSlotsUsed()) @@ -330,24 +313,6 @@ namespace Diligent #endif } - if (TransitionBuffers) - { - if (pBufferVk->IsInKnownState()) - { - if (!pBufferVk->CheckState(RESOURCE_STATE_VERTEX_BUFFER)) - { - TransitionBufferState(*pBufferVk, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_VERTEX_BUFFER, true); - } - VERIFY_EXPR(pBufferVk->CheckAccessFlags(VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT)); - } - } -#ifdef DEVELOPMENT - else if (VerifyStates) - { - DvpVerifyBufferState(*pBufferVk, RESOURCE_STATE_VERTEX_BUFFER, "Binding vertex buffers (DeviceContextVkImpl::CommitVkVertexBuffers)"); - } -#endif - // Device context keeps strong references to all vertex buffers. vkVertexBuffers[slot] = pBufferVk->GetVkBuffer(); @@ -423,63 +388,33 @@ namespace Diligent if ( drawAttribs.IsIndexed ) { #ifdef DEVELOPMENT - if (m_pIndexBuffer == nullptr) + if (VerifyStates) { - LOG_ERROR("Index buffer is not set up for indexed draw command"); - return; + DvpVerifyBufferState(*m_pIndexBuffer, RESOURCE_STATE_INDEX_BUFFER, "Indexed draw call (DeviceContextVkImpl::Draw)"); } #endif - - BufferVkImpl *pBuffVk = m_pIndexBuffer.RawPtr<BufferVkImpl>(); - if (drawAttribs.Flags & DRAW_FLAG_TRANSITION_INDEX_BUFFER) - { - if (pBuffVk->IsInKnownState()) - { - if (!pBuffVk->CheckState(RESOURCE_STATE_INDEX_BUFFER)) - { - TransitionBufferState(*pBuffVk, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_INDEX_BUFFER, true); - } - VERIFY_EXPR(pBuffVk->CheckAccessFlags(VK_ACCESS_INDEX_READ_BIT)); - } - } -#ifdef DEVELOPMENT - else if (VerifyStates) - { - DvpVerifyBufferState(*pBuffVk, RESOURCE_STATE_INDEX_BUFFER, "Indexed draw call (DeviceContextVkImpl::Draw)"); - } -#endif - DEV_CHECK_ERR(drawAttribs.IndexType == VT_UINT16 || drawAttribs.IndexType == VT_UINT32, "Unsupported index format. Only R16_UINT and R32_UINT are allowed."); VkIndexType vkIndexType = drawAttribs.IndexType == VT_UINT16 ? VK_INDEX_TYPE_UINT16 : VK_INDEX_TYPE_UINT32; - m_CommandBuffer.BindIndexBuffer(pBuffVk->GetVkBuffer(), m_IndexDataStartOffset + pBuffVk->GetDynamicOffset(m_ContextId, this), vkIndexType); + m_CommandBuffer.BindIndexBuffer(m_pIndexBuffer->GetVkBuffer(), m_IndexDataStartOffset + m_pIndexBuffer->GetDynamicOffset(m_ContextId, this), vkIndexType); } - auto TransitionVertexBuffers = (drawAttribs.Flags & DRAW_FLAG_TRANSITION_VERTEX_BUFFERS) != 0; - if (m_State.CommittedVBsUpToDate) + if (!m_State.CommittedVBsUpToDate) { - if (TransitionVertexBuffers) - { - TransitionVkVertexBuffers(); - } + CommitVkVertexBuffers(); + } #ifdef DEVELOPMENT - else if (VerifyStates) + if (VerifyStates) + { + for (Uint32 slot = 0; slot < m_NumVertexStreams; ++slot ) { - for (Uint32 slot = 0; slot < m_NumVertexStreams; ++slot ) + if (auto* pBufferVk = m_VertexStreams[slot].pBuffer.RawPtr()) { - auto& CurrStream = m_VertexStreams[slot]; - auto* pBufferVk = CurrStream.pBuffer.RawPtr(); - if (pBufferVk != nullptr) - { - DvpVerifyBufferState(*pBufferVk, RESOURCE_STATE_VERTEX_BUFFER, "Using vertex buffers (DeviceContextVkImpl::Draw)"); - } + DvpVerifyBufferState(*pBufferVk, RESOURCE_STATE_VERTEX_BUFFER, "Using vertex buffers (DeviceContextVkImpl::Draw)"); } } -#endif - } - else - { - CommitVkVertexBuffers(TransitionVertexBuffers, VerifyStates); } +#endif + if (m_DescrSetBindInfo.DynamicOffsetCount != 0) m_pPipelineState->BindDescriptorSetsWithDynamicOffsets(this, m_DescrSetBindInfo); #if 0 @@ -496,13 +431,7 @@ namespace Diligent if (pIndirectDrawAttribsVk != nullptr) { // Buffer memory barries must be executed outside of render pass - auto TransitionMode = - (drawAttribs.Flags & DRAW_FLAG_TRANSITION_INDIRECT_ARGS_BUFFER) ? - RESOURCE_STATE_TRANSITION_MODE_TRANSITION : - (VerifyStates ? - RESOURCE_STATE_TRANSITION_MODE_VERIFY : - RESOURCE_STATE_TRANSITION_MODE_NONE); - TransitionOrVerifyBufferState(*pIndirectDrawAttribsVk, TransitionMode, RESOURCE_STATE_INDIRECT_ARGUMENT, + TransitionOrVerifyBufferState(*pIndirectDrawAttribsVk, drawAttribs.IndirectAttribsBufferStateTransitionMode, RESOURCE_STATE_INDIRECT_ARGUMENT, VK_ACCESS_INDIRECT_COMMAND_READ_BIT, "Indirect draw (DeviceContextVkImpl::Draw)"); } @@ -538,7 +467,7 @@ namespace Diligent ++m_State.NumCommands; } - void DeviceContextVkImpl::DispatchCompute( const DispatchComputeAttribs &DispatchAttrs ) + void DeviceContextVkImpl::DispatchCompute( const DispatchComputeAttribs& DispatchAttrs ) { #ifdef DEVELOPMENT if (!DvpVerifyDispatchArguments(DispatchAttrs)) @@ -573,13 +502,7 @@ namespace Diligent #endif // Buffer memory barries must be executed outside of render pass - auto TransitionMode = - (DispatchAttrs.Flags & DISPATCH_FLAG_TRANSITION_INDIRECT_ARGS_BUFFER) ? - RESOURCE_STATE_TRANSITION_MODE_TRANSITION : - ((DispatchAttrs.Flags & DISPATCH_FLAG_VERIFY_STATES) ? - RESOURCE_STATE_TRANSITION_MODE_VERIFY : - RESOURCE_STATE_TRANSITION_MODE_NONE); - TransitionOrVerifyBufferState(*pBufferVk, TransitionMode, RESOURCE_STATE_INDIRECT_ARGUMENT, + TransitionOrVerifyBufferState(*pBufferVk, DispatchAttrs.IndirectAttribsBufferStateTransitionMode, RESOURCE_STATE_INDIRECT_ARGUMENT, VK_ACCESS_INDIRECT_COMMAND_READ_BIT, "Indirect dispatch (DeviceContextVkImpl::DispatchCompute)"); m_CommandBuffer.DispatchIndirect(pBufferVk->GetVkBuffer(), pBufferVk->GetDynamicOffset(m_ContextId, this) + DispatchAttrs.DispatchArgsByteOffset); @@ -922,9 +845,23 @@ namespace Diligent m_pPipelineState = nullptr; } - void DeviceContextVkImpl::SetVertexBuffers( Uint32 StartSlot, Uint32 NumBuffersSet, IBuffer **ppBuffers, Uint32 *pOffsets, SET_VERTEX_BUFFERS_FLAGS Flags ) + void DeviceContextVkImpl::SetVertexBuffers( Uint32 StartSlot, + Uint32 NumBuffersSet, + IBuffer** ppBuffers, + Uint32* pOffsets, + RESOURCE_STATE_TRANSITION_MODE StateTransitionMode, + SET_VERTEX_BUFFERS_FLAGS Flags ) { - TDeviceContextBase::SetVertexBuffers( StartSlot, NumBuffersSet, ppBuffers, pOffsets, Flags ); + TDeviceContextBase::SetVertexBuffers( StartSlot, NumBuffersSet, ppBuffers, pOffsets, StateTransitionMode, Flags ); + for ( Uint32 Buff = 0; Buff < m_NumVertexStreams; ++Buff ) + { + auto& CurrStream = m_VertexStreams[Buff]; + if(auto* pBufferVk = CurrStream.pBuffer.RawPtr()) + { + TransitionOrVerifyBufferState(*pBufferVk, StateTransitionMode, RESOURCE_STATE_VERTEX_BUFFER, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, + "Setting vertex buffers (DeviceContextVkImpl::SetVertexBuffers)"); + } + } m_State.CommittedVBsUpToDate = false; } @@ -942,9 +879,13 @@ namespace Diligent m_CommandBuffer.Reset(); } - void DeviceContextVkImpl::SetIndexBuffer( IBuffer *pIndexBuffer, Uint32 ByteOffset ) + void DeviceContextVkImpl::SetIndexBuffer( IBuffer *pIndexBuffer, Uint32 ByteOffset, RESOURCE_STATE_TRANSITION_MODE StateTransitionMode ) { - TDeviceContextBase::SetIndexBuffer( pIndexBuffer, ByteOffset ); + TDeviceContextBase::SetIndexBuffer( pIndexBuffer, ByteOffset, StateTransitionMode ); + if (m_pIndexBuffer) + { + TransitionOrVerifyBufferState(*m_pIndexBuffer, StateTransitionMode, RESOURCE_STATE_INDEX_BUFFER, VK_ACCESS_INDEX_READ_BIT, "Binding buffer as index buffer (DeviceContextVkImpl::SetIndexBuffer)" ); + } m_State.CommittedIBUpToDate = false; } |
