// Copyright 2022 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "gpu/vulkan/vulkan_util.h" #include "base/logging.h" #include "gpu/vulkan/vulkan_function_pointers.h" namespace gpu { VkSemaphore ImportVkSemaphoreHandle(VkDevice vk_device, SemaphoreHandle handle) { if (!handle.is_valid() || handle.vk_handle_type() != VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA) { return VK_NULL_HANDLE; } VkSemaphore semaphore = VK_NULL_HANDLE; VkSemaphoreCreateInfo info = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO}; VkResult result = vkCreateSemaphore(vk_device, &info, nullptr, &semaphore); if (result != VK_SUCCESS) return VK_NULL_HANDLE; zx::event event = handle.TakeHandle(); VkImportSemaphoreZirconHandleInfoFUCHSIA import = { VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA}; import.semaphore = semaphore; import.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA; import.zirconHandle = event.get(); result = vkImportSemaphoreZirconHandleFUCHSIA(vk_device, &import); if (result != VK_SUCCESS) { vkDestroySemaphore(vk_device, semaphore, nullptr); return VK_NULL_HANDLE; } // Vulkan took ownership of the handle. std::ignore = event.release(); return semaphore; } SemaphoreHandle GetVkSemaphoreHandle( VkDevice vk_device, VkSemaphore vk_semaphore, VkExternalSemaphoreHandleTypeFlagBits handle_type) { DCHECK_EQ(handle_type, VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA); // Create VkSemaphoreGetFdInfoKHR structure. VkSemaphoreGetZirconHandleInfoFUCHSIA info = { VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA}; info.semaphore = vk_semaphore; info.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA; zx_handle_t handle; VkResult result = vkGetSemaphoreZirconHandleFUCHSIA(vk_device, &info, &handle); if (result != VK_SUCCESS) { LOG(ERROR) << "vkGetSemaphoreFuchsiaHandleKHR failed : " << result; return gpu::SemaphoreHandle(); } return gpu::SemaphoreHandle( VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA, zx::event(handle)); } } // namespace gpu