From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/make_vulkan | 4 +- dlls/winevulkan/vulkan.c | 150 +++++++++++++++++-------------- dlls/winevulkan/vulkan_private.h | 16 +--- dlls/winevulkan/vulkan_thunks.c | 10 +-- include/wine/vulkan_driver.h | 27 ++++++ 5 files changed, 120 insertions(+), 87 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 1aadf069f47..83f9ed5702e 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -1140,7 +1140,7 @@ class VkHandle(object):
if self.parent is None: # Should only happen for VkInstance - return "wine_instance_from_handle({0})->funcs".format(param) + return "vulkan_instance_from_handle({0})->funcs".format(param) elif self.name == "VkCommandBuffer": return "wine_cmd_buffer_from_handle({0})->device->funcs".format(param) elif self.name == "VkDevice": @@ -1193,7 +1193,7 @@ class VkHandle(object): if self.name == "VkDevice": return "wine_device_from_handle({0})->host_device".format(name) if self.name == "VkInstance": - return "wine_instance_from_handle({0})->host_instance".format(name) + return "vulkan_instance_from_handle({0})->host.instance".format(name) if self.name == "VkDeviceMemory": return "wine_device_memory_from_handle({0})->host_memory".format(name) if self.name == "VkPhysicalDevice": diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 11c60223ec2..caf20355f25 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -115,9 +115,11 @@ static int wrapper_entry_compare(const void *key, const struct rb_entry *entry) return 0; }
-static void add_handle_mapping(struct wine_instance *instance, uint64_t client_handle, +static void add_handle_mapping(struct vulkan_instance *obj, uint64_t client_handle, uint64_t host_handle, struct wrapper_entry *entry) { + struct wine_instance *instance = CONTAINING_RECORD(obj, struct wine_instance, obj); + if (instance->enable_wrapper_list) { entry->host_handle = host_handle; @@ -129,14 +131,16 @@ static void add_handle_mapping(struct wine_instance *instance, uint64_t client_h } }
-static void add_handle_mapping_ptr(struct wine_instance *instance, void *client_handle, +static void add_handle_mapping_ptr(struct vulkan_instance *obj, void *client_handle, void *host_handle, struct wrapper_entry *entry) { - add_handle_mapping(instance, (uintptr_t)client_handle, (uintptr_t)host_handle, entry); + add_handle_mapping(obj, (uintptr_t)client_handle, (uintptr_t)host_handle, entry); }
-static void remove_handle_mapping(struct wine_instance *instance, struct wrapper_entry *entry) +static void remove_handle_mapping(struct vulkan_instance *obj, struct wrapper_entry *entry) { + struct wine_instance *instance = CONTAINING_RECORD(obj, struct wine_instance, obj); + if (instance->enable_wrapper_list) { pthread_rwlock_wrlock(&instance->wrapper_lock); @@ -145,8 +149,9 @@ static void remove_handle_mapping(struct wine_instance *instance, struct wrapper } }
-static uint64_t client_handle_from_host(struct wine_instance *instance, uint64_t host_handle) +static uint64_t client_handle_from_host(struct vulkan_instance *obj, uint64_t host_handle) { + struct wine_instance *instance = CONTAINING_RECORD(obj, struct wine_instance, obj); struct rb_entry *entry; uint64_t result = 0;
@@ -207,7 +212,7 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB
object = user_data;
- if (!object->instance->host_instance) + if (!object->instance->host.instance) { /* instance wasn't yet created, this is a message from the host loader */ return VK_FALSE; @@ -312,7 +317,7 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk
object = user_data;
- if (!object->instance->host_instance) + if (!object->instance->host.instance) { /* instance wasn't yet created, this is a message from the host loader */ return VK_FALSE; @@ -352,7 +357,7 @@ static void wine_phys_dev_cleanup(struct wine_phys_dev *phys_dev) }
static VkResult wine_vk_physical_device_init(struct wine_phys_dev *object, VkPhysicalDevice host_handle, - VkPhysicalDevice client_physical_device, struct wine_instance *instance) + VkPhysicalDevice client_physical_device, struct vulkan_instance *instance) { BOOL have_memory_placed = FALSE, have_map_memory2 = FALSE; uint32_t num_host_properties, num_properties = 0; @@ -677,7 +682,7 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * header = find_next_struct(header->pNext, VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT); debug_utils_messenger = (VkDebugUtilsMessengerCreateInfoEXT *) header;
- instance->utils_messengers[i].instance = instance; + instance->utils_messengers[i].instance = &instance->obj; instance->utils_messengers[i].host_debug_messenger = VK_NULL_HANDLE; instance->utils_messengers[i].user_callback = (UINT_PTR)debug_utils_messenger->pfnUserCallback; instance->utils_messengers[i].user_data = (UINT_PTR)debug_utils_messenger->pUserData; @@ -689,7 +694,7 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context *
if ((debug_report_callback = find_next_struct(dst->pNext, VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT))) { - instance->default_callback.instance = instance; + instance->default_callback.instance = &instance->obj; instance->default_callback.host_debug_callback = VK_NULL_HANDLE; instance->default_callback.user_callback = (UINT_PTR)debug_report_callback->pfnCallback; instance->default_callback.user_data = (UINT_PTR)debug_report_callback->pUserData; @@ -751,14 +756,15 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * }
/* Helper function which stores wrapped physical devices in the instance object. */ -static VkResult wine_vk_instance_init_physical_devices(struct wine_instance *instance, struct wine_phys_dev *physical_devices, VkInstance client_instance) +static VkResult wine_vk_instance_init_physical_devices(struct vulkan_instance *instance, struct wine_phys_dev *physical_devices, + uint32_t *physical_device_count, VkInstance client_instance) { VkPhysicalDevice *host_handles; uint32_t phys_dev_count; unsigned int i; VkResult res;
- res = instance->funcs.p_vkEnumeratePhysicalDevices(instance->host_instance, &phys_dev_count, NULL); + res = instance->funcs.p_vkEnumeratePhysicalDevices(instance->host.instance, &phys_dev_count, NULL); if (res != VK_SUCCESS) { ERR("Failed to enumerate physical devices, res=%d\n", res); @@ -777,7 +783,7 @@ static VkResult wine_vk_instance_init_physical_devices(struct wine_instance *ins if (!(host_handles = calloc(phys_dev_count, sizeof(*host_handles)))) return VK_ERROR_OUT_OF_HOST_MEMORY;
- res = instance->funcs.p_vkEnumeratePhysicalDevices(instance->host_instance, &phys_dev_count, host_handles); + res = instance->funcs.p_vkEnumeratePhysicalDevices(instance->host.instance, &phys_dev_count, host_handles); if (res != VK_SUCCESS) { free(host_handles); @@ -792,7 +798,7 @@ static VkResult wine_vk_instance_init_physical_devices(struct wine_instance *ins if (res != VK_SUCCESS) goto err; } - instance->phys_dev_count = phys_dev_count; + *physical_device_count = phys_dev_count;
free(host_handles); return VK_SUCCESS; @@ -875,7 +881,7 @@ VkResult wine_vkCreateDevice(VkPhysicalDevice phys_dev_handle, const VkDeviceCre void *client_ptr) { struct wine_phys_dev *phys_dev = wine_phys_dev_from_handle(phys_dev_handle); - struct wine_instance *instance = phys_dev->instance; + struct vulkan_instance *instance = phys_dev->instance; VkDevice client_device = client_ptr; VkDeviceCreateInfo create_info_host; struct VkQueue_T *queue_handles; @@ -934,7 +940,7 @@ VkResult wine_vkCreateDevice(VkPhysicalDevice phys_dev_handle, const VkDeviceCre for (i = 0; i < create_info_host.queueCreateInfoCount; i++) wine_vk_device_init_queues(object, create_info_host.pQueueCreateInfos + i, &queue_handles);
- client_device->quirks = instance->quirks; + client_device->quirks = CONTAINING_RECORD(instance, struct wine_instance, obj)->quirks; client_device->obj.unix_handle = (uintptr_t)object;
TRACE("Created device %p, host_device %p.\n", object, object->host_device); @@ -958,6 +964,7 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, const VkApplicationInfo *app_info; struct conversion_context ctx; struct wine_instance *instance; + VkInstance host_instance; unsigned int i; VkResult res;
@@ -973,7 +980,7 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, init_conversion_context(&ctx); res = wine_vk_instance_convert_create_info(&ctx, create_info, &create_info_host, instance); if (res == VK_SUCCESS) - res = p_vkCreateInstance(&create_info_host, NULL /* allocator */, &instance->host_instance); + res = p_vkCreateInstance(&create_info_host, NULL /* allocator */, &host_instance); free_conversion_context(&ctx); if (res != VK_SUCCESS) { @@ -983,14 +990,15 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, return res; }
- instance->handle = client_instance; + instance->obj.client.instance = client_instance; + instance->obj.host.instance = host_instance;
/* Load all instance functions we are aware of. Note the loader takes care * of any filtering for extensions which were not requested, but which the * ICD may support. */ #define USE_VK_FUNC(name) \ - instance->funcs.p_##name = (void *)vk_funcs->p_vkGetInstanceProcAddr(instance->host_instance, #name); + instance->obj.funcs.p_##name = (void *)vk_funcs->p_vkGetInstanceProcAddr(instance->obj.host.instance, #name); ALL_VK_INSTANCE_FUNCS() #undef USE_VK_FUNC
@@ -999,11 +1007,11 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, * the host physical devices and present those to the application. * Cleanup happens as part of wine_vkDestroyInstance. */ - res = wine_vk_instance_init_physical_devices(instance, instance->phys_devs, client_instance); + res = wine_vk_instance_init_physical_devices(&instance->obj, instance->phys_devs, &instance->phys_dev_count, client_instance); if (res != VK_SUCCESS) { ERR("Failed to load physical devices, res=%d\n", res); - instance->funcs.p_vkDestroyInstance(instance->host_instance, NULL /* allocator */); + instance->obj.funcs.p_vkDestroyInstance(instance->obj.host.instance, NULL /* allocator */); free(instance->utils_messengers); free(instance); return res; @@ -1023,7 +1031,7 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info,
client_instance->obj.unix_handle = (uintptr_t)instance;
- TRACE("Created instance %p, host_instance %p.\n", instance, instance->host_instance); + TRACE("Created instance %p, host_instance %p.\n", instance, instance->obj.host.instance);
rb_init(&instance->wrappers, wrapper_entry_compare); pthread_rwlock_init(&instance->wrapper_lock, NULL); @@ -1031,11 +1039,11 @@ VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, for (i = 0; i < instance->phys_dev_count; i++) { struct wine_phys_dev *phys_dev = &instance->phys_devs[i]; - add_handle_mapping_ptr(instance, phys_dev->handle, phys_dev->host_physical_device, &phys_dev->wrapper_entry); + add_handle_mapping_ptr(&instance->obj, phys_dev->handle, phys_dev->host_physical_device, &phys_dev->wrapper_entry); }
*ret = client_instance; - add_handle_mapping_ptr(instance, *ret, instance->host_instance, &instance->wrapper_entry); + add_handle_mapping_ptr(&instance->obj, *ret, instance->obj.host.instance, &instance->wrapper_entry); return VK_SUCCESS; }
@@ -1059,7 +1067,8 @@ void wine_vkDestroyDevice(VkDevice handle, const VkAllocationCallbacks *allocato
void wine_vkDestroyInstance(VkInstance client_instance, const VkAllocationCallbacks *allocator) { - struct wine_instance *instance = wine_instance_from_handle(client_instance); + struct vulkan_instance *obj = vulkan_instance_from_handle(client_instance); + struct wine_instance *instance = CONTAINING_RECORD(obj, struct wine_instance, obj); unsigned int i;
if (allocator) @@ -1067,13 +1076,13 @@ void wine_vkDestroyInstance(VkInstance client_instance, const VkAllocationCallba if (!instance) return;
- instance->funcs.p_vkDestroyInstance(instance->host_instance, NULL /* allocator */); + instance->obj.funcs.p_vkDestroyInstance(instance->obj.host.instance, NULL /* allocator */); for (i = 0; i < instance->phys_dev_count; i++) { - remove_handle_mapping(instance, &instance->phys_devs[i].wrapper_entry); + remove_handle_mapping(&instance->obj, &instance->phys_devs[i].wrapper_entry); wine_phys_dev_cleanup(&instance->phys_devs[i]); } - remove_handle_mapping(instance, &instance->wrapper_entry); + remove_handle_mapping(&instance->obj, &instance->wrapper_entry);
pthread_rwlock_destroy(&instance->wrapper_lock); free(instance->utils_messengers); @@ -1198,7 +1207,8 @@ VkResult wine_vkEnumerateInstanceVersion(uint32_t *version)
VkResult wine_vkEnumeratePhysicalDevices(VkInstance client_instance, uint32_t *count, VkPhysicalDevice *devices) { - struct wine_instance *instance = wine_instance_from_handle(client_instance); + struct vulkan_instance *obj = vulkan_instance_from_handle(client_instance); + struct wine_instance *instance = CONTAINING_RECORD(obj, struct wine_instance, obj); unsigned int i;
if (!devices) @@ -1313,14 +1323,15 @@ void wine_vkDestroyCommandPool(VkDevice device_handle, VkCommandPool handle, free(pool); }
-static VkResult wine_vk_enumerate_physical_device_groups(struct wine_instance *instance, +static VkResult wine_vk_enumerate_physical_device_groups(struct vulkan_instance *obj, VkResult (*p_vkEnumeratePhysicalDeviceGroups)(VkInstance, uint32_t *, VkPhysicalDeviceGroupProperties *), uint32_t *count, VkPhysicalDeviceGroupProperties *properties) { + struct wine_instance *instance = CONTAINING_RECORD(obj, struct wine_instance, obj); unsigned int i, j; VkResult res;
- res = p_vkEnumeratePhysicalDeviceGroups(instance->host_instance, count, properties); + res = p_vkEnumeratePhysicalDeviceGroups(instance->obj.host.instance, count, properties); if (res < 0 || !properties) return res;
@@ -1343,7 +1354,7 @@ static VkResult wine_vk_enumerate_physical_device_groups(struct wine_instance *i VkResult wine_vkEnumeratePhysicalDeviceGroups(VkInstance client_instance, uint32_t *count, VkPhysicalDeviceGroupProperties *properties) { - struct wine_instance *instance = wine_instance_from_handle(client_instance); + struct vulkan_instance *instance = vulkan_instance_from_handle(client_instance);
return wine_vk_enumerate_physical_device_groups(instance, instance->funcs.p_vkEnumeratePhysicalDeviceGroups, count, properties); @@ -1352,7 +1363,7 @@ VkResult wine_vkEnumeratePhysicalDeviceGroups(VkInstance client_instance, uint32 VkResult wine_vkEnumeratePhysicalDeviceGroupsKHR(VkInstance client_instance, uint32_t *count, VkPhysicalDeviceGroupProperties *properties) { - struct wine_instance *instance = wine_instance_from_handle(client_instance); + struct vulkan_instance *instance = vulkan_instance_from_handle(client_instance);
return wine_vk_enumerate_physical_device_groups(instance, instance->funcs.p_vkEnumeratePhysicalDeviceGroupsKHR, count, properties); @@ -1659,7 +1670,7 @@ void wine_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(VkPhysicalDevice phy VkResult wine_vkCreateWin32SurfaceKHR(VkInstance client_instance, const VkWin32SurfaceCreateInfoKHR *create_info, const VkAllocationCallbacks *allocator, VkSurfaceKHR *surface) { - struct wine_instance *instance = wine_instance_from_handle(client_instance); + struct vulkan_instance *instance = vulkan_instance_from_handle(client_instance); VkWin32SurfaceCreateInfoKHR create_info_host = *create_info; struct wine_surface *object; HWND dummy = NULL; @@ -1680,7 +1691,7 @@ VkResult wine_vkCreateWin32SurfaceKHR(VkInstance client_instance, const VkWin32S create_info_host.hwnd = object->hwnd = dummy; }
- res = instance->funcs.p_vkCreateWin32SurfaceKHR(instance->host_instance, &create_info_host, + res = instance->funcs.p_vkCreateWin32SurfaceKHR(instance->host.instance, &create_info_host, NULL /* allocator */, &object->driver_surface); if (res != VK_SUCCESS) { @@ -1701,13 +1712,13 @@ VkResult wine_vkCreateWin32SurfaceKHR(VkInstance client_instance, const VkWin32S void wine_vkDestroySurfaceKHR(VkInstance client_instance, VkSurfaceKHR surface, const VkAllocationCallbacks *allocator) { - struct wine_instance *instance = wine_instance_from_handle(client_instance); + struct vulkan_instance *instance = vulkan_instance_from_handle(client_instance); struct wine_surface *object = wine_surface_from_handle(surface);
if (!object) return;
- instance->funcs.p_vkDestroySurfaceKHR(instance->host_instance, object->driver_surface, NULL); + instance->funcs.p_vkDestroySurfaceKHR(instance->host.instance, object->driver_surface, NULL); remove_handle_mapping(instance, &object->wrapper_entry); window_surfaces_remove(object);
@@ -1774,7 +1785,7 @@ VkResult wine_vkCreateSwapchainKHR(VkDevice device_handle, const VkSwapchainCrea struct wine_surface *surface = wine_surface_from_handle(create_info->surface); struct wine_device *device = wine_device_from_handle(device_handle); struct wine_phys_dev *physical_device = device->phys_dev; - struct wine_instance *instance = physical_device->instance; + struct vulkan_instance *instance = physical_device->instance; VkSwapchainCreateInfoKHR create_info_host = *create_info; VkSurfaceCapabilitiesKHR capabilities; VkResult res; @@ -2213,7 +2224,7 @@ VkResult wine_vkCreateImage(VkDevice handle, const VkImageCreateInfo *create_inf return device->funcs.p_vkCreateImage(device->host_device, &info, NULL, image); }
-static void adjust_surface_capabilities(struct wine_instance *instance, struct wine_surface *surface, +static void adjust_surface_capabilities(struct vulkan_instance *instance, struct wine_surface *surface, VkSurfaceCapabilitiesKHR *capabilities) { RECT client_rect; @@ -2244,7 +2255,7 @@ VkResult wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice device_ { struct wine_phys_dev *physical_device = wine_phys_dev_from_handle(device_handle); struct wine_surface *surface = wine_surface_from_handle(surface_handle); - struct wine_instance *instance = physical_device->instance; + struct vulkan_instance *instance = physical_device->instance; VkResult res;
if (!NtUserIsWindow(surface->hwnd)) return VK_ERROR_SURFACE_LOST_KHR; @@ -2260,7 +2271,7 @@ VkResult wine_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice device struct wine_phys_dev *physical_device = wine_phys_dev_from_handle(device_handle); struct wine_surface *surface = wine_surface_from_handle(surface_info->surface); VkPhysicalDeviceSurfaceInfo2KHR surface_info_host = *surface_info; - struct wine_instance *instance = physical_device->instance; + struct vulkan_instance *instance = physical_device->instance; VkResult res;
if (!instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilities2KHR) @@ -2285,7 +2296,7 @@ VkResult wine_vkGetPhysicalDevicePresentRectanglesKHR(VkPhysicalDevice device_ha { struct wine_phys_dev *physical_device = wine_phys_dev_from_handle(device_handle); struct wine_surface *surface = wine_surface_from_handle(surface_handle); - struct wine_instance *instance = physical_device->instance; + struct vulkan_instance *instance = physical_device->instance;
if (!NtUserIsWindow(surface->hwnd)) { @@ -2304,7 +2315,7 @@ VkResult wine_vkGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice device_handl { struct wine_phys_dev *physical_device = wine_phys_dev_from_handle(device_handle); struct wine_surface *surface = wine_surface_from_handle(surface_handle); - struct wine_instance *instance = physical_device->instance; + struct vulkan_instance *instance = physical_device->instance;
return instance->funcs.p_vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device->host_physical_device, surface->host_surface, format_count, formats); @@ -2316,7 +2327,7 @@ VkResult wine_vkGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice device_hand struct wine_phys_dev *physical_device = wine_phys_dev_from_handle(device_handle); struct wine_surface *surface = wine_surface_from_handle(surface_info->surface); VkPhysicalDeviceSurfaceInfo2KHR surface_info_host = *surface_info; - struct wine_instance *instance = physical_device->instance; + struct vulkan_instance *instance = physical_device->instance; VkResult res;
if (!physical_device->instance->funcs.p_vkGetPhysicalDeviceSurfaceFormats2KHR) @@ -2354,8 +2365,9 @@ VkResult wine_vkCreateDebugUtilsMessengerEXT(VkInstance client_instance, const VkAllocationCallbacks *allocator, VkDebugUtilsMessengerEXT *messenger) { - struct wine_instance *instance = wine_instance_from_handle(client_instance); + struct vulkan_instance *instance = vulkan_instance_from_handle(client_instance); VkDebugUtilsMessengerCreateInfoEXT wine_create_info; + VkDebugUtilsMessengerEXT host_debug_messenger; struct wine_debug_utils_messenger *object; VkResult res;
@@ -2365,23 +2377,23 @@ VkResult wine_vkCreateDebugUtilsMessengerEXT(VkInstance client_instance, if (!(object = calloc(1, sizeof(*object)))) return VK_ERROR_OUT_OF_HOST_MEMORY;
- object->instance = instance; - object->user_callback = (UINT_PTR)create_info->pfnUserCallback; - object->user_data = (UINT_PTR)create_info->pUserData; - wine_create_info = *create_info; - wine_create_info.pfnUserCallback = (void *) &debug_utils_callback_conversion; wine_create_info.pUserData = object;
- res = instance->funcs.p_vkCreateDebugUtilsMessengerEXT(instance->host_instance, &wine_create_info, - NULL, &object->host_debug_messenger); + res = instance->funcs.p_vkCreateDebugUtilsMessengerEXT(instance->host.instance, &wine_create_info, + NULL, &host_debug_messenger); if (res != VK_SUCCESS) { free(object); return res; }
+ object->host_debug_messenger = host_debug_messenger; + object->instance = instance; + object->user_callback = (UINT_PTR)create_info->pfnUserCallback; + object->user_data = (UINT_PTR)create_info->pUserData; + *messenger = wine_debug_utils_messenger_to_handle(object); add_handle_mapping(instance, *messenger, object->host_debug_messenger, &object->wrapper_entry); return VK_SUCCESS; @@ -2390,7 +2402,7 @@ VkResult wine_vkCreateDebugUtilsMessengerEXT(VkInstance client_instance, void wine_vkDestroyDebugUtilsMessengerEXT(VkInstance client_instance, VkDebugUtilsMessengerEXT messenger, const VkAllocationCallbacks *allocator) { - struct wine_instance *instance = wine_instance_from_handle(client_instance); + struct vulkan_instance *instance = vulkan_instance_from_handle(client_instance); struct wine_debug_utils_messenger *object;
object = wine_debug_utils_messenger_from_handle(messenger); @@ -2398,7 +2410,7 @@ void wine_vkDestroyDebugUtilsMessengerEXT(VkInstance client_instance, VkDebugUti if (!object) return;
- instance->funcs.p_vkDestroyDebugUtilsMessengerEXT(instance->host_instance, object->host_debug_messenger, NULL); + instance->funcs.p_vkDestroyDebugUtilsMessengerEXT(instance->host.instance, object->host_debug_messenger, NULL); remove_handle_mapping(instance, &object->wrapper_entry);
free(object); @@ -2409,8 +2421,9 @@ VkResult wine_vkCreateDebugReportCallbackEXT(VkInstance client_instance, const VkAllocationCallbacks *allocator, VkDebugReportCallbackEXT *callback) { - struct wine_instance *instance = wine_instance_from_handle(client_instance); + struct vulkan_instance *instance = vulkan_instance_from_handle(client_instance); VkDebugReportCallbackCreateInfoEXT wine_create_info; + VkDebugReportCallbackEXT host_debug_callback; struct wine_debug_report_callback *object; VkResult res;
@@ -2420,23 +2433,23 @@ VkResult wine_vkCreateDebugReportCallbackEXT(VkInstance client_instance, if (!(object = calloc(1, sizeof(*object)))) return VK_ERROR_OUT_OF_HOST_MEMORY;
- object->instance = instance; - object->user_callback = (UINT_PTR)create_info->pfnCallback; - object->user_data = (UINT_PTR)create_info->pUserData; - wine_create_info = *create_info; - wine_create_info.pfnCallback = (void *) debug_report_callback_conversion; wine_create_info.pUserData = object;
- res = instance->funcs.p_vkCreateDebugReportCallbackEXT(instance->host_instance, &wine_create_info, - NULL, &object->host_debug_callback); + res = instance->funcs.p_vkCreateDebugReportCallbackEXT(instance->host.instance, &wine_create_info, + NULL, &host_debug_callback); if (res != VK_SUCCESS) { free(object); return res; }
+ object->host_debug_callback = host_debug_callback; + object->instance = instance; + object->user_callback = (UINT_PTR)create_info->pfnCallback; + object->user_data = (UINT_PTR)create_info->pUserData; + *callback = wine_debug_report_callback_to_handle(object); add_handle_mapping(instance, *callback, object->host_debug_callback, &object->wrapper_entry); return VK_SUCCESS; @@ -2445,7 +2458,7 @@ VkResult wine_vkCreateDebugReportCallbackEXT(VkInstance client_instance, void wine_vkDestroyDebugReportCallbackEXT(VkInstance client_instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks *allocator) { - struct wine_instance *instance = wine_instance_from_handle(client_instance); + struct vulkan_instance *instance = vulkan_instance_from_handle(client_instance); struct wine_debug_report_callback *object;
object = wine_debug_report_callback_from_handle(callback); @@ -2453,7 +2466,7 @@ void wine_vkDestroyDebugReportCallbackEXT(VkInstance client_instance, VkDebugRep if (!object) return;
- instance->funcs.p_vkDestroyDebugReportCallbackEXT(instance->host_instance, object->host_debug_callback, NULL); + instance->funcs.p_vkDestroyDebugReportCallbackEXT(instance->host.instance, object->host_debug_callback, NULL); remove_handle_mapping(instance, &object->wrapper_entry);
free(object); @@ -2512,14 +2525,15 @@ void wine_vkDestroyDeferredOperationKHR(VkDevice handle, NTSTATUS vk_is_available_instance_function(void *arg) { struct is_available_instance_function_params *params = arg; - struct wine_instance *instance = wine_instance_from_handle(params->instance); + struct vulkan_instance *obj = vulkan_instance_from_handle(params->instance); + struct wine_instance *instance = CONTAINING_RECORD(obj, struct wine_instance, obj);
if (!strcmp(params->name, "vkCreateWin32SurfaceKHR")) return instance->enable_win32_surface; if (!strcmp(params->name, "vkGetPhysicalDeviceWin32PresentationSupportKHR")) return instance->enable_win32_surface;
- return !!vk_funcs->p_vkGetInstanceProcAddr(instance->host_instance, params->name); + return !!vk_funcs->p_vkGetInstanceProcAddr(obj->host.instance, params->name); }
NTSTATUS vk_is_available_device_function(void *arg) @@ -2538,8 +2552,8 @@ NTSTATUS vk_is_available_instance_function32(void *arg) UINT32 instance; UINT32 name; } *params = arg; - struct wine_instance *instance = wine_instance_from_handle(UlongToPtr(params->instance)); - return !!vk_funcs->p_vkGetInstanceProcAddr(instance->host_instance, UlongToPtr(params->name)); + struct vulkan_instance *instance = vulkan_instance_from_handle(UlongToPtr(params->instance)); + return !!vk_funcs->p_vkGetInstanceProcAddr(instance->host.instance, UlongToPtr(params->name)); }
NTSTATUS vk_is_available_device_function32(void *arg) diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index df49b4922e3..224348b4863 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -99,7 +99,7 @@ struct wine_debug_utils_messenger;
struct wine_debug_report_callback { - struct wine_instance *instance; /* parent */ + struct vulkan_instance *instance; /* parent */ VkDebugReportCallbackEXT host_debug_callback;
UINT64 user_callback; /* client pointer */ @@ -110,7 +110,7 @@ struct wine_debug_report_callback
struct wine_phys_dev { - struct wine_instance *instance; /* parent */ + struct vulkan_instance *instance; /* parent */
VkPhysicalDevice handle; /* client physical device */ VkPhysicalDevice host_physical_device; @@ -134,10 +134,7 @@ struct wine_debug_report_callback;
struct wine_instance { - struct vulkan_instance_funcs funcs; - - VkInstance handle; /* client instance */ - VkInstance host_instance; + struct vulkan_instance obj;
VkBool32 enable_win32_surface; VkBool32 enable_wrapper_list; @@ -160,11 +157,6 @@ struct wine_instance
C_ASSERT(sizeof(struct wine_instance) == offsetof(struct wine_instance, phys_devs[0]));
-static inline struct wine_instance *wine_instance_from_handle(VkInstance handle) -{ - return (struct wine_instance *)(uintptr_t)handle->obj.unix_handle; -} - struct wine_cmd_pool { VkCommandPool handle; @@ -195,7 +187,7 @@ static inline struct wine_device_memory *wine_device_memory_from_handle(VkDevice
struct wine_debug_utils_messenger { - struct wine_instance *instance; /* parent */ + struct vulkan_instance *instance; /* parent */ VkDebugUtilsMessengerEXT host_debug_messenger;
UINT64 user_callback; /* client pointer */ diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 3d2433dc385..10eba93c9ac 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -8871,7 +8871,7 @@ static uint64_t wine_vk_unwrap_handle(uint32_t type, uint64_t handle) case VK_OBJECT_TYPE_DEVICE_MEMORY: return (uint64_t) wine_device_memory_from_handle(handle)->host_memory; case VK_OBJECT_TYPE_INSTANCE: - return (uint64_t) (uintptr_t) wine_instance_from_handle(((VkInstance) (uintptr_t) handle))->host_instance; + return (uint64_t) (uintptr_t) vulkan_instance_from_handle(((VkInstance) (uintptr_t) handle))->host.instance; case VK_OBJECT_TYPE_PHYSICAL_DEVICE: return (uint64_t) (uintptr_t) wine_phys_dev_from_handle(((VkPhysicalDevice) (uintptr_t) handle))->host_physical_device; case VK_OBJECT_TYPE_QUEUE: @@ -45384,7 +45384,7 @@ static NTSTATUS thunk64_vkDebugReportMessageEXT(void *args)
TRACE("%p, %#x, %#x, 0x%s, 0x%s, %d, %p, %p\n", params->instance, params->flags, params->objectType, wine_dbgstr_longlong(params->object), wine_dbgstr_longlong(params->location), params->messageCode, params->pLayerPrefix, params->pMessage);
- wine_instance_from_handle(params->instance)->funcs.p_vkDebugReportMessageEXT(wine_instance_from_handle(params->instance)->host_instance, params->flags, params->objectType, wine_vk_unwrap_handle(params->objectType, params->object), params->location, params->messageCode, params->pLayerPrefix, params->pMessage); + vulkan_instance_from_handle(params->instance)->funcs.p_vkDebugReportMessageEXT(vulkan_instance_from_handle(params->instance)->host.instance, params->flags, params->objectType, wine_vk_unwrap_handle(params->objectType, params->object), params->location, params->messageCode, params->pLayerPrefix, params->pMessage); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -45405,7 +45405,7 @@ static NTSTATUS thunk32_vkDebugReportMessageEXT(void *args)
TRACE("%#x, %#x, %#x, 0x%s, 0x%s, %d, %#x, %#x\n", params->instance, params->flags, params->objectType, wine_dbgstr_longlong(params->object), wine_dbgstr_longlong(params->location), params->messageCode, params->pLayerPrefix, params->pMessage);
- wine_instance_from_handle((VkInstance)UlongToPtr(params->instance))->funcs.p_vkDebugReportMessageEXT(wine_instance_from_handle((VkInstance)UlongToPtr(params->instance))->host_instance, params->flags, params->objectType, wine_vk_unwrap_handle(params->objectType, params->object), params->location, params->messageCode, (const char *)UlongToPtr(params->pLayerPrefix), (const char *)UlongToPtr(params->pMessage)); + vulkan_instance_from_handle((VkInstance)UlongToPtr(params->instance))->funcs.p_vkDebugReportMessageEXT(vulkan_instance_from_handle((VkInstance)UlongToPtr(params->instance))->host.instance, params->flags, params->objectType, wine_vk_unwrap_handle(params->objectType, params->object), params->location, params->messageCode, (const char *)UlongToPtr(params->pLayerPrefix), (const char *)UlongToPtr(params->pMessage)); return STATUS_SUCCESS; }
@@ -53352,7 +53352,7 @@ static NTSTATUS thunk64_vkSubmitDebugUtilsMessageEXT(void *args)
init_conversion_context(ctx); convert_VkDebugUtilsMessengerCallbackDataEXT_win64_to_host(ctx, params->pCallbackData, &pCallbackData_host); - wine_instance_from_handle(params->instance)->funcs.p_vkSubmitDebugUtilsMessageEXT(wine_instance_from_handle(params->instance)->host_instance, params->messageSeverity, params->messageTypes, &pCallbackData_host); + vulkan_instance_from_handle(params->instance)->funcs.p_vkSubmitDebugUtilsMessageEXT(vulkan_instance_from_handle(params->instance)->host.instance, params->messageSeverity, params->messageTypes, &pCallbackData_host); free_conversion_context(ctx); return STATUS_SUCCESS; } @@ -53375,7 +53375,7 @@ static NTSTATUS thunk32_vkSubmitDebugUtilsMessageEXT(void *args)
init_conversion_context(ctx); convert_VkDebugUtilsMessengerCallbackDataEXT_win32_to_host(ctx, (const VkDebugUtilsMessengerCallbackDataEXT32 *)UlongToPtr(params->pCallbackData), &pCallbackData_host); - wine_instance_from_handle((VkInstance)UlongToPtr(params->instance))->funcs.p_vkSubmitDebugUtilsMessageEXT(wine_instance_from_handle((VkInstance)UlongToPtr(params->instance))->host_instance, params->messageSeverity, params->messageTypes, &pCallbackData_host); + vulkan_instance_from_handle((VkInstance)UlongToPtr(params->instance))->funcs.p_vkSubmitDebugUtilsMessageEXT(vulkan_instance_from_handle((VkInstance)UlongToPtr(params->instance))->host.instance, params->messageSeverity, params->messageTypes, &pCallbackData_host); free_conversion_context(ctx); return STATUS_SUCCESS; } diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 7612ef34cd2..2a9d67b72e9 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -48,6 +48,33 @@ struct vulkan_client_object /* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ #define WINE_VULKAN_DRIVER_VERSION 35
+struct vulkan_object +{ + UINT64 host_handle; + UINT64 client_handle; +}; + +#define VULKAN_OBJECT_HEADER( type, name ) \ + union { \ + struct vulkan_object obj; \ + struct { \ + union { type name; UINT64 handle; } host; \ + union { type name; UINT64 handle; } client; \ + }; \ + } + +struct vulkan_instance +{ + VULKAN_OBJECT_HEADER( VkInstance, instance ); + struct vulkan_instance_funcs funcs; +}; + +static inline struct vulkan_instance *vulkan_instance_from_handle( VkInstance handle ) +{ + struct vulkan_client_object *client = (struct vulkan_client_object *)handle; + return (struct vulkan_instance *)(UINT_PTR)client->unix_handle; +} + struct vulkan_funcs { /* Vulkan global functions. These are the only calls at this point a graphics driver