Skip to content

Commit 2574f04

Browse files
committed
Use ResIndex to locate actual InlineCB and PushConstantData.
1 parent af59a53 commit 2574f04

File tree

3 files changed

+29
-57
lines changed

3 files changed

+29
-57
lines changed

Graphics/GraphicsEngineVulkan/include/ShaderResourceCacheVk.hpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -274,19 +274,19 @@ class ShaderResourceCacheVk : public ShaderResourceCacheBase
274274
STDDeleter<void, IMemoryAllocator>(Allocator)};
275275
}
276276

277-
// Sets the push constant data pointer for the given index
277+
// Sets the push constant data pointer for the given ResIndex
278278
// This is used to store per-SRB push constant data for STATIC push constants
279-
void SetPushConstantDataPtr(Uint32 Index, void* pData)
279+
void SetPushConstantDataPtr(Uint32 ResIndex, void* pData)
280280
{
281-
VERIFY_EXPR(Index < m_NumPushConstantBuffers);
282-
m_pPushConstantDataPtrs[Index] = pData;
281+
VERIFY_EXPR(ResIndex < m_NumPushConstantBuffers);
282+
m_pPushConstantDataPtrs[ResIndex] = pData;
283283
}
284284

285-
// Gets the push constant data pointer for the given index
286-
void* GetPushConstantDataPtr(Uint32 Index) const
285+
// Gets the push constant data pointer for the given ResIndex
286+
void* GetPushConstantDataPtr(Uint32 ResIndex) const
287287
{
288-
VERIFY_EXPR(Index < m_NumPushConstantBuffers);
289-
return m_pPushConstantDataPtrs[Index];
288+
VERIFY_EXPR(ResIndex < m_NumPushConstantBuffers);
289+
return m_pPushConstantDataPtrs[ResIndex];
290290
}
291291

292292
// Initializes push constant data pointers array
@@ -323,18 +323,18 @@ class ShaderResourceCacheVk : public ShaderResourceCacheBase
323323
}
324324
}
325325

326-
// Sets the inline constant buffer at the given index
327-
void SetInlineConstantBuffer(Uint32 Index, RefCntAutoPtr<BufferVkImpl>&& pBuffer)
326+
// Sets the inline constant buffer at the given ResIndex
327+
void SetInlineConstantBuffer(Uint32 ResIndex, RefCntAutoPtr<BufferVkImpl>&& pBuffer)
328328
{
329-
VERIFY_EXPR(Index < m_NumInlineConstantBuffers);
330-
m_pInlineConstantBuffers[Index] = std::move(pBuffer);
329+
VERIFY_EXPR(ResIndex < m_NumInlineConstantBuffers);
330+
m_pInlineConstantBuffers[ResIndex] = std::move(pBuffer);
331331
}
332332

333-
// Gets the inline constant buffer at the given index
334-
BufferVkImpl* GetInlineConstantBuffer(Uint32 Index) const
333+
// Gets the inline constant buffer at the given ResIndex
334+
BufferVkImpl* GetInlineConstantBuffer(Uint32 ResIndex) const
335335
{
336-
VERIFY_EXPR(Index < m_NumInlineConstantBuffers);
337-
return m_pInlineConstantBuffers[Index].RawPtr();
336+
VERIFY_EXPR(ResIndex < m_NumInlineConstantBuffers);
337+
return m_pInlineConstantBuffers[ResIndex].RawPtr();
338338
}
339339

340340
Uint32 GetNumInlineConstantBuffers() const { return m_NumInlineConstantBuffers; }

Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp

Lines changed: 12 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -682,30 +682,18 @@ void PipelineResourceSignatureVkImpl::InitSRBResourceCache(ShaderResourceCacheVk
682682
ResourceCache.MarkHasInlineConstants();
683683

684684
// Count push constant buffers, emulated inline constant buffers, and calculate total memory size
685-
Uint32 NumPushConstantBuffers = 0;
686-
Uint32 NumEmulatedInlineConstantCBs = 0;
687685
Uint32 TotalInlineConstantSize = 0;
688686
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
689687
{
690688
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
691689
TotalInlineConstantSize += InlineCBAttr.NumConstants * sizeof(Uint32);
692-
if (InlineCBAttr.IsPushConstant)
693-
++NumPushConstantBuffers;
694-
else
695-
++NumEmulatedInlineConstantCBs;
696690
}
697691

698-
// Initialize push constant data pointers array in the resource cache
699-
if (NumPushConstantBuffers > 0)
700-
{
701-
ResourceCache.InitializePushConstantDataPtrs(NumPushConstantBuffers);
702-
}
692+
// Initialize push constant data pointers array in the resource cache, use ResIndex to access actual PushConstantDataPtr later.
693+
ResourceCache.InitializePushConstantDataPtrs(TotalResources);
703694

704-
// Initialize inline constant buffers array in the resource cache
705-
if (NumEmulatedInlineConstantCBs > 0)
706-
{
707-
ResourceCache.InitializeInlineConstantBuffers(NumEmulatedInlineConstantCBs);
708-
}
695+
// Initialize inline constant buffers array in the resource cache, use ResIndex to access actual InlineConstantBuffer later.
696+
ResourceCache.InitializeInlineConstantBuffers(TotalResources);
709697

710698
// Allocate memory for all inline constants
711699
void* pInlineConstantMemory = nullptr;
@@ -720,8 +708,6 @@ void PipelineResourceSignatureVkImpl::InitSRBResourceCache(ShaderResourceCacheVk
720708

721709
// Assign memory to each inline constant buffer and create per-SRB buffers
722710
Uint8* pCurrentDataPtr = static_cast<Uint8*>(pInlineConstantMemory);
723-
Uint32 PushConstantBufferIdx = 0;
724-
Uint32 EmulatedInlineConstantIdx = 0;
725711
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
726712
{
727713
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
@@ -731,7 +717,7 @@ void PipelineResourceSignatureVkImpl::InitSRBResourceCache(ShaderResourceCacheVk
731717
{
732718
// For push constants, store the data pointer in the resource cache
733719
// Each SRB has its own copy of push constant data
734-
ResourceCache.SetPushConstantDataPtr(PushConstantBufferIdx++, pCurrentDataPtr);
720+
ResourceCache.SetPushConstantDataPtr(InlineCBAttr.ResIndex, pCurrentDataPtr);
735721
pCurrentDataPtr += DataSize;
736722
}
737723
else
@@ -761,10 +747,9 @@ void PipelineResourceSignatureVkImpl::InitSRBResourceCache(ShaderResourceCacheVk
761747
RefCntAutoPtr<IBuffer> pBuffer;
762748
m_pDevice->CreateBuffer(CBDesc, nullptr, &pBuffer);
763749
VERIFY_EXPR(pBuffer);
764-
ResourceCache.SetInlineConstantBuffer(EmulatedInlineConstantIdx, RefCntAutoPtr<BufferVkImpl>{pBuffer, IID_BufferVk});
750+
ResourceCache.SetInlineConstantBuffer(InlineCBAttr.ResIndex, RefCntAutoPtr<BufferVkImpl>{pBuffer, IID_BufferVk});
765751
}
766752

767-
++EmulatedInlineConstantIdx;
768753
pCurrentDataPtr += DataSize;
769754
}
770755
}
@@ -788,7 +773,6 @@ void PipelineResourceSignatureVkImpl::InitSRBResourceCache(ShaderResourceCacheVk
788773

789774
// Bind internal inline constant buffers to the resource cache
790775
// This must be done after descriptor set allocation so that descriptor writes work correctly
791-
Uint32 EmulatedInlineConstantIdx = 0;
792776
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
793777
{
794778
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
@@ -798,9 +782,7 @@ void PipelineResourceSignatureVkImpl::InitSRBResourceCache(ShaderResourceCacheVk
798782
continue;
799783

800784
// Get the per-SRB buffer from the resource cache
801-
BufferVkImpl* pBuffer = ResourceCache.GetInlineConstantBuffer(EmulatedInlineConstantIdx);
802-
++EmulatedInlineConstantIdx;
803-
785+
BufferVkImpl* pBuffer = ResourceCache.GetInlineConstantBuffer(InlineCBAttr.ResIndex);
804786
if (!pBuffer)
805787
continue;
806788

@@ -851,8 +833,7 @@ void PipelineResourceSignatureVkImpl::CopyStaticResources(ShaderResourceCacheVk&
851833
// Handle STATIC push constants first - copy data from Signature's static cache to SRB's cache
852834
// Each SRB has its own copy of push constant data
853835
const auto ResIdxRange = GetResourceIndexRange(SHADER_RESOURCE_VARIABLE_TYPE_STATIC);
854-
Uint32 DstPushConstantBufferIdx = 0;
855-
Uint32 SrcPushConstantBufferIdx = 0;
836+
856837
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
857838
{
858839
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
@@ -863,19 +844,17 @@ void PipelineResourceSignatureVkImpl::CopyStaticResources(ShaderResourceCacheVk&
863844
if (ResDesc.VarType == SHADER_RESOURCE_VARIABLE_TYPE_STATIC)
864845
{
865846
// Get source data from Signature's static resource cache
866-
const void* pSrcData = m_pStaticResCache ? m_pStaticResCache->GetPushConstantDataPtr(SrcPushConstantBufferIdx) : nullptr;
867-
++SrcPushConstantBufferIdx;
847+
const void* pSrcData = m_pStaticResCache ? m_pStaticResCache->GetPushConstantDataPtr(InlineCBAttr.ResIndex) : nullptr;
868848

869849
// Get destination data pointer from SRB's resource cache
870-
void* pDstData = DstResourceCache.GetPushConstantDataPtr(DstPushConstantBufferIdx);
850+
void* pDstData = DstResourceCache.GetPushConstantDataPtr(InlineCBAttr.ResIndex);
871851

872852
if (pSrcData != nullptr && pDstData != nullptr)
873853
{
874854
const Uint32 DataSize = InlineCBAttr.NumConstants * sizeof(Uint32);
875855
memcpy(pDstData, pSrcData, DataSize);
876856
}
877857
}
878-
++DstPushConstantBufferIdx;
879858
}
880859

881860
if (!HasDescriptorSet(DESCRIPTOR_SET_ID_STATIC_MUTABLE) || m_pStaticResCache == nullptr)
@@ -1366,8 +1345,6 @@ void PipelineResourceSignatureVkImpl::UpdateInlineConstantBuffers(const ShaderRe
13661345
// SRB caches use SRBCacheOffset, static caches use StaticCacheOffset
13671346
const ResourceCacheContentType CacheType = ResourceCache.GetContentType();
13681347

1369-
Uint32 PushConstantBufferIdx = 0;
1370-
Uint32 EmulatedInlineConstantIdx = 0;
13711348
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
13721349
{
13731350
const InlineConstantBufferAttribsVk& InlineCBAttr = m_InlineConstantBuffers[i];
@@ -1377,20 +1354,17 @@ void PipelineResourceSignatureVkImpl::UpdateInlineConstantBuffers(const ShaderRe
13771354
{
13781355
// For true push constants, get data from the SRB's resource cache
13791356
// Each SRB has its own copy of push constant data
1380-
const void* pInlineConstantData = ResourceCache.GetPushConstantDataPtr(PushConstantBufferIdx);
1357+
const void* pInlineConstantData = ResourceCache.GetPushConstantDataPtr(InlineCBAttr.ResIndex);
13811358
VERIFY_EXPR(pInlineConstantData != nullptr);
13821359

1383-
++PushConstantBufferIdx;
1384-
13851360
// Copy data to the device context's push constants buffer
13861361
// This will be submitted via vkCmdPushConstants before draw/dispatch
13871362
Ctx.SetPushConstants(pInlineConstantData, 0, DataSize);
13881363
continue;
13891364
}
13901365

13911366
// For emulated inline constants, get the per-SRB buffer from the resource cache
1392-
BufferVkImpl* pBuffer = ResourceCache.GetInlineConstantBuffer(EmulatedInlineConstantIdx);
1393-
++EmulatedInlineConstantIdx;
1367+
BufferVkImpl* pBuffer = ResourceCache.GetInlineConstantBuffer(InlineCBAttr.ResIndex);
13941368

13951369
if (pBuffer)
13961370
{

Graphics/GraphicsEngineVulkan/src/ShaderVariableManagerVk.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,6 @@ void ShaderVariableManagerVk::SetInlineConstants(Uint32 ResIndex,
672672

673673
// For both Signature's static cache and SRB cache, push constant data is stored
674674
// in the resource cache via GetPushConstantDataPtr()
675-
Uint32 PushConstantBufferIdx = 0;
676675
for (Uint32 i = 0; i < NumInlineCBs; ++i)
677676
{
678677
const InlineConstantBufferAttribsVk& InlineCBAttr = pInlineCBs[i];
@@ -682,15 +681,14 @@ void ShaderVariableManagerVk::SetInlineConstants(Uint32 ResIndex,
682681
if (InlineCBAttr.ResIndex == ResIndex)
683682
{
684683
// Get the data pointer from the resource cache
685-
void* pPushConstantData = m_ResourceCache.GetPushConstantDataPtr(PushConstantBufferIdx);
684+
void* pPushConstantData = m_ResourceCache.GetPushConstantDataPtr(InlineCBAttr.ResIndex);
686685
if (pPushConstantData != nullptr)
687686
{
688687
Uint32* pDstConstants = reinterpret_cast<Uint32*>(pPushConstantData);
689688
memcpy(pDstConstants + FirstConstant, pConstants, NumConstants * sizeof(Uint32));
690689
}
691690
return;
692691
}
693-
++PushConstantBufferIdx;
694692
}
695693
UNEXPECTED("Push constant buffer not found");
696694
}

0 commit comments

Comments
 (0)