Skip to content

Commit 663b762

Browse files
committed
[dxvk] Open the D3DKMT resource local handle on allocation
1 parent c6ac7f2 commit 663b762

4 files changed

Lines changed: 150 additions & 0 deletions

File tree

src/dxvk/dxvk_memory.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,13 @@ namespace dxvk {
215215

216216

217217
DxvkResourceAllocation::~DxvkResourceAllocation() {
218+
if (unlikely(m_kmtLocal)) {
219+
D3DKMT_DESTROYALLOCATION destroy = { };
220+
destroy.hDevice = m_allocator->device()->kmtLocal();
221+
destroy.hResource = m_kmtLocal;
222+
D3DKMTDestroyAllocation(&destroy);
223+
}
224+
218225
if (m_buffer) {
219226
if (unlikely(m_bufferViews))
220227
delete m_bufferViews;
@@ -1119,6 +1126,48 @@ namespace dxvk {
11191126
}
11201127
}
11211128

1129+
#ifdef _WIN32
1130+
auto sharedExport = (const VkExportMemoryAllocateInfo*)next;
1131+
if (sharedExport && sharedExport->sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO) {
1132+
VkMemoryGetWin32HandleInfoKHR handleInfo = { VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR };
1133+
handleInfo.handleType = (VkExternalMemoryHandleTypeFlagBits)sharedExport->handleTypes;
1134+
handleInfo.memory = allocation->m_memory;
1135+
1136+
D3DDDI_OPENALLOCATIONINFO2 alloc = { };
1137+
HANDLE sharedHandle = INVALID_HANDLE_VALUE;
1138+
1139+
if (vk->vkGetMemoryWin32HandleKHR(vk->device(), &handleInfo, &sharedHandle) != VK_SUCCESS) {
1140+
Logger::warn("DxvkMemoryAllocator::createImageResource: Failed to get shared handle for memory");
1141+
} else if (handleInfo.handleType & VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT) {
1142+
D3DKMT_OPENRESOURCE open = { };
1143+
open.hDevice = m_device->kmtLocal();
1144+
open.hGlobalShare = (uintptr_t)sharedHandle;
1145+
open.NumAllocations = 1;
1146+
open.pOpenAllocationInfo2 = &alloc;
1147+
1148+
if (D3DKMTOpenResource2(&open)) {
1149+
Logger::warn("DxvkMemoryAllocator::createImageResource: Failed to open shared D3DKMT handle");
1150+
} else {
1151+
allocation->m_kmtLocal = open.hResource;
1152+
allocation->m_kmtGlobal = open.hGlobalShare;
1153+
}
1154+
} else {
1155+
D3DKMT_OPENRESOURCEFROMNTHANDLE open = { };
1156+
open.hDevice = m_device->kmtLocal();
1157+
open.hNtHandle = sharedHandle;
1158+
open.NumAllocations = 1;
1159+
open.pOpenAllocationInfo2 = &alloc;
1160+
1161+
if (D3DKMTOpenResourceFromNtHandle(&open)) {
1162+
Logger::warn("DxvkMemoryAllocator::createImageResource: Failed to open shared NT handle");
1163+
} else {
1164+
allocation->m_kmtLocal = open.hResource;
1165+
}
1166+
CloseHandle(sharedHandle);
1167+
}
1168+
}
1169+
#endif
1170+
11221171
return allocation;
11231172
}
11241173

src/dxvk/dxvk_memory.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,24 @@ namespace dxvk {
550550
return m_mapPtr;
551551
}
552552

553+
/**
554+
* \brief D3DKMT resource local handle
555+
* \returns The resource D3DKMT local handle
556+
* \returns \c 0 if resource is not shared
557+
*/
558+
D3DKMT_HANDLE kmtLocal() const {
559+
return m_kmtLocal;
560+
}
561+
562+
/**
563+
* \brief D3DKMT resource global handle
564+
* \returns The resource D3DKMT global handle
565+
* \returns \c 0 if resource is not shared or shared with NT handle
566+
*/
567+
D3DKMT_HANDLE kmtGlobal() const {
568+
return m_kmtGlobal;
569+
}
570+
553571
/**
554572
* \brief Queries memory info
555573
* \returns Memory info
@@ -644,6 +662,8 @@ namespace dxvk {
644662

645663
VkImage m_image = VK_NULL_HANDLE;
646664
DxvkResourceImageViewMap* m_imageViews = nullptr;
665+
D3DKMT_HANDLE m_kmtLocal = 0;
666+
D3DKMT_HANDLE m_kmtGlobal = 0;
647667

648668
DxvkSparsePageTable* m_sparsePageTable = nullptr;
649669

src/util/util_gdi.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ namespace dxvk {
1919
return -1;
2020
}
2121

22+
NTSTATUS D3DKMTDestroyAllocation(const D3DKMT_DESTROYALLOCATION *desc) {
23+
Logger::warn("D3DKMTDestroyAllocation: Not available on this platform.");
24+
return -1;
25+
}
26+
2227
NTSTATUS D3DKMTDestroyDCFromMemory(const D3DKMT_DESTROYDCFROMMEMORY *desc) {
2328
Logger::warn("D3DKMTDestroyDCFromMemory: Not available on this platform.");
2429
return -1;
@@ -33,6 +38,16 @@ namespace dxvk {
3338
Logger::warn("D3DKMTOpenAdapterFromLuid: Not available on this platform.");
3439
return -1;
3540
}
41+
42+
NTSTATUS D3DKMTOpenResource2(D3DKMT_OPENRESOURCE *desc) {
43+
Logger::warn("D3DKMTOpenResource2: Not available on this platform.");
44+
return -1;
45+
}
46+
47+
NTSTATUS D3DKMTOpenResourceFromNtHandle(D3DKMT_OPENRESOURCEFROMNTHANDLE *desc) {
48+
Logger::warn("D3DKMTOpenResourceFromNtHandle: Not available on this platform.");
49+
return -1;
50+
}
3651
#endif
3752

3853
}

src/util/util_gdi.h

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace dxvk {
1111
using NTSTATUS = LONG;
1212
using D3DDDIFORMAT = D3DFORMAT;
1313
using D3DKMT_HANDLE = UINT;
14+
using D3DGPU_VIRTUAL_ADDRESS = ULONGLONG;
1415

1516
typedef struct _D3DKMT_CLOSEADAPTER
1617
{
@@ -89,6 +90,14 @@ namespace dxvk {
8990
UINT PatchLocationListSize;
9091
} D3DKMT_CREATEDEVICE;
9192

93+
typedef struct _D3DKMT_DESTROYALLOCATION
94+
{
95+
D3DKMT_HANDLE hDevice;
96+
D3DKMT_HANDLE hResource;
97+
const D3DKMT_HANDLE *phAllocationList;
98+
UINT AllocationCount;
99+
} D3DKMT_DESTROYALLOCATION;
100+
92101
typedef struct _D3DKMT_DESTROYDCFROMMEMORY
93102
{
94103
HDC hDc;
@@ -106,10 +115,67 @@ namespace dxvk {
106115
D3DKMT_HANDLE hAdapter;
107116
} D3DKMT_OPENADAPTERFROMLUID;
108117

118+
typedef struct _D3DDDI_OPENALLOCATIONINFO
119+
{
120+
D3DKMT_HANDLE hAllocation;
121+
const void *pPrivateDriverData;
122+
UINT PrivateDriverDataSize;
123+
} D3DDDI_OPENALLOCATIONINFO;
124+
125+
typedef struct _D3DDDI_OPENALLOCATIONINFO2
126+
{
127+
D3DKMT_HANDLE hAllocation;
128+
const void *pPrivateDriverData;
129+
UINT PrivateDriverDataSize;
130+
D3DGPU_VIRTUAL_ADDRESS GpuVirtualAddress;
131+
ULONG_PTR Reserved[6];
132+
} D3DDDI_OPENALLOCATIONINFO2;
133+
134+
typedef struct _D3DKMT_OPENRESOURCE
135+
{
136+
D3DKMT_HANDLE hDevice;
137+
D3DKMT_HANDLE hGlobalShare;
138+
UINT NumAllocations;
139+
union
140+
{
141+
D3DDDI_OPENALLOCATIONINFO *pOpenAllocationInfo;
142+
D3DDDI_OPENALLOCATIONINFO2 *pOpenAllocationInfo2;
143+
};
144+
void *pPrivateRuntimeData;
145+
UINT PrivateRuntimeDataSize;
146+
void *pResourcePrivateDriverData;
147+
UINT ResourcePrivateDriverDataSize;
148+
void *pTotalPrivateDriverDataBuffer;
149+
UINT TotalPrivateDriverDataBufferSize;
150+
D3DKMT_HANDLE hResource;
151+
} D3DKMT_OPENRESOURCE;
152+
153+
typedef struct _D3DKMT_OPENRESOURCEFROMNTHANDLE
154+
{
155+
D3DKMT_HANDLE hDevice;
156+
HANDLE hNtHandle;
157+
UINT NumAllocations;
158+
D3DDDI_OPENALLOCATIONINFO2 *pOpenAllocationInfo2;
159+
UINT PrivateRuntimeDataSize;
160+
void *pPrivateRuntimeData;
161+
UINT ResourcePrivateDriverDataSize;
162+
void *pResourcePrivateDriverData;
163+
UINT TotalPrivateDriverDataBufferSize;
164+
void *pTotalPrivateDriverDataBuffer;
165+
D3DKMT_HANDLE hResource;
166+
D3DKMT_HANDLE hKeyedMutex;
167+
void *pKeyedMutexPrivateRuntimeData;
168+
UINT KeyedMutexPrivateRuntimeDataSize;
169+
D3DKMT_HANDLE hSyncObject;
170+
} D3DKMT_OPENRESOURCEFROMNTHANDLE;
171+
109172
EXTERN_C WINBASEAPI NTSTATUS WINAPI D3DKMTCloseAdapter(const D3DKMT_CLOSEADAPTER *desc);
110173
EXTERN_C WINBASEAPI NTSTATUS WINAPI D3DKMTCreateDCFromMemory(D3DKMT_CREATEDCFROMMEMORY *desc);
111174
EXTERN_C WINBASEAPI NTSTATUS WINAPI D3DKMTCreateDevice(D3DKMT_CREATEDEVICE *desc);
175+
EXTERN_C WINBASEAPI NTSTATUS WINAPI D3DKMTDestroyAllocation(const D3DKMT_DESTROYALLOCATION *desc);
112176
EXTERN_C WINBASEAPI NTSTATUS WINAPI D3DKMTDestroyDCFromMemory(const D3DKMT_DESTROYDCFROMMEMORY *desc);
113177
EXTERN_C WINBASEAPI NTSTATUS WINAPI D3DKMTDestroyDevice(const D3DKMT_DESTROYDEVICE *desc);
114178
EXTERN_C WINBASEAPI NTSTATUS WINAPI D3DKMTOpenAdapterFromLuid(D3DKMT_OPENADAPTERFROMLUID *desc);
179+
EXTERN_C WINBASEAPI NTSTATUS WINAPI D3DKMTOpenResource2(D3DKMT_OPENRESOURCE *desc);
180+
EXTERN_C WINBASEAPI NTSTATUS WINAPI D3DKMTOpenResourceFromNtHandle(D3DKMT_OPENRESOURCEFROMNTHANDLE *desc);
115181
}

0 commit comments

Comments
 (0)