Fix image validation errors in SPIR-V tests
authorPaavo Pessi <paavo.pessi@siru.fi>
Fri, 6 Apr 2018 11:12:05 +0000 (14:12 +0300)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 19 Apr 2018 08:44:34 +0000 (04:44 -0400)
A helper function for uploading images caused validation errors by
setting the image layout to SHADER_READ_ONLY_OPTIMAL regardless of the
image descriptor type.

A new parameter for defining the image layout was added to the helper
function, and tests using storage images were changed to use GENERAL
layout.

Affects:

dEQP-VK.spirv_assembly.instruction.compute.image_sampler.imageread.storage_image.*

Components: Vulkan, Framework

VK-GL-CTS issue: 1111

Change-Id: I783c87fe2dd91d65537343d1ae88e3a4f07b77c6

external/vulkancts/framework/vulkan/vkImageUtil.cpp
external/vulkancts/framework/vulkan/vkImageUtil.hpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp

index 7807983..741ca0d 100644 (file)
@@ -2601,7 +2601,8 @@ void copyBufferToImage (const DeviceInterface&                                    vk,
                                                VkImageAspectFlags                                              imageAspectFlags,
                                                deUint32                                                                mipLevels,
                                                deUint32                                                                arrayLayers,
-                                               VkImage                                                                 destImage)
+                                               VkImage                                                                 destImage,
+                                               VkImageLayout                                                   destImageLayout)
 {
        Move<VkCommandPool>             cmdPool         = createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
        Move<VkCommandBuffer>   cmdBuffer       = allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
@@ -2648,7 +2649,7 @@ void copyBufferToImage (const DeviceInterface&                                    vk,
                VK_ACCESS_TRANSFER_WRITE_BIT,                                   // VkAccessFlags                        srcAccessMask;
                VK_ACCESS_SHADER_READ_BIT,                                              // VkAccessFlags                        dstAccessMask;
                VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,                   // VkImageLayout                        oldLayout;
-               VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,               // VkImageLayout                        newLayout;
+               destImageLayout,                                                                // VkImageLayout                        newLayout;
                VK_QUEUE_FAMILY_IGNORED,                                                // deUint32                                     srcQueueFamilyIndex;
                VK_QUEUE_FAMILY_IGNORED,                                                // deUint32                                     dstQueueFamilyIndex;
                destImage,                                                                              // VkImage                                      image;
index f834ca3..3d4aac1 100644 (file)
@@ -150,7 +150,8 @@ void                                                        copyBufferToImage                               (const DeviceInterface&                                         vk,
                                                                                                                                 vk::VkImageAspectFlags                                         imageAspectFlags,
                                                                                                                                 deUint32                                                                       mipLevels,
                                                                                                                                 deUint32                                                                       arrayLayers,
-                                                                                                                                vk::VkImage                                                            destImage);
+                                                                                                                                vk::VkImage                                                            destImage,
+                                                                                                                                VkImageLayout                                                          destImageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
 
 /*--------------------------------------------------------------------*//*!
  * Checks if the physical device supports creation of the specified
index 2a85eeb..5e505e6 100644 (file)
@@ -513,6 +513,7 @@ tcu::TestStatus SpvAsmComputeShaderInstance::iterate (void)
                        inputImages.push_back(ImageHandleSp(image));
                        inputAllocs.push_back(de::SharedPtr<Allocation>(imageAlloc.release()));
 
+                       const VkImageLayout                     imageLayout             = (descType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
                        const VkBufferImageCopy         copyRegion              =
                        {
                                0u,                                                                                             // VkDeviceSize                         bufferOffset;
@@ -530,7 +531,7 @@ tcu::TestStatus SpvAsmComputeShaderInstance::iterate (void)
                        vector<VkBufferImageCopy>       copyRegions;
                        copyRegions.push_back(copyRegion);
 
-                       copyBufferToImage(vkdi, device, queue, queueFamilyIndex, buffer->get(), (deUint32)numBytes, copyRegions, DE_NULL, VK_IMAGE_ASPECT_COLOR_BIT, 1u, 1u, image->get());
+                       copyBufferToImage(vkdi, device, queue, queueFamilyIndex, buffer->get(), (deUint32)numBytes, copyRegions, DE_NULL, VK_IMAGE_ASPECT_COLOR_BIT, 1u, 1u, image->get(), imageLayout);
                }
        }