ShaderRender is missing the appropriate barriers before and after cmdCopyImageToBuffer
authorMais Alnasser <mais.alnasser@amd.com>
Wed, 10 Feb 2016 20:08:15 +0000 (15:08 -0500)
committerMais Alnasser <mais.alnasser@amd.com>
Wed, 10 Feb 2016 20:46:55 +0000 (15:46 -0500)
external/vulkancts/modules/vulkan/shaderrender/vktShaderRender.cpp

index 09c0a8b..4d542b7 100644 (file)
@@ -1700,7 +1700,44 @@ void ShaderRenderCaseInstance::render (tcu::Surface& result, const QuadGrid& qua
                };
 
                VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
+
+               const VkImageMemoryBarrier imageBarrier =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,         // VkStructureType                      sType;
+                       DE_NULL,                                                                        // const void*                          pNext;
+                       VK_ACCESS_TRANSFER_WRITE_BIT,                           // VkAccessFlags                        srcAccessMask;
+                       VK_ACCESS_TRANSFER_READ_BIT,                            // VkAccessFlags                        dstAccessMask;
+                       VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,       // VkImageLayout                        oldLayout;
+                       VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,           // VkImageLayout                        newLayout;
+                       VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     dstQueueFamilyIndex;
+                       *m_colorImage,                                                          // VkImage                                      image;
+                       {                                                                                       // VkImageSubresourceRange      subresourceRange;
+                               VK_IMAGE_ASPECT_COLOR_BIT,                              // VkImageAspectFlags   aspectMask;
+                               0u,                                                     // deUint32                             baseMipLevel;
+                               1u,                                                     // deUint32                             mipLevels;
+                               0u,                                                     // deUint32                             baseArraySlice;
+                               1u                                                      // deUint32                             arraySize;
+                       }
+               };
+
+               const VkBufferMemoryBarrier bufferBarrier =
+               {
+                       VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,        // VkStructureType      sType;
+                       DE_NULL,                                                                        // const void*          pNext;
+                       VK_ACCESS_TRANSFER_WRITE_BIT,                           // VkAccessFlags        srcAccessMask;
+                       VK_ACCESS_HOST_READ_BIT,                                        // VkAccessFlags        dstAccessMask;
+                       VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                     srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                     dstQueueFamilyIndex;
+                       *readImageBuffer,                                                       // VkBuffer                     buffer;
+                       0u,                                                                                     // VkDeviceSize         offset;
+                       imageSizeBytes                                                          // VkDeviceSize         size;
+               };
+
+               vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &imageBarrier);
                vk.cmdCopyImageToBuffer(*cmdBuffer, *m_colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *readImageBuffer, 1u, &copyParams);
+               vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
+
                VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
 
                VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));