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+
4246struct priv_owner {
4347 struct mp_hwdec_ctx hwctx ;
4448 CudaFunctions * cu ;
@@ -47,7 +51,11 @@ struct priv_owner {
4751};
4852
4953struct 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