Merge vk-gl-cts/vulkan-cts-1.1.2 into vk-gl-cts/master
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / vktExternalMemoryUtil.cpp
index 85f085f..8261785 100644 (file)
@@ -1055,6 +1055,42 @@ static vk::Move<vk::VkDeviceMemory> importMemory (const vk::DeviceInterface&
 
                return memory;
        }
+       else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
+       {
+               AndroidHardwareBufferExternalApi* ahbApi = AndroidHardwareBufferExternalApi::getInstance();
+               if (!ahbApi)
+               {
+                       TCU_THROW(NotSupportedError, "Platform doesn't support Android Hardware Buffer handles");
+               }
+
+               deUint32 ahbFormat = 0;
+               ahbApi->describe(handle.getAndroidHardwareBuffer(), DE_NULL, DE_NULL, DE_NULL, &ahbFormat, DE_NULL, DE_NULL);
+               DE_ASSERT(ahbApi->ahbFormatIsBlob(ahbFormat) || image != 0);
+
+               vk::VkImportAndroidHardwareBufferInfoANDROID    importInfo =
+               {
+                       vk::VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID,
+                       DE_NULL,
+                       handle.getAndroidHardwareBuffer()
+               };
+               const vk::VkMemoryDedicatedAllocateInfo         dedicatedInfo =
+               {
+                       vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR,
+                       &importInfo,
+                       image,
+                       buffer,
+               };
+               const vk::VkMemoryAllocateInfo                                  info =
+               {
+                       vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
+                       (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
+                       requirements.size,
+                       (memoryTypeIndex == ~0U) ? chooseMemoryType(requirements.memoryTypeBits)  : memoryTypeIndex
+               };
+               vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
+
+               return memory;
+       }
        else
        {
                DE_FATAL("Unknown external memory type");