Merge vk-gl-cts/aosp-deqp-dev into vk-gl-cts/master
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / framework / vulkan / vkBuilderUtil.cpp
index cc0232e..2ce46a0 100644 (file)
@@ -66,6 +66,39 @@ DescriptorSetLayoutBuilder& DescriptorSetLayoutBuilder::addBinding (VkDescriptor
        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
@@ -243,10 +276,13 @@ void DescriptorSetUpdateBuilder::update (const DeviceInterface& vk, VkDevice dev
        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++)
        {
@@ -262,9 +298,16 @@ void DescriptorSetUpdateBuilder::updateWithPush (const DeviceInterface& vk, VkCo
                        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