Merge remote-tracking branch 'khronos/vulkan-cts-1.1.0' into pie-cts-dev
authorChris Forbes <chrisforbes@google.com>
Thu, 27 Sep 2018 16:34:24 +0000 (09:34 -0700)
committerandroid-build-merger <android-build-merger@google.com>
Thu, 27 Sep 2018 16:34:24 +0000 (09:34 -0700)
am: 6cf5f05368

Change-Id: I2be685a153ecb2514bd69dd577f458a0e35b62f2

external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemAttachmentClearTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemAttachmentLoadTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemCopyImageToBufferTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemFillUpdateCopyBufferTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemWsiSwapchainTests.cpp
external/vulkancts/modules/vulkan/robustness/vktRobustnessVertexAccessTests.cpp

index 0392f3a..7589038 100644 (file)
@@ -290,7 +290,7 @@ protected:
        void                                                            uploadBuffer                                            (tcu::ConstPixelBufferAccess bufferAccess, const Allocation& bufferAlloc);
        void                                                            uploadImage                                                     (const tcu::ConstPixelBufferAccess& src, VkImage dst, const ImageParms& parms, const deUint32 mipLevels = 1u);
        virtual tcu::TestStatus                         checkTestResult                                         (tcu::ConstPixelBufferAccess result);
-       virtual void                                            copyRegionToTextureLevel                        (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region) = 0;
+       virtual void                                            copyRegionToTextureLevel                        (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel = 0u) = 0;
        deUint32                                                        calculateSize                                           (tcu::ConstPixelBufferAccess src) const
                                                                                {
                                                                                        return src.getWidth() * src.getHeight() * src.getDepth() * tcu::getPixelSize(src.getFormat());
@@ -845,7 +845,7 @@ private:
        Move<VkImage>                                           m_destination;
        de::MovePtr<Allocation>                         m_destinationImageAlloc;
 
-       virtual void                                            copyRegionToTextureLevel        (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region);
+       virtual void                                            copyRegionToTextureLevel        (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel = 0u);
 };
 
 CopyImageToImage::CopyImageToImage (Context& context, TestParams params)
@@ -1117,8 +1117,10 @@ tcu::TestStatus CopyImageToImage::checkTestResult (tcu::ConstPixelBufferAccess r
        return tcu::TestStatus::pass("CopiesAndBlitting test");
 }
 
-void CopyImageToImage::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
+void CopyImageToImage::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel)
 {
+       DE_UNREF(mipLevel);
+
        VkOffset3D      srcOffset       = region.imageCopy.srcOffset;
        VkOffset3D      dstOffset       = region.imageCopy.dstOffset;
        VkExtent3D      extent          = region.imageCopy.extent;
@@ -1175,12 +1177,48 @@ public:
                                                                                                                 const TestParams                               params)
                                                                : vkt::TestCase (testCtx, name, description)
                                                                , m_params              (params)
-                                                       {}
+       {}
 
        virtual TestInstance*   createInstance                          (Context&                                               context) const
-                                                       {
-                                                               return new CopyImageToImage(context, m_params);
-                                                       }
+       {
+               return new CopyImageToImage(context, m_params);
+       }
+
+       virtual void                    checkSupport                            (Context&                                               context) const
+       {
+               if (m_params.allocationKind == ALLOCATION_KIND_DEDICATED)
+               {
+                       if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_dedicated_allocation"))
+                               TCU_THROW(NotSupportedError, "VK_KHR_dedicated_allocation is not supported");
+               }
+
+               if ((m_params.dst.image.imageType == VK_IMAGE_TYPE_3D && m_params.src.image.imageType == VK_IMAGE_TYPE_2D) ||
+                       (m_params.dst.image.imageType == VK_IMAGE_TYPE_2D && m_params.src.image.imageType == VK_IMAGE_TYPE_3D))
+               {
+                       if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance1"))
+                               TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported");
+               }
+
+               VkImageFormatProperties properties;
+               if ((context.getInstanceInterface().getPhysicalDeviceImageFormatProperties (context.getPhysicalDevice(),
+                                                                                                                                                                       m_params.src.image.format,
+                                                                                                                                                                       m_params.src.image.imageType,
+                                                                                                                                                                       VK_IMAGE_TILING_OPTIMAL,
+                                                                                                                                                                       VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
+                                                                                                                                                                       0,
+                                                                                                                                                                       &properties) == VK_ERROR_FORMAT_NOT_SUPPORTED) ||
+                       (context.getInstanceInterface().getPhysicalDeviceImageFormatProperties (context.getPhysicalDevice(),
+                                                                                                                                                                       m_params.dst.image.format,
+                                                                                                                                                                       m_params.dst.image.imageType,
+                                                                                                                                                                       VK_IMAGE_TILING_OPTIMAL,
+                                                                                                                                                                       VK_IMAGE_USAGE_TRANSFER_DST_BIT,
+                                                                                                                                                                       0,
+                                                                                                                                                                       &properties) == VK_ERROR_FORMAT_NOT_SUPPORTED))
+               {
+                       TCU_THROW(NotSupportedError, "Format not supported");
+               }
+       }
+
 private:
        TestParams                              m_params;
 };
@@ -1193,7 +1231,7 @@ public:
                                                                CopyBufferToBuffer                      (Context& context, TestParams params);
        virtual tcu::TestStatus         iterate                                         (void);
 private:
-       virtual void                            copyRegionToTextureLevel        (tcu::ConstPixelBufferAccess, tcu::PixelBufferAccess, CopyRegion);
+       virtual void                            copyRegionToTextureLevel        (tcu::ConstPixelBufferAccess, tcu::PixelBufferAccess, CopyRegion, deUint32 mipLevel = 0u);
        Move<VkBuffer>                          m_source;
        de::MovePtr<Allocation>         m_sourceBufferAlloc;
        Move<VkBuffer>                          m_destination;
@@ -1323,8 +1361,10 @@ tcu::TestStatus CopyBufferToBuffer::iterate (void)
        return checkTestResult(resultLevel->getAccess());
 }
 
-void CopyBufferToBuffer::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
+void CopyBufferToBuffer::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel)
 {
+       DE_UNREF(mipLevel);
+
        deMemcpy((deUint8*) dst.getDataPtr() + region.bufferCopy.dstOffset,
                         (deUint8*) src.getDataPtr() + region.bufferCopy.srcOffset,
                         (size_t)region.bufferCopy.size);
@@ -1358,7 +1398,7 @@ public:
                                                                                                                         TestParams     testParams);
        virtual tcu::TestStatus         iterate                                         (void);
 private:
-       virtual void                            copyRegionToTextureLevel        (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region);
+       virtual void                            copyRegionToTextureLevel        (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel = 0u);
 
        tcu::TextureFormat                      m_textureFormat;
        VkDeviceSize                            m_bufferSize;
@@ -1529,8 +1569,10 @@ private:
        TestParams                              m_params;
 };
 
-void CopyImageToBuffer::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
+void CopyImageToBuffer::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel)
 {
+       DE_UNREF(mipLevel);
+
        deUint32                        rowLength       = region.bufferImageCopy.bufferRowLength;
        if (!rowLength)
                rowLength = region.bufferImageCopy.imageExtent.width;
@@ -1566,7 +1608,7 @@ public:
                                                                                                                         TestParams     testParams);
        virtual tcu::TestStatus         iterate                                         (void);
 private:
-       virtual void                            copyRegionToTextureLevel        (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region);
+       virtual void                            copyRegionToTextureLevel        (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel = 0u);
 
        tcu::TextureFormat                      m_textureFormat;
        VkDeviceSize                            m_bufferSize;
@@ -1722,8 +1764,10 @@ private:
        TestParams                              m_params;
 };
 
-void CopyBufferToImage::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
+void CopyBufferToImage::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel)
 {
+       DE_UNREF(mipLevel);
+
        deUint32                        rowLength       = region.bufferImageCopy.bufferRowLength;
        if (!rowLength)
                rowLength = region.bufferImageCopy.imageExtent.width;
@@ -1760,7 +1804,7 @@ public:
        virtual tcu::TestStatus                         iterate                                                 (void);
 protected:
        virtual tcu::TestStatus                         checkTestResult                                 (tcu::ConstPixelBufferAccess result);
-       virtual void                                            copyRegionToTextureLevel                (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region);
+       virtual void                                            copyRegionToTextureLevel                (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel = 0u);
        virtual void                                            generateExpectedResult                  (void);
 private:
        bool                                                            checkLinearFilteredResult               (const tcu::ConstPixelBufferAccess&     result,
@@ -2509,8 +2553,10 @@ MirrorMode getMirrorMode(const VkOffset3D s1, const VkOffset3D s2, const VkOffse
        return MIRROR_MODE_LAST;
 }
 
-void BlittingImages::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
+void BlittingImages::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel)
 {
+       DE_UNREF(mipLevel);
+
        const MirrorMode mirrorMode = getMirrorMode(region.imageBlit.srcOffsets[0],
                                                                                                region.imageBlit.srcOffsets[1],
                                                                                                region.imageBlit.dstOffsets[0],
@@ -2629,7 +2675,7 @@ public:
        virtual tcu::TestStatus                         iterate                                                 (void);
 protected:
        virtual tcu::TestStatus                         checkTestResult                                 (tcu::ConstPixelBufferAccess result = tcu::ConstPixelBufferAccess());
-       virtual void                                            copyRegionToTextureLevel                (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region);
+       virtual void                                            copyRegionToTextureLevel                (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel = 0u);
        virtual void                                            generateExpectedResult                  (void);
 private:
        bool                                                            checkLinearFilteredResult               (void);
@@ -2983,6 +3029,29 @@ bool BlittingMipmaps::checkLinearFilteredResult (void)
 
        for (deUint32 mipLevelNdx = 0u; mipLevelNdx < m_params.mipLevels; mipLevelNdx++)
        {
+               // Update reference results with previous results that have been verified.
+               // This needs to be done such that accumulated errors don't exceed the fixed threshold.
+               for (deUint32 i = 0; i < m_params.regions.size(); i++)
+               {
+                       const CopyRegion region = m_params.regions[i];
+                       const deUint32 srcMipLevel = m_params.regions[i].imageBlit.srcSubresource.mipLevel;
+                       const deUint32 dstMipLevel = m_params.regions[i].imageBlit.dstSubresource.mipLevel;
+                       de::MovePtr<tcu::TextureLevel>  prevResultLevel;
+                       tcu::ConstPixelBufferAccess src;
+                       if (srcMipLevel < mipLevelNdx)
+                       {
+                               // Generate expected result from rendered result that was previously verified
+                               prevResultLevel = readImage(*m_destination, m_params.dst.image, srcMipLevel);
+                               src = prevResultLevel->getAccess();
+                       }
+                       else
+                       {
+                               // Previous reference mipmaps might have changed, so recompute expected result
+                               src = m_expectedTextureLevel[srcMipLevel]->getAccess();
+                       }
+                       copyRegionToTextureLevel(src, m_expectedTextureLevel[dstMipLevel]->getAccess(), region, dstMipLevel);
+               }
+
                de::MovePtr<tcu::TextureLevel>                  resultLevel                     = readImage(*m_destination, m_params.dst.image, mipLevelNdx);
                const tcu::ConstPixelBufferAccess&              resultAccess            = resultLevel->getAccess();
 
@@ -3145,8 +3214,10 @@ tcu::TestStatus BlittingMipmaps::checkTestResult (tcu::ConstPixelBufferAccess re
        return tcu::TestStatus::pass("Pass");
 }
 
-void BlittingMipmaps::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
+void BlittingMipmaps::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel)
 {
+       DE_ASSERT(src.getDepth() == dst.getDepth());
+
        const MirrorMode mirrorMode = getMirrorMode(region.imageBlit.srcOffsets[0],
                                                                                                region.imageBlit.srcOffsets[1],
                                                                                                region.imageBlit.dstOffsets[0],
@@ -3205,14 +3276,17 @@ void BlittingMipmaps::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src,
        }
        else
        {
-               const tcu::ConstPixelBufferAccess       srcSubRegion    = tcu::getSubregion(src, srcOffset.x, srcOffset.y, srcExtent.x, srcExtent.y);
-               const tcu::PixelBufferAccess            dstSubRegion    = tcu::getSubregion(dst, dstOffset.x, dstOffset.y, dstExtent.x, dstExtent.y);
-               blit(dstSubRegion, srcSubRegion, filter, mirrorMode);
-
-               if (filter == tcu::Sampler::LINEAR)
+               for (int layerNdx = 0u; layerNdx < src.getDepth(); layerNdx++)
                {
-                       const tcu::PixelBufferAccess    unclampedSubRegion      = tcu::getSubregion(m_unclampedExpectedTextureLevel[0]->getAccess(), dstOffset.x, dstOffset.y, dstExtent.x, dstExtent.y);
-                       scaleFromWholeSrcBuffer(unclampedSubRegion, src, srcOffset, srcExtent, filter);
+                       const tcu::ConstPixelBufferAccess       srcSubRegion    = tcu::getSubregion(src, srcOffset.x, srcOffset.y, layerNdx, srcExtent.x, srcExtent.y, 1);
+                       const tcu::PixelBufferAccess            dstSubRegion    = tcu::getSubregion(dst, dstOffset.x, dstOffset.y, layerNdx, dstExtent.x, dstExtent.y, 1);
+                       blit(dstSubRegion, srcSubRegion, filter, mirrorMode);
+
+                       if (filter == tcu::Sampler::LINEAR)
+                       {
+                               const tcu::PixelBufferAccess    unclampedSubRegion      = tcu::getSubregion(m_unclampedExpectedTextureLevel[mipLevel]->getAccess(), dstOffset.x, dstOffset.y, layerNdx, dstExtent.x, dstExtent.y, 1);
+                               scaleFromWholeSrcBuffer(unclampedSubRegion, srcSubRegion, srcOffset, srcExtent, filter);
+                       }
                }
        }
 }
@@ -3288,7 +3362,8 @@ private:
 
        virtual void                                                            copyRegionToTextureLevel        (tcu::ConstPixelBufferAccess    src,
                                                                                                                                                         tcu::PixelBufferAccess                 dst,
-                                                                                                                                                        CopyRegion                                             region);
+                                                                                                                                                        CopyRegion                                             region,
+                                                                                                                                                        deUint32                                               dstMipLevel);
 };
 
 ResolveImageToImage::ResolveImageToImage (Context& context, TestParams params, const ResolveImageToImageOptions options)
@@ -3946,8 +4021,10 @@ tcu::TestStatus ResolveImageToImage::checkTestResult (tcu::ConstPixelBufferAcces
        return tcu::TestStatus::pass("CopiesAndBlitting test");
 }
 
-void ResolveImageToImage::copyRegionToTextureLevel(tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
+void ResolveImageToImage::copyRegionToTextureLevel(tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region, deUint32 mipLevel)
 {
+       DE_UNREF(mipLevel);
+
        VkOffset3D srcOffset    = region.imageResolve.srcOffset;
                        srcOffset.z             = region.imageResolve.srcSubresource.baseArrayLayer;
        VkOffset3D dstOffset    = region.imageResolve.dstOffset;
index d4a75e0..051d772 100644 (file)
@@ -3460,8 +3460,7 @@ tcu::TestStatus testImageQueries (Context& context, vk::VkExternalMemoryHandleTy
                vk::VK_IMAGE_CREATE_SPARSE_BINDING_BIT|vk::VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT,
                vk::VK_IMAGE_CREATE_SPARSE_BINDING_BIT|vk::VK_IMAGE_CREATE_SPARSE_ALIASED_BIT,
                vk::VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT,
-               vk::VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT,
-               vk::VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT
+               vk::VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
        };
        const vk::VkImageUsageFlags                     usageFlags[]            =
        {
index 8943282..794bcfd 100644 (file)
@@ -485,7 +485,7 @@ RandomAllocFreeTestInstance::RandomAllocFreeTestInstance (Context& context, Test
        {
                m_heaps[heapNdx].heap                   = m_memoryProperties.memoryHeaps[heapNdx];
                m_heaps[heapNdx].memoryUsage    = 0;
-               m_heaps[heapNdx].maxMemoryUsage = m_heaps[heapNdx].heap.size / 2; /* Use at maximum 50% of heap */
+               m_heaps[heapNdx].maxMemoryUsage = m_heaps[heapNdx].heap.size / 8; /* Use at maximum 12.5% of heap */
 
                m_heaps[heapNdx].objects.reserve(100);
        }
index fbff6e1..f987f14 100644 (file)
@@ -253,6 +253,7 @@ tcu::TestStatus AttachmentClearTestInstance::iterate()
        vk.cmdEndRenderPass(*cmdBuffer);
 
        {
+               // Image validator reads image in compute shader
                const vk::VkImageMemoryBarrier  endImgBarrier           =
                {
                        vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                     // sType
@@ -273,8 +274,8 @@ tcu::TestStatus AttachmentClearTestInstance::iterate()
                        }
                };
                vk.cmdPipelineBarrier(*cmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
                                                          vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+                                                         vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
index 79b7386..ca2587b 100644 (file)
@@ -181,6 +181,7 @@ tcu::TestStatus AttachmentLoadTestInstance::iterate()
        vk.cmdEndRenderPass(*cmdBuffer);
 
        {
+               // Image validator reads image in compute shader
                const vk::VkImageMemoryBarrier  endImgBarrier           =
                {
                        vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                     // sType
@@ -201,8 +202,8 @@ tcu::TestStatus AttachmentLoadTestInstance::iterate()
                        }
                };
                vk.cmdPipelineBarrier(*cmdBuffer,
-                                                               vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
                                                                vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+                                                               vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
                                                                (vk::VkDependencyFlags)0,
                                                                0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                                0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
index 90b04df..5e78eaa 100644 (file)
@@ -189,7 +189,7 @@ tcu::TestStatus CopyImageToBufferTestInstance<T>::iterate()
 
                vk.cmdPipelineBarrier(targetCmdBuffer,
                                                          vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
@@ -231,39 +231,14 @@ tcu::TestStatus CopyImageToBufferTestInstance<T>::iterate()
                };
 
                vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
                                                          1, &initializeBarrier);
        }
 
-       // Start destination buffer barrier
-       {
-               const vk::VkBufferMemoryBarrier startBufferBarrier              =
-               {
-                       vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,            // VkStructureType              sType
-                       DE_NULL,                                                                                        // const void*                  pNext
-                       0,                                                                                                      // VkAccessFlags                srcAccessMask
-                       vk::VK_ACCESS_TRANSFER_WRITE_BIT,                                       // VkAccessFlags                dstAccessMask
-                       queueFamilyIndex,                                                                       // uint32_t                             srcQueueFamilyIndex
-                       queueFamilyIndex,                                                                       // uint32_t                             dstQueueFamilyIndex
-                       **dstBuffer,                                                                            // VkBuffer                             buffer
-                       0u,                                                                                                     // VkDeviceSize                 offset
-                       VK_WHOLE_SIZE,                                                                          // VkDeviceSize                 size
-               };
-
-               vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
-                                                         (vk::VkDependencyFlags)0,
-                                                         0, (const vk::VkMemoryBarrier*)DE_NULL,
-                                                         1, &startBufferBarrier,
-                                                         0, (const vk::VkImageMemoryBarrier*)DE_NULL);
-       }
-
-
        // Copy image to buffer
        const vk::VkImageSubresourceLayers      subresourceLayers       =
        {
@@ -286,6 +261,7 @@ tcu::TestStatus CopyImageToBufferTestInstance<T>::iterate()
        vk.cmdCopyImageToBuffer(targetCmdBuffer, **colorImage, vk::VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, **dstBuffer, 1u, &copyRegion);
 
        {
+               // Buffer validator reads buffer in compute shader
                const vk::VkBufferMemoryBarrier endBufferBarrier                =
                {
                        vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,            // VkStructureType              sType
@@ -299,8 +275,8 @@ tcu::TestStatus CopyImageToBufferTestInstance<T>::iterate()
                        VK_WHOLE_SIZE,                                                                          // VkDeviceSize                 size
                };
                vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                               vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
                                                                vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                                               vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
                                                                (vk::VkDependencyFlags)0,
                                                                0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                                1, &endBufferBarrier,
index f6b51dc..c5900d0 100644 (file)
@@ -192,25 +192,6 @@ tcu::TestStatus FillUpdateCopyBufferTestInstance<T>::iterate()
        switch (m_cmdType) {
                case FILL_BUFFER:
                        {
-                               const vk::VkBufferMemoryBarrier startFillBufferBarrier =
-                               {
-                                       vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,    // VkStructureType              sType
-                                       DE_NULL,                                                                                // const void*                  pNext
-                                       0,                                                                                              // VkAccessFlags                srcAccessMask
-                                       vk::VK_ACCESS_TRANSFER_WRITE_BIT,                               // VkAccessFlags                dstAccessMask
-                                       queueFamilyIndex,                                                               // uint32_t                             srcQueueFamilyIndex
-                                       queueFamilyIndex,                                                               // uint32_t                             dstQueueFamilyIndex
-                                       **dstBuffer,                                                                    // VkBuffer                             buffer
-                                       0u,                                                                                             // VkDeviceSize                 offset
-                                       VK_WHOLE_SIZE,                                                                  // VkDeviceSize                 size
-                               };
-                               vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
-                                                                         (vk::VkDependencyFlags) 0,
-                                                                         0, (const vk::VkMemoryBarrier *) DE_NULL,
-                                                                         1, &startFillBufferBarrier,
-                                                                         0, (const vk::VkImageMemoryBarrier *) DE_NULL);
                                // Fill buffer
                                vk.cmdFillBuffer(targetCmdBuffer, **dstBuffer, 0u, VK_WHOLE_SIZE, m_fillValue);
                                break;
@@ -218,25 +199,6 @@ tcu::TestStatus FillUpdateCopyBufferTestInstance<T>::iterate()
 
                case UPDATE_BUFFER:
                        {
-                               const vk::VkBufferMemoryBarrier startUpdateBufferBarrier =
-                               {
-                                       vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,    // VkStructureType              sType
-                                       DE_NULL,                                                                                // const void*                  pNext
-                                       0,                                                                                              // VkAccessFlags                srcAccessMask
-                                       vk::VK_ACCESS_TRANSFER_WRITE_BIT,                               // VkAccessFlags                dstAccessMask
-                                       queueFamilyIndex,                                                               // uint32_t                             srcQueueFamilyIndex
-                                       queueFamilyIndex,                                                               // uint32_t                             dstQueueFamilyIndex
-                                       **dstBuffer,                                                                    // VkBuffer                             buffer
-                                       0u,                                                                                             // VkDeviceSize                 offset
-                                       VK_WHOLE_SIZE,                                                                  // VkDeviceSize                 size
-                               };
-                               vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
-                                                                         (vk::VkDependencyFlags) 0,
-                                                                         0, (const vk::VkMemoryBarrier *) DE_NULL,
-                                                                         1, &startUpdateBufferBarrier,
-                                                                         0, (const vk::VkImageMemoryBarrier *) DE_NULL);
                                // Update buffer
                                deUint32 data[BUFFER_SIZE];
                                for (size_t ndx = 0; ndx < BUFFER_SIZE; ndx++)
@@ -247,30 +209,9 @@ tcu::TestStatus FillUpdateCopyBufferTestInstance<T>::iterate()
 
                case COPY_BUFFER:
                        {
-                               // Start src buffer barrier
-                               const vk::VkBufferMemoryBarrier startBufferBarrier =
-                               {
-                                       vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,    // VkStructureType              sType
-                                       DE_NULL,                                                                                // const void*                  pNext
-                                       0,                                                                                              // VkAccessFlags                srcAccessMask
-                                       vk::VK_ACCESS_TRANSFER_WRITE_BIT,                               // VkAccessFlags                dstAccessMask
-                                       queueFamilyIndex,                                                               // uint32_t                             srcQueueFamilyIndex
-                                       queueFamilyIndex,                                                               // uint32_t                             dstQueueFamilyIndex
-                                       **srcBuffer,                                                                    // VkBuffer                             buffer
-                                       0u,                                                                                             // VkDeviceSize                 offset
-                                       VK_WHOLE_SIZE,                                                                  // VkDeviceSize                 size
-                               };
-                               vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
-                                                                         (vk::VkDependencyFlags) 0,
-                                                                         0, (const vk::VkMemoryBarrier *) DE_NULL,
-                                                                         1, &startBufferBarrier,
-                                                                         0, (const vk::VkImageMemoryBarrier *) DE_NULL);
                                vk.cmdFillBuffer(targetCmdBuffer, **srcBuffer, 0u, VK_WHOLE_SIZE, m_fillValue);
 
-                               // Barrier to change accessMask to transfer read bit for source buffer
-                               const vk::VkBufferMemoryBarrier startCopyBufferBarrier  =
+                               const vk::VkBufferMemoryBarrier copyBufferBarrier       =
                                {
                                        vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,            // VkStructureType              sType
                                        DE_NULL,                                                                                        // const void*                  pNext
@@ -283,32 +224,14 @@ tcu::TestStatus FillUpdateCopyBufferTestInstance<T>::iterate()
                                        VK_WHOLE_SIZE,                                                                          // VkDeviceSize                 size
                                };
 
-                               // Image barrier for destination buffer
-                               const vk::VkBufferMemoryBarrier dstBufferBarrier                =
-                               {
-                                       vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,            // VkStructureType              sType
-                                       DE_NULL,                                                                                        // const void*                  pNext
-                                       0,                                                                                                      // VkAccessFlags                srcAccessMask
-                                       vk::VK_ACCESS_TRANSFER_WRITE_BIT,                                       // VkAccessFlags                dstAccessMask
-                                       queueFamilyIndex,                                                                       // uint32_t                             srcQueueFamilyIndex
-                                       queueFamilyIndex,                                                                       // uint32_t                             dstQueueFamilyIndex
-                                       **dstBuffer,                                                                            // VkBuffer                             buffer
-                                       0u,                                                                                                     // VkDeviceSize                 offset
-                                       VK_WHOLE_SIZE,                                                                          // VkDeviceSize                 size
-                               };
-
-                               const vk::VkBufferMemoryBarrier memoryBarriers[2] =
-                               {
-                                       startCopyBufferBarrier,
-                                       dstBufferBarrier
-                               };
                                vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+                                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
                                                                          (vk::VkDependencyFlags)0,
                                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
-                                                                         2, memoryBarriers,
+                                                                         1, &copyBufferBarrier,
                                                                          0, (const vk::VkImageMemoryBarrier*)DE_NULL);
+
                                // Copy buffer
                                const vk::VkBufferCopy                          copyBufferRegion                =
                                {
@@ -326,6 +249,7 @@ tcu::TestStatus FillUpdateCopyBufferTestInstance<T>::iterate()
        }
 
        {
+               // Buffer validator reads buffer in compute shader
                const vk::VkBufferMemoryBarrier endBufferBarrier                =
                {
                        vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,            // VkStructureType              sType
@@ -339,8 +263,8 @@ tcu::TestStatus FillUpdateCopyBufferTestInstance<T>::iterate()
                        VK_WHOLE_SIZE,                                                                          // VkDeviceSize                 size
                };
                vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
                                                          vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                                         vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          1, &endBufferBarrier,
index 7a2c1d0..b9339c4 100644 (file)
@@ -277,7 +277,9 @@ std::vector<vk::VkSwapchainCreateInfoKHR> generateSwapchainParameterCases (vk::w
                        // Determine the maximum memory heap space available for protected images
                        vk::VkPhysicalDeviceMemoryProperties    memoryProperties        = vk::getPhysicalDeviceMemoryProperties(context.getInstanceDriver(), context.getPhysicalDevice());
                        vk::VkDeviceSize                                                protectedHeapSize       = 0;
+                       vk::VkDeviceSize                                                maxMemoryUsage          = 0;
                        deUint32                                                                protectedHeapMask       = 0;
+
                        for (deUint32 memType = 0; memType < memoryProperties.memoryTypeCount; memType++)
                        {
                                deUint32 heapIndex      = memoryProperties.memoryTypes[memType].heapIndex;
@@ -286,15 +288,18 @@ std::vector<vk::VkSwapchainCreateInfoKHR> generateSwapchainParameterCases (vk::w
                                        (protectedHeapMask & (1u << heapIndex)) == 0)
                                {
                                        protectedHeapSize = de::max(protectedHeapSize, memoryProperties.memoryHeaps[heapIndex].size);
+                                       maxMemoryUsage    = protectedHeapSize / 4 ; /* Use at maximum 25% of heap */
                                        protectedHeapMask |= 1u << heapIndex;
                                }
                        }
 
                        // If the implementation doesn't have a max image count, min+16 means we won't clamp.
-                       // Limit it to how many protected images we estimate can be allocated, with two images
-                       // worth of slack for alignment, swapchain-specific constraints, etc.
+                       // Limit it to how many protected images we estimate can be allocated - 25% of heap size
                        const deUint32  maxImageCount           = de::min((capabilities.maxImageCount > 0) ? capabilities.maxImageCount : capabilities.minImageCount + 16u,
-                                                                                                                 deUint32(protectedHeapSize / memoryRequirements.size) - 2);
+                                                                                                                 deUint32(maxMemoryUsage / memoryRequirements.size));
+                       if (maxImageCount < capabilities.minImageCount)
+                               TCU_THROW(NotSupportedError, "Memory heap doesn't have enough memory!.");
+
                        const deUint32  maxImageCountToTest     = de::clamp(16u, capabilities.minImageCount, maxImageCount);
                        for (deUint32 imageCount = capabilities.minImageCount; imageCount <= maxImageCountToTest; ++imageCount)
                        {
@@ -328,30 +333,154 @@ std::vector<vk::VkSwapchainCreateInfoKHR> generateSwapchainParameterCases (vk::w
                                { 117, 998 },
                        };
 
+                       const vk::DeviceInterface&                              vkd                                     = context.getDeviceInterface();
+                       vk::VkDevice                                                    device                          = context.getDevice();
+                       vk::VkPhysicalDeviceMemoryProperties    memoryProperties        = vk::getPhysicalDeviceMemoryProperties(context.getInstanceDriver(), context.getPhysicalDevice());
+                       vk::VkDeviceSize                                                protectedHeapSize       = 0;
+                       vk::VkDeviceSize                                                maxMemoryUsage          = 0;
+
+                       for (deUint32 memType = 0; memType < memoryProperties.memoryTypeCount; memType++)
+                       {
+                               deUint32 heapIndex      = memoryProperties.memoryTypes[memType].heapIndex;
+                               if (memoryProperties.memoryTypes[memType].propertyFlags & vk::VK_MEMORY_PROPERTY_PROTECTED_BIT)
+                               {
+                                       protectedHeapSize = de::max(protectedHeapSize, memoryProperties.memoryHeaps[heapIndex].size);
+                                       maxMemoryUsage    = protectedHeapSize / 4 ; /* Use at maximum 25% of heap */
+                               }
+                       }
+
                        if (platformProperties.swapchainExtent == vk::wsi::PlatformProperties::SWAPCHAIN_EXTENT_SETS_WINDOW_SIZE ||
                                platformProperties.swapchainExtent == vk::wsi::PlatformProperties::SWAPCHAIN_EXTENT_SCALED_TO_WINDOW_SIZE)
                        {
                                for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_testSizes); ++ndx)
                                {
-                                       cases.push_back(baseParameters);
-                                       cases.back().imageExtent.width  = de::clamp(s_testSizes[ndx].width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width);
-                                       cases.back().imageExtent.height = de::clamp(s_testSizes[ndx].height, capabilities.minImageExtent.height, capabilities.maxImageExtent.height);
+                                       vk::VkMemoryRequirements memoryRequirements;
+                                       {
+                                               const vk::VkImageCreateInfo imageInfo =
+                                               {
+                                                       vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+                                                       DE_NULL,
+                                                       vk::VK_IMAGE_CREATE_PROTECTED_BIT,
+                                                       vk::VK_IMAGE_TYPE_2D,
+                                                       baseParameters.imageFormat,
+                                                       {
+                                                               s_testSizes[ndx].width,
+                                                               s_testSizes[ndx].height,
+                                                               1,
+                                                       },
+                                                       1,      // mipLevels
+                                                       baseParameters.imageArrayLayers,
+                                                       vk::VK_SAMPLE_COUNT_1_BIT,
+                                                       vk::VK_IMAGE_TILING_OPTIMAL,
+                                                       baseParameters.imageUsage,
+                                                       baseParameters.imageSharingMode,
+                                                       baseParameters.queueFamilyIndexCount,
+                                                       baseParameters.pQueueFamilyIndices,
+                                                       vk::VK_IMAGE_LAYOUT_UNDEFINED
+                                               };
+
+                                               vk::Move<vk::VkImage> image = vk::createImage(vkd, device, &imageInfo);
+
+                                               memoryRequirements = vk::getImageMemoryRequirements(vkd, device, *image);
+                                       }
+
+                                       // Check for the image size requirement based on double/triple buffering
+                                       if (memoryRequirements.size  * capabilities.minImageCount < maxMemoryUsage)
+                                       {
+                                               cases.push_back(baseParameters);
+                                               cases.back().imageExtent.width  = de::clamp(s_testSizes[ndx].width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width);
+                                               cases.back().imageExtent.height = de::clamp(s_testSizes[ndx].height, capabilities.minImageExtent.height, capabilities.maxImageExtent.height);
+                                       }
                                }
                        }
 
                        if (platformProperties.swapchainExtent != vk::wsi::PlatformProperties::SWAPCHAIN_EXTENT_SETS_WINDOW_SIZE)
                        {
-                               cases.push_back(baseParameters);
-                               cases.back().imageExtent = capabilities.currentExtent;
+                               vk::VkMemoryRequirements memoryRequirements;
+                               {
+                                       const vk::VkImageCreateInfo imageInfo =
+                                       {
+                                               vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+                                               DE_NULL,
+                                               vk::VK_IMAGE_CREATE_PROTECTED_BIT,
+                                               vk::VK_IMAGE_TYPE_2D,
+                                               baseParameters.imageFormat,
+                                               {
+                                                       capabilities.currentExtent.width,
+                                                       capabilities.currentExtent.height,
+                                                       1,
+                                               },
+                                               1,      // mipLevels
+                                               baseParameters.imageArrayLayers,
+                                               vk::VK_SAMPLE_COUNT_1_BIT,
+                                               vk::VK_IMAGE_TILING_OPTIMAL,
+                                               baseParameters.imageUsage,
+                                               baseParameters.imageSharingMode,
+                                               baseParameters.queueFamilyIndexCount,
+                                               baseParameters.pQueueFamilyIndices,
+                                               vk::VK_IMAGE_LAYOUT_UNDEFINED
+                                       };
+
+                                       vk::Move<vk::VkImage> image = vk::createImage(vkd, device, &imageInfo);
+
+                                       memoryRequirements = vk::getImageMemoryRequirements(vkd, device, *image);
+                               }
+
+                               // Check for the image size requirement based on double/triple buffering
+                               if (memoryRequirements.size  * capabilities.minImageCount < maxMemoryUsage)
+                               {
+                                       cases.push_back(baseParameters);
+                                       cases.back().imageExtent = capabilities.currentExtent;
+                               }
                        }
 
                        if (platformProperties.swapchainExtent != vk::wsi::PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE)
                        {
-                               cases.push_back(baseParameters);
-                               cases.back().imageExtent = capabilities.minImageExtent;
+                               static const vk::VkExtent2D     s_testExtentSizes[]     =
+                               {
+                                       { capabilities.minImageExtent.width, capabilities.minImageExtent.height },
+                                       { capabilities.maxImageExtent.width, capabilities.maxImageExtent.height },
+                               };
 
-                               cases.push_back(baseParameters);
-                               cases.back().imageExtent = capabilities.maxImageExtent;
+                               for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_testExtentSizes); ++ndx)
+                               {
+                                       vk::VkMemoryRequirements memoryRequirements;
+                                       {
+                                               const vk::VkImageCreateInfo     imageInfo =
+                                               {
+                                                       vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+                                                       DE_NULL,
+                                                       vk::VK_IMAGE_CREATE_PROTECTED_BIT,
+                                                       vk::VK_IMAGE_TYPE_2D,
+                                                       baseParameters.imageFormat,
+                                                       {
+                                                               s_testExtentSizes[ndx].width,
+                                                               s_testExtentSizes[ndx].height,
+                                                               1,
+                                                       },
+                                                       1,      // mipLevels
+                                                       baseParameters.imageArrayLayers,
+                                                       vk::VK_SAMPLE_COUNT_1_BIT,
+                                                       vk::VK_IMAGE_TILING_OPTIMAL,
+                                                       baseParameters.imageUsage,
+                                                       baseParameters.imageSharingMode,
+                                                       baseParameters.queueFamilyIndexCount,
+                                                       baseParameters.pQueueFamilyIndices,
+                                                       vk::VK_IMAGE_LAYOUT_UNDEFINED
+                                               };
+
+                                               vk::Move<vk::VkImage> image = vk::createImage(vkd, device, &imageInfo);
+
+                                               memoryRequirements = vk::getImageMemoryRequirements(vkd, device, *image);
+                                       }
+
+                                       // Check for the image size requirement based on double/triple buffering
+                                       if (memoryRequirements.size  * capabilities.minImageCount < maxMemoryUsage)
+                                       {
+                                               cases.push_back(baseParameters);
+                                               cases.back().imageExtent =s_testExtentSizes[ndx];
+                                       }
+                               }
                        }
 
                        break;
index 8a445dc..cc64ba1 100644 (file)
@@ -899,9 +899,9 @@ bool VertexAccessInstance::isValueWithinVertexBufferOrZero(void* vertexBuffer, V
                deUint32                encodedValue;
 
                if (isAlpha)
-                       encodedValue = deMin32(deUint32(normValue * 0x3u), 0x3u);
+                       encodedValue = deMin32(deUint32(deFloatRound(normValue * 0x3u)), 0x3u);
                else
-                       encodedValue = deMin32(deUint32(normValue * 0x3FFu), 0x3FFu);
+                       encodedValue = deMin32(deUint32(deFloatRound(normValue * 0x3FFu)), 0x3FFu);
 
                if (encodedValue == 0)
                        return true;