From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/vulkan.c | 49 ++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 20 deletions(-)
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 4409d1b0f43..16e1517220b 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -489,15 +489,18 @@ 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 wine_vk_instance_convert_create_info(const VkInstanceCreateInfo *src, + VkInstanceCreateInfo *dst, struct wine_instance *object) { VkDebugUtilsMessengerCreateInfoEXT *debug_utils_messenger; VkDebugReportCallbackCreateInfoEXT *debug_report_callback; VkBaseInStructure *header; + const char **extensions; unsigned int i;
*dst = *src; + dst->ppEnabledExtensionNames = NULL; + dst->enabledExtensionCount = 0;
object->utils_messenger_count = wine_vk_count_struct(dst, DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT); object->utils_messengers = calloc(object->utils_messenger_count, sizeof(*object->utils_messengers)); @@ -542,10 +545,10 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * return VK_ERROR_LAYER_NOT_PRESENT; }
- TRACE("Enabled %u instance extensions.\n", dst->enabledExtensionCount); - for (i = 0; i < dst->enabledExtensionCount; i++) + TRACE("Enabled %u instance extensions.\n", src->enabledExtensionCount); + for (i = 0; i < src->enabledExtensionCount; i++) { - const char *extension_name = dst->ppEnabledExtensionNames[i]; + const char *extension_name = src->ppEnabledExtensionNames[i]; TRACE("Extension %u: %s.\n", i, debugstr_a(extension_name)); if (!wine_vk_instance_extension_supported(extension_name)) { @@ -558,19 +561,21 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * } }
- if (use_external_memory()) + if (!src->enabledExtensionCount) extensions = NULL; + else { - const char **new_extensions; + if (!(extensions = malloc((src->enabledExtensionCount + 2) * sizeof(*extensions)))) return VK_ERROR_OUT_OF_HOST_MEMORY; + memcpy(extensions, src->ppEnabledExtensionNames, src->enabledExtensionCount * sizeof(*extensions)); + dst->enabledExtensionCount = src->enabledExtensionCount; + }
- new_extensions = conversion_context_alloc(ctx, (dst->enabledExtensionCount + 2) * - sizeof(*dst->ppEnabledExtensionNames)); - memcpy(new_extensions, src->ppEnabledExtensionNames, - dst->enabledExtensionCount * sizeof(*dst->ppEnabledExtensionNames)); - new_extensions[dst->enabledExtensionCount++] = "VK_KHR_get_physical_device_properties2"; - new_extensions[dst->enabledExtensionCount++] = "VK_KHR_external_memory_capabilities"; - dst->ppEnabledExtensionNames = new_extensions; + if (use_external_memory()) + { + extensions[dst->enabledExtensionCount++] = "VK_KHR_get_physical_device_properties2"; + extensions[dst->enabledExtensionCount++] = "VK_KHR_external_memory_capabilities"; }
+ dst->ppEnabledExtensionNames = extensions; return VK_SUCCESS; }
@@ -842,7 +847,6 @@ 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; VkResult res;
@@ -857,14 +861,17 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, list_init(&object->wrappers); 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) - res = vk_funcs->p_vkCreateInstance(&create_info_host, NULL /* allocator */, &object->instance); - free_conversion_context(&ctx); + if ((res = wine_vk_instance_convert_create_info(create_info, &create_info_host, object)) != VK_SUCCESS) + { + wine_vk_instance_free(object); + return res; + } + + res = vk_funcs->p_vkCreateInstance(&create_info_host, NULL /* allocator */, &object->instance); if (res != VK_SUCCESS) { ERR("Failed to create instance, res=%d\n", res); + free((void *)create_info_host.ppEnabledExtensionNames); wine_vk_instance_free(object); return res; } @@ -890,6 +897,7 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, if (res != VK_SUCCESS) { ERR("Failed to load physical devices, res=%d\n", res); + free((void *)create_info_host.ppEnabledExtensionNames); wine_vk_instance_free(object); return res; } @@ -911,6 +919,7 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, client_instance->base.unix_handle = (uintptr_t)object; *instance = client_instance; TRACE("Created instance %p (native instance %p).\n", object, object->instance); + free((void *)create_info_host.ppEnabledExtensionNames); return VK_SUCCESS; }