 
            From: Rémi Bernon rbernon@codeweavers.com
And pass it to D3DKMT creation functions. --- dlls/win32u/d3dkmt.c | 18 +++++++++--------- dlls/win32u/vulkan.c | 24 ++++++++++++++++++++++-- dlls/win32u/win32u_private.h | 2 +- 3 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 23640cb39be..5d6ada3e11d 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -180,7 +180,7 @@ static NTSTATUS d3dkmt_object_alloc( UINT size, enum d3dkmt_type type, void **ob }
/* create a global D3DKMT object, either with a global handle or later shareable */ -static NTSTATUS d3dkmt_object_create( struct d3dkmt_object *object, BOOL shared, const void *runtime, UINT runtime_size ) +static NTSTATUS d3dkmt_object_create( struct d3dkmt_object *object, int fd, BOOL shared, const void *runtime, UINT runtime_size ) { NTSTATUS status;
@@ -1053,7 +1053,7 @@ NTSTATUS WINAPI NtGdiDdDDICreateAllocation2( D3DKMT_CREATEALLOCATION *params ) if ((status = d3dkmt_object_alloc( sizeof(*allocation), D3DKMT_ALLOCATION, (void **)&allocation ))) goto failed;
if (!params->Flags.CreateShared) status = alloc_object_handle( &resource->obj ); - else status = d3dkmt_object_create( &resource->obj, params->Flags.NtSecuritySharing, + else status = d3dkmt_object_create( &resource->obj, -1, params->Flags.NtSecuritySharing, params->pPrivateRuntimeData, params->PrivateRuntimeDataSize ); if (status) goto failed;
@@ -1372,7 +1372,7 @@ NTSTATUS WINAPI NtGdiDdDDICreateKeyedMutex2( D3DKMT_CREATEKEYEDMUTEX2 *params ) if (!params) return STATUS_INVALID_PARAMETER;
if ((status = d3dkmt_object_alloc( sizeof(*mutex), D3DKMT_MUTEX, (void **)&mutex ))) return status; - if ((status = d3dkmt_object_create( mutex, params->Flags.NtSecuritySharing, + if ((status = d3dkmt_object_create( mutex, -1, params->Flags.NtSecuritySharing, params->pPrivateRuntimeData, params->PrivateRuntimeDataSize ))) goto failed;
@@ -1511,7 +1511,7 @@ NTSTATUS WINAPI NtGdiDdDDICreateSynchronizationObject2( D3DKMT_CREATESYNCHRONIZA
if ((status = d3dkmt_object_alloc( sizeof(*sync), D3DKMT_SYNC, (void **)&sync ))) return status; if (!params->Info.Flags.Shared) status = alloc_object_handle( sync ); - else status = d3dkmt_object_create( sync, params->Info.Flags.NtSecuritySharing, NULL, 0 ); + else status = d3dkmt_object_create( sync, -1, params->Info.Flags.NtSecuritySharing, NULL, 0 ); if (status) goto failed;
if (params->Info.Flags.Shared) params->Info.SharedHandle = sync->shared ? 0 : sync->global; @@ -1668,18 +1668,18 @@ NTSTATUS WINAPI NtGdiDdDDIDestroySynchronizationObject( const D3DKMT_DESTROYSYNC return STATUS_SUCCESS; }
-/* create a D3DKMT global or shared resource */ -D3DKMT_HANDLE d3dkmt_create_resource( D3DKMT_HANDLE *global ) +/* create a D3DKMT global or shared resource from a host-specific fd */ +D3DKMT_HANDLE d3dkmt_create_resource( int fd, D3DKMT_HANDLE *global ) { struct d3dkmt_resource *resource = NULL; struct d3dkmt_object *allocation = NULL; NTSTATUS status;
- TRACE( "global %p\n", global ); + TRACE( "fd %d, global %p\n", fd, global );
if ((status = d3dkmt_object_alloc( sizeof(*resource), D3DKMT_RESOURCE, (void **)&resource ))) goto failed; if ((status = d3dkmt_object_alloc( sizeof(*allocation), D3DKMT_ALLOCATION, (void **)&allocation ))) goto failed; - if ((status = d3dkmt_object_create( &resource->obj, !global, NULL, 0 ))) goto failed; + if ((status = d3dkmt_object_create( &resource->obj, fd, !global, NULL, 0 ))) goto failed;
if ((status = alloc_object_handle( allocation ))) goto failed; resource->allocation = allocation->local; @@ -1744,7 +1744,7 @@ D3DKMT_HANDLE d3dkmt_create_sync( D3DKMT_HANDLE *global ) TRACE( "global %p\n", global );
if ((status = d3dkmt_object_alloc( sizeof(*sync), D3DKMT_SYNC, (void **)&sync ))) goto failed; - if ((status = d3dkmt_object_create( sync, !global, NULL, 0 ))) goto failed; + if ((status = d3dkmt_object_create( sync, -1, !global, NULL, 0 ))) goto failed; if (global) *global = sync->global; return sync->local;
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index cb6684fc7f6..7c253af5bff 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -26,6 +26,7 @@
#include <dlfcn.h> #include <pthread.h> +#include <unistd.h>
#include "ntstatus.h" #define WIN32_NO_STATUS @@ -372,9 +373,27 @@ static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryA
if (export_info) { - FIXME( "Exporting memory handle not yet implemented!\n" ); + if (!memory->local) + { + VkMemoryGetFdInfoKHR get_fd_info = {.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, .memory = host_device_memory}; + int fd = -1;
- if (!memory->local && !(memory->local = d3dkmt_create_resource( nt_shared ? NULL : &memory->global ))) goto failed; + switch ((get_fd_info.handleType = get_host_external_memory_type())) + { + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT: + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT: + if ((res = device->p_vkGetMemoryFdKHR( device->host.device, &get_fd_info, &fd ))) goto failed; + break; + default: + FIXME( "Unsupported handle type %#x\n", get_fd_info.handleType ); + break; + } + + memory->local = d3dkmt_create_resource( fd, nt_shared ? NULL : &memory->global ); + close( fd ); + + if (!memory->local) goto failed; + } if (nt_shared && !(memory->shared = create_shared_resource_handle( memory->local, &export_win32 ))) goto failed; }
@@ -387,6 +406,7 @@ static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryA return VK_SUCCESS;
failed: + WARN( "Failed to allocate memory, res %d\n", res ); device->p_vkFreeMemory( device->host.device, host_device_memory, NULL ); if (memory->local) d3dkmt_destroy_resource( memory->local ); free( memory ); diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 6eaa7270b01..8257881ba69 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -205,7 +205,7 @@ 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 D3DKMT_HANDLE d3dkmt_create_resource( D3DKMT_HANDLE *global ); +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 );