Support a variable descriptor count of 0. Bug: 439522242 Change-Id: I423e663ed151e42b47b924372ef9908d584fa33e Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/76308 Commit-Queue: Corentin Wallez <cwallez@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by: Corentin Wallez <cwallez@google.com> Presubmit-Ready: Corentin Wallez <cwallez@google.com> Reviewed-by: Geoff Lang <geofflang@google.com> Tested-by: Corentin Wallez <cwallez@google.com>
diff --git a/src/Vulkan/VkDescriptorPool.cpp b/src/Vulkan/VkDescriptorPool.cpp index 3eb1662..066120b 100644 --- a/src/Vulkan/VkDescriptorPool.cpp +++ b/src/Vulkan/VkDescriptorPool.cpp
@@ -74,7 +74,7 @@ for(uint32_t i = 0; i < descriptorSetCount; i++) { pDescriptorSets[i] = VK_NULL_HANDLE; - layoutSizes[i] = vk::Cast(pSetLayouts[i])->getDescriptorSetAllocationSize(variableDescriptorCounts ? variableDescriptorCounts[i] : 0); + layoutSizes[i] = vk::Cast(pSetLayouts[i])->getDescriptorSetAllocationSize(variableDescriptorCounts ? &variableDescriptorCounts[i] : nullptr); } VkResult result = allocateSets(&(layoutSizes[0]), descriptorSetCount, pDescriptorSets); @@ -82,7 +82,7 @@ { for(uint32_t i = 0; i < descriptorSetCount; i++) { - vk::Cast(pSetLayouts[i])->initialize(vk::Cast(pDescriptorSets[i]), variableDescriptorCounts ? variableDescriptorCounts[i] : 0); + vk::Cast(pSetLayouts[i])->initialize(vk::Cast(pDescriptorSets[i]), variableDescriptorCounts ? &variableDescriptorCounts[i] : nullptr); } } return result; @@ -235,4 +235,4 @@ return totalFreeSize; } -} // namespace vk \ No newline at end of file +} // namespace vk
diff --git a/src/Vulkan/VkDescriptorSetLayout.cpp b/src/Vulkan/VkDescriptorSetLayout.cpp index beae8c1..9f4bbcd 100644 --- a/src/Vulkan/VkDescriptorSetLayout.cpp +++ b/src/Vulkan/VkDescriptorSetLayout.cpp
@@ -143,22 +143,22 @@ type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC; } -size_t DescriptorSetLayout::getDescriptorSetAllocationSize(uint32_t variableDescriptorCount) const +size_t DescriptorSetLayout::getDescriptorSetAllocationSize(const uint32_t *variableDescriptorCount) const { // vk::DescriptorSet has a header with a pointer to the layout. return sw::align<alignof(DescriptorSet)>(sizeof(DescriptorSetHeader) + getDescriptorSetDataSize(variableDescriptorCount)); } -size_t DescriptorSetLayout::getDescriptorSetDataSize(uint32_t variableDescriptorCount) const +size_t DescriptorSetLayout::getDescriptorSetDataSize(const uint32_t *variableDescriptorCount) const { size_t size = 0; for(uint32_t i = 0; i < bindingsArraySize; i++) { uint32_t descriptorCount = bindings[i].descriptorCount; - if((i == (bindingsArraySize - 1)) && (variableDescriptorCount > 0)) + if((i == (bindingsArraySize - 1)) && variableDescriptorCount) { - descriptorCount = variableDescriptorCount; + descriptorCount = *variableDescriptorCount; } size += descriptorCount * GetDescriptorSize(bindings[i].descriptorType); @@ -167,7 +167,7 @@ return size; } -void DescriptorSetLayout::initialize(DescriptorSet *descriptorSet, uint32_t variableDescriptorCount) +void DescriptorSetLayout::initialize(DescriptorSet *descriptorSet, const uint32_t *variableDescriptorCount) { ASSERT(descriptorSet->header.layout == nullptr); @@ -181,9 +181,9 @@ uint32_t descriptorCount = bindings[i].descriptorCount; - if((i == (bindingsArraySize - 1)) && (variableDescriptorCount > 0)) + if((i == (bindingsArraySize - 1)) && variableDescriptorCount) { - descriptorCount = variableDescriptorCount; + descriptorCount = *variableDescriptorCount; } if(bindings[i].immutableSamplers)
diff --git a/src/Vulkan/VkDescriptorSetLayout.hpp b/src/Vulkan/VkDescriptorSetLayout.hpp index bf3a1c0..b3ff806 100644 --- a/src/Vulkan/VkDescriptorSetLayout.hpp +++ b/src/Vulkan/VkDescriptorSetLayout.hpp
@@ -106,10 +106,10 @@ static void WriteDescriptorSet(Device *device, DescriptorSet *dstSet, const VkDescriptorUpdateTemplateEntry &entry, const char *src); - void initialize(DescriptorSet *descriptorSet, uint32_t variableDescriptorCount); + void initialize(DescriptorSet *descriptorSet, const uint32_t* variableDescriptorCount); // Returns the total size of the descriptor set in bytes. - size_t getDescriptorSetAllocationSize(uint32_t variableDescriptorCount) const; + size_t getDescriptorSetAllocationSize(const uint32_t* variableDescriptorCount) const; // Returns the byte offset from the base address of the descriptor set for // the given binding number. @@ -136,7 +136,7 @@ private: uint8_t *getDescriptorPointer(DescriptorSet *descriptorSet, uint32_t bindingNumber, uint32_t arrayElement, uint32_t count, size_t *typeSize) const; - size_t getDescriptorSetDataSize(uint32_t variableDescriptorCount) const; + size_t getDescriptorSetDataSize(const uint32_t* variableDescriptorCount) const; static bool isDynamic(VkDescriptorType type); const VkDescriptorSetLayoutCreateFlags flags;