summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-06-01 15:33:49 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-06-01 15:33:49 +0000
commite8f6cc0e5f96af00a4f8c384d0b086f5a4f703d4 (patch)
treef7195525bfc1fce251819b217a871df902f66414 /Graphics/GraphicsEngineVulkan
parentImplemented command pool manager to handle multithreaded resource initializat... (diff)
downloadDiligentCore-e8f6cc0e5f96af00a4f8c384d0b086f5a4f703d4.tar.gz
DiligentCore-e8f6cc0e5f96af00a4f8c384d0b086f5a4f703d4.zip
Implemented indirect rendering in Vk
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp36
1 files changed, 20 insertions, 16 deletions
diff --git a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
index e41db8c5..0ba8ea70 100644
--- a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
@@ -397,8 +397,6 @@ namespace Diligent
CommitVkVertexBuffers();
#if 0
- GraphCtx.SetRootSignature( pPipelineStateVk->GetVkRootSignature() );
-
if(m_pCommittedResourceCache != nullptr)
{
pPipelineStateVk->GetRootSignature().CommitRootViews(*m_pCommittedResourceCache, GraphCtx, false, m_ContextId);
@@ -411,30 +409,36 @@ namespace Diligent
}
#endif
#endif
+ if( DrawAttribs.IsIndirect )
+ {
+ VERIFY(DrawAttribs.pIndirectDrawAttribs != nullptr, "Valid pIndirectDrawAttribs must be provided for indirect draw command");
+
+ auto *pBufferVk = ValidatedCast<BufferVkImpl>(DrawAttribs.pIndirectDrawAttribs);
+
+ // Buffer memory barries must be executed outside of render pass
+ if(!pBufferVk->CheckAccessFlags(VK_ACCESS_INDIRECT_COMMAND_READ_BIT))
+ BufferMemoryBarrier(*pBufferVk, VK_ACCESS_INDIRECT_COMMAND_READ_BIT);
+ }
if(m_CommandBuffer.GetState().RenderPass == VK_NULL_HANDLE)
CommitRenderPassAndFramebuffer(pPipelineStateVk);
if( DrawAttribs.IsIndirect )
{
-#if 0
if( auto *pBufferVk = ValidatedCast<BufferVkImpl>(DrawAttribs.pIndirectDrawAttribs) )
{
-#ifdef _DEBUG
- if(pBufferVk->GetDesc().Usage == USAGE_DYNAMIC)
- pBufferVk->DbgVerifyDynamicAllocation(m_ContextId);
-#endif
+//#ifdef _DEBUG
+// if(pBufferVk->GetDesc().Usage == USAGE_DYNAMIC)
+// pBufferVk->DbgVerifyDynamicAllocation(m_ContextId);
+//#endif
+ if(!pBufferVk->CheckAccessFlags(VK_ACCESS_INDIRECT_COMMAND_READ_BIT))
+ BufferMemoryBarrier(*pBufferVk, VK_ACCESS_INDIRECT_COMMAND_READ_BIT);
- GraphCtx.TransitionResource(pBufferVk, Vk_RESOURCE_STATE_INDIRECT_ARGUMENT);
- size_t BuffDataStartByteOffset;
- IVkResource *pVkArgsBuff = pBufferVk->GetVkBuffer(BuffDataStartByteOffset, m_ContextId);
- GraphCtx.ExecuteIndirect(DrawAttribs.IsIndexed ? m_pDrawIndexedIndirectSignature : m_pDrawIndirectSignature, pVkArgsBuff, DrawAttribs.IndirectDrawArgsOffset + BuffDataStartByteOffset);
- }
- else
- {
- LOG_ERROR_MESSAGE("Valid pIndirectDrawAttribs must be provided for indirect draw command");
+ if( DrawAttribs.IsIndexed )
+ m_CommandBuffer.DrawIndexedIndirect(pBufferVk->GetVkBuffer(), DrawAttribs.IndirectDrawArgsOffset, 1, 0);
+ else
+ m_CommandBuffer.DrawIndirect(pBufferVk->GetVkBuffer(), DrawAttribs.IndirectDrawArgsOffset, 1, 0);
}
-#endif
}
else
{