VkDescriptorSetLayoutBinding const & DescriptorSetLayout::getBindingLayout(uint32_t binding) const
{
- ASSERT(binding < bindingCount);
- return bindings[binding];
+ uint32_t index = getBindingIndex(binding);
+ return bindings[index];
}
uint8_t* DescriptorSetLayout::getOffsetPointer(DescriptorSet *descriptorSet, uint32_t binding, uint32_t arrayElement, uint32_t count, size_t* typeSize) const
// VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC
bool isBindingDynamic(uint32_t binding) const;
- // Returns the VkDescriptorSetLayoutBinding for the binding with the given
- // index.
+ // Returns the VkDescriptorSetLayoutBinding for the given binding.
VkDescriptorSetLayoutBinding const & getBindingLayout(uint32_t binding) const;
uint8_t* getOffsetPointer(DescriptorSet *descriptorSet, uint32_t binding, uint32_t arrayElement, uint32_t count, size_t* typeSize) const;
for(uint32_t i = 0; i < descriptorUpdateEntryCount; i++)
{
- for(uint32_t j = 0; j < descriptorUpdateEntries[i].descriptorCount; j++)
+ auto const &entry = descriptorUpdateEntries[i];
+ auto binding = entry.dstBinding;
+ auto arrayElement = entry.dstArrayElement;
+ for (uint32_t descriptorIndex = 0; descriptorIndex < entry.descriptorCount; descriptorIndex++)
{
- const char *memToRead = (const char *)pData + descriptorUpdateEntries[i].offset + j * descriptorUpdateEntries[i].stride;
+ while (arrayElement == descriptorSetLayout->getBindingLayout(binding).descriptorCount)
+ {
+ // If descriptorCount is greater than the number of remaining
+ // array elements in the destination binding, those affect
+ // consecutive bindings in a manner similar to
+ // VkWriteDescriptorSet.
+ // If a binding has a descriptorCount of zero, it is skipped.
+ arrayElement = 0;
+ binding++;
+ }
+
+ uint8_t *memToRead = (uint8_t *)pData + entry.offset + descriptorIndex * entry.stride;
size_t typeSize = 0;
uint8_t* memToWrite = descriptorSetLayout->getOffsetPointer(
- descriptorSet, descriptorUpdateEntries[i].dstBinding, descriptorUpdateEntries[i].dstArrayElement, 1, &typeSize);
+ descriptorSet,
+ binding,
+ arrayElement,
+ 1, // count
+ &typeSize);
memcpy(memToWrite, memToRead, typeSize);
+
+ arrayElement++;
}
}
}