 
            From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/d3dkmt.c | 19 +++++++++++++++++++ dlls/win32u/vulkan.c | 7 +++++-- dlls/win32u/win32u_private.h | 2 ++ 3 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index fd9e49b77a0..ade74cd1eed 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -1671,6 +1671,25 @@ 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; + NTSTATUS status; + int fd; + + TRACE( "local %#x\n", local ); + + if (!(object = get_d3dkmt_object( local, -1 ))) return -1; + if ((status = wine_server_handle_to_fd( object->handle, GENERIC_ALL, &fd, NULL ))) + { + WARN( "Failed to receive object %p/%#x fd, status %#x\n", object, local, status ); + return -1; + } + + return fd; +} + /* create a D3DKMT global or shared resource from a host-specific fd */ D3DKMT_HANDLE d3dkmt_create_resource( int fd, D3DKMT_HANDLE *global ) { diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 7c253af5bff..fe89ca36707 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 ); @@ -355,13 +356,15 @@ static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryA break; }
- if (!memory->local) + if ((fd_info.fd = d3dkmt_object_get_fd( memory->local )) < 0) { free( memory ); return VK_ERROR_INVALID_EXTERNAL_HANDLE; }
- FIXME( "Importing memory handle not yet implemented!\n" ); + 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 );