From 26e240dfcb3dad8527a25c0f6270395528a5a71e Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Wed, 27 Feb 2019 20:56:45 -0800 Subject: Fixed PipelineLayoutVk --- .../GraphicsEngineVulkan/include/PipelineLayout.h | 12 ++++++----- .../include/RenderDeviceVkImpl.h | 6 +++--- .../GraphicsEngineVulkan/src/PipelineLayout.cpp | 23 +++++++++++----------- .../src/ShaderResourceLayoutVk.cpp | 2 +- 4 files changed, 23 insertions(+), 20 deletions(-) (limited to 'Graphics/GraphicsEngineVulkan') 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& 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& 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 PipelineLayout::GetDescriptorSetSizes(Uint32& NumSets)cons NumSets = 0; std::array 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(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(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(VarType+1)) + for(SHADER_RESOURCE_VARIABLE_TYPE VarType = SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE; VarType <= SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC; VarType = static_cast(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(VarType + 1)) + for (SHADER_RESOURCE_VARIABLE_TYPE VarType = SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE; VarType <= SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC; VarType = static_cast(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::max(), "Descriptor set (", DescriptorSet, ") excceeds max representable value"); VERIFY(Binding <= std::numeric_limits::max(), "Binding (", Binding, ") excceeds max representable value"); -- cgit v1.2.3