 
            From: Rémi Bernon rbernon@codeweavers.com
--- dlls/vulkan-1/tests/vulkan.c | 4 +-- dlls/win32u/tests/d3dkmt.c | 25 ++++---------- dlls/win32u/vulkan.c | 58 +++++++++++++++++--------------- dlls/winevulkan/vulkan.c | 50 ++++++++++++++++++++------- dlls/winevulkan/vulkan_private.h | 1 + dlls/winewayland.drv/vulkan.c | 1 + dlls/winex11.drv/vulkan.c | 1 + 7 files changed, 80 insertions(+), 60 deletions(-)
diff --git a/dlls/vulkan-1/tests/vulkan.c b/dlls/vulkan-1/tests/vulkan.c index 71ad2c4cf34..c4ad755595f 100644 --- a/dlls/vulkan-1/tests/vulkan.c +++ b/dlls/vulkan-1/tests/vulkan.c @@ -1363,7 +1363,7 @@ static void test_external_memory(VkInstance vk_instance, VkPhysicalDevice vk_phy get_handle_info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR;
vr = pfn_vkGetMemoryWin32HandleKHR(vk_device, &get_handle_info, &handle); - ok(vr == VK_SUCCESS, "vkGetMemoryWin32HandleKHR failed, VkResult %d.\n", vr); + todo_wine ok(vr == VK_SUCCESS, "vkGetMemoryWin32HandleKHR failed, VkResult %d.\n", vr);
alloc_info.pNext = &dedicated_alloc_info; import_memory(vk_device, alloc_info, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR, handle); @@ -1398,7 +1398,7 @@ static void test_external_memory(VkInstance vk_instance, VkPhysicalDevice vk_phy get_handle_info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR;
vr = pfn_vkGetMemoryWin32HandleKHR(vk_device, &get_handle_info, &handle); - ok(vr == VK_SUCCESS, "vkGetMemoryWin32HandleKHR failed, VkResult %d.\n", vr); + todo_wine ok(vr == VK_SUCCESS, "vkGetMemoryWin32HandleKHR failed, VkResult %d.\n", vr);
alloc_info.pNext = &dedicated_alloc_info; import_memory(vk_device, alloc_info, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR, handle); diff --git a/dlls/win32u/tests/d3dkmt.c b/dlls/win32u/tests/d3dkmt.c index a65ca1a4c02..4edb1195293 100644 --- a/dlls/win32u/tests/d3dkmt.c +++ b/dlls/win32u/tests/d3dkmt.c @@ -3363,12 +3363,12 @@ static struct vulkan_device *create_vulkan_device( LUID *luid )
winetest_push_context( "export" ); types = get_vulkan_external_image_types( dev->instance, physical_devices[i], VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR ); - todo_wine ok( !(~types & expect_export_types), "got types %#x\n", types ); + ok( !(~types & expect_export_types), "got types %#x\n", types ); winetest_pop_context();
winetest_push_context( "import" ); types = get_vulkan_external_image_types( dev->instance, physical_devices[i], VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR ); - todo_wine ok( !(~types & expect_import_types), "got types %#x\n", types ); + ok( !(~types & expect_import_types), "got types %#x\n", types ); winetest_pop_context(); }
@@ -3397,15 +3397,8 @@ static struct vulkan_device *create_vulkan_device( LUID *luid )
p_vkCreateDevice = (void *)p_vkGetInstanceProcAddr( dev->instance, "vkCreateDevice" ); vr = p_vkCreateDevice( dev->physical_device, &create_info, NULL, &dev->device ); - todo_wine ok_vk( VK_SUCCESS, vr ); - todo_wine ok_ptr( dev->device, !=, VK_NULL_HANDLE ); - if (dev->device == VK_NULL_HANDLE) - { - PFN_vkDestroyInstance p_vkDestroyInstance = (void *)p_vkGetInstanceProcAddr( dev->instance, "vkDestroyInstance" ); - p_vkDestroyInstance( dev->instance, NULL ); - free( dev ); - return NULL; - } + ok_vk( VK_SUCCESS, vr ); + ok_ptr( dev->device, !=, VK_NULL_HANDLE );
return dev; } @@ -3496,7 +3489,7 @@ static struct vulkan_buffer *export_vulkan_buffer( struct vulkan_device *dev, UI get_handle_info.memory = buf->memory; get_handle_info.handleType = handle_type; vr = p_vkGetMemoryWin32HandleKHR( dev->device, &get_handle_info, handle ); - ok_vk( VK_SUCCESS, vr ); + todo_wine ok_vk( VK_SUCCESS, vr );
return buf; } @@ -3638,7 +3631,7 @@ static struct vulkan_image *export_vulkan_image( struct vulkan_device *dev, UINT get_handle_info.memory = img->memory; get_handle_info.handleType = handle_type; vr = p_vkGetMemoryWin32HandleKHR( dev->device, &get_handle_info, handle ); - ok_vk( VK_SUCCESS, vr ); + todo_wine ok_vk( VK_SUCCESS, vr );
return img; } @@ -4646,42 +4639,36 @@ static void test_shared_resources(void)
case MAKETEST(4, 0, 0): { - if (!vulkan_exp) break; buf = export_vulkan_buffer( vulkan_exp, resource_size, NULL, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, &handle ); get_d3dkmt_resource_desc( luid, handle, FALSE, 0, runtime_desc ); break; } case MAKETEST(4, 0, 1): { - if (!vulkan_exp) break; buf = export_vulkan_buffer( vulkan_exp, resource_size, NULL, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, &handle ); get_d3dkmt_resource_desc( luid, handle, TRUE, 0, runtime_desc ); break; } case MAKETEST(4, 1, 0): { - if (!vulkan_exp) break; img = export_vulkan_image( vulkan_exp, width_1d, 1, array_1d, NULL, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, &handle ); get_d3dkmt_resource_desc( luid, handle, FALSE, 0, runtime_desc ); break; } case MAKETEST(4, 2, 0): { - if (!vulkan_exp) break; img = export_vulkan_image( vulkan_exp, width_2d, height_2d, 1, NULL, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, &handle ); get_d3dkmt_resource_desc( luid, handle, FALSE, 0, runtime_desc ); break; } case MAKETEST(4, 2, 1): { - if (!vulkan_exp) break; img = export_vulkan_image( vulkan_exp, width_2d, height_2d, 1, NULL, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, &handle ); get_d3dkmt_resource_desc( luid, handle, TRUE, 0, runtime_desc ); break; } case MAKETEST(4, 3, 0): { - if (!vulkan_exp) break; img = export_vulkan_image( vulkan_exp, width_3d, height_3d, depth_3d, NULL, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, &handle ); get_d3dkmt_resource_desc( luid, handle, FALSE, 0, runtime_desc ); break; diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 361802d04c6..58872f70cde 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -177,6 +177,14 @@ static VkResult allocate_external_host_memory( struct vulkan_device *device, VkM return VK_SUCCESS; }
+static VkExternalMemoryHandleTypeFlagBits get_host_external_memory_type(void) +{ + const char *host_extension = driver_funcs->p_get_host_extension( "VK_KHR_external_memory_win32" ); + if (!strcmp( host_extension, "VK_KHR_external_memory_fd" )) return VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT; + if (!strcmp( host_extension, "VK_EXT_external_memory_dma_buf" )) return VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT; + return 0; +} + static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryAllocateInfo *client_alloc_info, const VkAllocationCallbacks *allocator, VkDeviceMemory *ret ) { @@ -202,8 +210,8 @@ static VkResult win32u_vkAllocateMemory( VkDevice client_device, const VkMemoryA export_info = (VkExportMemoryAllocateInfo *)*next; if (!(export_info->handleTypes & EXTERNAL_MEMORY_WIN32_BITS)) FIXME( "Unsupported handle types %#x\n", export_info->handleTypes ); - FIXME( "VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO not implemented!\n" ); - *next = (*next)->pNext; next = &prev; + else + export_info->handleTypes = get_host_external_memory_type(); break; case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR: FIXME( "VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR not implemented!\n" ); @@ -450,8 +458,8 @@ static VkResult win32u_vkCreateBuffer( VkDevice client_device, const VkBufferCre external_info = (VkExternalMemoryBufferCreateInfo *)*next; if (!(external_info->handleTypes & EXTERNAL_MEMORY_WIN32_BITS)) FIXME( "Unsupported handle types %#x\n", external_info->handleTypes ); - FIXME( "VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO not implemented!\n" ); - *next = (*next)->pNext; next = &prev; + else + external_info->handleTypes = get_host_external_memory_type(); break; case VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT: break; case VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR: break; @@ -491,8 +499,8 @@ static void win32u_vkGetDeviceBufferMemoryRequirements( VkDevice client_device, external_info = (VkExternalMemoryBufferCreateInfo *)*next; if (!(external_info->handleTypes & EXTERNAL_MEMORY_WIN32_BITS)) FIXME( "Unsupported handle types %#x\n", external_info->handleTypes ); - FIXME( "VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO not implemented!\n" ); - *next = (*next)->pNext; next = &prev; + else + external_info->handleTypes = get_host_external_memory_type(); break; case VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT: break; case VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR: break; @@ -509,18 +517,15 @@ static void win32u_vkGetPhysicalDeviceExternalBufferProperties( VkPhysicalDevice VkPhysicalDeviceExternalBufferInfo *buffer_info = (VkPhysicalDeviceExternalBufferInfo *)client_buffer_info; /* cast away const, it has been copied in the thunks */ struct vulkan_physical_device *physical_device = vulkan_physical_device_from_handle( client_physical_device ); struct vulkan_instance *instance = physical_device->instance; + VkExternalMemoryHandleTypeFlagBits handle_type = 0;
TRACE( "physical_device %p, buffer_info %p, buffer_properties %p\n", physical_device, buffer_info, buffer_properties );
- if (!(buffer_info->handleType & EXTERNAL_MEMORY_WIN32_BITS)) - FIXME( "Unsupported handle type %#x\n", buffer_info->handleType ); - FIXME( "VkPhysicalDeviceExternalBufferInfo Win32 handleType not implemented!\n" ); - buffer_info->handleType = 0; + handle_type = buffer_info->handleType; + if (handle_type & EXTERNAL_MEMORY_WIN32_BITS) buffer_info->handleType = get_host_external_memory_type();
instance->p_vkGetPhysicalDeviceExternalBufferProperties( physical_device->host.physical_device, buffer_info, buffer_properties ); - buffer_properties->externalMemoryProperties.externalMemoryFeatures = 0; - buffer_properties->externalMemoryProperties.exportFromImportedHandleTypes = 0; - buffer_properties->externalMemoryProperties.compatibleHandleTypes = 0; + buffer_properties->externalMemoryProperties.compatibleHandleTypes = handle_type; }
static VkResult win32u_vkCreateImage( VkDevice client_device, const VkImageCreateInfo *create_info, @@ -540,8 +545,8 @@ static VkResult win32u_vkCreateImage( VkDevice client_device, const VkImageCreat external_info = (VkExternalMemoryImageCreateInfo *)*next; if (!(external_info->handleTypes & EXTERNAL_MEMORY_WIN32_BITS)) FIXME( "Unsupported handle types %#x\n", external_info->handleTypes ); - FIXME( "VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO not implemented!\n" ); - *next = (*next)->pNext; next = &prev; + else + external_info->handleTypes = get_host_external_memory_type(); break; case VK_STRUCTURE_TYPE_IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA: break; case VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT: break; @@ -584,8 +589,8 @@ static void win32u_vkGetDeviceImageMemoryRequirements( VkDevice client_device, c external_info = (VkExternalMemoryImageCreateInfo *)*next; if (!(external_info->handleTypes & EXTERNAL_MEMORY_WIN32_BITS)) FIXME( "Unsupported handle types %#x\n", external_info->handleTypes ); - FIXME( "VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO not implemented!\n" ); - *next = (*next)->pNext; next = &prev; + else + external_info->handleTypes = get_host_external_memory_type(); break; case VK_STRUCTURE_TYPE_IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA: break; case VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT: break; @@ -608,7 +613,7 @@ static VkResult win32u_vkGetPhysicalDeviceImageFormatProperties2( VkPhysicalDevi VkBaseOutStructure **next, *prev = (VkBaseOutStructure *)format_info; /* cast away const, chain has been copied in the thunks */ struct vulkan_physical_device *physical_device = vulkan_physical_device_from_handle( client_physical_device ); struct vulkan_instance *instance = physical_device->instance; - VkPhysicalDeviceExternalImageFormatInfo *external_info; + VkExternalMemoryHandleTypeFlagBits handle_type = 0; VkResult res;
TRACE( "physical_device %p, format_info %p, format_properties %p\n", physical_device, format_info, format_properties ); @@ -622,12 +627,12 @@ static VkResult win32u_vkGetPhysicalDeviceImageFormatProperties2( VkPhysicalDevi case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: break; case VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV: break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: - external_info = (VkPhysicalDeviceExternalImageFormatInfo *)*next; - if (!(external_info->handleType & EXTERNAL_MEMORY_WIN32_BITS)) - FIXME( "Unsupported handle type %#x\n", external_info->handleType ); - FIXME( "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO not implemented!\n" ); - *next = (*next)->pNext; next = &prev; + { + VkPhysicalDeviceExternalImageFormatInfo *external_info = (VkPhysicalDeviceExternalImageFormatInfo *)*next; + handle_type = external_info->handleType; + if (handle_type & EXTERNAL_MEMORY_WIN32_BITS) external_info->handleType = get_host_external_memory_type(); break; + } case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: break; case VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR: break; default: FIXME( "Unhandled sType %u.\n", (*next)->sType ); break; @@ -635,16 +640,14 @@ static VkResult win32u_vkGetPhysicalDeviceImageFormatProperties2( VkPhysicalDevi }
res = instance->p_vkGetPhysicalDeviceImageFormatProperties2( physical_device->host.physical_device, format_info, format_properties ); - if (!res) for (prev = (VkBaseOutStructure *)format_properties, next = &prev->pNext; *next; prev = *next, next = &(*next)->pNext) + for (prev = (VkBaseOutStructure *)format_properties, next = &prev->pNext; *next; prev = *next, next = &(*next)->pNext) { switch ((*next)->sType) { case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: { VkExternalImageFormatProperties *props = (VkExternalImageFormatProperties *)*next; - props->externalMemoryProperties.externalMemoryFeatures = 0; - props->externalMemoryProperties.exportFromImportedHandleTypes = 0; - props->externalMemoryProperties.compatibleHandleTypes = 0; + props->externalMemoryProperties.compatibleHandleTypes = handle_type; break; } case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT: break; @@ -1453,6 +1456,7 @@ static VkBool32 nulldrv_get_physical_device_presentation_support( struct vulkan_ static const char *nulldrv_get_host_extension( const char *name ) { if (!strcmp( name, "VK_KHR_win32_surface" )) return "VK_EXT_headless_surface"; + if (!strcmp( name, "VK_KHR_external_memory_win32" )) return "VK_KHR_external_memory_fd"; return name; }
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 05dc8e44cd7..c8869e82f71 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -366,7 +366,8 @@ static VkResult vulkan_physical_device_init(struct vulkan_physical_device *physi */ for (i = 0; i < num_host_properties; i++) { - if (wine_vk_device_extension_supported(host_properties[i].extensionName)) + if (!strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_memory_win32")) + || wine_vk_device_extension_supported(host_properties[i].extensionName)) { TRACE("Enabling extension '%s' for physical device %p\n", host_properties[i].extensionName, physical_device); num_properties++; @@ -397,7 +398,12 @@ static VkResult vulkan_physical_device_init(struct vulkan_physical_device *physi
for (i = 0, j = 0; i < num_host_properties; i++) { - if (wine_vk_device_extension_supported(host_properties[i].extensionName)) + if (!strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_memory_win32"))) + { + strcpy(physical_device->extensions[j].extensionName, "VK_KHR_external_memory_win32"); + physical_device->extensions[j++].specVersion = VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION; + } + else if (wine_vk_device_extension_supported(host_properties[i].extensionName)) { physical_device->extensions[j] = host_properties[i]; j++; @@ -532,8 +538,8 @@ static void wine_vk_device_init_queues(struct wine_device *object, const VkDevic object->queue_count += info->queueCount; }
-static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device *physical_device, - struct conversion_context *ctx, const VkDeviceCreateInfo *src, VkDeviceCreateInfo *dst) +static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device *physical_device, struct conversion_context *ctx, + const VkDeviceCreateInfo *src, VkDeviceCreateInfo *dst, struct wine_device *device) { bool has_swapchain_maintenance1 = false; bool has_external_memory_host = false; @@ -570,6 +576,12 @@ static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device if (!strcmp(*extension, "VK_EXT_swapchain_maintenance1")) has_swapchain_maintenance1 = true; if (!strcmp(*extension, "VK_EXT_surface_maintenance1")) has_surface_maintenance1 = true; if (!strcmp(*extension, "VK_KHR_swapchain")) has_swapchain = true; + if (!strcmp(*extension, "VK_KHR_external_memory_win32")) + { + device->has_external_memory_win32 = true; + *extension = vk_funcs->p_get_host_extension("VK_KHR_external_memory_win32"); + if (!strcmp(*extension, "VK_EXT_external_memory_dma_buf")) extensions[count++] = "VK_KHR_external_memory_fd"; + } }
if (physical_device->map_placed_align) @@ -894,7 +906,7 @@ VkResult wine_vkCreateDevice(VkPhysicalDevice client_physical_device, const VkDe return VK_ERROR_OUT_OF_HOST_MEMORY;
init_conversion_context(&ctx); - res = wine_vk_device_convert_create_info(physical_device, &ctx, create_info, &create_info_host); + res = wine_vk_device_convert_create_info(physical_device, &ctx, create_info, &create_info_host, device); if (res == VK_SUCCESS) res = instance->p_vkCreateDevice(physical_device->host.physical_device, &create_info_host, NULL /* allocator */, &host_device); @@ -1767,8 +1779,14 @@ NTSTATUS vk_is_available_instance_function(void *arg) NTSTATUS vk_is_available_device_function(void *arg) { struct is_available_device_function_params *params = arg; - struct vulkan_device *device = vulkan_device_from_handle(params->device); - return !!vk_funcs->p_vkGetDeviceProcAddr(device->host.device, params->name); + struct wine_device *device = wine_device_from_handle(params->device); + + if (!strcmp(params->name, "vkGetMemoryWin32HandleKHR")) + return device->has_external_memory_win32; + if (!strcmp(params->name, "vkGetMemoryWin32HandlePropertiesKHR")) + return device->has_external_memory_win32; + + return !!vk_funcs->p_vkGetDeviceProcAddr(device->obj.host.device, params->name); }
#endif /* _WIN64 */ @@ -1781,13 +1799,14 @@ NTSTATUS vk_is_available_instance_function32(void *arg) UINT32 name; } *params = arg; struct wine_instance *instance = wine_instance_from_handle(UlongToPtr(params->instance)); + const char *name = UlongToPtr(params->name);
- if (!strcmp(UlongToPtr(params->name), "vkCreateWin32SurfaceKHR")) + if (!strcmp(name, "vkCreateWin32SurfaceKHR")) return instance->enable_win32_surface; - if (!strcmp(UlongToPtr(params->name), "vkGetPhysicalDeviceWin32PresentationSupportKHR")) + if (!strcmp(name, "vkGetPhysicalDeviceWin32PresentationSupportKHR")) return instance->enable_win32_surface;
- return !!vk_funcs->p_vkGetInstanceProcAddr(instance->obj.host.instance, UlongToPtr(params->name)); + return !!vk_funcs->p_vkGetInstanceProcAddr(instance->obj.host.instance, name); }
NTSTATUS vk_is_available_device_function32(void *arg) @@ -1797,6 +1816,13 @@ NTSTATUS vk_is_available_device_function32(void *arg) UINT32 device; UINT32 name; } *params = arg; - struct vulkan_device *device = vulkan_device_from_handle(UlongToPtr(params->device)); - return !!vk_funcs->p_vkGetDeviceProcAddr(device->host.device, UlongToPtr(params->name)); + struct wine_device *device = wine_device_from_handle(UlongToPtr(params->device)); + const char *name = UlongToPtr(params->name); + + if (!strcmp(name, "vkGetMemoryWin32HandleKHR")) + return device->has_external_memory_win32; + if (!strcmp(name, "vkGetMemoryWin32HandlePropertiesKHR")) + return device->has_external_memory_win32; + + return !!vk_funcs->p_vkGetDeviceProcAddr(device->obj.host.device, name); } diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index 51fd39c4813..d3ef04ada20 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -41,6 +41,7 @@ struct wine_queue struct wine_device { struct vulkan_device obj; + bool has_external_memory_win32; uint64_t queue_count; struct wine_queue queues[]; }; diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index f342112aeba..cd5c5295cb1 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -84,6 +84,7 @@ static VkBool32 wayland_get_physical_device_presentation_support(struct vulkan_p static const char *wayland_get_host_extension(const char *name) { if (!strcmp( name, "VK_KHR_win32_surface" )) return "VK_KHR_wayland_surface"; + if (!strcmp( name, "VK_KHR_external_memory_win32" )) return "VK_KHR_external_memory_fd"; return name; }
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 4ef37fe1db5..f49f382b3a6 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -81,6 +81,7 @@ static VkBool32 X11DRV_get_physical_device_presentation_support( struct vulkan_p static const char *X11DRV_get_host_extension( const char *name ) { if (!strcmp( name, "VK_KHR_win32_surface" )) return "VK_KHR_xlib_surface"; + if (!strcmp( name, "VK_KHR_external_memory_win32" )) return "VK_KHR_external_memory_fd"; return name; }