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;