diff options
Diffstat (limited to '')
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/include/PipelineStateVkImpl.hpp | 3 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp | 30 |
2 files changed, 25 insertions, 8 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/PipelineStateVkImpl.hpp b/Graphics/GraphicsEngineVulkan/include/PipelineStateVkImpl.hpp index 8cd27ea3..ce2432ef 100644 --- a/Graphics/GraphicsEngineVulkan/include/PipelineStateVkImpl.hpp +++ b/Graphics/GraphicsEngineVulkan/include/PipelineStateVkImpl.hpp @@ -116,7 +116,8 @@ private: RefCntAutoPtr<PipelineResourceSignatureVkImpl> CreateDefaultSignature( const PipelineStateCreateInfo& CreateInfo, - const TShaderStages& ShaderStages); + const TShaderStages& ShaderStages, + Uint32 BindingIndex); void Destruct(); diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp index a6cc4ba3..f6de5dd7 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp @@ -738,7 +738,8 @@ RenderPassDesc PipelineStateVkImpl::GetImplicitRenderPassDesc( RefCntAutoPtr<PipelineResourceSignatureVkImpl> PipelineStateVkImpl::CreateDefaultSignature( const PipelineStateCreateInfo& CreateInfo, - const TShaderStages& ShaderStages) + const TShaderStages& ShaderStages, + Uint32 BindingIndex) { struct UniqueResource { @@ -841,15 +842,15 @@ RefCntAutoPtr<PipelineResourceSignatureVkImpl> PipelineStateVkImpl::CreateDefaul RefCntAutoPtr<PipelineResourceSignatureVkImpl> pSignature; if (Resources.size()) { - String SignName = String{"Implicit signature of PSO '"} + m_Desc.Name + '\''; + String SignName = String{"Implicit signature of PSO '"} + m_Desc.Name + String{BindingIndex ? "':1" : "':0"}; PipelineResourceSignatureDesc ResSignDesc; ResSignDesc.Name = SignName.c_str(); ResSignDesc.Resources = Resources.data(); ResSignDesc.NumResources = static_cast<Uint32>(Resources.size()); - ResSignDesc.ImmutableSamplers = LayoutDesc.ImmutableSamplers; - ResSignDesc.NumImmutableSamplers = LayoutDesc.NumImmutableSamplers; - ResSignDesc.BindingIndex = 0; + ResSignDesc.ImmutableSamplers = BindingIndex ? nullptr : LayoutDesc.ImmutableSamplers; + ResSignDesc.NumImmutableSamplers = BindingIndex ? 0 : LayoutDesc.NumImmutableSamplers; + ResSignDesc.BindingIndex = BindingIndex; ResSignDesc.SRBAllocationGranularity = CreateInfo.PSODesc.SRBAllocationGranularity; ResSignDesc.UseCombinedTextureSamplers = pCombinedSamplerSuffix != nullptr; ResSignDesc.CombinedSamplerSuffix = pCombinedSamplerSuffix; @@ -870,10 +871,25 @@ RefCntAutoPtr<PipelineResourceSignatureVkImpl> PipelineStateVkImpl::CreateDefaul void PipelineStateVkImpl::InitPipelineLayout(const PipelineStateCreateInfo& CreateInfo, TShaderStages& ShaderStages) { - if (m_UsingImplicitSignature) + if (m_Desc.SeparateGeometrySignature) { + TShaderStages AllOtherStages; + TShaderStages GeometryStage; + + for (const auto& Stage : ShaderStages) + { + if (Stage.Type == SHADER_TYPE_GEOMETRY) + GeometryStage.push_back(Stage); + else + AllOtherStages.push_back(Stage); + } + + VERIFY_EXPR(m_SignatureCount == 2); + m_Signatures[1] = CreateDefaultSignature(CreateInfo, GeometryStage, 1); + m_Signatures[0] = CreateDefaultSignature(CreateInfo, AllOtherStages, 0); + } else if (m_UsingImplicitSignature) { VERIFY_EXPR(m_SignatureCount == 1); - m_Signatures[0] = CreateDefaultSignature(CreateInfo, ShaderStages); + m_Signatures[0] = CreateDefaultSignature(CreateInfo, ShaderStages, 0); VERIFY_EXPR(!m_Signatures[0] || m_Signatures[0]->GetDesc().BindingIndex == 0); } |
