summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-08-21 13:17:54 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-08-21 13:17:54 +0000
commitd50d9030e3ba79a8ebe81c8982d5399c65073597 (patch)
treec6102e6d2428fe829d5e238b863cf57c7c9f0272 /Graphics/GraphicsEngineVulkan
parentRemoved dummy shader variable. Added final kw to implementation classes. (diff)
downloadDiligentCore-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.h3
-rw-r--r--Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp40
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();