Do the 'from UNDEFINED' layout transition only on the first pass
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / descriptor_indexing / vktDescriptorSetsIndexingTests.cpp
index 541b492..aaa7ba6 100644 (file)
@@ -346,12 +346,20 @@ public:
                                                                                                                                 const IterateCommonVariables&                          variables,
                                                                                                                                 bool                                                                           fromTest);
 
+       void                                            iterateCommandSetup                             (IterateCommonVariables&                                        variables);
 
-       void                                            iterateCommandBegin                             (IterateCommonVariables&                                        variables);
+       void                                            iterateCommandBegin                             (IterateCommonVariables&                                        variables,
+                                                                                                                               bool                                                                            firstPass = true);
 
-       bool                                            iterateCommandEnd                               (IterateCommonVariables&                                        variables,
+       void                                            iterateCommandEnd                               (IterateCommonVariables&                                        variables,
+                                                                                                                               ut::UpdatablePixelBufferAccessPtr&      programResult,
+                                                                                                                               ut::UpdatablePixelBufferAccessPtr&      referenceResult,
                                                                                                                                 bool                                                                           collectBeforeSubmit = true);
 
+       bool                                            iterateVerifyResults                    (IterateCommonVariables&                                        variables,
+                                                                                                                                        ut::UpdatablePixelBufferAccessPtr      programResult,
+                                                                                                                                        ut::UpdatablePixelBufferAccessPtr      referenceResult);
+
        Move<VkCommandBuffer>           createCmdBuffer                                 (void);
 
        void                                            commandBindPipeline                             (VkCommandBuffer                                                        commandBuffer,
@@ -1165,7 +1173,7 @@ void CommonDescriptorInstance::updateDescriptors                                  (IterateCommonVariables&
        }
 }
 
-void CommonDescriptorInstance::iterateCommandBegin                                     (IterateCommonVariables&                                        variables)
+void CommonDescriptorInstance::iterateCommandSetup                                     (IterateCommonVariables&                                        variables)
 {
        variables.dataAlignment                         = 0;
 
@@ -1217,66 +1225,74 @@ void CommonDescriptorInstance::iterateCommandBegin                                      (IterateCommonVariables&
                updateDescriptors                               (variables);
        }
 
+}
+
+void CommonDescriptorInstance::iterateCommandBegin                                     (IterateCommonVariables&                                        variables,      bool firstPass)
+{
        vk::beginCommandBuffer                          (m_vki, *variables.commandBuffer);
 
        // Clear color attachment, and transition it to VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
        if ((m_testParams.stageFlags & VK_SHADER_STAGE_VERTEX_BIT) || (m_testParams.stageFlags & VK_SHADER_STAGE_FRAGMENT_BIT))
        {
-               const VkImageMemoryBarrier preImageBarrier =
+               if (firstPass)
                {
-                       VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                         // VkStructureType              sType
-                       DE_NULL,                                                                                        // const void*                  pNext
-                       0u,                                                                                                     // VkAccessFlags                srcAccessMask
-                       VK_ACCESS_TRANSFER_WRITE_BIT,                                           // VkAccessFlags                dstAccessMask
-                       VK_IMAGE_LAYOUT_UNDEFINED,                                                      // VkImageLayout                oldLayout
-                       VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,                           // VkImageLayout                newLayout
-                       VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             srcQueueFamilyIndex
-                       VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             dstQueueFamilyIndex
-                       *variables.frameBuffer->image->image,                           // VkImage                              image
+                       const VkImageMemoryBarrier preImageBarrier =
                        {
-                               VK_IMAGE_ASPECT_COLOR_BIT,                              // VkImageAspectFlags   aspectMask
-                               0u,                                                                             // uint32_t                             baseMipLevel
-                               VK_REMAINING_MIP_LEVELS,                                // uint32_t                             mipLevels,
-                               0u,                                                                             // uint32_t                             baseArray
-                               VK_REMAINING_ARRAY_LAYERS,                              // uint32_t                             arraySize
-                       }
-               };
+                               VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                         // VkStructureType              sType
+                               DE_NULL,                                                                                        // const void*                  pNext
+                               0u,                                                                                                     // VkAccessFlags                srcAccessMask
+                               VK_ACCESS_TRANSFER_WRITE_BIT,                                           // VkAccessFlags                dstAccessMask
+                               VK_IMAGE_LAYOUT_UNDEFINED,                                                      // VkImageLayout                oldLayout
+                               VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,                           // VkImageLayout                newLayout
+                               VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             srcQueueFamilyIndex
+                               VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             dstQueueFamilyIndex
+                               *variables.frameBuffer->image->image,                           // VkImage                              image
+                               {
+                                       VK_IMAGE_ASPECT_COLOR_BIT,                              // VkImageAspectFlags   aspectMask
+                                       0u,                                                                             // uint32_t                             baseMipLevel
+                                       VK_REMAINING_MIP_LEVELS,                                // uint32_t                             mipLevels,
+                                       0u,                                                                             // uint32_t                             baseArray
+                                       VK_REMAINING_ARRAY_LAYERS,                              // uint32_t                             arraySize
+                               }
+                       };
 
-               m_vki.cmdPipelineBarrier(*variables.commandBuffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
-                                                               (VkDependencyFlags)0,
-                                                               0, (const VkMemoryBarrier*)DE_NULL,
-                                                               0, (const VkBufferMemoryBarrier*)DE_NULL,
-                                                               1, &preImageBarrier);
+                       m_vki.cmdPipelineBarrier(*variables.commandBuffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                                                       (VkDependencyFlags)0,
+                                                                       0, (const VkMemoryBarrier*)DE_NULL,
+                                                                       0, (const VkBufferMemoryBarrier*)DE_NULL,
+                                                                       1, &preImageBarrier);
 
-               const VkClearColorValue clearColorValue         = makeClearValueColor(m_clearColor).color;
-               m_vki.cmdClearColorImage(*variables.commandBuffer, *variables.frameBuffer->image->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColorValue, 1, &preImageBarrier.subresourceRange);
+                       const VkClearColorValue clearColorValue         = makeClearValueColor(m_clearColor).color;
 
-               const VkImageMemoryBarrier postImageBarrier =
-               {
-                       VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                         // VkStructureType              sType
-                       DE_NULL,                                                                                        // const void*                  pNext
-                       VK_ACCESS_TRANSFER_WRITE_BIT,                                           // VkAccessFlags                srcAccessMask
-                       VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                           // VkAccessFlags                dstAccessMask
-                       VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,                           // VkImageLayout                oldLayout
-                       VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,                       // VkImageLayout                newLayout
-                       VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             srcQueueFamilyIndex
-                       VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             dstQueueFamilyIndex
-                       *variables.frameBuffer->image->image,                           // VkImage                              image
+                       m_vki.cmdClearColorImage(*variables.commandBuffer, *variables.frameBuffer->image->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColorValue, 1, &preImageBarrier.subresourceRange);
+
+                       const VkImageMemoryBarrier postImageBarrier =
                        {
-                               VK_IMAGE_ASPECT_COLOR_BIT,                              // VkImageAspectFlags   aspectMask
-                               0u,                                                                             // uint32_t                             baseMipLevel
-                               VK_REMAINING_MIP_LEVELS,                                // uint32_t                             mipLevels,
-                               0u,                                                                             // uint32_t                             baseArray
-                               VK_REMAINING_ARRAY_LAYERS,                              // uint32_t                             arraySize
-                       }
-               };
+                               VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                         // VkStructureType              sType
+                               DE_NULL,                                                                                        // const void*                  pNext
+                               VK_ACCESS_TRANSFER_WRITE_BIT,                                           // VkAccessFlags                srcAccessMask
+                               VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                           // VkAccessFlags                dstAccessMask
+                               VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,                           // VkImageLayout                oldLayout
+                               VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,                       // VkImageLayout                newLayout
+                               VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             srcQueueFamilyIndex
+                               VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             dstQueueFamilyIndex
+                               *variables.frameBuffer->image->image,                           // VkImage                              image
+                               {
+                                       VK_IMAGE_ASPECT_COLOR_BIT,                              // VkImageAspectFlags   aspectMask
+                                       0u,                                                                             // uint32_t                             baseMipLevel
+                                       VK_REMAINING_MIP_LEVELS,                                // uint32_t                             mipLevels,
+                                       0u,                                                                             // uint32_t                             baseArray
+                                       VK_REMAINING_ARRAY_LAYERS,                              // uint32_t                             arraySize
+                               }
+                       };
 
-               m_vki.cmdPipelineBarrier(*variables.commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
-                                                               (VkDependencyFlags)0,
-                                                               0, (const VkMemoryBarrier*)DE_NULL,
-                                                               0, (const VkBufferMemoryBarrier*)DE_NULL,
-                                                               1, &postImageBarrier);
+                       m_vki.cmdPipelineBarrier(*variables.commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+                                                                       (VkDependencyFlags)0,
+                                                                       0, (const VkMemoryBarrier*)DE_NULL,
+                                                                       0, (const VkBufferMemoryBarrier*)DE_NULL,
+                                                                       1, &postImageBarrier);
 
+               }
        }
 
        if (m_testParams.calculateInLoop)
@@ -1318,25 +1334,35 @@ void CommonDescriptorInstance::iterateCommandBegin                                      (IterateCommonVariables&
 tcu::TestStatus        CommonDescriptorInstance::iterate                                       (void)
 {
        IterateCommonVariables  v;
-       iterateCommandBegin             (v);
+       ut::UpdatablePixelBufferAccessPtr       programResult;
+       ut::UpdatablePixelBufferAccessPtr       referenceResult;
 
-       if (true == m_testParams.copyBuffersToImages)
-       {
-               copyBuffersToImages     (v);
-       }
+       bool firstPass = true;
 
-       if (true == m_testParams.updateAfterBind)
-       {
-               updateDescriptors       (v);
-       }
+       iterateCommandSetup             (v);
+
+       v.renderArea.extent.width       = m_testParams.frameResolution.width/4;
+       v.renderArea.extent.height      = m_testParams.frameResolution.height/4;
 
-       v.renderArea.extent.width       = m_testParams.frameResolution.width/2;
-       v.renderArea.extent.height      = m_testParams.frameResolution.height/2;
-       for (int x = 0; x < 2; x++)
-               for (int y= 0; y < 2; y++)
+       for (int x = 0; x < 4; x++)
+               for (int y= 0; y < 4; y++)
                {
-                       v.renderArea.offset.x           = x * m_testParams.frameResolution.width/2;
-                       v.renderArea.offset.y           = y * m_testParams.frameResolution.height/2;
+                       iterateCommandBegin             (v, firstPass);
+
+                       if (true == firstPass && true == m_testParams.copyBuffersToImages)
+                       {
+                               copyBuffersToImages     (v);
+                       }
+
+                       firstPass = false;
+
+                       if (true == m_testParams.updateAfterBind)
+                       {
+                               updateDescriptors       (v);
+                       }
+
+                       v.renderArea.offset.x           = x * m_testParams.frameResolution.width/4;
+                       v.renderArea.offset.y           = y * m_testParams.frameResolution.height/4;
 
                        vk::VkRect2D scissor = makeRect2D(v.renderArea.offset.x, v.renderArea.offset.y, v.renderArea.extent.width, v.renderArea.extent.height);
                        m_vki.cmdSetScissor(*v.commandBuffer, 0u, 1u, &scissor);
@@ -1344,9 +1370,11 @@ tcu::TestStatus  CommonDescriptorInstance::iterate                                       (void)
                        vk::beginRenderPass             (m_vki, *v.commandBuffer, *v.renderPass, *v.frameBuffer->buffer, v.renderArea, m_clearColor);
                        m_vki.cmdDraw                   (*v.commandBuffer, v.vertexCount, 1u, 0u, 0u);
                        vk::endRenderPass               (m_vki, *v.commandBuffer);
+
+                       iterateCommandEnd(v, programResult, referenceResult);
                }
 
-       return (iterateCommandEnd(v) ? tcu::TestStatus::pass : tcu::TestStatus::fail)("");
+       return ( iterateVerifyResults(v, programResult, referenceResult) ? tcu::TestStatus::pass : tcu::TestStatus::fail)("");
 }
 
 std::vector<float> CommonDescriptorInstance::createColorScheme         (void)
@@ -1361,12 +1389,11 @@ std::vector<float> CommonDescriptorInstance::createColorScheme          (void)
        return cs;
 }
 
-bool CommonDescriptorInstance::iterateCommandEnd                                       (IterateCommonVariables&                                        variables,
+void CommonDescriptorInstance::iterateCommandEnd                                       (IterateCommonVariables&                                        variables,
+                                                                                                                                        ut::UpdatablePixelBufferAccessPtr&     programResult,
+                                                                                                                                        ut::UpdatablePixelBufferAccessPtr&     referenceResult,
                                                                                                                                         bool                                                                           collectBeforeSubmit)
 {
-       ut::UpdatablePixelBufferAccessPtr       programResult;
-       ut::UpdatablePixelBufferAccessPtr       referenceResult;
-
        if (collectBeforeSubmit)
        {
                iterateCollectResults(programResult, variables, true);
@@ -1382,7 +1409,12 @@ bool CommonDescriptorInstance::iterateCommandEnd                                 (IterateCommonVariables&
                iterateCollectResults(programResult, variables, true);
                iterateCollectResults(referenceResult, variables, false);
        }
+}
 
+bool CommonDescriptorInstance::iterateVerifyResults                    (IterateCommonVariables&                                        variables,
+                                                                                                                                        ut::UpdatablePixelBufferAccessPtr      programResult,
+                                                                                                                                        ut::UpdatablePixelBufferAccessPtr      referenceResult)
+{
        bool result = false;
        if (m_testParams.fuzzyComparison)
        {
@@ -2190,7 +2222,11 @@ void DynamicBuffersInstance::updateDescriptors                                           (IterateCommonVariables&
 tcu::TestStatus        DynamicBuffersInstance::iterate                                         (void)
 {
        IterateCommonVariables  v;
-       iterateCommandBegin             (v);
+       iterateCommandSetup             (v);
+
+       ut::UpdatablePixelBufferAccessPtr       programResult;
+       ut::UpdatablePixelBufferAccessPtr       referenceResult;
+       bool firstPass = true;
 
        DE_ASSERT(v.dataAlignment);
 
@@ -2219,6 +2255,19 @@ tcu::TestStatus  DynamicBuffersInstance::iterate                                         (void)
 
        const VkDescriptorSet   descriptorSets[] = { *v.descriptorSet };
 
+       v.renderArea.extent.width       = m_testParams.frameResolution.width/4;
+       v.renderArea.extent.height      = m_testParams.frameResolution.height/4;
+
+       for (int x = 0; x < 4; x++)
+               for (int y= 0; y < 4; y++)
+               {
+
+                       v.renderArea.offset.x           = x * m_testParams.frameResolution.width/4;
+                       v.renderArea.offset.y           = y * m_testParams.frameResolution.height/4;
+
+                       iterateCommandBegin             (v, firstPass);
+                       firstPass = false;
+
        m_vki.cmdBindDescriptorSets(
                *v.commandBuffer,                                               // commandBuffer
                VK_PIPELINE_BIND_POINT_GRAPHICS,                // pipelineBindPoint
@@ -2229,14 +2278,17 @@ tcu::TestStatus DynamicBuffersInstance::iterate                                         (void)
                v.availableDescriptorCount,                             // dynamicOffsetCount
                dynamicOffsets.data());                                 // pDynamicOffsets
 
-       vk::VkRect2D scissor = makeRect2D(m_testParams.frameResolution.width, m_testParams.frameResolution.height);
+                       vk::VkRect2D scissor = makeRect2D(v.renderArea.offset.x, v.renderArea.offset.y, v.renderArea.extent.width, v.renderArea.extent.height);
        m_vki.cmdSetScissor(*v.commandBuffer, 0u, 1u, &scissor);
 
        vk::beginRenderPass     (m_vki, *v.commandBuffer, *v.renderPass, *v.frameBuffer->buffer, v.renderArea, m_clearColor);
-       m_vki.cmdDraw           (*v.commandBuffer, v.vertexCount, 1, 0, 0);
+                       m_vki.cmdDraw                   (*v.commandBuffer, v.vertexCount, 1u, 0u, 0u);
        vk::endRenderPass       (m_vki, *v.commandBuffer);
 
-       return (iterateCommandEnd(v) ? tcu::TestStatus::pass : tcu::TestStatus::fail)("");
+                       iterateCommandEnd(v, programResult, referenceResult);
+               }
+
+       return (iterateVerifyResults(v, programResult, referenceResult) ? tcu::TestStatus::pass : tcu::TestStatus::fail)("");
 }
 
 class DynamicStorageBufferInstance : public DynamicBuffersInstance, public StorageBufferInstance
@@ -2934,8 +2986,12 @@ void StorageImageInstance::createAndPopulateDescriptors                          (IterateCommonVariabl
 tcu::TestStatus StorageImageInstance::iterate                                          (void)
 {
        IterateCommonVariables  v;
+       iterateCommandSetup             (v);
        iterateCommandBegin             (v);
 
+       ut::UpdatablePixelBufferAccessPtr       programResult;
+       ut::UpdatablePixelBufferAccessPtr       referenceResult;
+
        if (m_testParams.updateAfterBind)
        {
                updateDescriptors       (v);
@@ -2950,7 +3006,9 @@ tcu::TestStatus StorageImageInstance::iterate                                             (void)
 
        copyImagesToBuffers             (v);
 
-       return (iterateCommandEnd(v, false) ? tcu::TestStatus::pass : tcu::TestStatus::fail)("");
+       iterateCommandEnd(v, programResult, referenceResult, false);
+
+       return ( iterateVerifyResults(v, programResult, referenceResult) ? tcu::TestStatus::pass : tcu::TestStatus::fail)("");
 }
 
 void StorageImageInstance::iterateCollectResults                                       (ut::UpdatablePixelBufferAccessPtr&                     result,