 
            From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/tests/d3dkmt.c | 17 +++++++++++++++++ dlls/winevulkan/vulkan.c | 12 +++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/dlls/win32u/tests/d3dkmt.c b/dlls/win32u/tests/d3dkmt.c index ba25286642e..2d54a3b57bb 100644 --- a/dlls/win32u/tests/d3dkmt.c +++ b/dlls/win32u/tests/d3dkmt.c @@ -3330,6 +3330,7 @@ static struct vulkan_device *create_vulkan_device( LUID *luid ) struct vulkan_device *dev; float priority = 0.0f; uint32_t count; + BOOL is_wow64; VkResult vr;
dev = calloc( 1, sizeof(*dev) ); @@ -3395,7 +3396,17 @@ 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 ); + /* currently fails on llvmpipe on WOW64 without placed memory */ + todo_wine_if(IsWow64Process(GetCurrentProcess(), &is_wow64) && is_wow64 && vr == VK_ERROR_EXTENSION_NOT_PRESENT) ok_vk( VK_SUCCESS, vr ); + if (vr != VK_SUCCESS) + { + PFN_vkDestroyInstance p_vkDestroyInstance; + p_vkDestroyInstance = (void *)p_vkGetInstanceProcAddr( dev->instance, "vkDestroyInstance" ); + p_vkDestroyInstance( dev->instance, NULL ); + free( dev ); + return NULL; + } ok_ptr( dev->device, !=, VK_NULL_HANDLE );
return dev; @@ -4637,36 +4648,42 @@ 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/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index b69b6618243..3ff313e5b83 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -451,6 +451,11 @@ static VkResult vulkan_physical_device_init(struct vulkan_physical_device *physi { if (!strcmp(host_properties[i].extensionName, vk_funcs->p_get_host_extension("VK_KHR_external_memory_win32"))) { + if (zero_bits && !physical_device->map_placed_align) + { + WARN("Cannot export WOW64 memory without VK_EXT_map_memory_placed\n"); + continue; + } strcpy(physical_device->extensions[j].extensionName, "VK_KHR_external_memory_win32"); physical_device->extensions[j++].specVersion = VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION; } @@ -470,7 +475,7 @@ static VkResult vulkan_physical_device_init(struct vulkan_physical_device *physi j++; } } - physical_device->extension_count = num_properties; + physical_device->extension_count = j;
free(host_properties); return VK_SUCCESS; @@ -590,6 +595,11 @@ static VkResult wine_vk_device_convert_create_info(struct vulkan_physical_device if (!strcmp(*extension, "VK_KHR_swapchain")) has_swapchain = true; if (!strcmp(*extension, "VK_KHR_external_memory_win32")) { + if (zero_bits && !physical_device->map_placed_align) + { + FIXME("Cannot export WOW64 memory without VK_EXT_map_memory_placed\n"); + return VK_ERROR_EXTENSION_NOT_PRESENT; + } 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";