Add metadata bindings in sparse tests
authorIgor Ostrowski <igor.ostrowski@intel.com>
Wed, 12 Jul 2017 13:15:14 +0000 (15:15 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 21 Jul 2017 16:01:55 +0000 (12:01 -0400)
All metadata must be bound prior to device use of the sparse image

Affects:
dEQP-VK.sparse_resources.image_sparse_residency.*
dEQP-VK.sparse_resources.mipmap_sparse_residency.*
dEQP-VK.sparse_resources.shader_intrinsics.*

dEQP-VK.glsl.texture_functions.*sparse*
dEQP-VK.glsl.texture_gather.*sparse*

Components: Vulkan
VK-GL-CTS issue: 572

Change-Id: I4bbf2b74ed7fc0cea000084769cbed0dbe4a802e

external/vulkancts/modules/vulkan/shaderrender/vktShaderRender.cpp
external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesImageSparseResidency.cpp
external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesMipmapSparseResidency.cpp
external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.cpp
external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.cpp
external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.hpp

index 56f41da..7a59f3d 100644 (file)
@@ -1458,6 +1458,16 @@ void ShaderRenderCaseInstance::uploadSparseImage (const tcu::TextureFormat&              tex
                        }
                }
 
+               deUint32 metadataAspectIndex = noMatchFound;
+               for (deUint32 memoryReqNdx = 0; memoryReqNdx < sparseMemoryReqCount; ++memoryReqNdx)
+               {
+                       if (sparseImageMemoryRequirements[memoryReqNdx].formatProperties.aspectMask & VK_IMAGE_ASPECT_METADATA_BIT)
+                       {
+                               metadataAspectIndex = memoryReqNdx;
+                               break;
+                       }
+               }
+
                if (colorAspectIndex == noMatchFound)
                        TCU_THROW(NotSupportedError, "Not supported image aspect - the test supports currently only VK_IMAGE_ASPECT_COLOR_BIT.");
 
@@ -1480,7 +1490,7 @@ void ShaderRenderCaseInstance::uploadSparseImage (const tcu::TextureFormat&               tex
                if (memoryRequirements.size > deviceProperties.limits.sparseAddressSpaceSize)
                        TCU_THROW(NotSupportedError, "Required memory size for sparse resource exceeds device limits.");
 
-               // Check if the image format supports sparse oprerations
+               // Check if the image format supports sparse operations
                const std::vector<VkSparseImageFormatProperties> sparseImageFormatPropVec =
                        getPhysicalDeviceSparseImageFormatProperties(instance, physicalDevice, imageCreateInfo.format, imageCreateInfo.imageType, imageCreateInfo.samples, imageCreateInfo.usage, imageCreateInfo.tiling);
 
@@ -1552,8 +1562,7 @@ void ShaderRenderCaseInstance::uploadSparseImage (const tcu::TextureFormat&               tex
                        // 1) VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT is requested by the driver: each layer needs a separate tail.
                        // 2) otherwise:                                                            only one tail is needed.
                        {
-                               if ( imageMipTailMemoryBinds.size() == 0                                                                                                   ||
-                                       (imageMipTailMemoryBinds.size() != 0 && (aspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) == 0))
+                               if (imageMipTailMemoryBinds.size() == 0 || (aspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) == 0)
                                {
                                        const VkMemoryRequirements allocRequirements =
                                        {
@@ -1576,6 +1585,36 @@ void ShaderRenderCaseInstance::uploadSparseImage (const tcu::TextureFormat&              tex
                                        m_allocations.push_back(allocation);
                                        imageMipTailMemoryBinds.push_back(imageMipTailMemoryBind);
                                }
+
+                               // Metadata
+                               if (metadataAspectIndex != noMatchFound)
+                               {
+                                       const VkSparseImageMemoryRequirements   metadataAspectRequirements = sparseImageMemoryRequirements[metadataAspectIndex];
+
+                                       if (imageMipTailMemoryBinds.size() == 1 || (metadataAspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) == 0)
+                                       {
+                                               const VkMemoryRequirements metadataAllocRequirements =
+                                               {
+                                                       metadataAspectRequirements.imageMipTailSize,    // VkDeviceSize size;
+                                                       memoryRequirements.alignment,                                   // VkDeviceSize alignment;
+                                                       memoryRequirements.memoryTypeBits,                              // uint32_t             memoryTypeBits;
+                                               };
+                                               const de::SharedPtr<Allocation> metadataAllocation(m_memAlloc.allocate(metadataAllocRequirements, MemoryRequirement::Any).release());
+
+                                               const VkSparseMemoryBind metadataMipTailMemoryBind =
+                                               {
+                                                       metadataAspectRequirements.imageMipTailOffset +
+                                                       layerNdx * metadataAspectRequirements.imageMipTailStride,                       // VkDeviceSize                                 resourceOffset;
+                                                       metadataAspectRequirements.imageMipTailSize,                                            // VkDeviceSize                                 size;
+                                                       metadataAllocation->getMemory(),                                                                        // VkDeviceMemory                               memory;
+                                                       metadataAllocation->getOffset(),                                                                        // VkDeviceSize                                 memoryOffset;
+                                                       VK_SPARSE_MEMORY_BIND_METADATA_BIT                                                                      // VkSparseMemoryBindFlags              flags;
+                                               };
+
+                                               m_allocations.push_back(metadataAllocation);
+                                               imageMipTailMemoryBinds.push_back(metadataMipTailMemoryBind);
+                                       }
+                               }
                        }
                }
 
index 20decb2..630a06a 100644 (file)
@@ -270,7 +270,8 @@ tcu::TestStatus ImageSparseResidencyInstance::iterate (void)
 
                DE_ASSERT(sparseMemoryRequirements.size() != 0);
 
-               const deUint32 colorAspectIndex = getSparseAspectRequirementsIndex(sparseMemoryRequirements, VK_IMAGE_ASPECT_COLOR_BIT);
+               const deUint32 colorAspectIndex         = getSparseAspectRequirementsIndex(sparseMemoryRequirements, VK_IMAGE_ASPECT_COLOR_BIT);
+               const deUint32 metadataAspectIndex      = getSparseAspectRequirementsIndex(sparseMemoryRequirements, VK_IMAGE_ASPECT_METADATA_BIT);
 
                if (colorAspectIndex == NO_MATCH_FOUND)
                        TCU_THROW(NotSupportedError, "Not supported image aspect - the test supports currently only VK_IMAGE_ASPECT_COLOR_BIT");
@@ -340,6 +341,24 @@ tcu::TestStatus ImageSparseResidencyInstance::iterate (void)
 
                                imageMipTailMemoryBinds.push_back(imageMipTailMemoryBind);
                        }
+
+                       // Metadata
+                       if (metadataAspectIndex != NO_MATCH_FOUND)
+                       {
+                               const VkSparseImageMemoryRequirements metadataAspectRequirements = sparseMemoryRequirements[metadataAspectIndex];
+
+                               if (!(metadataAspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT))
+                               {
+                                       const VkSparseMemoryBind imageMipTailMemoryBind = makeSparseMemoryBind(deviceInterface, getDevice(),
+                                               metadataAspectRequirements.imageMipTailSize, memoryType,
+                                               metadataAspectRequirements.imageMipTailOffset + layerNdx * metadataAspectRequirements.imageMipTailStride,
+                                               VK_SPARSE_MEMORY_BIND_METADATA_BIT);
+
+                                       deviceMemUniquePtrVec.push_back(makeVkSharedPtr(Move<VkDeviceMemory>(check<VkDeviceMemory>(imageMipTailMemoryBind.memory), Deleter<VkDeviceMemory>(deviceInterface, getDevice(), DE_NULL))));
+
+                                       imageMipTailMemoryBinds.push_back(imageMipTailMemoryBind);
+                               }
+                       }
                }
 
                if ((aspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) && aspectRequirements.imageMipTailFirstLod < imageCreateInfo.mipLevels)
@@ -352,6 +371,23 @@ tcu::TestStatus ImageSparseResidencyInstance::iterate (void)
                        imageMipTailMemoryBinds.push_back(imageMipTailMemoryBind);
                }
 
+               // Metadata
+               if (metadataAspectIndex != NO_MATCH_FOUND)
+               {
+                       const VkSparseImageMemoryRequirements metadataAspectRequirements = sparseMemoryRequirements[metadataAspectIndex];
+
+                       if ((metadataAspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT))
+                       {
+                               const VkSparseMemoryBind imageMipTailMemoryBind = makeSparseMemoryBind(deviceInterface, getDevice(),
+                                       metadataAspectRequirements.imageMipTailSize, memoryType, metadataAspectRequirements.imageMipTailOffset,
+                                       VK_SPARSE_MEMORY_BIND_METADATA_BIT);
+
+                               deviceMemUniquePtrVec.push_back(makeVkSharedPtr(Move<VkDeviceMemory>(check<VkDeviceMemory>(imageMipTailMemoryBind.memory), Deleter<VkDeviceMemory>(deviceInterface, getDevice(), DE_NULL))));
+
+                               imageMipTailMemoryBinds.push_back(imageMipTailMemoryBind);
+                       }
+               }
+
                VkBindSparseInfo bindSparseInfo =
                {
                        VK_STRUCTURE_TYPE_BIND_SPARSE_INFO,                     //VkStructureType                                                       sType;
index 6616df0..24e128b 100644 (file)
@@ -209,7 +209,8 @@ tcu::TestStatus MipmapSparseResidencyInstance::iterate (void)
 
                DE_ASSERT(sparseMemoryRequirements.size() != 0);
 
-               const deUint32 colorAspectIndex = getSparseAspectRequirementsIndex(sparseMemoryRequirements, VK_IMAGE_ASPECT_COLOR_BIT);
+               const deUint32 colorAspectIndex         = getSparseAspectRequirementsIndex(sparseMemoryRequirements, VK_IMAGE_ASPECT_COLOR_BIT);
+               const deUint32 metadataAspectIndex      = getSparseAspectRequirementsIndex(sparseMemoryRequirements, VK_IMAGE_ASPECT_METADATA_BIT);
 
                if (colorAspectIndex == NO_MATCH_FOUND)
                        TCU_THROW(NotSupportedError, "Not supported image aspect - the test supports currently only VK_IMAGE_ASPECT_COLOR_BIT");
@@ -255,6 +256,24 @@ tcu::TestStatus MipmapSparseResidencyInstance::iterate (void)
 
                                imageMipTailMemoryBinds.push_back(imageMipTailMemoryBind);
                        }
+
+                       // Metadata
+                       if (metadataAspectIndex != NO_MATCH_FOUND)
+                       {
+                               const VkSparseImageMemoryRequirements metadataAspectRequirements = sparseMemoryRequirements[metadataAspectIndex];
+
+                               if (!(metadataAspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT))
+                               {
+                                       const VkSparseMemoryBind imageMipTailMemoryBind = makeSparseMemoryBind(deviceInterface, getDevice(),
+                                               metadataAspectRequirements.imageMipTailSize, memoryType,
+                                               metadataAspectRequirements.imageMipTailOffset + layerNdx * metadataAspectRequirements.imageMipTailStride,
+                                               VK_SPARSE_MEMORY_BIND_METADATA_BIT);
+
+                                       deviceMemUniquePtrVec.push_back(makeVkSharedPtr(Move<VkDeviceMemory>(check<VkDeviceMemory>(imageMipTailMemoryBind.memory), Deleter<VkDeviceMemory>(deviceInterface, getDevice(), DE_NULL))));
+
+                                       imageMipTailMemoryBinds.push_back(imageMipTailMemoryBind);
+                               }
+                       }
                }
 
                if ((aspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) && aspectRequirements.imageMipTailFirstLod < imageSparseInfo.mipLevels)
@@ -267,6 +286,23 @@ tcu::TestStatus MipmapSparseResidencyInstance::iterate (void)
                        imageMipTailMemoryBinds.push_back(imageMipTailMemoryBind);
                }
 
+               // Metadata
+               if (metadataAspectIndex != NO_MATCH_FOUND)
+               {
+                       const VkSparseImageMemoryRequirements metadataAspectRequirements = sparseMemoryRequirements[metadataAspectIndex];
+
+                       if (metadataAspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT)
+                       {
+                               const VkSparseMemoryBind imageMipTailMemoryBind = makeSparseMemoryBind(deviceInterface, getDevice(),
+                                       metadataAspectRequirements.imageMipTailSize, memoryType, metadataAspectRequirements.imageMipTailOffset,
+                                       VK_SPARSE_MEMORY_BIND_METADATA_BIT);
+
+                               deviceMemUniquePtrVec.push_back(makeVkSharedPtr(Move<VkDeviceMemory>(check<VkDeviceMemory>(imageMipTailMemoryBind.memory), Deleter<VkDeviceMemory>(deviceInterface, getDevice(), DE_NULL))));
+
+                               imageMipTailMemoryBinds.push_back(imageMipTailMemoryBind);
+                       }
+               }
+
                VkBindSparseInfo bindSparseInfo =
                {
                        VK_STRUCTURE_TYPE_BIND_SPARSE_INFO,                     //VkStructureType                                                       sType;
index 1f73b6c..2c23452 100644 (file)
@@ -310,7 +310,8 @@ tcu::TestStatus SparseShaderIntrinsicsInstanceBase::iterate (void)
 
                DE_ASSERT(sparseMemoryRequirements.size() != 0);
 
-               const deUint32 colorAspectIndex = getSparseAspectRequirementsIndex(sparseMemoryRequirements, VK_IMAGE_ASPECT_COLOR_BIT);
+               const deUint32 colorAspectIndex         = getSparseAspectRequirementsIndex(sparseMemoryRequirements, VK_IMAGE_ASPECT_COLOR_BIT);
+               const deUint32 metadataAspectIndex      = getSparseAspectRequirementsIndex(sparseMemoryRequirements, VK_IMAGE_ASPECT_METADATA_BIT);
 
                if (colorAspectIndex == NO_MATCH_FOUND)
                        TCU_THROW(NotSupportedError, "Not supported image aspect - the test supports currently only VK_IMAGE_ASPECT_COLOR_BIT");
@@ -395,6 +396,25 @@ tcu::TestStatus SparseShaderIntrinsicsInstanceBase::iterate (void)
                        }
                }
 
+               // Metadata
+               if (metadataAspectIndex != NO_MATCH_FOUND)
+               {
+                       const VkSparseImageMemoryRequirements metadataAspectRequirements = sparseMemoryRequirements[metadataAspectIndex];
+
+                       const deUint32 metadataBindCount = (metadataAspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT ? 1u : imageSparseInfo.arrayLayers);
+                       for (deUint32 bindNdx = 0u; bindNdx < metadataBindCount; ++bindNdx)
+                       {
+                               const VkSparseMemoryBind imageMipTailMemoryBind = makeSparseMemoryBind(deviceInterface, getDevice(),
+                                       metadataAspectRequirements.imageMipTailSize, memoryType,
+                                       metadataAspectRequirements.imageMipTailOffset + bindNdx * metadataAspectRequirements.imageMipTailStride,
+                                       VK_SPARSE_MEMORY_BIND_METADATA_BIT);
+
+                               deviceMemUniquePtrVec.push_back(makeVkSharedPtr(Move<VkDeviceMemory>(check<VkDeviceMemory>(imageMipTailMemoryBind.memory), Deleter<VkDeviceMemory>(deviceInterface, getDevice(), DE_NULL))));
+
+                               imageMipTailBinds.push_back(imageMipTailMemoryBind);
+                       }
+               }
+
                VkBindSparseInfo bindSparseInfo =
                {
                        VK_STRUCTURE_TYPE_BIND_SPARSE_INFO,     //VkStructureType                                                       sType;
index d5eab7d..fd38c5e 100644 (file)
@@ -770,13 +770,13 @@ deUint32 getImageSizeInBytes(const VkExtent3D& baseExtents, const deUint32 layer
        return imageSizeInBytes;
 }
 
-VkSparseImageMemoryBind        makeSparseImageMemoryBind  (const DeviceInterface&              vk,
-                                                                                                       const VkDevice                          device,
-                                                                                                       const VkDeviceSize                      allocationSize,
-                                                                                                       const deUint32                          memoryType,
-                                                                                                       const VkImageSubresource&       subresource,
-                                                                                                       const VkOffset3D&                       offset,
-                                                                                                       const VkExtent3D&                       extent)
+VkSparseImageMemoryBind        makeSparseImageMemoryBind  (const DeviceInterface&                      vk,
+                                                                                                       const VkDevice                                  device,
+                                                                                                       const VkDeviceSize                              allocationSize,
+                                                                                                       const deUint32                                  memoryType,
+                                                                                                       const VkImageSubresource&               subresource,
+                                                                                                       const VkOffset3D&                               offset,
+                                                                                                       const VkExtent3D&                               extent)
 {
        const VkMemoryAllocateInfo      allocInfo =
        {
@@ -801,11 +801,12 @@ VkSparseImageMemoryBind   makeSparseImageMemoryBind  (const DeviceInterface&              vk,
        return imageMemoryBind;
 }
 
-VkSparseMemoryBind makeSparseMemoryBind        (const DeviceInterface& vk,
-                                                                                const VkDevice                 device,
-                                                                                const VkDeviceSize             allocationSize,
-                                                                                const deUint32                 memoryType,
-                                                                                const VkDeviceSize             resourceOffset)
+VkSparseMemoryBind makeSparseMemoryBind        (const DeviceInterface&                 vk,
+                                                                                const VkDevice                                 device,
+                                                                                const VkDeviceSize                             allocationSize,
+                                                                                const deUint32                                 memoryType,
+                                                                                const VkDeviceSize                             resourceOffset,
+                                                                                const VkSparseMemoryBindFlags  flags)
 {
        const VkMemoryAllocateInfo allocInfo =
        {
@@ -824,7 +825,7 @@ VkSparseMemoryBind makeSparseMemoryBind     (const DeviceInterface& vk,
        memoryBind.size                         = allocationSize;
        memoryBind.memory                       = deviceMemory;
        memoryBind.memoryOffset         = 0u;
-       memoryBind.flags                        = 0u;
+       memoryBind.flags                        = flags;
 
        return memoryBind;
 }
index ff9852b..7049aed 100644 (file)
@@ -237,7 +237,8 @@ vk::VkSparseMemoryBind                      makeSparseMemoryBind                            (const vk::DeviceInterface&                     v
                                                                                                                                         const vk::VkDevice                                     device,
                                                                                                                                         const vk::VkDeviceSize                         allocationSize,
                                                                                                                                         const deUint32                                         memoryType,
-                                                                                                                                        const vk::VkDeviceSize                         resourceOffset);
+                                                                                                                                        const vk::VkDeviceSize                         resourceOffset,
+                                                                                                                                        const vk::VkSparseMemoryBindFlags      flags                   = 0u);
 
 void                                                   beginCommandBuffer                                      (const vk::DeviceInterface&                     vk,
                                                                                                                                         const vk::VkCommandBuffer                      cmdBuffer);