Commit eb682440 by Nicolas Capens Committed by Nicolas Capens

Assert reserved binding entries aren't accessed

The spec for VkDescriptorSetLayoutBinding states that "If descriptorCount is zero this binding entry is reserved and the resource must not be accessed from any stage via this binding within any pipeline using the set layout." This restores the debug validation that existed at https://swiftshader-review.googlesource.com/c/SwiftShader/+/44308/4/src/Pipeline/SpirvShaderMemory.cpp#b405 Bug: b/157915024 Change-Id: I5e6798b0cc87f564a3c6f13963995822660b5111 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45468Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
parent 974cfa9f
...@@ -387,6 +387,7 @@ SIMD::Pointer SpirvShader::GetPointerToData(Object::ID id, Int arrayIndex, EmitS ...@@ -387,6 +387,7 @@ SIMD::Pointer SpirvShader::GetPointerToData(Object::ID id, Int arrayIndex, EmitS
const auto &d = descriptorDecorations.at(id); const auto &d = descriptorDecorations.at(id);
ASSERT(d.DescriptorSet >= 0 && d.DescriptorSet < vk::MAX_BOUND_DESCRIPTOR_SETS); ASSERT(d.DescriptorSet >= 0 && d.DescriptorSet < vk::MAX_BOUND_DESCRIPTOR_SETS);
ASSERT(d.Binding >= 0); ASSERT(d.Binding >= 0);
ASSERT(routine->pipelineLayout->getDescriptorCount(d.DescriptorSet, d.Binding) != 0); // "If descriptorCount is zero this binding entry is reserved and the resource must not be accessed from any stage via this binding within any pipeline using the set layout."
uint32_t bindingOffset = routine->pipelineLayout->getBindingOffset(d.DescriptorSet, d.Binding); uint32_t bindingOffset = routine->pipelineLayout->getBindingOffset(d.DescriptorSet, d.Binding);
uint32_t descriptorSize = routine->pipelineLayout->getDescriptorSize(d.DescriptorSet, d.Binding); uint32_t descriptorSize = routine->pipelineLayout->getDescriptorSize(d.DescriptorSet, d.Binding);
......
...@@ -44,6 +44,7 @@ PipelineLayout::PipelineLayout(const VkPipelineLayoutCreateInfo *pCreateInfo, vo ...@@ -44,6 +44,7 @@ PipelineLayout::PipelineLayout(const VkPipelineLayoutCreateInfo *pCreateInfo, vo
descriptorSets[i].bindings[j].descriptorType = setLayout->getDescriptorType(j); descriptorSets[i].bindings[j].descriptorType = setLayout->getDescriptorType(j);
descriptorSets[i].bindings[j].offset = setLayout->getBindingOffset(j); descriptorSets[i].bindings[j].offset = setLayout->getBindingOffset(j);
descriptorSets[i].bindings[j].dynamicOffsetIndex = dynamicOffsetIndex; descriptorSets[i].bindings[j].dynamicOffsetIndex = dynamicOffsetIndex;
descriptorSets[i].bindings[j].descriptorCount = setLayout->getDescriptorCount(j);
if(DescriptorSetLayout::IsDescriptorDynamic(descriptorSets[i].bindings[j].descriptorType)) if(DescriptorSetLayout::IsDescriptorDynamic(descriptorSets[i].bindings[j].descriptorType))
{ {
...@@ -97,6 +98,12 @@ uint32_t PipelineLayout::getDynamicOffsetIndex(uint32_t setNumber, uint32_t bind ...@@ -97,6 +98,12 @@ uint32_t PipelineLayout::getDynamicOffsetIndex(uint32_t setNumber, uint32_t bind
return descriptorSets[setNumber].bindings[bindingNumber].dynamicOffsetIndex; return descriptorSets[setNumber].bindings[bindingNumber].dynamicOffsetIndex;
} }
uint32_t PipelineLayout::getDescriptorCount(uint32_t setNumber, uint32_t bindingNumber) const
{
ASSERT(setNumber < descriptorSetCount && bindingNumber < descriptorSets[setNumber].bindingCount);
return descriptorSets[setNumber].bindings[bindingNumber].descriptorCount;
}
uint32_t PipelineLayout::getBindingOffset(uint32_t setNumber, uint32_t bindingNumber) const uint32_t PipelineLayout::getBindingOffset(uint32_t setNumber, uint32_t bindingNumber) const
{ {
ASSERT(setNumber < descriptorSetCount && bindingNumber < descriptorSets[setNumber].bindingCount); ASSERT(setNumber < descriptorSetCount && bindingNumber < descriptorSets[setNumber].bindingCount);
......
...@@ -34,7 +34,7 @@ public: ...@@ -34,7 +34,7 @@ public:
// Returns the index into the pipeline's dynamic offsets array for // Returns the index into the pipeline's dynamic offsets array for
// the given descriptor set and binding number. // the given descriptor set and binding number.
uint32_t getDynamicOffsetIndex(uint32_t setNumber, uint32_t bindingNumber) const; uint32_t getDynamicOffsetIndex(uint32_t setNumber, uint32_t bindingNumber) const;
uint32_t getDescriptorCount(uint32_t setNumber, uint32_t bindingNumber) const;
uint32_t getBindingOffset(uint32_t setNumber, uint32_t bindingNumber) const; uint32_t getBindingOffset(uint32_t setNumber, uint32_t bindingNumber) const;
VkDescriptorType getDescriptorType(uint32_t setNumber, uint32_t bindingNumber) const; VkDescriptorType getDescriptorType(uint32_t setNumber, uint32_t bindingNumber) const;
uint32_t getDescriptorSize(uint32_t setNumber, uint32_t bindingNumber) const; uint32_t getDescriptorSize(uint32_t setNumber, uint32_t bindingNumber) const;
...@@ -49,8 +49,9 @@ private: ...@@ -49,8 +49,9 @@ private:
struct Binding struct Binding
{ {
VkDescriptorType descriptorType; VkDescriptorType descriptorType;
uint32_t offset; // Offset in bytes in the descriptor set data. uint32_t offset; // Offset in bytes in the descriptor set data.
uint32_t dynamicOffsetIndex; // TODO(b/154914395): Debug only. uint32_t dynamicOffsetIndex;
uint32_t descriptorCount;
}; };
struct DescriptorSet struct DescriptorSet
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment