return *this;
}
+DescriptorSetLayoutBuilder& DescriptorSetLayoutBuilder::addIndexedBinding (VkDescriptorType descriptorType,
+ deUint32 descriptorCount,
+ VkShaderStageFlags stageFlags,
+ deUint32 dstBinding,
+ const VkSampler* pImmutableSamplers)
+{
+ if (pImmutableSamplers)
+ {
+ const ImmutableSamplerInfo immutableSamplerInfo =
+ {
+ (deUint32)dstBinding,
+ (deUint32)m_immutableSamplers.size()
+ };
+
+ m_immutableSamplerInfos.push_back(immutableSamplerInfo);
+
+ for (size_t descriptorNdx = 0; descriptorNdx < descriptorCount; descriptorNdx++)
+ m_immutableSamplers.push_back(pImmutableSamplers[descriptorNdx]);
+ }
+
+ // pImmutableSamplers will be updated at build time
+ const VkDescriptorSetLayoutBinding binding =
+ {
+ dstBinding, // binding
+ descriptorType, // descriptorType
+ descriptorCount, // descriptorCount
+ stageFlags, // stageFlags
+ DE_NULL, // pImmutableSamplers
+ };
+ m_bindings.push_back(binding);
+ return *this;
+}
+
Move<VkDescriptorSetLayout> DescriptorSetLayoutBuilder::build (const DeviceInterface& vk, VkDevice device, VkDescriptorSetLayoutCreateFlags extraFlags) const
{
// Create new layout bindings with pImmutableSamplers updated
vk.updateDescriptorSets(device, (deUint32)writes.size(), writePtr, (deUint32)m_copies.size(), copyPtr);
}
-void DescriptorSetUpdateBuilder::updateWithPush (const DeviceInterface& vk, VkCommandBuffer cmd, VkPipelineBindPoint bindPoint, VkPipelineLayout pipelineLayout, deUint32 setIdx) const
+void DescriptorSetUpdateBuilder::updateWithPush (const DeviceInterface& vk, VkCommandBuffer cmd, VkPipelineBindPoint bindPoint, VkPipelineLayout pipelineLayout, deUint32 setIdx, deUint32 descriptorIdx, deUint32 numDescriptors) const
{
+ // Write all descriptors or just a subset?
+ deUint32 count = (numDescriptors) ? numDescriptors : (deUint32)m_writes.size();
+
// Update VkWriteDescriptorSet structures with stored info
- std::vector<VkWriteDescriptorSet> writes = m_writes;
+ std::vector<VkWriteDescriptorSet> writes = m_writes;
for (size_t writeNdx = 0; writeNdx < m_writes.size(); writeNdx++)
{
writes[writeNdx].pTexelBufferView = &writeInfo.texelBufferViews[0];
}
- const VkWriteDescriptorSet* const writePtr = (m_writes.empty()) ? (DE_NULL) : (&writes[0]);
+ const VkWriteDescriptorSet* const writePtr = (m_writes.empty()) ? (DE_NULL) : (&writes[descriptorIdx]);
+
+ vk.cmdPushDescriptorSetKHR(cmd, bindPoint, pipelineLayout, setIdx, count, writePtr);
+}
- vk.cmdPushDescriptorSetKHR(cmd, bindPoint, pipelineLayout, setIdx, (deUint32)m_writes.size(), writePtr);
+void DescriptorSetUpdateBuilder::clear(void)
+{
+ m_writeDescriptorInfos.clear();
+ m_writes.clear();
+ m_copies.clear();
}
} // vk