From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/vulkan.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-)
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 9bad509c5ef..ee10acf4137 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -470,8 +470,8 @@ NTSTATUS init_vulkan(void *args) * This function takes care of extensions handled at winevulkan layer, a Wine graphics * driver is responsible for handling e.g. surface extensions. */ -static VkResult wine_vk_instance_convert_create_info(struct conversion_context *ctx, - const VkInstanceCreateInfo *src, VkInstanceCreateInfo *dst, struct wine_instance *object) +static VkResult convert_instance_create_info(struct wine_instance *object, const VkInstanceCreateInfo *src, + VkInstanceCreateInfo *dst, void **host_extensions) { VkDebugUtilsMessengerCreateInfoEXT *messenger_info; VkDebugReportCallbackCreateInfoEXT *callback_info; @@ -541,10 +541,11 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * { const char **new_extensions;
- new_extensions = conversion_context_alloc(ctx, (dst->enabledExtensionCount + 2) * - sizeof(*dst->ppEnabledExtensionNames)); - memcpy(new_extensions, src->ppEnabledExtensionNames, - dst->enabledExtensionCount * sizeof(*dst->ppEnabledExtensionNames)); + if (!(new_extensions = malloc((dst->enabledExtensionCount + 2) * sizeof(*new_extensions)))) + return VK_ERROR_OUT_OF_HOST_MEMORY; + *host_extensions = new_extensions; + + memcpy(new_extensions, dst->ppEnabledExtensionNames, dst->enabledExtensionCount * sizeof(*new_extensions)); new_extensions[dst->enabledExtensionCount++] = "VK_KHR_get_physical_device_properties2"; new_extensions[dst->enabledExtensionCount++] = "VK_KHR_external_memory_capabilities"; dst->ppEnabledExtensionNames = new_extensions; @@ -875,8 +876,8 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, VkInstance client_instance = client_ptr; VkInstanceCreateInfo create_info_host; const VkApplicationInfo *app_info; - struct conversion_context ctx; struct wine_instance *object; + void *host_extensions = NULL; VkResult res;
if (allocator) @@ -890,21 +891,23 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, list_init(&object->wrappers); list_init(&object->debug_utils_messengers); list_init(&object->debug_report_callbacks); - pthread_rwlock_init(&object->wrapper_lock, NULL);
- init_conversion_context(&ctx); - res = wine_vk_instance_convert_create_info(&ctx, create_info, &create_info_host, object); - if (res == VK_SUCCESS) + if ((res = convert_instance_create_info(object, create_info, &create_info_host, &host_extensions)) == VK_SUCCESS) + { res = vk_funcs->p_vkCreateInstance(&create_info_host, NULL /* allocator */, &object->instance); - free_conversion_context(&ctx); + free(host_extensions); + } cleanup_instance_create_info(&create_info_host, res == VK_SUCCESS ? object : NULL); + if (res != VK_SUCCESS) { ERR("Failed to create instance, res=%d\n", res); - wine_vk_instance_free(object); + free(object); return res; }
+ pthread_rwlock_init(&object->wrapper_lock, NULL); + object->handle = client_instance; WINE_VK_ADD_DISPATCHABLE_MAPPING(object, object->handle, object->instance, object);