summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-05-07 15:22:59 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-05-07 15:22:59 +0000
commitf87c62800ea13334bb73297bf36dfb686684aa8d (patch)
treeb21867acdbc13baa43744dc231594c4bd8d0968c /Graphics/GraphicsEngineVulkan
parentFirst working implementation of pipeline layout initialization in Vulkan (diff)
downloadDiligentCore-f87c62800ea13334bb73297bf36dfb686684aa8d.tar.gz
DiligentCore-f87c62800ea13334bb73297bf36dfb686684aa8d.zip
Fixed pipeline layout initialization when not all set layouts are active
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp24
1 files changed, 12 insertions, 12 deletions
diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp
index eb54d855..3fab3341 100644
--- a/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp
@@ -232,27 +232,27 @@ void PipelineLayout::DescriptorSetLayoutManager::Finalize(const VulkanUtilities:
}
m_LayoutBindings.resize(TotalBindings);
size_t BindingOffset = 0;
+ std::array<VkDescriptorSetLayout, 2> ActiveDescrSetLayouts;
+ int CurrActiveSet = 0;
for(size_t i=0; i < m_DescriptorSetLayouts.size(); ++i)
{
auto &Layout = m_DescriptorSetLayouts[i];
- std::copy(Layout.pBindings, Layout.pBindings + Layout.NumLayoutBindings, m_LayoutBindings.begin() + BindingOffset);
- Layout.Finalize(LogicalDevice, m_MemAllocator, &m_LayoutBindings[BindingOffset]);
- BindingOffset += Layout.NumLayoutBindings;
+ if(Layout.SetIndex >= 0)
+ {
+ std::copy(Layout.pBindings, Layout.pBindings + Layout.NumLayoutBindings, m_LayoutBindings.begin() + BindingOffset);
+ Layout.Finalize(LogicalDevice, m_MemAllocator, &m_LayoutBindings[BindingOffset]);
+ BindingOffset += Layout.NumLayoutBindings;
+ ActiveDescrSetLayouts[CurrActiveSet++] = Layout.VkLayout;
+ }
}
+ VERIFY_EXPR(CurrActiveSet == m_ActiveSets);
VkPipelineLayoutCreateInfo PipelineLayoutCI = {};
PipelineLayoutCI.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
PipelineLayoutCI.pNext = nullptr;
PipelineLayoutCI.flags = 0; // reserved for future use
- PipelineLayoutCI.setLayoutCount = static_cast<uint32_t>(m_DescriptorSetLayouts.size());
-
- std::vector<VkDescriptorSetLayout, STDAllocatorRawMem<VkDescriptorSetLayout> >
- VkDescrSetLayout(m_DescriptorSetLayouts.size(),
- VK_NULL_HANDLE,
- STD_ALLOCATOR_RAW_MEM(VkDescriptorSetLayout, m_MemAllocator, "Allocator for vector<VkDescriptorSetLayout>"));
- for(size_t i=0; i < m_DescriptorSetLayouts.size(); ++i)
- VkDescrSetLayout[i] = m_DescriptorSetLayouts[i].VkLayout;
- PipelineLayoutCI.pSetLayouts = !VkDescrSetLayout.empty() ? VkDescrSetLayout.data() : nullptr;
+ PipelineLayoutCI.setLayoutCount = m_ActiveSets;
+ PipelineLayoutCI.pSetLayouts = PipelineLayoutCI.setLayoutCount != 0 ? ActiveDescrSetLayouts.data() : nullptr;
PipelineLayoutCI.pushConstantRangeCount = 0;
PipelineLayoutCI.pPushConstantRanges = nullptr;
m_VkPipelineLayout = LogicalDevice.CreatePipelineLayout(PipelineLayoutCI);