Clear Core Validation Errors for Protected Memory
authorMartin Freebody <martin.freebody@mobica.com>
Tue, 18 Dec 2018 14:48:13 +0000 (14:48 +0000)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 11 Jan 2019 10:08:40 +0000 (05:08 -0500)
Affects: dEQP-VK.protected_memory.*

Components: Vulkan

VK-GL-CTS issue: 1539

Change-Id: I19c51330394f2fccc7a7a01fed3395bb66a5ab3f

12 files changed:
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemAttachmentClearTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemAttachmentLoadTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemBlitImageTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemClearColorImageTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemCopyBufferToImageTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemCopyImageTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemImageValidator.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemImageValidator.hpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemShaderImageAccessTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemUtils.hpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemWorkgroupStorageTests.cpp

index 0c2d3d8..fd0a0be 100644 (file)
@@ -271,7 +271,7 @@ tcu::TestStatus AttachmentClearTestInstance::iterate()
                << tcu::TestLog::Message << "Stencil clear value: " << m_clearValue.depthStencil.stencil << tcu::TestLog::EndMessage;
 
        // Validate resulting image
-       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
                return tcu::TestStatus::pass("Everything went OK");
        else
                return tcu::TestStatus::fail("Something went really wrong");
index f7f9926..66ae052 100644 (file)
@@ -213,7 +213,7 @@ tcu::TestStatus AttachmentLoadTestInstance::iterate()
                << tcu::TestLog::Message << "Stencil clear value: " << m_clearValue.depthStencil.stencil << tcu::TestLog::EndMessage;
 
        // Validate resulting image
-       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
                return tcu::TestStatus::pass("Everything went OK");
        else
                return tcu::TestStatus::fail("Something went really wrong");
index bed4569..b3091f8 100644 (file)
@@ -340,7 +340,7 @@ tcu::TestStatus BlitImageTestInstance::iterate()
                << tcu::TestLog::Message << "Color clear value: " << tcu::Vec4(m_clearColorValue.float32) << tcu::TestLog::EndMessage;
 
        // Validate resulting image
-       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
                return tcu::TestStatus::pass("Everything went OK");
        else
                return tcu::TestStatus::fail("Something went really wrong");
index 35d35e4..86b8ba0 100644 (file)
@@ -233,7 +233,7 @@ tcu::TestStatus ClearColorImageTestInstance::iterate()
                << tcu::TestLog::Message << "Color clear value: " << tcu::Vec4(m_clearColorValue.float32) << tcu::TestLog::EndMessage;
 
        // Validate resulting image
-       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
                return tcu::TestStatus::pass("Everything went OK");
        else
                return tcu::TestStatus::fail("Something went really wrong");
index 43022ca..3c56960 100644 (file)
@@ -300,7 +300,7 @@ tcu::TestStatus CopyBufferToImageTestInstance::iterate()
                << tcu::TestLog::Message << "Fill value: " << m_fillValue << tcu::TestLog::EndMessage;
 
        // Validate resulting image
-       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
                return tcu::TestStatus::pass("Everything went OK");
        else
                return tcu::TestStatus::fail("Something went really wrong");
index 2ebbf72..769897c 100644 (file)
@@ -338,7 +338,7 @@ tcu::TestStatus CopyImageTestInstance::iterate()
                        << tcu::TestLog::Message << "Color clear value: " << tcu::Vec4(m_clearColorValue.float32) << tcu::TestLog::EndMessage;
 
        // Validate resulting image
-       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+       if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
                return tcu::TestStatus::pass("Everything went OK");
        else
                return tcu::TestStatus::fail("Something went really wrong");
index 6bc186c..38dafa9 100644 (file)
@@ -111,7 +111,7 @@ void ImageValidator::initPrograms (vk::SourceCollections& programCollection) con
 }
 
 bool ImageValidator::validateImage (ProtectedContext& ctx, const ValidationData& refData,
-                                                                       const vk::VkImage image, const vk::VkFormat imageFormat) const
+                                                                       const vk::VkImage image, const vk::VkFormat imageFormat, const vk::VkImageLayout imageLayout) const
 {
        // Log out a few reference info
        {
@@ -197,7 +197,7 @@ bool ImageValidator::validateImage (ProtectedContext& ctx, const ValidationData&
        {
                vk::VkDescriptorBufferInfo      descRefUniform  = makeDescriptorBufferInfo(**refUniform, 0, refUniformSize);
                vk::VkDescriptorBufferInfo      descBuffer              = makeDescriptorBufferInfo(**helperBuffer, 0, helperBufferSize);
-               vk::VkDescriptorImageInfo       descSampledImg  = makeDescriptorImageInfo(*sampler, *imageView, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+               vk::VkDescriptorImageInfo       descSampledImg  = makeDescriptorImageInfo(*sampler, *imageView, imageLayout);
 
                vk::DescriptorSetUpdateBuilder()
                        .writeSingle(*descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &descSampledImg)
index 47f5cf5..b92f7e9 100644 (file)
@@ -52,7 +52,8 @@ public:
        bool                                    validateImage   (ProtectedContext&              ctx,
                                                                                         const ValidationData&  refData,
                                                                                         const vk::VkImage              image,
-                                                                                        const vk::VkFormat             imageFormat) const;
+                                                                                        const vk::VkFormat             imageFormat,
+                                                                                        const vk::VkImageLayout imageLayout) const;
 
 private:
        const vk::VkFormat              m_imageFormat;
index 5a370b9..e645e5d 100644 (file)
@@ -231,6 +231,7 @@ private:
        de::MovePtr<tcu::Texture2D>     createTestTexture2D             (void);
        void                                            calculateAtomicRef              (tcu::Texture2D&                texture2D);
        tcu::TestStatus                         validateResult                  (vk::VkImage                    image,
+                                                                                                                vk::VkImageLayout              imageLayout,
                                                                                                                 const tcu::Texture2D&  texture2D,
                                                                                                                 const tcu::Sampler&    refSampler);
 
@@ -545,8 +546,31 @@ tcu::TestStatus ImageAccessTestInstance::executeComputeTest (void)
                // Upload data to an unprotected image
                uploadImage(m_protectedContext, **unprotectedImage, *texture2D);
 
+               // Select vkImageLayout based upon accessType
+               vk::VkImageLayout imageSrcLayout = vk::VK_IMAGE_LAYOUT_UNDEFINED;
+
+               switch (m_params.accessType)
+               {
+                       case ACCESS_TYPE_SAMPLING:
+                       case ACCESS_TYPE_TEXEL_FETCH:
+                       {
+                               imageSrcLayout = vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+                               break;
+                       }
+                       case ACCESS_TYPE_IMAGE_LOAD:
+                       case ACCESS_TYPE_IMAGE_STORE:
+                       case ACCESS_TYPE_IMAGE_ATOMICS:
+                       {
+                               imageSrcLayout = vk::VK_IMAGE_LAYOUT_GENERAL;
+                               break;
+                       }
+                       default:
+                               DE_FATAL("Impossible");
+                               break;
+               }
+
                // Copy unprotected image to protected image
-               copyToProtectedImage(m_protectedContext, **unprotectedImage, **imageSrc, IMAGE_WIDTH, IMAGE_HEIGHT);
+               copyToProtectedImage(m_protectedContext, **unprotectedImage, **imageSrc, imageSrcLayout, IMAGE_WIDTH, IMAGE_HEIGHT);
        }
 
        // Clear dst image
@@ -671,7 +695,7 @@ tcu::TestStatus ImageAccessTestInstance::executeComputeTest (void)
        {
                const vk::VkImage       resultImage             = m_params.accessType == ACCESS_TYPE_IMAGE_ATOMICS ? **imageSrc : **imageDst;
 
-               return validateResult(resultImage, *texture2D, refSampler);
+               return validateResult(resultImage, vk::VK_IMAGE_LAYOUT_GENERAL, *texture2D, refSampler);
        }
 }
 
@@ -745,6 +769,29 @@ tcu::TestStatus ImageAccessTestInstance::executeFragmentTest (void)
                }
        }
 
+       // Select vkImageLayout based upon accessType
+       vk::VkImageLayout imageLayout = vk::VK_IMAGE_LAYOUT_UNDEFINED;
+
+       switch (m_params.accessType)
+       {
+               case ACCESS_TYPE_SAMPLING:
+               case ACCESS_TYPE_TEXEL_FETCH:
+               {
+                       imageLayout = vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+                       break;
+               }
+               case ACCESS_TYPE_IMAGE_LOAD:
+               case ACCESS_TYPE_IMAGE_STORE:
+               case ACCESS_TYPE_IMAGE_ATOMICS:
+               {
+                       imageLayout = vk::VK_IMAGE_LAYOUT_GENERAL;
+                       break;
+               }
+               default:
+                       DE_FATAL("Impossible");
+                       break;
+       }
+
        // Upload source image
        {
                de::MovePtr<vk::ImageWithMemory>        unprotectedImage        = createImage2D(ctx, PROTECTION_DISABLED, queueFamilyIndex,
@@ -756,7 +803,7 @@ tcu::TestStatus ImageAccessTestInstance::executeFragmentTest (void)
                uploadImage(m_protectedContext, **unprotectedImage, *texture2D);
 
                // Copy unprotected image to protected image
-               copyToProtectedImage(m_protectedContext, **unprotectedImage, **imageSrc, IMAGE_WIDTH, IMAGE_HEIGHT);
+               copyToProtectedImage(m_protectedContext, **unprotectedImage, **imageSrc, imageLayout, IMAGE_WIDTH, IMAGE_HEIGHT);
        }
 
        // Clear dst image
@@ -1010,7 +1057,7 @@ tcu::TestStatus ImageAccessTestInstance::executeFragmentTest (void)
                        vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                       // srcAccessMask
                        vk::VK_ACCESS_SHADER_READ_BIT,                                          // dstAccessMask
                        vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,           // oldLayout
-                       vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,           // newLayout
+                       imageLayout,                                                                            // newLayout
                        queueFamilyIndex,                                                                       // srcQueueFamilyIndex
                        queueFamilyIndex,                                                                       // dstQueueFamilyIndex
                        **colorImage,                                                                           // image
@@ -1048,7 +1095,7 @@ tcu::TestStatus ImageAccessTestInstance::executeFragmentTest (void)
                const vk::VkImage       resultImage             = m_params.accessType == ACCESS_TYPE_IMAGE_ATOMICS      ?       **imageSrc      :
                                                                                          m_params.accessType == ACCESS_TYPE_IMAGE_STORE        ?       **imageDst      : **colorImage;
 
-               return validateResult(resultImage, *texture2D, refSampler);
+               return validateResult(resultImage, imageLayout, *texture2D, refSampler);
        }
 }
 
@@ -1069,7 +1116,7 @@ void ImageAccessTestInstance::calculateAtomicRef (tcu::Texture2D& texture2D)
        }
 }
 
-tcu::TestStatus ImageAccessTestInstance::validateResult (vk::VkImage image, const tcu::Texture2D& texture2D, const tcu::Sampler& refSampler)
+tcu::TestStatus ImageAccessTestInstance::validateResult (vk::VkImage image, vk::VkImageLayout imageLayout, const tcu::Texture2D& texture2D, const tcu::Sampler& refSampler)
 {
        de::Random                      rnd                     (getSeedValue(m_params));
        ValidationData          refData;
@@ -1084,7 +1131,7 @@ tcu::TestStatus ImageAccessTestInstance::validateResult (vk::VkImage image, cons
                refData.values[ndx] = texture2D.sample(refSampler, cx, cy, lod);
        }
 
-       if (!m_validator.validateImage(m_protectedContext, refData, image, m_params.imageFormat))
+       if (!m_validator.validateImage(m_protectedContext, refData, image, m_params.imageFormat, imageLayout))
                return tcu::TestStatus::fail("Something went really wrong");
        else
                return tcu::TestStatus::pass("Everything went OK");
index 695abf7..8b4339d 100644 (file)
@@ -832,7 +832,7 @@ void uploadImage (ProtectedContext& ctx, vk::VkImage image, const tcu::Texture2D
        }
 }
 
-void copyToProtectedImage (ProtectedContext& ctx, vk::VkImage srcImage, vk::VkImage dstImage, deUint32 width, deUint32 height)
+void copyToProtectedImage (ProtectedContext& ctx, vk::VkImage srcImage, vk::VkImage dstImage, vk::VkImageLayout dstImageLayout, deUint32 width, deUint32 height)
 {
        const vk::DeviceInterface&                      vk                                      = ctx.getDeviceInterface();
        const vk::VkDevice                                      device                          = ctx.getDevice();
@@ -888,7 +888,7 @@ void copyToProtectedImage (ProtectedContext& ctx, vk::VkImage srcImage, vk::VkIm
                vk::VK_ACCESS_TRANSFER_WRITE_BIT,                               // VkAccessFlags                        srcAccessMask;
                vk::VK_ACCESS_SHADER_READ_BIT,                                  // VkAccessFlags                        dstAccessMask;
                vk::VK_IMAGE_LAYOUT_GENERAL,                                    // VkImageLayout                        oldLayout;
-               vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,   // VkImageLayout                        newLayout;
+               dstImageLayout,                                                                 // VkImageLayout                        newLayout;
                queueFamilyIndex,                                                               // deUint32                                     srcQueueFamilyIndex;
                queueFamilyIndex,                                                               // deUint32                                     dstQueueFamilyIndex;
                dstImage,                                                                               // VkImage                                      image;
index 565b0a8..22f3590 100644 (file)
@@ -173,6 +173,7 @@ void                                                                uploadImage                                                     (ProtectedContext&                                      ctx,
 void                                                           copyToProtectedImage                            (ProtectedContext&                                      ctx,
                                                                                                                                                 vk::VkImage                                            srcImage,
                                                                                                                                                 vk::VkImage                                            dstImage,
+                                                                                                                                                vk::VkImageLayout                                      dstImageLayout,
                                                                                                                                                 deUint32                                                       width,
                                                                                                                                                 deUint32                                                       height);
 
index c00531b..8c9c516 100644 (file)
@@ -95,6 +95,7 @@ public:
 private:
        de::MovePtr<tcu::Texture2D>     createTestTexture2D                             (void);
        tcu::TestStatus                         validateResult                                  (vk::VkImage                    image,
+                                                                                                                                vk::VkImageLayout imageLayout,
                                                                                                                                 const tcu::Texture2D&  texture2D,
                                                                                                                                 const tcu::Sampler&    refSampler);
        void                                            calculateRef                                    (tcu::Texture2D&                texture2D);
@@ -249,7 +250,7 @@ tcu::TestStatus WorkgroupStorageTestInstance::iterate (void)
                uploadImage(m_protectedContext, **unprotectedImage, *texture2D);
 
                // Copy unprotected image to protected image
-               copyToProtectedImage(m_protectedContext, **unprotectedImage, **imageSrc, m_params.imageWidth, m_params.imageHeight);
+               copyToProtectedImage(m_protectedContext, **unprotectedImage, **imageSrc, vk::VK_IMAGE_LAYOUT_GENERAL, m_params.imageWidth, m_params.imageHeight);
        }
 
        // Clear dst image
@@ -311,7 +312,7 @@ tcu::TestStatus WorkgroupStorageTestInstance::iterate (void)
        calculateRef(*texture2D);
 
        // Validate result
-       return validateResult(**imageDst, *texture2D, refSampler);
+       return validateResult(**imageDst, vk::VK_IMAGE_LAYOUT_GENERAL, *texture2D, refSampler);
 }
 
 void WorkgroupStorageTestInstance::calculateRef (tcu::Texture2D& texture2D)
@@ -331,7 +332,7 @@ void WorkgroupStorageTestInstance::calculateRef (tcu::Texture2D& texture2D)
        }
 }
 
-tcu::TestStatus WorkgroupStorageTestInstance::validateResult (vk::VkImage image, const tcu::Texture2D& texture2D, const tcu::Sampler& refSampler)
+tcu::TestStatus WorkgroupStorageTestInstance::validateResult (vk::VkImage image, vk::VkImageLayout imageLayout, const tcu::Texture2D& texture2D, const tcu::Sampler& refSampler)
 {
        de::Random                      rnd                     (getSeedValue(m_params));
        ValidationData          refData;
@@ -346,7 +347,7 @@ tcu::TestStatus WorkgroupStorageTestInstance::validateResult (vk::VkImage image,
                refData.values[ndx] = texture2D.sample(refSampler, cx, cy, lod);
        }
 
-       if (!m_validator.validateImage(m_protectedContext, refData, image, vk::VK_FORMAT_R8G8B8A8_UNORM))
+       if (!m_validator.validateImage(m_protectedContext, refData, image, vk::VK_FORMAT_R8G8B8A8_UNORM, imageLayout))
                return tcu::TestStatus::fail("Result validation failed");
        else
                return tcu::TestStatus::pass("Pass");