Remove individual 3D slice layout transitions
authorNoah Fredriks <Noah.Fredriks@amd.com>
Wed, 31 May 2017 18:01:35 +0000 (14:01 -0400)
committerNoah Fredriks <Noah.Fredriks@amd.com>
Fri, 30 Jun 2017 20:28:10 +0000 (16:28 -0400)
For VK_KHR_maintenance1 render to 3D slice tests using
VK_IMAGE_CREATE_2D_ARRAY_COMPATIBILITY_BIT_KHR, layout
transitions from undefined would actually affect all
slices in the complete mip level instead of just those
specified in the image view.  Therefore, don't use
VK_IMAGE_LAYOUT_UNDEFINED when previous subpasses may
have already rendered to the other slices.

Affects: dEQP-VK.pipeline.render_to_image.3d.*

VK-GL-CTS issue: 476
Components: Vulkan

Change-Id: I0cfde62c03f4400246eef192a382d5593c6997e5

external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp

index 72510b6..d11c802 100644 (file)
@@ -917,7 +917,9 @@ tcu::TestStatus testWithSizeReduction (Context& context, const CaseDef& caseDef,
 
        const Unique<VkShaderModule>    vertexModule    (createShaderModule                     (vk, device, context.getBinaryCollection().get("vert"), 0u));
        const Unique<VkShaderModule>    fragmentModule  (createShaderModule                     (vk, device, context.getBinaryCollection().get("frag"), 0u));
-       const Unique<VkRenderPass>              renderPass              (makeRenderPass                         (vk, device, caseDef.colorFormat, caseDef.depthStencilFormat, static_cast<deUint32>(numSlices)));
+       const Unique<VkRenderPass>              renderPass              (makeRenderPass                         (vk, device, caseDef.colorFormat, caseDef.depthStencilFormat, static_cast<deUint32>(numSlices),
+                                                                                                                                                                (caseDef.viewType == VK_IMAGE_VIEW_TYPE_3D) ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
+                                                                                                                                                                                                                                                        : VK_IMAGE_LAYOUT_UNDEFINED));
        const Unique<VkPipelineLayout>  pipelineLayout  (makePipelineLayout                     (vk, device));
        vector<SharedPtrVkPipeline>             pipelines;
 
@@ -963,6 +965,42 @@ tcu::TestStatus testWithSizeReduction (Context& context, const CaseDef& caseDef,
                flushMappedMemoryRange(vk, device, vertexBufferAlloc->getMemory(), vertexBufferAlloc->getOffset(), vertexBufferSize);
        }
 
+       // Prepare color image upfront for rendering to individual slices.  3D slices aren't separate subresources, so they shouldn't be transitioned
+       // during each subpass like array layers.
+       if (caseDef.viewType == VK_IMAGE_VIEW_TYPE_3D)
+       {
+               const Unique<VkCommandPool>             cmdPool         (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
+               const Unique<VkCommandBuffer>   cmdBuffer       (makeCommandBuffer(vk, device, *cmdPool));
+
+               beginCommandBuffer(vk, *cmdBuffer);
+
+               const VkImageMemoryBarrier      imageBarrier    =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                         // VkStructureType            sType;
+                       DE_NULL,                                                                                        // const void*                pNext;
+                       (VkAccessFlags)0,                                                                       // VkAccessFlags              srcAccessMask;
+                       VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                           // VkAccessFlags              dstAccessMask;
+                       VK_IMAGE_LAYOUT_UNDEFINED,                                                      // VkImageLayout              oldLayout;
+                       VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,                       // VkImageLayout              newLayout;
+                       VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                   srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                   dstQueueFamilyIndex;
+                       *colorImage,                                                                            // VkImage                    image;
+                       {                                                                                                       // VkImageSubresourceRange    subresourceRange;
+                               VK_IMAGE_ASPECT_COLOR_BIT,                                                      // VkImageAspectFlags    aspectMask;
+                               0u,                                                                                                     // uint32_t              baseMipLevel;
+                               1u,                                                                                                     // uint32_t              levelCount;
+                               0u,                                                                                                     // uint32_t              baseArrayLayer;
+                               static_cast<deUint32>(imageSize.w()),                           // uint32_t              layerCount;
+                       }
+               };
+
+               vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u,
+                                                               0u, DE_NULL, 0u, DE_NULL, 1u, &imageBarrier);
+
+               VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
+               submitCommandsAndWait(vk, device, queue, *cmdBuffer);
+       }
+
        // For each image layer or slice (3D), create an attachment and a pipeline
        {
                const VkImageAspectFlags        depthStencilAspect              = getFormatAspectFlags(caseDef.depthStencilFormat);