737 | 737 |
|
738 | 738 |
RefCntAutoPtr<PipelineResourceSignatureVkImpl> PipelineStateVkImpl::CreateDefaultSignature(
|
739 | 739 |
const PipelineStateCreateInfo& CreateInfo,
|
740 | |
const TShaderStages& ShaderStages)
|
|
740 |
const TShaderStages& ShaderStages,
|
|
741 |
Uint32 BindingIndex)
|
741 | 742 |
{
|
742 | 743 |
struct UniqueResource
|
743 | 744 |
{
|
|
840 | 841 |
RefCntAutoPtr<PipelineResourceSignatureVkImpl> pSignature;
|
841 | 842 |
if (Resources.size())
|
842 | 843 |
{
|
843 | |
String SignName = String{"Implicit signature of PSO '"} + m_Desc.Name + '\'';
|
|
844 |
String SignName = String{"Implicit signature of PSO '"} + m_Desc.Name + String{BindingIndex ? "':1" : "':0"};
|
844 | 845 |
|
845 | 846 |
PipelineResourceSignatureDesc ResSignDesc;
|
846 | 847 |
ResSignDesc.Name = SignName.c_str();
|
847 | 848 |
ResSignDesc.Resources = Resources.data();
|
848 | 849 |
ResSignDesc.NumResources = static_cast<Uint32>(Resources.size());
|
849 | |
ResSignDesc.ImmutableSamplers = LayoutDesc.ImmutableSamplers;
|
850 | |
ResSignDesc.NumImmutableSamplers = LayoutDesc.NumImmutableSamplers;
|
851 | |
ResSignDesc.BindingIndex = 0;
|
|
850 |
ResSignDesc.ImmutableSamplers = BindingIndex ? nullptr : LayoutDesc.ImmutableSamplers;
|
|
851 |
ResSignDesc.NumImmutableSamplers = BindingIndex ? 0 : LayoutDesc.NumImmutableSamplers;
|
|
852 |
ResSignDesc.BindingIndex = BindingIndex;
|
852 | 853 |
ResSignDesc.SRBAllocationGranularity = CreateInfo.PSODesc.SRBAllocationGranularity;
|
853 | 854 |
ResSignDesc.UseCombinedTextureSamplers = pCombinedSamplerSuffix != nullptr;
|
854 | 855 |
ResSignDesc.CombinedSamplerSuffix = pCombinedSamplerSuffix;
|
|
869 | 870 |
void PipelineStateVkImpl::InitPipelineLayout(const PipelineStateCreateInfo& CreateInfo,
|
870 | 871 |
TShaderStages& ShaderStages)
|
871 | 872 |
{
|
872 | |
if (m_UsingImplicitSignature)
|
|
873 |
if (m_Desc.SeparateGeometrySignature) {
|
|
874 |
TShaderStages AllOtherStages;
|
|
875 |
TShaderStages GeometryStage;
|
|
876 |
|
|
877 |
for (const auto& Stage : ShaderStages)
|
|
878 |
{
|
|
879 |
if (Stage.Type == SHADER_TYPE_GEOMETRY)
|
|
880 |
GeometryStage.push_back(Stage);
|
|
881 |
else
|
|
882 |
AllOtherStages.push_back(Stage);
|
|
883 |
}
|
|
884 |
|
|
885 |
VERIFY_EXPR(m_SignatureCount == 2);
|
|
886 |
m_Signatures[1] = CreateDefaultSignature(CreateInfo, GeometryStage, 1);
|
|
887 |
m_Signatures[0] = CreateDefaultSignature(CreateInfo, AllOtherStages, 0);
|
|
888 |
} else if (m_UsingImplicitSignature)
|
873 | 889 |
{
|
874 | 890 |
VERIFY_EXPR(m_SignatureCount == 1);
|
875 | |
m_Signatures[0] = CreateDefaultSignature(CreateInfo, ShaderStages);
|
|
891 |
m_Signatures[0] = CreateDefaultSignature(CreateInfo, ShaderStages, 0);
|
876 | 892 |
VERIFY_EXPR(!m_Signatures[0] || m_Signatures[0]->GetDesc().BindingIndex == 0);
|
877 | 893 |
}
|
878 | 894 |
|