summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2021-03-27 16:02:20 +0000
committers-ol <s+removethis@s-ol.nu>2021-03-27 16:02:20 +0000
commit884401f8ed7fdaf79032b99787501fc7f770b64e (patch)
tree285b9f5e2b73c8e5c0b01f403cf25f26e8c389b6
parentDILIGENT_BEGIN_INTERFACE1 helper (diff)
downloadDiligentCore-ext-vk.tar.gz
DiligentCore-ext-vk.zip
GLTF: hacky VR rendering supportext-vk
Diffstat (limited to '')
-rw-r--r--Graphics/GraphicsEngine/include/PipelineStateBase.hpp2
-rw-r--r--Graphics/GraphicsEngine/interface/PipelineState.h2
-rw-r--r--Graphics/GraphicsEngineVulkan/include/PipelineStateVkImpl.hpp3
-rw-r--r--Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp30
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);
}