Fix descriptor_indexing.input_attachment subpass description
authorTom Cooper <tom.cooper@arm.com>
Sat, 26 Oct 2019 18:14:42 +0000 (19:14 +0100)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Tue, 12 Nov 2019 08:48:19 +0000 (03:48 -0500)
The input attachments in the subpass description did not match the
descriptor set layout and shader. Unused attachment references have
been inserted to pad out the subpass description.

Components: Vulkan

VK-GL-CTS Issue: 2072

Affects: dEQP-VK.descriptor_indexing.input_attachment*

Change-Id: Iab36be779007828ddb25fe0600305a19be448804

external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp

index 18ee14b..541b492 100644 (file)
@@ -1092,7 +1092,6 @@ PixelBufferAccess CommonDescriptorInstance::getPixelAccess                        (deUint32                                                                       i
        return tcu::PixelBufferAccess(vk::mapVkFormat(imageFormat), (imageExtent.width >> mipLevel), (imageExtent.height >> mipLevel), imageExtent.depth, data);
 }
 
-
 void CommonDescriptorInstance::updateDescriptors                                       (IterateCommonVariables&                                        variables)
 {
        const std::vector<deUint32>     primes = ut::generatePrimes(variables.availableDescriptorCount);
@@ -1104,7 +1103,6 @@ void CommonDescriptorInstance::updateDescriptors                                  (IterateCommonVariables&
                const VkDescriptorImageInfo*    pImageInfo                      = DE_NULL;
                const VkBufferView*                             pTexelBufferView        = DE_NULL;
 
-
                VkDescriptorImageInfo           imageInfo =
                {
                        static_cast<VkSampler>(0),
@@ -2395,9 +2393,25 @@ Move<VkRenderPass> InputAttachmentInstance::createRenderPass             (const IterateComm
 
        // build input atachments
        {
+               const std::vector<deUint32>     primes = ut::generatePrimes(variables.availableDescriptorCount);
                const deUint32 inputCount = static_cast<deUint32>(variables.descriptorImageViews.size());
                for (deUint32 inputIdx = 0; inputIdx < inputCount; ++inputIdx)
                {
+                       // primes holds the indices of input attachments for shader binding 10 which has input_attachment_index=1
+                       deUint32 nextInputAttachmentIndex = primes[inputIdx] + 1;
+
+                       // Fill up the subpass description's input attachments with unused attachments forming gaps to the next referenced attachment
+                       for (deUint32 unusedIdx = static_cast<deUint32>(inputAttachmentRefs.size()); unusedIdx < nextInputAttachmentIndex; ++unusedIdx)
+                       {
+                               const VkAttachmentReference             inputAttachmentRef =
+                               {
+                                       VK_ATTACHMENT_UNUSED,                                           // deUint32                                                     attachment;
+                                       VK_IMAGE_LAYOUT_GENERAL                                         // VkImageLayout                                        layout;
+                               };
+
+                               inputAttachmentRefs.push_back(inputAttachmentRef);
+                       }
+
                        const VkAttachmentDescription   inputAttachmentDescription =
                        {
                                VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT,                // VkAttachmentDescriptionFlags         flags;