From d50d9030e3ba79a8ebe81c8982d5399c65073597 Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Tue, 21 Aug 2018 06:17:54 -0700 Subject: Fixed https://github.com/DiligentGraphics/DiligentCore/issues/19 (Add support for NULL buffers in SetVertexBuffers) --- .../include/DeviceContextVkImpl.h | 3 ++ .../src/DeviceContextVkImpl.cpp | 40 ++++++++++++++-------- 2 files changed, 29 insertions(+), 14 deletions(-) (limited to 'Graphics/GraphicsEngineVulkan') diff --git a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h index 9b8ad516..8fd6cf1a 100644 --- a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h +++ b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h @@ -228,6 +228,9 @@ private: VulkanDynamicHeap m_DynamicHeap; std::shared_ptr m_GenerateMipsHelper; RefCntAutoPtr m_GenerateMipsSRB; + + // In Vulkan we can't bind null vertex buffer, so we have to create a dummy VB + RefCntAutoPtr m_DummyVB; }; } diff --git a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp index f469e722..16885c3d 100644 --- a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp @@ -113,6 +113,13 @@ namespace Diligent m_GenerateMipsHelper(std::move(GenerateMipsHelper)) { m_GenerateMipsHelper->CreateSRB(&m_GenerateMipsSRB); + + BufferDesc DummyVBDesc; + DummyVBDesc.Name = "Dummy vertex buffer"; + DummyVBDesc.BindFlags = BIND_VERTEX_BUFFER; + DummyVBDesc.Usage = USAGE_DEFAULT; + DummyVBDesc.uiSizeInBytes = 32; + m_pDevice->CreateBuffer(DummyVBDesc, BufferData{}, &m_DummyVB); } DeviceContextVkImpl::~DeviceContextVkImpl() @@ -284,9 +291,8 @@ namespace Diligent for ( UINT Buff = 0; Buff < m_NumVertexStreams; ++Buff ) { auto& CurrStream = m_VertexStreams[Buff]; - VERIFY( CurrStream.pBuffer, "Attempting to bind a null buffer for rendering" ); auto* pBufferVk = CurrStream.pBuffer.RawPtr(); - if (!pBufferVk->CheckAccessFlags(VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT)) + if (pBufferVk != nullptr && !pBufferVk->CheckAccessFlags(VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT)) BufferMemoryBarrier(*pBufferVk, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT); } } @@ -305,23 +311,29 @@ namespace Diligent for ( UINT slot = 0; slot < m_NumVertexStreams; ++slot ) { auto& CurrStream = m_VertexStreams[slot]; - VERIFY( CurrStream.pBuffer, "Attempting to bind a null buffer for rendering" ); - - auto* pBufferVk = CurrStream.pBuffer.RawPtr(); - if (pBufferVk->GetDesc().Usage == USAGE_DYNAMIC) + if (auto* pBufferVk = CurrStream.pBuffer.RawPtr()) { - DynamicBufferPresent = true; + if (pBufferVk->GetDesc().Usage == USAGE_DYNAMIC) + { + DynamicBufferPresent = true; #ifdef DEVELOPMENT - pBufferVk->DvpVerifyDynamicAllocation(this); + pBufferVk->DvpVerifyDynamicAllocation(this); #endif - } - if (!pBufferVk->CheckAccessFlags(VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT)) - BufferMemoryBarrier(*pBufferVk, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT); + } + if (!pBufferVk->CheckAccessFlags(VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT)) + BufferMemoryBarrier(*pBufferVk, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT); - // Device context keeps strong references to all vertex buffers. + // Device context keeps strong references to all vertex buffers. - vkVertexBuffers[slot] = pBufferVk->GetVkBuffer(); - Offsets[slot] = CurrStream.Offset + pBufferVk->GetDynamicOffset(m_ContextId, this); + vkVertexBuffers[slot] = pBufferVk->GetVkBuffer(); + Offsets[slot] = CurrStream.Offset + pBufferVk->GetDynamicOffset(m_ContextId, this); + } + else + { + // We can't bind null vertex buffer in Vulkan and have to use a dummy one + vkVertexBuffers[slot] = m_DummyVB.RawPtr()->GetVkBuffer(); + Offsets[slot] = 0; + } } //GraphCtx.FlushResourceBarriers(); -- cgit v1.2.3