Skip to content

Commit 9d0e73a

Browse files
BtbNphilipl
authored andcommitted
vo_gpu: hwdec_cuda: add win32 support for vulkan memory mapping
1 parent ad4e136 commit 9d0e73a

File tree

1 file changed

+38
-9
lines changed

1 file changed

+38
-9
lines changed

video/out/opengl/hwdec_cuda.c

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939
#include "video/out/vulkan/ra_vk.h"
4040
#include "video/out/vulkan/utils.h"
4141

42+
#if HAVE_WIN32_DESKTOP
43+
#include <versionhelpers.h>
44+
#endif
45+
4246
struct priv_owner {
4347
struct mp_hwdec_ctx hwctx;
4448
CudaFunctions *cu;
@@ -47,7 +51,11 @@ struct priv_owner {
4751
};
4852

4953
struct ext_buf {
54+
#if HAVE_WIN32_DESKTOP
55+
HANDLE handle;
56+
#else
5057
int fd;
58+
#endif
5159
CUexternalMemory mem;
5260
CUdeviceptr buf;
5361
};
@@ -117,8 +125,11 @@ static int cuda_init(struct ra_hwdec *hw)
117125
#if HAVE_VULKAN
118126
if (is_vk) {
119127
#if HAVE_WIN32_DESKTOP
120-
MP_ERR(hw, "CUDA hwdec with Vulkan is currently not supported on Windows\n");
121-
return -1;
128+
if (!ra_vk_get(hw->ra)->has_ext_external_memory_win32) {
129+
MP_ERR(hw, "CUDA hwdec with Vulkan requires the %s extension\n",
130+
VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME);
131+
return -1;
132+
}
122133
#else
123134
if (!ra_vk_get(hw->ra)->has_ext_external_memory_fd) {
124135
MP_ERR(hw, "CUDA hwdec with Vulkan requires the %s extension\n",
@@ -302,30 +313,42 @@ static struct ra_buf *cuda_buf_pool_get(struct ra_hwdec_mapper *mapper, int n)
302313

303314
if (!ra_vk_buf_get_user_data(buf)) {
304315
struct ext_buf *ebuf = talloc_zero(NULL, struct ext_buf);
316+
struct vk_external_mem mem_info;
305317

306-
struct vk_external_fd fd_info;
307-
bool success = ra_vk_buf_get_external_fd(mapper->ra, buf, &fd_info);
318+
bool success = ra_vk_buf_get_external_info(mapper->ra, buf, &mem_info);
308319
if (!success) {
309320
ret = -1;
310321
goto error;
311322
}
312323

313-
ebuf->fd = fd_info.mem_fd;
314-
MP_DBG(mapper, "vk_external_fd[%d][%d]: %d %lu %lu\n", n, pool->index, ebuf->fd, fd_info.size, fd_info.offset);
324+
#if HAVE_WIN32_DESKTOP
325+
MP_DBG(mapper, "vk_external_info[%d][%d]: %p %zu %zu\n", n, pool->index, ebuf->handle, mem_info.size, mem_info.offset);
326+
ebuf->handle = mem_info.mem_handle;
327+
#else
328+
MP_DBG(mapper, "vk_external_info[%d][%d]: %d %zu %zu\n", n, pool->index, ebuf->fd, mem_info.size, mem_info.offset);
329+
ebuf->fd = mem_info.mem_fd;
330+
#endif
315331

316332
CUDA_EXTERNAL_MEMORY_HANDLE_DESC ext_desc = {
333+
#if HAVE_WIN32_DESKTOP
334+
.type = IsWindows8OrGreater()
335+
? CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32
336+
: CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT,
337+
.handle.win32.handle = ebuf->handle,
338+
#else
317339
.type = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD,
318340
.handle.fd = ebuf->fd,
319-
.size = fd_info.mem_size,
341+
#endif
342+
.size = mem_info.mem_size,
320343
.flags = 0,
321344
};
322345
ret = CHECK_CU(cu->cuImportExternalMemory(&ebuf->mem, &ext_desc));
323346
if (ret < 0)
324347
goto error;
325348

326349
CUDA_EXTERNAL_MEMORY_BUFFER_DESC buf_desc = {
327-
.offset = fd_info.offset,
328-
.size = fd_info.size,
350+
.offset = mem_info.offset,
351+
.size = mem_info.size,
329352
.flags = 0,
330353
};
331354
ret = CHECK_CU(cu->cuExternalMemoryGetMappedBuffer(&ebuf->buf, ebuf->mem, &buf_desc));
@@ -354,9 +377,15 @@ static void cuda_buf_pool_uninit(struct ra_hwdec_mapper *mapper, int n)
354377
if (ebuf) {
355378
if (ebuf->mem > 0) {
356379
CHECK_CU(cu->cuDestroyExternalMemory(ebuf->mem));
380+
#if HAVE_WIN32_DESKTOP
381+
} else if (ebuf->handle) {
382+
CloseHandle(ebuf->handle);
383+
}
384+
#else
357385
} else if (ebuf->fd > -1) {
358386
close(ebuf->fd);
359387
}
388+
#endif
360389
}
361390
talloc_free(ebuf);
362391
ra_vk_buf_set_user_data(buf, NULL);

0 commit comments

Comments
 (0)