Skip to content

Commit 8d57cdf

Browse files
committed
Rename GetInlineConstantBuffers to GetInlineConstantBufferAttribs to avoid confusion with actual buffer storage.
Add implicit vulkan push constant in GetDefaultResourceSignatureDesc.
1 parent 693ca4e commit 8d57cdf

File tree

5 files changed

+58
-70
lines changed

5 files changed

+58
-70
lines changed

Graphics/GraphicsEngineVulkan/include/PipelineResourceSignatureVkImpl.hpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,15 +160,10 @@ class PipelineResourceSignatureVkImpl final : public PipelineResourceSignatureBa
160160
DeviceContextVkImpl& Ctx) const;
161161

162162
// Returns the number of inline constant buffers
163-
Uint32 GetNumInlineConstantBuffers() const { return m_NumInlineConstantBuffers; }
163+
Uint32 GetNumInlineConstantBufferAttribs() const { return m_NumInlineConstantBufferAttribs; }
164164

165165
// Returns the inline constant buffer attributes
166-
const InlineConstantBufferAttribsVk* GetInlineConstantBuffers() const { return m_InlineConstantBuffers.get(); }
167-
168-
// Adds PIPELINE_RESOURCE_FLAG_VULKAN_PUSH_CONSTANT flag to a resource if it has
169-
// PIPELINE_RESOURCE_FLAG_INLINE_CONSTANTS but is missing the Vulkan push constant flag.
170-
// This is called during pipeline state creation when shader reflection detects a push constant.
171-
void UpdatePushConstantFlags(Uint32 ResIndex);
166+
const InlineConstantBufferAttribsVk* GetInlineConstantBufferAttribs() const { return m_InlineConstantBufferAttribs.get(); }
172167

173168
#ifdef DILIGENT_DEVELOPMENT
174169
/// Verifies committed resource using the SPIRV resource attributes from the PSO.
@@ -231,9 +226,9 @@ class PipelineResourceSignatureVkImpl final : public PipelineResourceSignatureBa
231226
Uint16 m_DynamicStorageBufferCount = 0;
232227

233228
// Number of inline constant buffers
234-
Uint32 m_NumInlineConstantBuffers = 0;
229+
Uint32 m_NumInlineConstantBufferAttribs = 0;
235230
// Inline constant buffer attributes
236-
std::unique_ptr<InlineConstantBufferAttribsVk[]> m_InlineConstantBuffers;
231+
std::unique_ptr<InlineConstantBufferAttribsVk[]> m_InlineConstantBufferAttribs;
237232

238233
// Note: Static inline constant data (including push constants) is stored in m_pStaticResCache.
239234
// For push constants, we use InitializePushConstantDataPtrs() and SetPushConstantDataPtr()

Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ void DeviceContextVkImpl::UpdateInlineConstantBuffers(ResourceBindInfo& BindInfo
431431
for (Uint32 i = 0; i < SignCount; ++i)
432432
{
433433
const PipelineResourceSignatureVkImpl* pSign = m_pPipelineState->GetResourceSignature(i);
434-
if (pSign == nullptr || pSign->GetNumInlineConstantBuffers() == 0)
434+
if (pSign == nullptr || pSign->GetNumInlineConstantBufferAttribs() == 0)
435435
continue;
436436

437437
const ShaderResourceCacheVk* pResourceCache = BindInfo.ResourceCaches[i];

Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp

Lines changed: 21 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -223,14 +223,14 @@ void PipelineResourceSignatureVkImpl::CreateSetLayouts(const bool IsSerialized)
223223
{
224224
VERIFY(ResDesc.ResourceType == SHADER_RESOURCE_TYPE_CONSTANT_BUFFER,
225225
"Only constant buffers can have INLINE_CONSTANTS flag");
226-
++m_NumInlineConstantBuffers;
226+
++m_NumInlineConstantBufferAttribs;
227227
}
228228
}
229229

230230
// Allocate inline constant buffer attributes array
231-
if (m_NumInlineConstantBuffers > 0)
231+
if (m_NumInlineConstantBufferAttribs > 0)
232232
{
233-
m_InlineConstantBuffers = std::make_unique<InlineConstantBufferAttribsVk[]>(m_NumInlineConstantBuffers);
233+
m_InlineConstantBufferAttribs = std::make_unique<InlineConstantBufferAttribsVk[]>(m_NumInlineConstantBufferAttribs);
234234
}
235235

236236
// Descriptor set mapping (static/mutable (0) or dynamic (1) -> set index)
@@ -408,7 +408,7 @@ void PipelineResourceSignatureVkImpl::CreateSetLayouts(const bool IsSerialized)
408408
VERIFY(ResDesc.ResourceType == SHADER_RESOURCE_TYPE_CONSTANT_BUFFER,
409409
"Only constant buffers can have INLINE_CONSTANTS flag");
410410

411-
InlineConstantBufferAttribsVk& InlineCBAttribs = m_InlineConstantBuffers[InlineConstantBufferIdx++];
411+
InlineConstantBufferAttribsVk& InlineCBAttribs = m_InlineConstantBufferAttribs[InlineConstantBufferIdx++];
412412
InlineCBAttribs.ResIndex = i; // Resource index for unique identification
413413
InlineCBAttribs.DescrSet = pAttribs->DescrSet;
414414
InlineCBAttribs.BindingIndex = pAttribs->BindingIndex;
@@ -418,7 +418,7 @@ void PipelineResourceSignatureVkImpl::CreateSetLayouts(const bool IsSerialized)
418418
// between multiple PipelineStates sharing the same PipelineResourceSignature
419419
}
420420
}
421-
VERIFY_EXPR(InlineConstantBufferIdx == m_NumInlineConstantBuffers);
421+
VERIFY_EXPR(InlineConstantBufferIdx == m_NumInlineConstantBufferAttribs);
422422

423423
#ifdef DILIGENT_DEBUG
424424
if (m_pStaticResCache != nullptr)
@@ -556,15 +556,15 @@ void PipelineResourceSignatureVkImpl::CreateSetLayouts(const bool IsSerialized)
556556

557557
// Initialize inline constant buffers in the static resource cache
558558
// This must be done after the resources are initialized above
559-
if (m_NumInlineConstantBuffers > 0 && m_pStaticResCache != nullptr)
559+
if (m_NumInlineConstantBufferAttribs > 0 && m_pStaticResCache != nullptr)
560560
{
561561
// First pass: calculate total memory size needed for all static inline constants
562562
// and count static push constant buffers
563563
Uint32 TotalStaticInlineConstantSize = 0;
564564
Uint32 NumStaticPushConstantBuffers = 0;
565-
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
565+
for (Uint32 i = 0; i < m_NumInlineConstantBufferAttribs; ++i)
566566
{
567-
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
567+
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBufferAttribs[i];
568568

569569
const PipelineResourceDesc& ResDesc = GetResourceDesc(InlineCBAttr.ResIndex);
570570
if (ResDesc.VarType == SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
@@ -594,9 +594,9 @@ void PipelineResourceSignatureVkImpl::CreateSetLayouts(const bool IsSerialized)
594594
// Second pass: assign memory to each static inline constant
595595
Uint8* pCurrentDataPtr = static_cast<Uint8*>(pInlineConstMemory);
596596
Uint32 StaticPushConstantIdx = 0;
597-
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
597+
for (Uint32 i = 0; i < m_NumInlineConstantBufferAttribs; ++i)
598598
{
599-
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
599+
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBufferAttribs[i];
600600

601601
const PipelineResourceDesc& ResDesc = GetResourceDesc(InlineCBAttr.ResIndex);
602602
const ResourceAttribs& Attr = GetResourceAttribs(InlineCBAttr.ResIndex);
@@ -675,17 +675,17 @@ void PipelineResourceSignatureVkImpl::InitSRBResourceCache(ShaderResourceCacheVk
675675
// For push constants, each SRB gets its own copy of the data (stored in ShaderResourceCacheVk)
676676
// For emulated inline constants, each SRB gets its own buffer to avoid conflicts between
677677
// multiple PipelineStates sharing the same PipelineResourceSignature
678-
if (m_NumInlineConstantBuffers > 0)
678+
if (m_NumInlineConstantBufferAttribs > 0)
679679
{
680680
// Ensure the cache reports inline constants so DeviceContextVkImpl
681681
// updates emulated buffers even if no data has been written yet.
682682
ResourceCache.MarkHasInlineConstants();
683683

684684
// Count push constant buffers, emulated inline constant buffers, and calculate total memory size
685685
Uint32 TotalInlineConstantSize = 0;
686-
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
686+
for (Uint32 i = 0; i < m_NumInlineConstantBufferAttribs; ++i)
687687
{
688-
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
688+
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBufferAttribs[i];
689689
TotalInlineConstantSize += InlineCBAttr.NumConstants * sizeof(Uint32);
690690
}
691691

@@ -708,9 +708,9 @@ void PipelineResourceSignatureVkImpl::InitSRBResourceCache(ShaderResourceCacheVk
708708

709709
// Assign memory to each inline constant buffer and create per-SRB buffers
710710
Uint8* pCurrentDataPtr = static_cast<Uint8*>(pInlineConstantMemory);
711-
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
711+
for (Uint32 i = 0; i < m_NumInlineConstantBufferAttribs; ++i)
712712
{
713-
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
713+
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBufferAttribs[i];
714714
const Uint32 DataSize = InlineCBAttr.NumConstants * sizeof(Uint32);
715715

716716
if (InlineCBAttr.IsPushConstant)
@@ -773,9 +773,9 @@ void PipelineResourceSignatureVkImpl::InitSRBResourceCache(ShaderResourceCacheVk
773773

774774
// Bind internal inline constant buffers to the resource cache
775775
// This must be done after descriptor set allocation so that descriptor writes work correctly
776-
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
776+
for (Uint32 i = 0; i < m_NumInlineConstantBufferAttribs; ++i)
777777
{
778-
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
778+
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBufferAttribs[i];
779779

780780
// Skip push constants - they don't use descriptor sets
781781
if (InlineCBAttr.IsPushConstant)
@@ -834,9 +834,9 @@ void PipelineResourceSignatureVkImpl::CopyStaticResources(ShaderResourceCacheVk&
834834
// Each SRB has its own copy of push constant data
835835
const auto ResIdxRange = GetResourceIndexRange(SHADER_RESOURCE_VARIABLE_TYPE_STATIC);
836836

837-
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
837+
for (Uint32 i = 0; i < m_NumInlineConstantBufferAttribs; ++i)
838838
{
839-
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
839+
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBufferAttribs[i];
840840
if (!InlineCBAttr.IsPushConstant)
841841
continue;
842842

@@ -1345,9 +1345,9 @@ void PipelineResourceSignatureVkImpl::UpdateInlineConstantBuffers(const ShaderRe
13451345
// SRB caches use SRBCacheOffset, static caches use StaticCacheOffset
13461346
const ResourceCacheContentType CacheType = ResourceCache.GetContentType();
13471347

1348-
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
1348+
for (Uint32 i = 0; i < m_NumInlineConstantBufferAttribs; ++i)
13491349
{
1350-
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
1350+
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBufferAttribs[i];
13511351
const Uint32 DataSize = InlineCBAttr.NumConstants * sizeof(Uint32);
13521352

13531353
if (InlineCBAttr.IsPushConstant)
@@ -1385,35 +1385,4 @@ void PipelineResourceSignatureVkImpl::UpdateInlineConstantBuffers(const ShaderRe
13851385
}
13861386
}
13871387

1388-
void PipelineResourceSignatureVkImpl::UpdatePushConstantFlags(Uint32 ResIndex)
1389-
{
1390-
VERIFY_EXPR(ResIndex < this->m_Desc.NumResources);
1391-
1392-
// Access the mutable resource description
1393-
PipelineResourceDesc& ResDesc = const_cast<PipelineResourceDesc&>(this->m_Desc.Resources[ResIndex]);
1394-
1395-
// Check if the resource has INLINE_CONSTANTS flag but is missing VULKAN_PUSH_CONSTANT flag
1396-
if ((ResDesc.Flags & PIPELINE_RESOURCE_FLAG_INLINE_CONSTANTS) != 0 &&
1397-
(ResDesc.Flags & PIPELINE_RESOURCE_FLAG_VULKAN_PUSH_CONSTANT) == 0)
1398-
{
1399-
// Add the Vulkan push constant flag
1400-
ResDesc.Flags |= PIPELINE_RESOURCE_FLAG_VULKAN_PUSH_CONSTANT;
1401-
1402-
// Update the corresponding InlineConstantBufferAttribsVk to mark it as a push constant
1403-
// Use ResIndex for matching
1404-
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
1405-
{
1406-
InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
1407-
if (InlineCBAttr.ResIndex == ResIndex)
1408-
{
1409-
// Mark this as a true push constant
1410-
// Note: Per-SRB buffers are created in InitSRBResourceCache(), which will check
1411-
// IsPushConstant and skip buffer creation for true push constants
1412-
InlineCBAttr.IsPushConstant = true;
1413-
break;
1414-
}
1415-
}
1416-
}
1417-
}
1418-
14191388
} // namespace Diligent

Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -605,10 +605,6 @@ PipelineResourceSignatureDescWrapper PipelineStateVkImpl::GetDefaultResourceSign
605605
ShaderResources.ProcessResources(
606606
[&](const SPIRVShaderResourceAttribs& Attribs, Uint32) //
607607
{
608-
// Note: Push constants are now included in the signature with
609-
// PIPELINE_RESOURCE_FLAG_VULKAN_PUSH_CONSTANT flag set.
610-
// They will be handled via vkCmdPushConstants at runtime.
611-
612608
// We can't skip immutable samplers because immutable sampler arrays have to be defined
613609
// as both resource and sampler.
614610
//if (Res.Type == SPIRVShaderResourceAttribs::SeparateSampler &&
@@ -674,6 +670,34 @@ PipelineResourceSignatureDescWrapper PipelineStateVkImpl::GetDefaultResourceSign
674670
}
675671
}
676672

673+
// If no resource has PIPELINE_RESOURCE_FLAG_VULKAN_PUSH_CONSTANT explicitly set,
674+
// find the first inline constant and mark it as a Vulkan push constant
675+
bool HasExplicitPushConstant = false;
676+
677+
for (Uint32 i = 0; i < SignDesc.Get().NumResources; ++i)
678+
{
679+
const PipelineResourceDesc& Res = SignDesc.Get().Resources[i];
680+
if ((Res.Flags & PIPELINE_RESOURCE_FLAG_VULKAN_PUSH_CONSTANT) != 0)
681+
{
682+
HasExplicitPushConstant = true;
683+
break;
684+
}
685+
}
686+
687+
if (!HasExplicitPushConstant)
688+
{
689+
// Find the first inline constant and add PIPELINE_RESOURCE_FLAG_VULKAN_PUSH_CONSTANT flag
690+
for (Uint32 i = 0; i < SignDesc.Get().NumResources; ++i)
691+
{
692+
PipelineResourceDesc& Res = const_cast<PipelineResourceDesc&>(SignDesc.Get().Resources[i]);
693+
if ((Res.Flags & PIPELINE_RESOURCE_FLAG_INLINE_CONSTANTS) != 0)
694+
{
695+
Res.Flags |= PIPELINE_RESOURCE_FLAG_VULKAN_PUSH_CONSTANT;
696+
break;
697+
}
698+
}
699+
}
700+
677701
return SignDesc;
678702
}
679703

Graphics/GraphicsEngineVulkan/src/ShaderVariableManagerVk.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -667,14 +667,14 @@ void ShaderVariableManagerVk::SetInlineConstants(Uint32 ResIndex,
667667
const bool IsPushConstant = (ResDesc.Flags & PIPELINE_RESOURCE_FLAG_VULKAN_PUSH_CONSTANT) != 0;
668668
if (IsPushConstant)
669669
{
670-
const InlineConstantBufferAttribsVk* pInlineCBs = m_pSignature->GetInlineConstantBuffers();
671-
const Uint32 NumInlineCBs = m_pSignature->GetNumInlineConstantBuffers();
670+
const InlineConstantBufferAttribsVk* pInlineCBAttribs = m_pSignature->GetInlineConstantBufferAttribs();
671+
const Uint32 NumInlineCBAttribs = m_pSignature->GetNumInlineConstantBufferAttribs();
672672

673673
// For both Signature's static cache and SRB cache, push constant data is stored
674674
// in the resource cache via GetPushConstantDataPtr()
675-
for (Uint32 i = 0; i < NumInlineCBs; ++i)
675+
for (Uint32 i = 0; i < NumInlineCBAttribs; ++i)
676676
{
677-
const InlineConstantBufferAttribsVk& InlineCBAttr = pInlineCBs[i];
677+
const InlineConstantBufferAttribsVk& InlineCBAttr = pInlineCBAttribs[i];
678678
if (!InlineCBAttr.IsPushConstant)
679679
continue;
680680

0 commit comments

Comments
 (0)