dEQP-VK.renderpass.sparserendertarget: bind metadata
authorSlawomir Cygan <slawomir.cygan@intel.com>
Fri, 19 Jan 2018 13:20:47 +0000 (14:20 +0100)
committerS&#322;awomir Cygan <slawomir.cygan@intel.com>
Thu, 8 Feb 2018 16:37:09 +0000 (11:37 -0500)
Memory was not bound to METADATA aspect, when COLOR aspect
mip tail size was 0. METADATA requirements are not related
to mip tails in other aspects - memory must be always and
unconditionally bound to METADATA.

Additionally, change VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT
condition to layerNdx == 0, as imageMipTailMemoryBinds vector
is now used both for metadata and other mip tails.

Affects: dEQP-VK.renderpass.sparserendertarget.*

Components: Vulkan

VK-GL-CTS issue: 958

Change-Id: I34661c82e0d9829448ac85546055c72151bfe85e
(cherry picked from commit d04c2b650db561fb28f5888ae3de244fc70e6748)

external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp

index 24181a9..e655d41 100644 (file)
@@ -697,7 +697,7 @@ void allocateAndBindSparseImage (const DeviceInterface&                                             vk,
                // 2) otherwise:                                                            only one tail is needed.
                if (aspectRequirements.imageMipTailSize > 0)
                {
-                       if (imageMipTailMemoryBinds.size() == 0 || (aspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) == 0)
+                       if (layerNdx == 0 || (aspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) == 0)
                        {
                                const VkMemoryRequirements allocRequirements =
                                {
@@ -721,36 +721,38 @@ void allocateAndBindSparseImage (const DeviceInterface&                                           vk,
 
                                imageMipTailMemoryBinds.push_back(imageMipTailMemoryBind);
                        }
+               }
+               // Handle Metadata. Similarly to MIP tail in aspectRequirements, there are two cases to consider here:
+               //
+               // 1) VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT is requested by the driver: each layer needs a separate tail.
+               // 2) otherwise:
+               if (metadataAspectIndex != noMatchFound)
+               {
+                       const VkSparseImageMemoryRequirements   metadataAspectRequirements = sparseImageMemoryRequirements[metadataAspectIndex];
 
-                       // Metadata
-                       if (metadataAspectIndex != noMatchFound)
+                       if (layerNdx == 0 || (metadataAspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) == 0)
                        {
-                               const VkSparseImageMemoryRequirements   metadataAspectRequirements = sparseImageMemoryRequirements[metadataAspectIndex];
-
-                               if (imageMipTailMemoryBinds.size() == 1 || (metadataAspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) == 0)
+                               const VkMemoryRequirements metadataAllocRequirements =
                                {
-                                       const VkMemoryRequirements metadataAllocRequirements =
-                                       {
-                                               metadataAspectRequirements.imageMipTailSize,    // VkDeviceSize size;
-                                               memoryRequirements.alignment,                                   // VkDeviceSize alignment;
-                                               memoryRequirements.memoryTypeBits,                              // uint32_t             memoryTypeBits;
-                                       };
-                                       const de::SharedPtr<Allocation> metadataAllocation(allocator.allocate(metadataAllocRequirements, MemoryRequirement::Any).release());
+                                       metadataAspectRequirements.imageMipTailSize,    // VkDeviceSize size;
+                                       memoryRequirements.alignment,                                   // VkDeviceSize alignment;
+                                       memoryRequirements.memoryTypeBits,                              // uint32_t             memoryTypeBits;
+                               };
+                               const de::SharedPtr<Allocation> metadataAllocation(allocator.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;
-                                       };
+                               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;
+                               };
 
-                                       allocations.push_back(metadataAllocation);
+                               allocations.push_back(metadataAllocation);
 
-                                       imageMipTailMemoryBinds.push_back(metadataMipTailMemoryBind);
-                               }
+                               imageMipTailMemoryBinds.push_back(metadataMipTailMemoryBind);
                        }
                }
        }