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;