diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2018-05-08 02:24:41 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2018-05-08 02:24:41 +0000 |
| commit | 00f29150efd4396b3b29c186c73e8c359fb6b59a (patch) | |
| tree | 15b703e58d08d07b91931493941e84653a43cbbd /Graphics/GraphicsEngineVulkan | |
| parent | Fixed pipeline layout initialization when not all set layouts are active (diff) | |
| download | DiligentCore-00f29150efd4396b3b29c186c73e8c359fb6b59a.tar.gz DiligentCore-00f29150efd4396b3b29c186c73e8c359fb6b59a.zip | |
Updated VK Shader Resource layout to use one binding for resource arrays
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
4 files changed, 19 insertions, 9 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h b/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h index b382f0f3..8c4b5dc9 100644 --- a/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h +++ b/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h @@ -61,6 +61,7 @@ public: SHADER_TYPE ShaderType, Uint32 &DescriptorSet, Uint32 &Binding, + Uint32 &OffsetFromTableStart, std::vector<uint32_t> &SPIRV); #if 0 @@ -153,7 +154,8 @@ private: void AllocateResourceSlot(const SPIRVShaderResourceAttribs &ResAttribs, SHADER_TYPE ShaderType, Uint32 &DescriptorSet, - Uint32 &Binding); + Uint32 &Binding, + Uint32 &OffsetFromTableStart); private: IMemoryAllocator &m_MemAllocator; VulkanUtilities::PipelineLayoutWrapper m_VkPipelineLayout; diff --git a/Graphics/GraphicsEngineVulkan/include/ShaderResourceLayoutVk.h b/Graphics/GraphicsEngineVulkan/include/ShaderResourceLayoutVk.h index 8999279a..0238df8d 100644 --- a/Graphics/GraphicsEngineVulkan/include/ShaderResourceLayoutVk.h +++ b/Graphics/GraphicsEngineVulkan/include/ShaderResourceLayoutVk.h @@ -165,15 +165,18 @@ public: const Uint16 Binding; const Uint16 DescriptorSet; + const Uint32 OffsetFromSetStart; const SPIRVShaderResourceAttribs &SpirvAttribs; ShaderResourceLayoutVk &ParentResLayout; VkResource(ShaderResourceLayoutVk &_ParentLayout, const SPIRVShaderResourceAttribs &_SpirvAttribs, uint32_t _Binding, - uint32_t _DescriptorSet) : + uint32_t _DescriptorSet, + Uint32 _OffsetFromSetStart) : Binding(static_cast<decltype(Binding)>(_Binding)), DescriptorSet(static_cast<decltype(DescriptorSet)>(_DescriptorSet)), + OffsetFromSetStart(_OffsetFromSetStart), SpirvAttribs(_SpirvAttribs), ParentResLayout(_ParentLayout) { diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp index 3fab3341..f1e81392 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp @@ -297,7 +297,8 @@ size_t PipelineLayout::DescriptorSetLayoutManager::GetHash()const void PipelineLayout::DescriptorSetLayoutManager::AllocateResourceSlot(const SPIRVShaderResourceAttribs &ResAttribs, SHADER_TYPE ShaderType, Uint32 &DescriptorSet, - Uint32 &Binding) + Uint32 &Binding, + Uint32 &OffsetFromTableStart) { auto& DescrSet = GetDescriptorSet(ResAttribs.VarType); if (DescrSet.SetIndex < 0) @@ -307,13 +308,14 @@ void PipelineLayout::DescriptorSetLayoutManager::AllocateResourceSlot(const SPIR DescriptorSet = DescrSet.SetIndex; VkDescriptorSetLayoutBinding VkBinding = {}; - VkBinding.binding = DescrSet.TotalDescriptors; - Binding = DescrSet.TotalDescriptors; + Binding = DescrSet.NumLayoutBindings; + VkBinding.binding = Binding; static const ResourceTypeToVkDescriptorType ResTypeToVkDescrType; VkBinding.descriptorType = ResTypeToVkDescrType[ResAttribs.Type]; VkBinding.descriptorCount = ResAttribs.ArraySize; VkBinding.stageFlags = ShaderTypeToVkShaderStageFlagBit(ShaderType); VkBinding.pImmutableSamplers = nullptr; + OffsetFromTableStart = DescrSet.TotalDescriptors; DescrSet.AddBinding(VkBinding, m_MemAllocator); } @@ -443,9 +445,10 @@ void PipelineLayout::AllocateResourceSlot(const SPIRVShaderResourceAttribs &ResA SHADER_TYPE ShaderType, Uint32 &DescriptorSet, // Output parameter Uint32 &Binding, // Output parameter + Uint32 &OffsetFromTableStart, std::vector<uint32_t> &SPIRV) { - m_LayoutMgr.AllocateResourceSlot(ResAttribs, ShaderType, DescriptorSet, Binding); + m_LayoutMgr.AllocateResourceSlot(ResAttribs, ShaderType, DescriptorSet, Binding, OffsetFromTableStart); SPIRV[ResAttribs.BindingDecorationOffset] = Binding; SPIRV[ResAttribs.DescriptorSetDecorationOffset] = DescriptorSet; diff --git a/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp b/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp index fe5a6fa7..0d2a54bb 100644 --- a/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp +++ b/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp @@ -208,10 +208,11 @@ void ShaderResourceLayoutVk::Initialize(const VulkanUtilities::VulkanLogicalDevi { Uint32 Binding = 0; Uint32 DescriptorSet = 0; + Uint32 OffsetFromSetStart = 0; if (pPipelineLayout) { VERIFY_EXPR(pSPIRV != nullptr); - pPipelineLayout->AllocateResourceSlot(Attribs, m_pResources->GetShaderType(), DescriptorSet, Binding, *pSPIRV); + pPipelineLayout->AllocateResourceSlot(Attribs, m_pResources->GetShaderType(), DescriptorSet, Binding, OffsetFromSetStart, *pSPIRV); VERIFY(DescriptorSet <= std::numeric_limits<decltype(VkResource::DescriptorSet)>::max(), "Descriptor set (", DescriptorSet, ") excceeds representable max value"); VERIFY(Binding <= std::numeric_limits<decltype(VkResource::Binding)>::max(), "Binding (", Binding, ") excceeds representable max value"); } @@ -229,12 +230,13 @@ void ShaderResourceLayoutVk::Initialize(const VulkanUtilities::VulkanLogicalDevi VERIFY_EXPR(m_pResourceCache != nullptr); DescriptorSet = Attribs.Type; - Binding = StaticResCacheSetSizes[DescriptorSet]; + OffsetFromSetStart = StaticResCacheSetSizes[DescriptorSet]; + Binding = 0; StaticResCacheSetSizes[DescriptorSet] += Attribs.ArraySize; } // Static samplers are never copied, and SamplerId == InvalidSamplerId - ::new (&GetResource(Attribs.VarType, CurrResInd[Attribs.VarType]++)) VkResource( *this, Attribs, Binding, DescriptorSet ); + ::new (&GetResource(Attribs.VarType, CurrResInd[Attribs.VarType]++)) VkResource( *this, Attribs, Binding, DescriptorSet, OffsetFromSetStart); }; m_pResources->ProcessResources( |
