From 51f876af24d24e923a08af00a69e9f5d9ec6bcfe Mon Sep 17 00:00:00 2001 From: azhirnov Date: Tue, 26 Jan 2021 10:15:53 +0300 Subject: allow to combine graphics PRS with mesh pipeline --- Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp | 10 +++++----- Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp | 13 ++++++++++++- Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) (limited to 'Graphics/GraphicsEngineVulkan') diff --git a/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp b/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp index 660815f6..87cf1da0 100644 --- a/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp +++ b/Graphics/GraphicsEngineVulkan/include/PipelineLayoutVk.hpp @@ -46,7 +46,7 @@ public: PipelineLayoutVk(); ~PipelineLayoutVk(); - void Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSignature** ppSignatures, Uint32 SignatureCount); + void Create(RenderDeviceVkImpl* pDeviceVk, PIPELINE_TYPE PipelineType, IPipelineResourceSignature** ppSignatures, Uint32 SignatureCount); void Release(RenderDeviceVkImpl* pDeviceVkImpl, Uint64 CommandQueueMask); size_t GetHash() const; @@ -69,10 +69,10 @@ public: struct ResourceInfo { - SHADER_RESOURCE_TYPE Type = SHADER_RESOURCE_TYPE_UNKNOWN; - - Uint32 DescrSetIndex = 0; - Uint32 BindingIndex = 0; + IPipelineResourceSignature* Signature = nullptr; + SHADER_RESOURCE_TYPE Type = SHADER_RESOURCE_TYPE_UNKNOWN; + Uint32 DescrSetIndex = 0; + Uint32 BindingIndex = 0; }; bool GetResourceInfo(const char* Name, SHADER_TYPE Stage, ResourceInfo& Info) const; diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp index 969fe16e..e190c4fd 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineLayoutVk.cpp @@ -56,7 +56,7 @@ void PipelineLayoutVk::Release(RenderDeviceVkImpl* pDeviceVk, Uint64 CommandQueu } } -void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSignature** ppSignatures, Uint32 SignatureCount) +void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, PIPELINE_TYPE PipelineType, IPipelineResourceSignature** ppSignatures, Uint32 SignatureCount) { VERIFY(m_SignatureCount == 0 && m_DescrSetCount == 0 && !m_VkPipelineLayout, "This pipeline layout is already initialized"); @@ -68,6 +68,7 @@ void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSi const Uint8 Index = pSignature->GetDesc().BindingIndex; +#ifdef DILIGENT_DEBUG VERIFY(Index < m_Signatures.size(), "Pipeline resource signature specifies binding index ", Uint32{Index}, " that exceeds the limit (", m_Signatures.size() - 1, "). This error should've been caught by ValidatePipelineResourceSignatureDesc."); @@ -77,6 +78,16 @@ void PipelineLayoutVk::Create(RenderDeviceVkImpl* pDeviceVk, IPipelineResourceSi " conflicts with another resource signature '", m_Signatures[Index]->GetDesc().Name, "' that uses the same index. This error should've been caught by ValidatePipelineResourceSignatures."); + for (Uint32 s = 0, StageCount = pSignature->GetNumShaderStages(); s < StageCount; ++s) + { + const auto ShaderType = pSignature->GetShaderStageType(s); + VERIFY(IsConsistentShaderType(ShaderType, PipelineType), + "Pipeline resource signature '", pSignature->GetDesc().Name, "' at index ", Uint32{Index}, + " has shader stage '", GetShaderTypeLiteralName(ShaderType), "' that is not compatible with pipeline type '", + GetPipelineTypeString(PipelineType), "'."); + } +#endif + m_SignatureCount = std::max(m_SignatureCount, Index + 1); m_Signatures[Index] = pSignature; } diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp index 41585909..2817a53a 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp @@ -830,7 +830,7 @@ void PipelineStateVkImpl::InitPipelineLayout(const PipelineStateCreateInfo& Crea } } - m_PipelineLayout.Create(GetDevice(), Signatures.data(), SignatureCount); + m_PipelineLayout.Create(GetDevice(), CreateInfo.PSODesc.PipelineType, Signatures.data(), SignatureCount); // verify that pipeline layout is compatible with shader resources and // remap resource bindings -- cgit v1.2.3