Fixes memory allocation tests
authorMatthew Netsch <quic_mnetsch@quicinc.com>
Tue, 28 Aug 2018 18:44:45 +0000 (14:44 -0400)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 30 Aug 2018 07:10:42 +0000 (03:10 -0400)
Queries the platform specific alignment restrictions
with a temp buffer instead of estimating.

Components: Vulkan
VK-GL-CTS issue: 1259

Affects:
dEQP-VK.memory.allocation.basic.size_*

Change-Id: I272026f9e29b5606b8a4265ef0034752ac43a71a

external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp

index d21a51d..9bfde7e 100644 (file)
@@ -253,6 +253,33 @@ tcu::TestStatus AllocateFreeTestInstance::iterate (void)
        TestLog&                                                                log                                     = m_context.getTestContext().getLog();
        const VkDevice                                                  device                          = getDevice();
        const DeviceInterface&                                  vkd                                     = getDeviceInterface();
+       VkMemoryRequirements                                    memReqs;
+       const deUint32                                                  queueFamilyIndex        = m_context.getUniversalQueueFamilyIndex();
+       VkBufferCreateFlags                                             createFlags                     = (vk::VkBufferCreateFlagBits)0u;
+       VkBufferUsageFlags                                              usageFlags                      = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+       VkSharingMode                                                   sharingMode                     = vk::VK_SHARING_MODE_EXCLUSIVE;
+       Move<VkBuffer>                                                  buffer;
+
+       if ((m_memoryProperties.memoryTypes[m_memoryTypeIndex].propertyFlags & vk::VK_MEMORY_PROPERTY_PROTECTED_BIT) == vk::VK_MEMORY_PROPERTY_PROTECTED_BIT)
+       {
+               createFlags |= vk::VK_BUFFER_CREATE_PROTECTED_BIT;
+       }
+
+       // Create a minimal buffer first to get the supported memory types
+       VkBufferCreateInfo                              bufferParams                                    =
+       {
+               VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,                       // VkStructureType          sType;
+               DE_NULL,                                                    // const void*              pNext;
+               createFlags,                                                // VkBufferCreateFlags      flags;
+               1u,                                                         // VkDeviceSize             size;
+               usageFlags,                                                 // VkBufferUsageFlags       usage;
+               sharingMode,                                                // VkSharingMode            sharingMode;
+               1u,                                                         // uint32_t                 queueFamilyIndexCount;
+               &queueFamilyIndex,                                          // const uint32_t*          pQueueFamilyIndices;
+       };
+
+       buffer = createBuffer(vkd, device, &bufferParams);
+       vkd.getBufferMemoryRequirements(device, *buffer, &memReqs);
 
        DE_ASSERT(m_config.memoryAllocationCount <= MAX_ALLOCATION_COUNT);
 
@@ -276,7 +303,7 @@ tcu::TestStatus AllocateFreeTestInstance::iterate (void)
                const VkMemoryType              memoryType              = m_memoryProperties.memoryTypes[m_memoryTypeIndex];
                const VkMemoryHeap              memoryHeap              = m_memoryProperties.memoryHeaps[memoryType.heapIndex];
 
-               const VkDeviceSize              allocationSize  = (m_config.memorySize ? *m_config.memorySize : (VkDeviceSize)(*m_config.memoryPercentage * (float)memoryHeap.size));
+               const VkDeviceSize              allocationSize  = (m_config.memorySize ? memReqs.size : (VkDeviceSize)(*m_config.memoryPercentage * (float)memoryHeap.size));
                const VkDeviceSize              roundedUpAllocationSize  = roundUpToNextMultiple(allocationSize, m_memoryLimits.deviceMemoryAllocationGranularity);
                vector<VkDeviceMemory>  memoryObjects   (m_config.memoryAllocationCount, (VkDeviceMemory)0);