diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2018-08-21 13:17:54 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2018-08-21 13:17:54 +0000 |
| commit | d50d9030e3ba79a8ebe81c8982d5399c65073597 (patch) | |
| tree | c6102e6d2428fe829d5e238b863cf57c7c9f0272 /Graphics/GraphicsEngineVulkan | |
| parent | Removed dummy shader variable. Added final kw to implementation classes. (diff) | |
| download | DiligentCore-d50d9030e3ba79a8ebe81c8982d5399c65073597.tar.gz DiligentCore-d50d9030e3ba79a8ebe81c8982d5399c65073597.zip | |
Fixed https://github.com/DiligentGraphics/DiligentCore/issues/19 (Add support for NULL buffers in SetVertexBuffers)
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h | 3 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp | 40 |
2 files changed, 29 insertions, 14 deletions
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<GenerateMipsVkHelper> m_GenerateMipsHelper; RefCntAutoPtr<IShaderResourceBinding> m_GenerateMipsSRB; + + // In Vulkan we can't bind null vertex buffer, so we have to create a dummy VB + RefCntAutoPtr<IBuffer> 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<BufferVkImpl>()->GetVkBuffer(); + Offsets[slot] = 0; + } } //GraphCtx.FlushResourceBarriers(); |
