summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2019-02-28 04:56:45 +0000
committerEgor Yusov <egor.yusov@gmail.com>2019-02-28 04:56:45 +0000
commit26e240dfcb3dad8527a25c0f6270395528a5a71e (patch)
tree857d318e6350489ad590d2c38e628d318449736f /Graphics/GraphicsEngineVulkan
parentWorking on resource binding API refactor (diff)
downloadDiligentCore-26e240dfcb3dad8527a25c0f6270395528a5a71e.tar.gz
DiligentCore-26e240dfcb3dad8527a25c0f6270395528a5a71e.zip
Fixed PipelineLayoutVk
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/include/PipelineLayout.h12
-rw-r--r--Graphics/GraphicsEngineVulkan/include/RenderDeviceVkImpl.h6
-rw-r--r--Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp23
-rw-r--r--Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp2
4 files changed, 23 insertions, 20 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h b/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h
index f970501a..a875cb90 100644
--- a/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h
+++ b/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h
@@ -58,6 +58,7 @@ public:
const char* DbgPipelineName)const;
void AllocateResourceSlot(const SPIRVShaderResourceAttribs& ResAttribs,
+ SHADER_RESOURCE_VARIABLE_TYPE VariableType,
VkSampler vkStaticSampler,
SHADER_TYPE ShaderType,
Uint32& DescriptorSet,
@@ -65,9 +66,9 @@ public:
Uint32& OffsetInCache,
std::vector<uint32_t>& SPIRV);
- Uint32 GetTotalDescriptors(SHADER_VARIABLE_TYPE VarType)const
+ Uint32 GetTotalDescriptors(SHADER_RESOURCE_VARIABLE_TYPE VarType)const
{
- VERIFY_EXPR(VarType >= 0 && VarType < SHADER_VARIABLE_TYPE_NUM_TYPES);
+ VERIFY_EXPR(VarType >= 0 && VarType < SHADER_RESOURCE_VARIABLE_TYPE_NUM_TYPES);
return m_LayoutMgr.GetDescriptorSet(VarType).TotalDescriptors;
}
@@ -82,7 +83,7 @@ public:
VkDescriptorSetLayout GetDynamicDescriptorSetVkLayout()const
{
- return m_LayoutMgr.GetDescriptorSet(SHADER_VARIABLE_TYPE_DYNAMIC).VkLayout;
+ return m_LayoutMgr.GetDescriptorSet(SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC).VkLayout;
}
struct DescriptorSetBindInfo
@@ -178,8 +179,8 @@ private:
void Finalize(const VulkanUtilities::VulkanLogicalDevice &LogicalDevice);
void Release(RenderDeviceVkImpl* pRenderDeviceVk, Uint64 CommandQueueMask);
- DescriptorSetLayout& GetDescriptorSet(SHADER_VARIABLE_TYPE VarType) { return m_DescriptorSetLayouts[VarType == SHADER_VARIABLE_TYPE_DYNAMIC ? 1 : 0]; }
- const DescriptorSetLayout& GetDescriptorSet(SHADER_VARIABLE_TYPE VarType)const { return m_DescriptorSetLayouts[VarType == SHADER_VARIABLE_TYPE_DYNAMIC ? 1 : 0]; }
+ DescriptorSetLayout& GetDescriptorSet(SHADER_RESOURCE_VARIABLE_TYPE VarType) { return m_DescriptorSetLayouts[VarType == SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC ? 1 : 0]; }
+ const DescriptorSetLayout& GetDescriptorSet(SHADER_RESOURCE_VARIABLE_TYPE VarType)const { return m_DescriptorSetLayouts[VarType == SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC ? 1 : 0]; }
bool operator == (const DescriptorSetLayoutManager& rhs)const;
bool operator != (const DescriptorSetLayoutManager& rhs)const {return !(*this == rhs);}
@@ -187,6 +188,7 @@ private:
VkPipelineLayout GetVkPipelineLayout()const{return m_VkPipelineLayout;}
void AllocateResourceSlot(const SPIRVShaderResourceAttribs& ResAttribs,
+ SHADER_RESOURCE_VARIABLE_TYPE VariableType,
VkSampler vkStaticSampler,
SHADER_TYPE ShaderType,
Uint32& DescriptorSet,
diff --git a/Graphics/GraphicsEngineVulkan/include/RenderDeviceVkImpl.h b/Graphics/GraphicsEngineVulkan/include/RenderDeviceVkImpl.h
index 64410774..c0e2847b 100644
--- a/Graphics/GraphicsEngineVulkan/include/RenderDeviceVkImpl.h
+++ b/Graphics/GraphicsEngineVulkan/include/RenderDeviceVkImpl.h
@@ -66,13 +66,13 @@ public:
Uint32 NumDeferredContexts );
~RenderDeviceVkImpl();
- virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject** ppInterface )override final;
+ virtual void QueryInterface(const INTERFACE_ID& IID, IObject** ppInterface )override final;
- virtual void CreatePipelineState( const PipelineStateDesc &PipelineDesc, IPipelineState** ppPipelineState )override final;
+ virtual void CreatePipelineState(const PipelineStateDesc& PipelineDesc, IPipelineState** ppPipelineState)override final;
virtual void CreateBuffer(const BufferDesc& BuffDesc, const BufferData* pBuffData, IBuffer** ppBuffer)override final;
- virtual void CreateShader(const ShaderCreationAttribs& ShaderCreationAttribs, IShader** ppShader)override final;
+ virtual void CreateShader(const ShaderCreateInfo& ShaderCreateInfo, IShader** ppShader)override final;
virtual void CreateTexture(const TextureDesc& TexDesc, const TextureData* pData, ITexture** ppTexture)override final;
diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp
index 6e930bcc..7ce29a6f 100644
--- a/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp
@@ -315,13 +315,14 @@ size_t PipelineLayout::DescriptorSetLayoutManager::GetHash()const
}
void PipelineLayout::DescriptorSetLayoutManager::AllocateResourceSlot(const SPIRVShaderResourceAttribs& ResAttribs,
+ SHADER_RESOURCE_VARIABLE_TYPE VariableType,
VkSampler vkStaticSampler,
SHADER_TYPE ShaderType,
Uint32& DescriptorSet,
Uint32& Binding,
Uint32& OffsetInCache)
{
- auto& DescrSet = GetDescriptorSet(ResAttribs.VarType);
+ auto& DescrSet = GetDescriptorSet(VariableType);
if (DescrSet.SetIndex < 0)
{
DescrSet.SetIndex = m_ActiveSets++;
@@ -335,9 +336,8 @@ void PipelineLayout::DescriptorSetLayoutManager::AllocateResourceSlot(const SPIR
VkBinding.descriptorCount = ResAttribs.ArraySize;
// There are no limitations on what combinations of stages can use a descriptor binding (13.2.1)
VkBinding.stageFlags = ShaderTypeToVkShaderStageFlagBit(ShaderType);
- if (ResAttribs.IsImmutableSamplerAssigned())
+ if (vkStaticSampler != VK_NULL_HANDLE)
{
- VERIFY(vkStaticSampler != VK_NULL_HANDLE, "No static sampler provided");
// If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and
// descriptorCount is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a valid pointer
// to an array of descriptorCount valid VkSampler handles (13.2.1)
@@ -365,6 +365,7 @@ void PipelineLayout::Release(RenderDeviceVkImpl *pDeviceVkImpl, Uint64 CommandQu
}
void PipelineLayout::AllocateResourceSlot(const SPIRVShaderResourceAttribs& ResAttribs,
+ SHADER_RESOURCE_VARIABLE_TYPE VariableType,
VkSampler vkStaticSampler,
SHADER_TYPE ShaderType,
Uint32& DescriptorSet, // Output parameter
@@ -372,7 +373,7 @@ void PipelineLayout::AllocateResourceSlot(const SPIRVShaderResourceAttribs& ResA
Uint32& OffsetInCache,
std::vector<uint32_t>& SPIRV)
{
- m_LayoutMgr.AllocateResourceSlot(ResAttribs, vkStaticSampler, ShaderType, DescriptorSet, Binding, OffsetInCache);
+ m_LayoutMgr.AllocateResourceSlot(ResAttribs, VariableType,vkStaticSampler, ShaderType, DescriptorSet, Binding, OffsetInCache);
SPIRV[ResAttribs.BindingDecorationOffset] = Binding;
SPIRV[ResAttribs.DescriptorSetDecorationOffset] = DescriptorSet;
}
@@ -387,14 +388,14 @@ std::array<Uint32, 2> PipelineLayout::GetDescriptorSetSizes(Uint32& NumSets)cons
NumSets = 0;
std::array<Uint32, 2> SetSizes = {};
- const auto &StaticAndMutSet = m_LayoutMgr.GetDescriptorSet(SHADER_VARIABLE_TYPE_STATIC);
+ const auto &StaticAndMutSet = m_LayoutMgr.GetDescriptorSet(SHADER_RESOURCE_VARIABLE_TYPE_STATIC);
if (StaticAndMutSet.SetIndex >= 0)
{
NumSets = std::max(NumSets, static_cast<Uint32>(StaticAndMutSet.SetIndex + 1));
SetSizes[StaticAndMutSet.SetIndex] = StaticAndMutSet.TotalDescriptors;
}
- const auto &DynamicSet = m_LayoutMgr.GetDescriptorSet(SHADER_VARIABLE_TYPE_DYNAMIC);
+ const auto &DynamicSet = m_LayoutMgr.GetDescriptorSet(SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
if (DynamicSet.SetIndex >= 0)
{
NumSets = std::max(NumSets, static_cast<Uint32>(DynamicSet.SetIndex + 1));
@@ -416,7 +417,7 @@ void PipelineLayout::InitResourceCache(RenderDeviceVkImpl* pDeviceVkImpl,
// Resources are initialized by source layout when shader resource binding objects are created
ResourceCache.InitializeSets(CacheMemAllocator, NumSets, SetSizes.data());
- const auto& StaticAndMutSet = m_LayoutMgr.GetDescriptorSet(SHADER_VARIABLE_TYPE_STATIC);
+ const auto& StaticAndMutSet = m_LayoutMgr.GetDescriptorSet(SHADER_RESOURCE_VARIABLE_TYPE_STATIC);
if (StaticAndMutSet.SetIndex >= 0)
{
const char* DescrSetName = "Static/Mutable Descriptor Set";
@@ -443,11 +444,11 @@ void PipelineLayout::PrepareDescriptorSets(DeviceContextVkImpl* pCtxVkI
// Do not use vector::resize for BindInfo.vkSets and BindInfo.DynamicOffsets as this
// causes unnecessary work to zero-initialize new elements
- VERIFY(m_LayoutMgr.GetDescriptorSet(SHADER_VARIABLE_TYPE_STATIC).SetIndex == m_LayoutMgr.GetDescriptorSet(SHADER_VARIABLE_TYPE_MUTABLE).SetIndex,
+ VERIFY(m_LayoutMgr.GetDescriptorSet(SHADER_RESOURCE_VARIABLE_TYPE_STATIC).SetIndex == m_LayoutMgr.GetDescriptorSet(SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE).SetIndex,
"Static and mutable variables are expected to share the same descriptor set");
Uint32 TotalDynamicDescriptors = 0;
BindInfo.SetCout = 0;
- for(SHADER_VARIABLE_TYPE VarType = SHADER_VARIABLE_TYPE_MUTABLE; VarType <= SHADER_VARIABLE_TYPE_DYNAMIC; VarType = static_cast<SHADER_VARIABLE_TYPE>(VarType+1))
+ for(SHADER_RESOURCE_VARIABLE_TYPE VarType = SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE; VarType <= SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC; VarType = static_cast<SHADER_RESOURCE_VARIABLE_TYPE>(VarType+1))
{
const auto& Set = m_LayoutMgr.GetDescriptorSet(VarType);
if (Set.SetIndex >= 0)
@@ -456,7 +457,7 @@ void PipelineLayout::PrepareDescriptorSets(DeviceContextVkImpl* pCtxVkI
if (BindInfo.SetCout > BindInfo.vkSets.size())
BindInfo.vkSets.resize(BindInfo.SetCout);
VERIFY_EXPR(BindInfo.vkSets[Set.SetIndex] == VK_NULL_HANDLE);
- if (VarType == SHADER_VARIABLE_TYPE_MUTABLE)
+ if (VarType == SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE)
BindInfo.vkSets[Set.SetIndex] = ResourceCache.GetDescriptorSet(Set.SetIndex).GetVkDescriptorSet();
else
{
@@ -506,7 +507,7 @@ void PipelineLayout::BindDescriptorSetsWithDynamicOffsets(DeviceContextVkImpl*
VERIFY_EXPR(BindInfo.pResourceCache != nullptr);
#ifdef _DEBUG
Uint32 TotalDynamicDescriptors = 0;
- for (SHADER_VARIABLE_TYPE VarType = SHADER_VARIABLE_TYPE_MUTABLE; VarType <= SHADER_VARIABLE_TYPE_DYNAMIC; VarType = static_cast<SHADER_VARIABLE_TYPE>(VarType + 1))
+ for (SHADER_RESOURCE_VARIABLE_TYPE VarType = SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE; VarType <= SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC; VarType = static_cast<SHADER_RESOURCE_VARIABLE_TYPE>(VarType + 1))
{
const auto &Set = m_LayoutMgr.GetDescriptorSet(VarType);
TotalDynamicDescriptors += Set.NumDynamicDescriptors;
diff --git a/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp b/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp
index 9151fc9a..546fd01e 100644
--- a/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/ShaderResourceLayoutVk.cpp
@@ -338,7 +338,7 @@ void ShaderResourceLayoutVk::Initialize(IRenderDevice*
}
auto& ShaderSPIRV = SPIRVs[ShaderInd];
- PipelineLayout.AllocateResourceSlot(Attribs, vkImmutableSampler, Resources.GetShaderType(), DescriptorSet, Binding, CacheOffset, ShaderSPIRV);
+ PipelineLayout.AllocateResourceSlot(Attribs, VarType, vkImmutableSampler, Resources.GetShaderType(), DescriptorSet, Binding, CacheOffset, ShaderSPIRV);
VERIFY(DescriptorSet <= std::numeric_limits<decltype(VkResource::DescriptorSet)>::max(), "Descriptor set (", DescriptorSet, ") excceeds max representable value");
VERIFY(Binding <= std::numeric_limits<decltype(VkResource::Binding)>::max(), "Binding (", Binding, ") excceeds max representable value");