Fixes AHB test out of memory error
authorMatthew Netsch <quic_mnetsch@quicinc.com>
Mon, 10 Dec 2018 18:34:22 +0000 (13:34 -0500)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Tue, 18 Dec 2018 09:35:46 +0000 (04:35 -0500)
Handles out of memory as not supported

Components: Vulkan
VK-GL-CTS issue: 1507

Affects:
dEQP-VK.api.external.memory.android_hardware_buffer.image_formats.*

Change-Id: If46d2fd7a446f8348aa11bb1636635c7d1f3660a

external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index 17e58d4..606f7aa
@@ -3822,7 +3822,7 @@ de::MovePtr<tcu::TestCaseGroup> createFenceTests (tcu::TestContext& testCtx, vk:
        return fenceGroup;
 }
 
-bool ValidateAHardwareBuffer(vk::VkFormat format, deUint64 requiredAhbUsage, const vk::DeviceDriver& vkd, const vk::VkDevice& device, vk::VkImageCreateFlags createFlag)
+bool ValidateAHardwareBuffer(vk::VkFormat format, deUint64 requiredAhbUsage, const vk::DeviceDriver& vkd, const vk::VkDevice& device, vk::VkImageCreateFlags createFlag, deUint32 layerCount, bool& enableMaxLayerTest)
 {
        DE_UNREF(createFlag);
 
@@ -3838,10 +3838,17 @@ bool ValidateAHardwareBuffer(vk::VkFormat format, deUint64 requiredAhbUsage, con
                return false;
 #endif
 
-       vk::pt::AndroidHardwareBufferPtr ahb = ahbApi->allocate(64u, 64u, 1u, ahbApi->vkFormatToAhbFormat(format), requiredAhbUsage);
+       vk::pt::AndroidHardwareBufferPtr ahb = ahbApi->allocate(64u, 64u, layerCount, ahbApi->vkFormatToAhbFormat(format), requiredAhbUsage);
        if (ahb.internal == DE_NULL)
-               return false;
-
+       {
+               enableMaxLayerTest = false;
+               // try again with layerCount '1'
+               ahb = ahbApi->allocate(64u, 64u, 1u, ahbApi->vkFormatToAhbFormat(format), requiredAhbUsage);
+               if (ahb.internal == DE_NULL)
+               {
+                       return false;
+               }
+       }
        NativeHandle nativeHandle(ahb);
        vk::VkAndroidHardwareBufferFormatPropertiesANDROID formatProperties =
        {
@@ -3890,6 +3897,7 @@ tcu::TestStatus testAndroidHardwareBufferImageFormat  (Context& context, vk::VkF
        const vk::Unique<vk::VkDevice>                            device                                (createDevice(context.getUsedApiVersion(), vkp, *instance, vki, physicalDevice, 0u, externalMemoryType, 0u, queueFamilyIndex));
        const vk::DeviceDriver                                            vkd                                   (vkp, *instance, *device);
        TestLog&                                                                          log                             = context.getTestContext().getLog();
+       const vk::VkPhysicalDeviceLimits                          limits                          = getPhysicalDeviceProperties(vki, physicalDevice).limits;
 
        vk::VkPhysicalDeviceProtectedMemoryFeatures             protectedFeatures;
        protectedFeatures.sType                         = vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES;
@@ -3933,6 +3941,7 @@ tcu::TestStatus testAndroidHardwareBufferImageFormat  (Context& context, vk::VkF
                vk::VkImageUsageFlags   usage                           = 0;
                vk::VkImageCreateFlags  createFlag                      = 0;
                deUint64                                requiredAhbUsage        = 0;
+               bool                                    enableMaxLayerTest      = true;
                for (size_t usageNdx = 0; usageNdx < numOfUsageFlags; usageNdx++)
                {
                        if ((combo & (1u << usageNdx)) == 0)
@@ -3957,7 +3966,7 @@ tcu::TestStatus testAndroidHardwareBufferImageFormat  (Context& context, vk::VkF
                        continue;
 
                // Only test a combination if AHardwareBuffer can be successfully allocated for it.
-               if (!ValidateAHardwareBuffer(format, requiredAhbUsage, vkd, *device, createFlag))
+               if (!ValidateAHardwareBuffer(format, requiredAhbUsage, vkd, *device, createFlag, limits.maxImageArrayLayers, enableMaxLayerTest))
                        continue;
 
                bool foundAnyUsableTiling = false;
@@ -4079,7 +4088,7 @@ tcu::TestStatus testAndroidHardwareBufferImageFormat  (Context& context, vk::VkF
                                TCU_CHECK((anhUsage & requiredAhbUsage) == requiredAhbUsage);
                        }
 
-                       if (properties.imageFormatProperties.maxArrayLayers > 1u)
+                       if ((properties.imageFormatProperties.maxArrayLayers > 1u) && enableMaxLayerTest)
                        {
                                deUint32                                                                exportedMemoryTypeIndex = ~0U;
                                const vk::Unique<vk::VkImage>                   image                                   (createExternalImage(vkd, *device, queueFamilyIndex, externalMemoryType, format, 64u, 64u, tiling, createFlag, usage, 1u, properties.imageFormatProperties.maxArrayLayers));