diff options
| author | skallweitNV <64953474+skallweitNV@users.noreply.github.com> | 2023-09-06 01:07:29 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-06 07:07:29 +0800 |
| commit | f80e01c8288e09aeac73c9f91bbfd8d1298a47ba (patch) | |
| tree | 673c7fd73b22f9965eba2f319f86aac23924a4f7 /tools | |
| parent | 2c2294d3310b24fd73cd41ec51338a736f3a2886 (diff) | |
Add support for getting external semaphore handles (#3181)
* Add support for getting external semaphore handles
* Fixes
* Linux fix
* Address reviewer comments
---------
Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/gfx/vulkan/vk-api.h | 1 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-device.cpp | 16 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-fence.cpp | 43 |
3 files changed, 58 insertions, 2 deletions
diff --git a/tools/gfx/vulkan/vk-api.h b/tools/gfx/vulkan/vk-api.h index f4caa8251..127988946 100644 --- a/tools/gfx/vulkan/vk-api.h +++ b/tools/gfx/vulkan/vk-api.h @@ -176,6 +176,7 @@ namespace gfx { #else # define VK_API_DEVICE_PLATFORM_OPT_PROCS(x) \ x(vkGetMemoryFdKHR) \ + x(vkGetSemaphoreFdKHR) \ /* */ #endif diff --git a/tools/gfx/vulkan/vk-device.cpp b/tools/gfx/vulkan/vk-device.cpp index 8f7a88886..015be5f15 100644 --- a/tools/gfx/vulkan/vk-device.cpp +++ b/tools/gfx/vulkan/vk-device.cpp @@ -607,6 +607,22 @@ Result DeviceImpl::initVulkanInstanceAndDevice( #endif m_features.add("external-memory"); } + if (extensionNames.contains(VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME)) + { + deviceExtensions.add(VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME); +#if SLANG_WINDOWS_FAMILY + if (extensionNames.contains(VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME)) + { + deviceExtensions.add(VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME); + } +#else + if (extensionNames.contains(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME)) + { + deviceExtensions.add(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME); + } +#endif + m_features.add("external-semaphore"); + } if (extensionNames.contains(VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME)) { deviceExtensions.add(VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME); diff --git a/tools/gfx/vulkan/vk-fence.cpp b/tools/gfx/vulkan/vk-fence.cpp index 0cef86a13..7ef2323f7 100644 --- a/tools/gfx/vulkan/vk-fence.cpp +++ b/tools/gfx/vulkan/vk-fence.cpp @@ -4,6 +4,10 @@ #include "vk-device.h" #include "vk-util.h" +#if SLANG_WINDOWS_FAMILY +#include <dxgi1_2.h> +#endif + namespace gfx { @@ -40,6 +44,30 @@ Result FenceImpl::init(const IFence::Desc& desc) createInfo.pNext = &timelineCreateInfo; createInfo.flags = 0; +#if SLANG_WINDOWS_FAMILY + VkExportSemaphoreWin32HandleInfoKHR exportSemaphoreWin32HandleInfoKHR; +#endif + VkExportSemaphoreCreateInfoKHR exportSemaphoreCreateInfo; + if (desc.isShared) + { +#if SLANG_WINDOWS_FAMILY + exportSemaphoreWin32HandleInfoKHR.sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR; + exportSemaphoreWin32HandleInfoKHR.pNext = timelineCreateInfo.pNext;; + exportSemaphoreWin32HandleInfoKHR.pAttributes = nullptr; + exportSemaphoreWin32HandleInfoKHR.dwAccess = DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE; + exportSemaphoreWin32HandleInfoKHR.name = (LPCWSTR)nullptr; +#endif + exportSemaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR; +#if SLANG_WINDOWS_FAMILY + exportSemaphoreCreateInfo.pNext = &exportSemaphoreWin32HandleInfoKHR; + exportSemaphoreCreateInfo.handleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT; +#else + exportSemaphoreCreateInfo.pNext = timelineCreateInfo.pNext; + exportSemaphoreCreateInfo.handleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT; +#endif + timelineCreateInfo.pNext = &exportSemaphoreCreateInfo; + } + SLANG_VK_RETURN_ON_FAIL(m_device->m_api.vkCreateSemaphore( m_device->m_api.m_device, &createInfo, nullptr, &m_semaphore)); @@ -62,7 +90,7 @@ Result FenceImpl::setCurrentValue(uint64_t value) { VkSemaphoreSignalInfo signalInfo; signalInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO; - signalInfo.pNext = NULL; + signalInfo.pNext = nullptr; signalInfo.semaphore = m_semaphore; signalInfo.value = value; @@ -89,9 +117,20 @@ Result FenceImpl::getSharedHandle(InteropHandle* outHandle) handleInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT; SLANG_VK_RETURN_ON_FAIL(m_device->m_api.vkGetSemaphoreWin32HandleKHR( - m_device->m_api.m_device, &handleInfo, (HANDLE*)&outHandle->handleValue)); + m_device->m_api.m_device, &handleInfo, (HANDLE*)&sharedHandle.handleValue)); +#else + VkSemaphoreGetFdInfoKHR fdInfo = { + VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR}; + fdInfo.pNext = nullptr; + fdInfo.semaphore = m_semaphore; + fdInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT; + + SLANG_VK_RETURN_ON_FAIL(m_device->m_api.vkGetSemaphoreFdKHR( + m_device->m_api.m_device, &fdInfo, (int*)&sharedHandle.handleValue)); #endif + sharedHandle.api = InteropHandleAPI::Vulkan; + *outHandle = sharedHandle; return SLANG_OK; } |
