void importSemaphore (const vk::DeviceInterface& vkd, const vk::VkDevice device, const vk::VkSemaphore semaphore, vk::VkExternalSemaphoreHandleTypeFlagBitsKHR externalType, NativeHandle& handle, vk::VkSemaphoreImportFlagsKHR flags) { if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR) { const vk::VkImportSemaphoreFdInfoKHR importInfo = { vk::VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR, DE_NULL, semaphore, flags, externalType, handle.getFd() }; VK_CHECK(vkd.importSemaphoreFdKHR(device, &importInfo)); handle.disown(); } else if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR) { const vk::VkImportSemaphoreWin32HandleInfoKHR importInfo = { vk::VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR, DE_NULL, semaphore, flags, externalType, handle.getWin32Handle(), DE_NULL }; VK_CHECK(vkd.importSemaphoreWin32HandleKHR(device, &importInfo)); // \note File descriptors and win32 handles behave differently, but this call wil make it seem like they would behave in same way handle.reset(); } else DE_FATAL("Unknown semaphore external handle type"); }
static vk::Move<vk::VkDeviceMemory> importMemory (const vk::DeviceInterface& vkd, vk::VkDevice device, vk::VkBuffer buffer, vk::VkImage image, const vk::VkMemoryRequirements& requirements, vk::VkExternalMemoryHandleTypeFlagBitsKHR externalType, NativeHandle& handle) { const bool isDedicated = !!buffer || !!image; DE_ASSERT(!buffer || !image); if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR) { const vk::VkImportMemoryFdInfoKHR importInfo = { vk::VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, DE_NULL, externalType, handle.getFd() }; const vk::VkMemoryDedicatedAllocateInfoKHR 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, chooseMemoryType(requirements.memoryTypeBits) }; vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info)); handle.disown(); return memory; } else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR || externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR) { const vk::VkImportMemoryWin32HandleInfoKHR importInfo = { vk::VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR, DE_NULL, externalType, handle.getWin32Handle(), DE_NULL }; const vk::VkMemoryDedicatedAllocateInfoKHR 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, chooseMemoryType(requirements.memoryTypeBits) }; vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info)); handle.disown(); return memory; } else { DE_FATAL("Unknown external memory type"); return vk::Move<vk::VkDeviceMemory>(); } }