@@ -56,6 +56,41 @@ namespace dxvk {
5656 Logger::warn (str::format (" Importing semaphores of type " , info.sharedType , " not supported by device" ));
5757 }
5858 }
59+
60+ #ifdef _WIN32
61+ if (info.sharedType != VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_FLAG_BITS_MAX_ENUM ) {
62+ VkSemaphoreGetWin32HandleInfoKHR win32HandleInfo = { VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR };
63+ win32HandleInfo.semaphore = m_semaphore;
64+ win32HandleInfo.handleType = m_info.sharedType ;
65+
66+ HANDLE sharedHandle = INVALID_HANDLE_VALUE ;
67+ VkResult vr = m_vkd->vkGetSemaphoreWin32HandleKHR (m_vkd->device (), &win32HandleInfo, &sharedHandle);
68+
69+ if (vr != VK_SUCCESS ) {
70+ Logger::err (str::format (" Failed to get semaphore handle: " , vr));
71+ } else if (m_info.sharedType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT ) {
72+ D3DKMT_OPENSYNCHRONIZATIONOBJECT desc = { };
73+ desc.hSharedHandle = (uintptr_t )sharedHandle;
74+
75+ if (D3DKMTOpenSynchronizationObject (&desc)) {
76+ Logger::warn (" DxvkFence::DxvkFence: Failed to open shared D3DKMT handle" );
77+ } else {
78+ m_kmtLocal = desc.hSyncObject ;
79+ m_kmtGlobal = desc.hSharedHandle ;
80+ }
81+ } else {
82+ D3DKMT_OPENSYNCOBJECTFROMNTHANDLE desc = { };
83+ desc.hNtHandle = sharedHandle;
84+
85+ if (D3DKMTOpenSyncObjectFromNtHandle (&desc)) {
86+ Logger::warn (" DxvkFence::DxvkFence: Failed to open shared NT handle" );
87+ } else {
88+ m_kmtLocal = desc.hSyncObject ;
89+ }
90+ CloseHandle (sharedHandle);
91+ }
92+ }
93+ #endif
5994 }
6095
6196
@@ -68,6 +103,11 @@ namespace dxvk {
68103 }
69104 m_thread.join ();
70105 }
106+ if (m_kmtLocal) {
107+ D3DKMT_DESTROYSYNCHRONIZATIONOBJECT desc = { };
108+ desc.hSyncObject = m_kmtLocal;
109+ D3DKMTDestroySynchronizationObject (&desc);
110+ }
71111 m_vkd->vkDestroySemaphore (m_vkd->device (), m_semaphore, nullptr );
72112 }
73113
0 commit comments