 
            From: Rémi Bernon rbernon@codeweavers.com
--- dlls/vulkan-1/tests/vulkan.c | 4 ++-- dlls/win32u/vulkan.c | 25 ++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/dlls/vulkan-1/tests/vulkan.c b/dlls/vulkan-1/tests/vulkan.c index 138f914d713..71ad2c4cf34 100644 --- a/dlls/vulkan-1/tests/vulkan.c +++ b/dlls/vulkan-1/tests/vulkan.c @@ -1154,8 +1154,8 @@ static void import_memory(VkDevice vk_device, VkMemoryAllocateInfo alloc_info, V import_handle_info.name = L"wine_test_buffer_export_name";
vr = vkAllocateMemory(vk_device, &alloc_info, NULL, &memory); - todo_wine ok(vr == VK_SUCCESS, "vkAllocateMemory failed, VkResult %d.\n", vr); - if (vr == VK_SUCCESS) vkFreeMemory(vk_device, memory, NULL); + ok(vr == VK_SUCCESS, "vkAllocateMemory failed, VkResult %d.\n", vr); + vkFreeMemory(vk_device, memory, NULL); } }
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index c1095e682ae..3e0300184c0 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -221,6 +221,24 @@ static HANDLE create_shared_handle( D3DKMT_HANDLE local, const VkExportMemoryWin return NULL; }
+static HANDLE open_shared_handle_from_name( const WCHAR *name ) +{ + D3DKMT_OPENNTHANDLEFROMNAME open_name = {0}; + WCHAR bufferW[MAX_PATH * 2]; + UNICODE_STRING name_str = {.Buffer = bufferW}; + OBJECT_ATTRIBUTES attr; + NTSTATUS status; + + init_shared_resource_path( name, &name_str ); + InitializeObjectAttributes( &attr, &name_str, OBJ_OPENIF, NULL, NULL ); + + open_name.dwDesiredAccess = GENERIC_ALL; + open_name.pObjAttrib = &attr; + status = NtGdiDdDDIOpenNtHandleFromName( &open_name ); + if (status) WARN( "Failed to open %s, status %#x\n", debugstr_w( name ), status ); + return open_name.hNtHandle; +} + static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryAllocateInfo *client_alloc_info, const VkAllocationCallbacks *allocator, VkDeviceMemory *ret ) { @@ -297,8 +315,13 @@ static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryA case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT: case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT: case VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT: - memory->local = d3dkmt_open_resource( 0, import_win32->handle ); + { + HANDLE shared = import_win32->handle; + if (import_win32->name && !(shared = open_shared_handle_from_name( import_win32->name ))) break; + memory->local = d3dkmt_open_resource( 0, shared ); + if (shared && shared != import_win32->handle) NtClose( shared ); break; + } default: FIXME( "Unsupported handle type %#x\n", import_win32->handleType ); break;