diff options
| author | s-ol <s+removethis@s-ol.nu> | 2021-03-27 16:02:20 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2021-03-27 16:02:20 +0000 |
| commit | 884401f8ed7fdaf79032b99787501fc7f770b64e (patch) | |
| tree | 285b9f5e2b73c8e5c0b01f403cf25f26e8c389b6 | |
| parent | DILIGENT_BEGIN_INTERFACE1 helper (diff) | |
| download | DiligentCore-ext-vk.tar.gz DiligentCore-ext-vk.zip | |
GLTF: hacky VR rendering supportext-vk
4 files changed, 28 insertions, 9 deletions
diff --git a/Graphics/GraphicsEngine/include/PipelineStateBase.hpp b/Graphics/GraphicsEngine/include/PipelineStateBase.hpp index 869e0af0..8f89bb14 100644 --- a/Graphics/GraphicsEngine/include/PipelineStateBase.hpp +++ b/Graphics/GraphicsEngine/include/PipelineStateBase.hpp @@ -963,7 +963,7 @@ private: if (m_UsingImplicitSignature) { VERIFY_EXPR(CreateInfo.ResourceSignaturesCount == 0 || CreateInfo.ppResourceSignatures == nullptr); - m_SignatureCount = 1; + m_SignatureCount = CreateInfo.PSODesc.SeparateGeometrySignature ? 2 : 1; } else { diff --git a/Graphics/GraphicsEngine/interface/PipelineState.h b/Graphics/GraphicsEngine/interface/PipelineState.h index 96d6de5c..4e56df1c 100644 --- a/Graphics/GraphicsEngine/interface/PipelineState.h +++ b/Graphics/GraphicsEngine/interface/PipelineState.h @@ -332,6 +332,8 @@ struct PipelineStateDesc DILIGENT_DERIVE(DeviceObjectAttribs) /// Pipeline layout description PipelineResourceLayoutDesc ResourceLayout; + bool SeparateGeometrySignature DEFAULT_INITIALIZER(false); + #if DILIGENT_CPP_INTERFACE bool IsAnyGraphicsPipeline() const { return PipelineType == PIPELINE_TYPE_GRAPHICS || PipelineType == PIPELINE_TYPE_MESH; } bool IsComputePipeline() const { return PipelineType == PIPELINE_TYPE_COMPUTE; } 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); } |
