Vulkan: Export VkSemaphores as SYNC_FDs instead of OPAQUE_FDs
For Dawn/Chrome interop, Chrome OS differs from Linux as it uses the NativePixmap-based SharedImageBacking which stores image memory as dma-bufs as opposed to opaque FDs. Likewise, for synchronization, Chrome OS wants to use sync obj FDs as opposed to opaque FDs for more flexibility. The motivating difference between sync obj FDs and their opaque counterparts is how they are created. As their name suggests, Opaque FDs are mostly meaningless outside of the Vulkan ecosystem and must be created from a VkDevice. As a result, Linux’s ExternalVkImageBacking needs the Vulkan implementation to create the FD even when accessing the SharedImage as a GL texture [1]. On Chrome OS, however, we don’t guarantee Vulkan outside of Dawn, so we aren’t able to create the opaque FD directly in Chrome. Instead, we are always able to create sync objs (e.g. via a fence [2]) which can be imported as VkSemaphores by simply changing VkImportSemaphoreFdInfoKHR::handleType. Similarly, we can export signal VkSemaphores as sync objs as well by updating VkSemaphoreGetFdInfoKHR::handleType. This CL adds conditional support for using SYNC_FDs on Chrome OS when importing/exporting VkSemaphores and renames SemaphoreServiceOpaqueFD accordingly. With this, we can properly wait on reads/writes on a GL SharedImage representation before accessing the same memory in Dawn [3]. [1] https://source.chromium.org/chromium/chromium/src/+/main:gpu/command_buffer/service/external_vk_image_gl_representation.cc;l=75;drc=f887797b3b527feabd5dfe9b3f2cc7f6deade49f [2] https://source.chromium.org/chromium/chromium/src/+/main:gpu/command_buffer/service/shared_image_backing_gl_image.cc;l=681;drc=f887797b3b527feabd5dfe9b3f2cc7f6deade49f [3] https://chromium-review.googlesource.com/c/chromium/src/+/3042460 BUG=b:172208313 Change-Id: I5357847fea40e41d1b982054e3573d363e17530c Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/59080 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Austin Eng <enga@chromium.org> Commit-Queue: Brian Ho <hob@chromium.org>
This commit is contained in:
parent
c635acdfba
commit
4d94647e1f
|
@ -598,12 +598,13 @@ source_set("dawn_native_sources") {
|
|||
if (is_chromeos) {
|
||||
sources += [
|
||||
"vulkan/external_memory/MemoryServiceDmaBuf.cpp",
|
||||
"vulkan/external_semaphore/SemaphoreServiceOpaqueFD.cpp",
|
||||
"vulkan/external_semaphore/SemaphoreServiceFD.cpp",
|
||||
]
|
||||
defines += [ "DAWN_USE_SYNC_FDS" ]
|
||||
} else if (is_linux) {
|
||||
sources += [
|
||||
"vulkan/external_memory/MemoryServiceOpaqueFD.cpp",
|
||||
"vulkan/external_semaphore/SemaphoreServiceOpaqueFD.cpp",
|
||||
"vulkan/external_semaphore/SemaphoreServiceFD.cpp",
|
||||
]
|
||||
} else if (is_fuchsia) {
|
||||
sources += [
|
||||
|
|
|
@ -489,7 +489,7 @@ if (DAWN_ENABLE_VULKAN)
|
|||
if (UNIX AND NOT APPLE)
|
||||
target_sources(dawn_native PRIVATE
|
||||
"vulkan/external_memory/MemoryServiceOpaqueFD.cpp"
|
||||
"vulkan/external_semaphore/SemaphoreServiceOpaqueFD.cpp"
|
||||
"vulkan/external_semaphore/SemaphoreServiceFD.cpp"
|
||||
)
|
||||
else()
|
||||
target_sources(dawn_native PRIVATE
|
||||
|
|
|
@ -18,6 +18,13 @@
|
|||
#include "dawn_native/vulkan/VulkanError.h"
|
||||
#include "dawn_native/vulkan/external_semaphore/SemaphoreService.h"
|
||||
|
||||
static constexpr VkExternalSemaphoreHandleTypeFlagBits kHandleType =
|
||||
#if defined(DAWN_USE_SYNC_FDS)
|
||||
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT;
|
||||
#else
|
||||
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
|
||||
#endif // defined(DAWN_USE_SYNC_FDS)
|
||||
|
||||
namespace dawn_native { namespace vulkan { namespace external_semaphore {
|
||||
|
||||
Service::Service(Device* device) : mDevice(device) {
|
||||
|
@ -31,7 +38,7 @@ namespace dawn_native { namespace vulkan { namespace external_semaphore {
|
|||
VkPhysicalDeviceExternalSemaphoreInfoKHR semaphoreInfo;
|
||||
semaphoreInfo.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR;
|
||||
semaphoreInfo.pNext = nullptr;
|
||||
semaphoreInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
|
||||
semaphoreInfo.handleType = kHandleType;
|
||||
|
||||
VkExternalSemaphorePropertiesKHR semaphoreProperties;
|
||||
semaphoreProperties.sType = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR;
|
||||
|
@ -73,7 +80,7 @@ namespace dawn_native { namespace vulkan { namespace external_semaphore {
|
|||
importSemaphoreFdInfo.pNext = nullptr;
|
||||
importSemaphoreFdInfo.semaphore = semaphore;
|
||||
importSemaphoreFdInfo.flags = 0;
|
||||
importSemaphoreFdInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
|
||||
importSemaphoreFdInfo.handleType = kHandleType;
|
||||
importSemaphoreFdInfo.fd = handle;
|
||||
|
||||
MaybeError status = CheckVkSuccess(
|
||||
|
@ -92,7 +99,7 @@ namespace dawn_native { namespace vulkan { namespace external_semaphore {
|
|||
VkExportSemaphoreCreateInfoKHR exportSemaphoreInfo;
|
||||
exportSemaphoreInfo.sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR;
|
||||
exportSemaphoreInfo.pNext = nullptr;
|
||||
exportSemaphoreInfo.handleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
|
||||
exportSemaphoreInfo.handleTypes = kHandleType;
|
||||
|
||||
VkSemaphoreCreateInfo semaphoreCreateInfo;
|
||||
semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
|
||||
|
@ -112,7 +119,7 @@ namespace dawn_native { namespace vulkan { namespace external_semaphore {
|
|||
semaphoreGetFdInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR;
|
||||
semaphoreGetFdInfo.pNext = nullptr;
|
||||
semaphoreGetFdInfo.semaphore = semaphore;
|
||||
semaphoreGetFdInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
|
||||
semaphoreGetFdInfo.handleType = kHandleType;
|
||||
|
||||
int fd = -1;
|
||||
DAWN_TRY(CheckVkSuccess(
|
Loading…
Reference in New Issue