From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/d3dkmt.c | 12 ++++++++++++ dlls/win32u/vulkan.c | 9 +++++++-- dlls/win32u/win32u_private.h | 2 ++ 3 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 1113eca9f8e..6a78f774575 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -1677,6 +1677,18 @@ NTSTATUS WINAPI NtGdiDdDDIDestroySynchronizationObject( const D3DKMT_DESTROYSYNC return STATUS_SUCCESS; }
+/* get a locally opened D3DKMT object host-specific fd */ +int d3dkmt_object_get_fd( D3DKMT_HANDLE local ) +{ + struct d3dkmt_object *object; + + TRACE( "local %#x\n", local ); + + if (!(object = get_d3dkmt_object( local, -1 ))) return -1; + if (object->fd < 0) return -1; + return dup( object->fd ); +} + /* create a D3DKMT global or shared resource from a host-specific fd, takes ownership of the fd */ D3DKMT_HANDLE d3dkmt_create_resource( int fd, D3DKMT_HANDLE *global ) { diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 508597ae8e9..e1b368d0202 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -270,6 +270,7 @@ static HANDLE open_shared_resource_from_name( const WCHAR *name ) static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryAllocateInfo *client_alloc_info, const VkAllocationCallbacks *allocator, VkDeviceMemory *ret ) { + VkImportMemoryFdInfoKHR fd_info = {.sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR}; VkMemoryAllocateInfo *alloc_info = (VkMemoryAllocateInfo *)client_alloc_info; /* cast away const, chain has been copied in the thunks */ VkBaseOutStructure **next, *prev = (VkBaseOutStructure *)alloc_info; struct vulkan_device *device = vulkan_device_from_handle( client_device ); @@ -360,8 +361,12 @@ static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryA free( memory ); return VK_ERROR_INVALID_EXTERNAL_HANDLE; } - - FIXME( "Importing memory handle not yet implemented!\n" ); + if ((fd_info.fd = d3dkmt_object_get_fd( memory->local )) >= 0) + { + fd_info.handleType = get_host_external_memory_type(); + fd_info.pNext = alloc_info->pNext; + alloc_info->pNext = &fd_info; + } }
if ((res = device->p_vkAllocateMemory( device->host.device, alloc_info, NULL, &host_device_memory ))) diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 8257881ba69..fff97511292 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -205,6 +205,8 @@ extern BOOL get_vulkan_gpus( struct list *gpus ); extern void free_vulkan_gpu( struct vulkan_gpu *gpu ); extern BOOL get_vulkan_uuid_from_luid( const LUID *luid, GUID *uuid );
+extern int d3dkmt_object_get_fd( D3DKMT_HANDLE local ); + extern D3DKMT_HANDLE d3dkmt_create_resource( int fd, D3DKMT_HANDLE *global ); extern D3DKMT_HANDLE d3dkmt_open_resource( D3DKMT_HANDLE global, HANDLE shared ); extern NTSTATUS d3dkmt_destroy_resource( D3DKMT_HANDLE local );