summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-05-08 02:24:41 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-05-08 02:24:41 +0000
commit00f29150efd4396b3b29c186c73e8c359fb6b59a (patch)
tree15b703e58d08d07b91931493941e84653a43cbbd /Graphics/GraphicsEngineVulkan
parentFixed pipeline layout initialization when not all set layouts are active (diff)
downloadDiligentCore-00f29150efd4396b3b29c186c73e8c359fb6b59a.tar.gz
DiligentCore-00f29150efd4396b3b29c186c73e8c359fb6b59a.zip
Updated VK Shader Resource layout to use one binding for resource arrays
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/include/PipelineLayout.h4
-rw-r--r--Graphics/GraphicsEngineVulkan/include/ShaderResourceLayoutVk.h5
-rw-r--r--Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp11
-rw-r--r--Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp8
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(