Skip to content

Commit 656c769

Browse files
Vulkan: fully zero-initialize descriptor write info in CommitDynamicResources
1 parent 607fc9c commit 656c769

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -639,23 +639,23 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc
639639
auto AccelStructIt = DescrAccelStructArr.begin();
640640
auto WriteDescrSetIt = WriteDescrSetArr.begin();
641641

642-
const auto DynamicSetIdx = GetDescriptorSetIndex<DESCRIPTOR_SET_ID_DYNAMIC>();
643-
const auto& SetResources = ResourceCache.GetDescriptorSet(DynamicSetIdx);
644-
const auto& LogicalDevice = GetDevice()->GetLogicalDevice();
645-
const auto DynResIdxRange = GetResourceIndexRange(SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
642+
const Uint32 DynamicSetIdx = GetDescriptorSetIndex<DESCRIPTOR_SET_ID_DYNAMIC>();
643+
const ShaderResourceCacheVk::DescriptorSet& SetResources = ResourceCache.GetDescriptorSet(DynamicSetIdx);
644+
const VulkanUtilities::VulkanLogicalDevice& LogicalDevice = GetDevice()->GetLogicalDevice();
645+
const std::pair<Uint32, Uint32> DynResIdxRange = GetResourceIndexRange(SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
646646

647-
constexpr auto CacheType = ResourceCacheContentType::SRB;
647+
constexpr ResourceCacheContentType CacheType = ResourceCacheContentType::SRB;
648648

649649
for (Uint32 ResIdx = DynResIdxRange.first, ArrElem = 0; ResIdx < DynResIdxRange.second;)
650650
{
651-
const auto& Attr = GetResourceAttribs(ResIdx);
652-
const auto CacheOffset = Attr.CacheOffset(CacheType);
653-
const auto ArraySize = Attr.ArraySize;
654-
const auto DescrType = Attr.GetDescriptorType();
651+
const PipelineResourceAttribsType& Attr = GetResourceAttribs(ResIdx);
652+
const Uint32 CacheOffset = Attr.CacheOffset(CacheType);
653+
const Uint32 ArraySize = Attr.ArraySize;
654+
const DescriptorType DescrType = Attr.GetDescriptorType();
655655

656656
#ifdef DILIGENT_DEBUG
657657
{
658-
const auto& Res = GetResourceDesc(ResIdx);
658+
const PipelineResourceDesc& Res = GetResourceDesc(ResIdx);
659659
VERIFY_EXPR(ArraySize == GetResourceDesc(ResIdx).ArraySize);
660660
VERIFY_EXPR(Res.VarType == SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
661661
}
@@ -672,12 +672,17 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc
672672
// The type of the descriptor also controls which array the descriptors are taken from. (13.2.4)
673673
WriteDescrSetIt->descriptorType = DescriptorTypeToVkDescriptorType(DescrType);
674674
WriteDescrSetIt->descriptorCount = 0;
675+
// Zero-initialize array pointers as some implementations (e.g. Android Emulator) still check them even
676+
// if they are not used.
677+
WriteDescrSetIt->pImageInfo = nullptr;
678+
WriteDescrSetIt->pBufferInfo = nullptr;
679+
WriteDescrSetIt->pTexelBufferView = nullptr;
675680

676681
auto WriteArrayElements = [&](auto DescrType, auto& DescrIt, const auto& DescrArr) //
677682
{
678683
while (ArrElem < ArraySize && DescrIt != DescrArr.end())
679684
{
680-
if (const auto& CachedRes = SetResources.GetResource(CacheOffset + (ArrElem++)))
685+
if (const ShaderResourceCacheVk::Resource& CachedRes = SetResources.GetResource(CacheOffset + (ArrElem++)))
681686
{
682687
*DescrIt = CachedRes.GetDescriptorWriteInfo<DescrType>();
683688
++DescrIt;
@@ -774,7 +779,7 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc
774779
AccelStructIt == DescrAccelStructArr.end() ||
775780
WriteDescrSetIt == WriteDescrSetArr.end())
776781
{
777-
auto DescrWriteCount = static_cast<Uint32>(std::distance(WriteDescrSetArr.begin(), WriteDescrSetIt));
782+
Uint32 DescrWriteCount = static_cast<Uint32>(std::distance(WriteDescrSetArr.begin(), WriteDescrSetIt));
778783
if (DescrWriteCount > 0)
779784
LogicalDevice.UpdateDescriptorSets(DescrWriteCount, WriteDescrSetArr.data(), 0, nullptr);
780785

@@ -786,7 +791,7 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc
786791
}
787792
}
788793

789-
auto DescrWriteCount = static_cast<Uint32>(std::distance(WriteDescrSetArr.begin(), WriteDescrSetIt));
794+
Uint32 DescrWriteCount = static_cast<Uint32>(std::distance(WriteDescrSetArr.begin(), WriteDescrSetIt));
790795
if (DescrWriteCount > 0)
791796
LogicalDevice.UpdateDescriptorSets(DescrWriteCount, WriteDescrSetArr.data(), 0, nullptr);
792797
}

0 commit comments

Comments
 (0)