From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/make_vulkan | 4 + dlls/winevulkan/vulkan.c | 41 +++ dlls/winevulkan/vulkan_private.h | 17 ++ dlls/winevulkan/vulkan_thunks.c | 502 ++++++++++++++++++++++++++----- dlls/winevulkan/vulkan_thunks.h | 2 + 5 files changed, 495 insertions(+), 71 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index e4a734c284b..e901a986609 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -225,6 +225,7 @@ MANUAL_UNIX_THUNKS = { "vkCreateDevice", "vkCreateImage", "vkCreateInstance", + "vkCreateSwapchainKHR", "vkCreateWin32SurfaceKHR", "vkDestroyCommandPool", "vkDestroyDebugReportCallbackEXT", @@ -233,6 +234,7 @@ MANUAL_UNIX_THUNKS = { "vkDestroyDevice", "vkDestroyInstance", "vkDestroySurfaceKHR", + "vkDestroySwapchainKHR", "vkEnumerateDeviceExtensionProperties", "vkEnumerateDeviceLayerProperties", "vkEnumerateInstanceExtensionProperties", @@ -1183,6 +1185,8 @@ class VkHandle(object): return "wine_queue_from_handle({0})->host_queue".format(name) if self.name == "VkSurfaceKHR": return "wine_surface_from_handle({0})->host_surface".format(name) + if self.name == "VkSwapchainKHR": + return "wine_swapchain_from_handle({0})->host_swapchain".format(name) if self.is_dispatchable(): LOGGER.error("Unhandled host handle for: {0}".format(self.name)) return None diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 240ba3e8618..25d78f02347 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1493,6 +1493,47 @@ void wine_vkDestroySurfaceKHR(VkInstance handle, VkSurfaceKHR surface, free(object); }
+VkResult wine_vkCreateSwapchainKHR(VkDevice device_handle, const VkSwapchainCreateInfoKHR *create_info, + const VkAllocationCallbacks *allocator, VkSwapchainKHR *swapchain_handle) +{ + struct wine_swapchain *object, *old_swapchain = wine_swapchain_from_handle(create_info->oldSwapchain); + struct wine_surface *surface = wine_surface_from_handle(create_info->surface); + struct wine_device *device = wine_device_from_handle(device_handle); + VkSwapchainCreateInfoKHR create_info_host = *create_info; + VkResult res; + + if (surface) create_info_host.surface = surface->driver_surface; + if (old_swapchain) create_info_host.oldSwapchain = old_swapchain->host_swapchain; + + if (!(object = calloc(1, sizeof(*object)))) return VK_ERROR_OUT_OF_HOST_MEMORY; + res = device->funcs.p_vkCreateSwapchainKHR(device->host_device, &create_info_host, NULL, &object->host_swapchain); + if (res != VK_SUCCESS) + { + free(object); + return res; + } + + WINE_VK_ADD_NON_DISPATCHABLE_MAPPING(device->phys_dev->instance, object, object->host_swapchain, object); + *swapchain_handle = wine_swapchain_to_handle(object); + + return res; +} + +void wine_vkDestroySwapchainKHR(VkDevice device_handle, VkSwapchainKHR swapchain_handle, + const VkAllocationCallbacks *allocator) +{ + struct wine_device *device = wine_device_from_handle(device_handle); + struct wine_swapchain *swapchain = wine_swapchain_from_handle(swapchain_handle); + + if (allocator) FIXME("Support for allocation callbacks not implemented yet\n"); + if (!swapchain) return; + + device->funcs.p_vkDestroySwapchainKHR(device->host_device, swapchain->host_swapchain, NULL); + WINE_VK_REMOVE_HANDLE_MAPPING(device->phys_dev->instance, swapchain); + + free(swapchain); +} + VkResult wine_vkAllocateMemory(VkDevice handle, const VkMemoryAllocateInfo *alloc_info, const VkAllocationCallbacks *allocator, VkDeviceMemory *ret) { diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index 6b01e99262e..4e4d665299f 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -238,6 +238,23 @@ static inline VkSurfaceKHR wine_surface_to_handle(struct wine_surface *surface) return (VkSurfaceKHR)(uintptr_t)surface; }
+struct wine_swapchain +{ + VkSwapchainKHR host_swapchain; + + struct wine_vk_mapping mapping; +}; + +static inline struct wine_swapchain *wine_swapchain_from_handle(VkSwapchainKHR handle) +{ + return (struct wine_swapchain *)(uintptr_t)handle; +} + +static inline VkSwapchainKHR wine_swapchain_to_handle(struct wine_swapchain *surface) +{ + return (VkSwapchainKHR)(uintptr_t)surface; +} + BOOL wine_vk_device_extension_supported(const char *name); BOOL wine_vk_instance_extension_supported(const char *name);
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 9cb270c9dea..0d417aab8a3 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -6848,18 +6848,35 @@ static uint64_t wine_vk_unwrap_handle(uint32_t type, uint64_t handle) return (uint64_t) (uintptr_t) wine_queue_from_handle(((VkQueue) (uintptr_t) handle))->host_queue; case VK_OBJECT_TYPE_SURFACE_KHR: return (uint64_t) wine_surface_from_handle(handle)->host_surface; + case VK_OBJECT_TYPE_SWAPCHAIN_KHR: + return (uint64_t) wine_swapchain_from_handle(handle)->host_swapchain; default: return handle; } }
+#ifdef _WIN64 +static inline void convert_VkAcquireNextImageInfoKHR_win64_to_host(const VkAcquireNextImageInfoKHR *in, VkAcquireNextImageInfoKHR *out) +{ + if (!in) return; + + out->sType = in->sType; + out->pNext = in->pNext; + out->swapchain = wine_swapchain_from_handle(in->swapchain)->host_swapchain; + out->timeout = in->timeout; + out->semaphore = in->semaphore; + out->fence = in->fence; + out->deviceMask = in->deviceMask; +} +#endif /* _WIN64 */ + static inline void convert_VkAcquireNextImageInfoKHR_win32_to_host(const VkAcquireNextImageInfoKHR32 *in, VkAcquireNextImageInfoKHR *out) { if (!in) return;
out->sType = in->sType; out->pNext = NULL; - out->swapchain = in->swapchain; + out->swapchain = wine_swapchain_from_handle(in->swapchain)->host_swapchain; out->timeout = in->timeout; out->semaphore = in->semaphore; out->fence = in->fence; @@ -7389,15 +7406,65 @@ static inline const VkBindBufferMemoryInfo *convert_VkBindBufferMemoryInfo_array }
#ifdef _WIN64 -static inline void convert_VkBindImageMemoryInfo_win64_to_host(const VkBindImageMemoryInfo *in, VkBindImageMemoryInfo *out) +static inline void convert_VkBindImageMemoryInfo_win64_to_host(struct conversion_context *ctx, const VkBindImageMemoryInfo *in, VkBindImageMemoryInfo *out) { + const VkBaseInStructure *in_header; + VkBaseOutStructure *out_header = (void *)out; + if (!in) return;
out->sType = in->sType; - out->pNext = in->pNext; + out->pNext = NULL; out->image = in->image; out->memory = wine_device_memory_from_handle(in->memory)->host_memory; out->memoryOffset = in->memoryOffset; + + for (in_header = (void *)in->pNext; in_header; in_header = (void *)in_header->pNext) + { + switch (in_header->sType) + { + case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: + { + VkBindImageMemoryDeviceGroupInfo *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkBindImageMemoryDeviceGroupInfo *in_ext = (const VkBindImageMemoryDeviceGroupInfo *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO; + out_ext->pNext = NULL; + out_ext->deviceIndexCount = in_ext->deviceIndexCount; + out_ext->pDeviceIndices = in_ext->pDeviceIndices; + out_ext->splitInstanceBindRegionCount = in_ext->splitInstanceBindRegionCount; + out_ext->pSplitInstanceBindRegions = in_ext->pSplitInstanceBindRegions; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: + { + VkBindImageMemorySwapchainInfoKHR *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkBindImageMemorySwapchainInfoKHR *in_ext = (const VkBindImageMemorySwapchainInfoKHR *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR; + out_ext->pNext = NULL; + out_ext->swapchain = wine_swapchain_from_handle(in_ext->swapchain)->host_swapchain; + out_ext->imageIndex = in_ext->imageIndex; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: + { + VkBindImagePlaneMemoryInfo *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkBindImagePlaneMemoryInfo *in_ext = (const VkBindImagePlaneMemoryInfo *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO; + out_ext->pNext = NULL; + out_ext->planeAspect = in_ext->planeAspect; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + default: + FIXME("Unhandled sType %u.\n", in_header->sType); + break; + } + } } #endif /* _WIN64 */
@@ -7438,7 +7505,7 @@ static inline void convert_VkBindImageMemoryInfo_win32_to_host(struct conversion const VkBindImageMemorySwapchainInfoKHR32 *in_ext = (const VkBindImageMemorySwapchainInfoKHR32 *)in_header; out_ext->sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR; out_ext->pNext = NULL; - out_ext->swapchain = in_ext->swapchain; + out_ext->swapchain = wine_swapchain_from_handle(in_ext->swapchain)->host_swapchain; out_ext->imageIndex = in_ext->imageIndex; out_header->pNext = (void *)out_ext; out_header = (void *)out_ext; @@ -7473,7 +7540,7 @@ static inline const VkBindImageMemoryInfo *convert_VkBindImageMemoryInfo_array_w out = conversion_context_alloc(ctx, count * sizeof(*out)); for (i = 0; i < count; i++) { - convert_VkBindImageMemoryInfo_win64_to_host(&in[i], &out[i]); + convert_VkBindImageMemoryInfo_win64_to_host(ctx, &in[i], &out[i]); }
return out; @@ -16341,6 +16408,133 @@ static inline void convert_VkGraphicsPipelineCreateInfo_array_host_to_win32(cons } }
+#ifdef _WIN64 +static inline void convert_VkImageCreateInfo_win64_to_host(struct conversion_context *ctx, const VkImageCreateInfo *in, VkImageCreateInfo *out) +{ + const VkBaseInStructure *in_header; + VkBaseOutStructure *out_header = (void *)out; + + if (!in) return; + + out->sType = in->sType; + out->pNext = NULL; + out->flags = in->flags; + out->imageType = in->imageType; + out->format = in->format; + out->extent = in->extent; + out->mipLevels = in->mipLevels; + out->arrayLayers = in->arrayLayers; + out->samples = in->samples; + out->tiling = in->tiling; + out->usage = in->usage; + out->sharingMode = in->sharingMode; + out->queueFamilyIndexCount = in->queueFamilyIndexCount; + out->pQueueFamilyIndices = in->pQueueFamilyIndices; + out->initialLayout = in->initialLayout; + + for (in_header = (void *)in->pNext; in_header; in_header = (void *)in_header->pNext) + { + switch (in_header->sType) + { + case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: + { + VkDedicatedAllocationImageCreateInfoNV *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkDedicatedAllocationImageCreateInfoNV *in_ext = (const VkDedicatedAllocationImageCreateInfoNV *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV; + out_ext->pNext = NULL; + out_ext->dedicatedAllocation = in_ext->dedicatedAllocation; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: + { + VkExternalMemoryImageCreateInfo *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkExternalMemoryImageCreateInfo *in_ext = (const VkExternalMemoryImageCreateInfo *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO; + out_ext->pNext = NULL; + out_ext->handleTypes = in_ext->handleTypes; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: + { + VkImageSwapchainCreateInfoKHR *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkImageSwapchainCreateInfoKHR *in_ext = (const VkImageSwapchainCreateInfoKHR *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR; + out_ext->pNext = NULL; + out_ext->swapchain = in_ext->swapchain ? wine_swapchain_from_handle(in_ext->swapchain)->host_swapchain : 0; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: + { + VkImageFormatListCreateInfo *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkImageFormatListCreateInfo *in_ext = (const VkImageFormatListCreateInfo *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO; + out_ext->pNext = NULL; + out_ext->viewFormatCount = in_ext->viewFormatCount; + out_ext->pViewFormats = in_ext->pViewFormats; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: + { + VkImageStencilUsageCreateInfo *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkImageStencilUsageCreateInfo *in_ext = (const VkImageStencilUsageCreateInfo *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO; + out_ext->pNext = NULL; + out_ext->stencilUsage = in_ext->stencilUsage; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + case VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT: + { + VkOpaqueCaptureDescriptorDataCreateInfoEXT *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkOpaqueCaptureDescriptorDataCreateInfoEXT *in_ext = (const VkOpaqueCaptureDescriptorDataCreateInfoEXT *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT; + out_ext->pNext = NULL; + out_ext->opaqueCaptureDescriptorData = in_ext->opaqueCaptureDescriptorData; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + case VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT: + { + VkImageCompressionControlEXT *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkImageCompressionControlEXT *in_ext = (const VkImageCompressionControlEXT *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT; + out_ext->pNext = NULL; + out_ext->flags = in_ext->flags; + out_ext->compressionControlPlaneCount = in_ext->compressionControlPlaneCount; + out_ext->pFixedRateFlags = in_ext->pFixedRateFlags; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + case VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV: + { + VkOpticalFlowImageFormatInfoNV *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkOpticalFlowImageFormatInfoNV *in_ext = (const VkOpticalFlowImageFormatInfoNV *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV; + out_ext->pNext = NULL; + out_ext->usage = in_ext->usage; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } + default: + FIXME("Unhandled sType %u.\n", in_header->sType); + break; + } + } +} +#endif /* _WIN64 */ + static inline void convert_VkImageCreateInfo_win32_to_host(struct conversion_context *ctx, const VkImageCreateInfo32 *in, VkImageCreateInfo *out) { const VkBaseInStructure32 *in_header; @@ -16396,7 +16590,7 @@ static inline void convert_VkImageCreateInfo_win32_to_host(struct conversion_con const VkImageSwapchainCreateInfoKHR32 *in_ext = (const VkImageSwapchainCreateInfoKHR32 *)in_header; out_ext->sType = VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR; out_ext->pNext = NULL; - out_ext->swapchain = in_ext->swapchain; + out_ext->swapchain = in_ext->swapchain ? wine_swapchain_from_handle(in_ext->swapchain)->host_swapchain : 0; out_header->pNext = (void *)out_ext; out_header = (void *)out_ext; break; @@ -18204,33 +18398,7 @@ static inline const VkShaderCreateInfoEXT *convert_VkShaderCreateInfoEXT_array_w return out; }
-#ifdef _WIN64 -static inline void convert_VkSwapchainCreateInfoKHR_win64_to_driver(const VkSwapchainCreateInfoKHR *in, VkSwapchainCreateInfoKHR *out) -{ - if (!in) return; - - out->sType = in->sType; - out->pNext = in->pNext; - out->flags = in->flags; - out->surface = wine_surface_from_handle(in->surface)->driver_surface; - out->minImageCount = in->minImageCount; - out->imageFormat = in->imageFormat; - out->imageColorSpace = in->imageColorSpace; - out->imageExtent = in->imageExtent; - out->imageArrayLayers = in->imageArrayLayers; - out->imageUsage = in->imageUsage; - out->imageSharingMode = in->imageSharingMode; - out->queueFamilyIndexCount = in->queueFamilyIndexCount; - out->pQueueFamilyIndices = in->pQueueFamilyIndices; - out->preTransform = in->preTransform; - out->compositeAlpha = in->compositeAlpha; - out->presentMode = in->presentMode; - out->clipped = in->clipped; - out->oldSwapchain = in->oldSwapchain; -} -#endif /* _WIN64 */ - -static inline void convert_VkSwapchainCreateInfoKHR_win32_to_driver(struct conversion_context *ctx, const VkSwapchainCreateInfoKHR32 *in, VkSwapchainCreateInfoKHR *out) +static inline void convert_VkSwapchainCreateInfoKHR_win32_to_unwrapped_host(struct conversion_context *ctx, const VkSwapchainCreateInfoKHR32 *in, VkSwapchainCreateInfoKHR *out) { const VkBaseInStructure32 *in_header; VkBaseOutStructure *out_header = (void *)out; @@ -18240,7 +18408,7 @@ static inline void convert_VkSwapchainCreateInfoKHR_win32_to_driver(struct conve out->sType = in->sType; out->pNext = NULL; out->flags = in->flags; - out->surface = wine_surface_from_handle(in->surface)->driver_surface; + out->surface = in->surface; out->minImageCount = in->minImageCount; out->imageFormat = in->imageFormat; out->imageColorSpace = in->imageColorSpace; @@ -19200,6 +19368,24 @@ static inline void convert_VkDeviceGroupPresentCapabilitiesKHR_host_to_win32(con out->modes = in->modes; }
+#ifdef _WIN64 +static inline const VkImageCreateInfo *convert_VkImageCreateInfo_array_win64_to_host(struct conversion_context *ctx, const VkImageCreateInfo *in, uint32_t count) +{ + VkImageCreateInfo *out; + unsigned int i; + + if (!in || !count) return NULL; + + out = conversion_context_alloc(ctx, count * sizeof(*out)); + for (i = 0; i < count; i++) + { + convert_VkImageCreateInfo_win64_to_host(ctx, &in[i], &out[i]); + } + + return out; +} +#endif /* _WIN64 */ + static inline const VkImageCreateInfo *convert_VkImageCreateInfo_array_win32_to_host(struct conversion_context *ctx, const VkImageCreateInfo32 *in, uint32_t count) { VkImageCreateInfo *out; @@ -19216,6 +19402,18 @@ static inline const VkImageCreateInfo *convert_VkImageCreateInfo_array_win32_to_ return out; }
+#ifdef _WIN64 +static inline void convert_VkDeviceImageMemoryRequirements_win64_to_host(struct conversion_context *ctx, const VkDeviceImageMemoryRequirements *in, VkDeviceImageMemoryRequirements *out) +{ + if (!in) return; + + out->sType = in->sType; + out->pNext = in->pNext; + out->pCreateInfo = convert_VkImageCreateInfo_array_win64_to_host(ctx, in->pCreateInfo, 1); + out->planeAspect = in->planeAspect; +} +#endif /* _WIN64 */ + static inline void convert_VkDeviceImageMemoryRequirements_win32_to_host(struct conversion_context *ctx, const VkDeviceImageMemoryRequirements32 *in, VkDeviceImageMemoryRequirements *out) { if (!in) return; @@ -19311,6 +19509,18 @@ static inline const VkImageSubresource2KHR *convert_VkImageSubresource2KHR_array return out; }
+#ifdef _WIN64 +static inline void convert_VkDeviceImageSubresourceInfoKHR_win64_to_host(struct conversion_context *ctx, const VkDeviceImageSubresourceInfoKHR *in, VkDeviceImageSubresourceInfoKHR *out) +{ + if (!in) return; + + out->sType = in->sType; + out->pNext = in->pNext; + out->pCreateInfo = convert_VkImageCreateInfo_array_win64_to_host(ctx, in->pCreateInfo, 1); + out->pSubresource = in->pSubresource; +} +#endif /* _WIN64 */ + static inline void convert_VkDeviceImageSubresourceInfoKHR_win32_to_host(struct conversion_context *ctx, const VkDeviceImageSubresourceInfoKHR32 *in, VkDeviceImageSubresourceInfoKHR *out) { if (!in) return; @@ -27842,7 +28052,57 @@ static inline const VkPresentRegionKHR *convert_VkPresentRegionKHR_array_win32_t return out; }
-static inline void convert_VkPresentInfoKHR_win32_to_host(struct conversion_context *ctx, const VkPresentInfoKHR32 *in, VkPresentInfoKHR *out) +#ifdef _WIN64 +static inline const VkSwapchainKHR *convert_VkSwapchainKHR_array_win64_to_driver(struct conversion_context *ctx, const VkSwapchainKHR *in, uint32_t count) +{ + VkSwapchainKHR *out; + unsigned int i; + + if (!in || !count) return NULL; + + out = conversion_context_alloc(ctx, count * sizeof(*out)); + for (i = 0; i < count; i++) + { + out[i] = wine_swapchain_from_handle(in[i])->host_swapchain; + } + + return out; +} +#endif /* _WIN64 */ + +static inline const VkSwapchainKHR *convert_VkSwapchainKHR_array_win32_to_driver(struct conversion_context *ctx, const VkSwapchainKHR *in, uint32_t count) +{ + VkSwapchainKHR *out; + unsigned int i; + + if (!in || !count) return NULL; + + out = conversion_context_alloc(ctx, count * sizeof(*out)); + for (i = 0; i < count; i++) + { + out[i] = wine_swapchain_from_handle(in[i])->host_swapchain; + } + + return out; +} + +#ifdef _WIN64 +static inline void convert_VkPresentInfoKHR_win64_to_driver(struct conversion_context *ctx, const VkPresentInfoKHR *in, VkPresentInfoKHR *out) +{ + if (!in) return; + + out->sType = in->sType; + out->pNext = in->pNext; + out->waitSemaphoreCount = in->waitSemaphoreCount; + out->pWaitSemaphores = in->pWaitSemaphores; + out->swapchainCount = in->swapchainCount; + out->pSwapchains = convert_VkSwapchainKHR_array_win64_to_driver(ctx, in->pSwapchains, in->swapchainCount); + out->pImageIndices = in->pImageIndices; + out->pResults = in->pResults; +} +#endif /* _WIN64 */ + +static inline void convert_VkPresentInfoKHR_win32_to_driver(struct conversion_context *ctx, const VkPresentInfoKHR32 *in, VkPresentInfoKHR *out) { const VkBaseInStructure32 *in_header; VkBaseOutStructure *out_header = (void *)out; @@ -27854,7 +28114,7 @@ static inline void convert_VkPresentInfoKHR_win32_to_host(struct conversion_cont out->waitSemaphoreCount = in->waitSemaphoreCount; out->pWaitSemaphores = (const VkSemaphore *)UlongToPtr(in->pWaitSemaphores); out->swapchainCount = in->swapchainCount; - out->pSwapchains = (const VkSwapchainKHR *)UlongToPtr(in->pSwapchains); + out->pSwapchains = convert_VkSwapchainKHR_array_win32_to_driver(ctx, (const VkSwapchainKHR *)UlongToPtr(in->pSwapchains), in->swapchainCount); out->pImageIndices = (const uint32_t *)UlongToPtr(in->pImageIndices); out->pResults = (VkResult *)UlongToPtr(in->pResults);
@@ -28318,13 +28578,26 @@ static inline const VkSubmitInfo2 *convert_VkSubmitInfo2_array_win32_to_host(str return out; }
+#ifdef _WIN64 +static inline void convert_VkReleaseSwapchainImagesInfoEXT_win64_to_host(const VkReleaseSwapchainImagesInfoEXT *in, VkReleaseSwapchainImagesInfoEXT *out) +{ + if (!in) return; + + out->sType = in->sType; + out->pNext = in->pNext; + out->swapchain = wine_swapchain_from_handle(in->swapchain)->host_swapchain; + out->imageIndexCount = in->imageIndexCount; + out->pImageIndices = in->pImageIndices; +} +#endif /* _WIN64 */ + static inline void convert_VkReleaseSwapchainImagesInfoEXT_win32_to_host(const VkReleaseSwapchainImagesInfoEXT32 *in, VkReleaseSwapchainImagesInfoEXT *out) { if (!in) return;
out->sType = in->sType; out->pNext = NULL; - out->swapchain = in->swapchain; + out->swapchain = wine_swapchain_from_handle(in->swapchain)->host_swapchain; out->imageIndexCount = in->imageIndexCount; out->pImageIndices = (const uint32_t *)UlongToPtr(in->pImageIndices); if (in->pNext) @@ -28387,6 +28660,40 @@ static inline void convert_VkDebugUtilsObjectTagInfoEXT_win32_to_host(const VkDe FIXME("Unexpected pNext\n"); }
+#ifdef _WIN64 +static inline const VkSwapchainKHR *convert_VkSwapchainKHR_array_win64_to_host(struct conversion_context *ctx, const VkSwapchainKHR *in, uint32_t count) +{ + VkSwapchainKHR *out; + unsigned int i; + + if (!in || !count) return NULL; + + out = conversion_context_alloc(ctx, count * sizeof(*out)); + for (i = 0; i < count; i++) + { + out[i] = wine_swapchain_from_handle(in[i])->host_swapchain; + } + + return out; +} +#endif /* _WIN64 */ + +static inline const VkSwapchainKHR *convert_VkSwapchainKHR_array_win32_to_host(struct conversion_context *ctx, const VkSwapchainKHR *in, uint32_t count) +{ + VkSwapchainKHR *out; + unsigned int i; + + if (!in || !count) return NULL; + + out = conversion_context_alloc(ctx, count * sizeof(*out)); + for (i = 0; i < count; i++) + { + out[i] = wine_swapchain_from_handle(in[i])->host_swapchain; + } + + return out; +} + static inline void convert_VkHdrMetadataEXT_win32_to_host(const VkHdrMetadataEXT32 *in, VkHdrMetadataEXT *out) { if (!in) return; @@ -28666,10 +28973,12 @@ static inline void convert_VkSemaphoreWaitInfo_win32_to_host(const VkSemaphoreWa static NTSTATUS thunk64_vkAcquireNextImage2KHR(void *args) { struct vkAcquireNextImage2KHR_params *params = args; + VkAcquireNextImageInfoKHR pAcquireInfo_host;
TRACE("%p, %p, %p\n", params->device, params->pAcquireInfo, params->pImageIndex);
- params->result = wine_device_from_handle(params->device)->funcs.p_vkAcquireNextImage2KHR(wine_device_from_handle(params->device)->host_device, params->pAcquireInfo, params->pImageIndex); + convert_VkAcquireNextImageInfoKHR_win64_to_host(params->pAcquireInfo, &pAcquireInfo_host); + params->result = wine_device_from_handle(params->device)->funcs.p_vkAcquireNextImage2KHR(wine_device_from_handle(params->device)->host_device, &pAcquireInfo_host, params->pImageIndex); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -28699,7 +29008,7 @@ static NTSTATUS thunk64_vkAcquireNextImageKHR(void *args)
TRACE("%p, 0x%s, 0x%s, 0x%s, 0x%s, %p\n", params->device, wine_dbgstr_longlong(params->swapchain), wine_dbgstr_longlong(params->timeout), wine_dbgstr_longlong(params->semaphore), wine_dbgstr_longlong(params->fence), params->pImageIndex);
- params->result = wine_device_from_handle(params->device)->funcs.p_vkAcquireNextImageKHR(wine_device_from_handle(params->device)->host_device, params->swapchain, params->timeout, params->semaphore, params->fence, params->pImageIndex); + params->result = wine_device_from_handle(params->device)->funcs.p_vkAcquireNextImageKHR(wine_device_from_handle(params->device)->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, params->timeout, params->semaphore, params->fence, params->pImageIndex); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -28719,7 +29028,7 @@ static NTSTATUS thunk32_vkAcquireNextImageKHR(void *args)
TRACE("%#x, 0x%s, 0x%s, 0x%s, 0x%s, %#x\n", params->device, wine_dbgstr_longlong(params->swapchain), wine_dbgstr_longlong(params->timeout), wine_dbgstr_longlong(params->semaphore), wine_dbgstr_longlong(params->fence), params->pImageIndex);
- params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkAcquireNextImageKHR(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, params->swapchain, params->timeout, params->semaphore, params->fence, (uint32_t *)UlongToPtr(params->pImageIndex)); + params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkAcquireNextImageKHR(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, params->timeout, params->semaphore, params->fence, (uint32_t *)UlongToPtr(params->pImageIndex)); return STATUS_SUCCESS; }
@@ -35798,10 +36107,16 @@ static NTSTATUS thunk32_vkCreateGraphicsPipelines(void *args) static NTSTATUS thunk64_vkCreateImage(void *args) { struct vkCreateImage_params *params = args; + VkImageCreateInfo pCreateInfo_host; + struct conversion_context local_ctx; + struct conversion_context *ctx = &local_ctx;
TRACE("%p, %p, %p, %p\n", params->device, params->pCreateInfo, params->pAllocator, params->pImage);
- params->result = wine_vkCreateImage(params->device, params->pCreateInfo, params->pAllocator, params->pImage); + init_conversion_context(ctx); + convert_VkImageCreateInfo_win64_to_host(ctx, params->pCreateInfo, &pCreateInfo_host); + params->result = wine_vkCreateImage(params->device, &pCreateInfo_host, params->pAllocator, params->pImage); + free_conversion_context(ctx); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -36585,12 +36900,10 @@ static NTSTATUS thunk32_vkCreateShadersEXT(void *args) static NTSTATUS thunk64_vkCreateSwapchainKHR(void *args) { struct vkCreateSwapchainKHR_params *params = args; - VkSwapchainCreateInfoKHR pCreateInfo_host;
TRACE("%p, %p, %p, %p\n", params->device, params->pCreateInfo, params->pAllocator, params->pSwapchain);
- convert_VkSwapchainCreateInfoKHR_win64_to_driver(params->pCreateInfo, &pCreateInfo_host); - params->result = wine_device_from_handle(params->device)->funcs.p_vkCreateSwapchainKHR(wine_device_from_handle(params->device)->host_device, &pCreateInfo_host, NULL, params->pSwapchain); + params->result = wine_vkCreateSwapchainKHR(params->device, params->pCreateInfo, params->pAllocator, params->pSwapchain); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -36612,8 +36925,8 @@ static NTSTATUS thunk32_vkCreateSwapchainKHR(void *args) TRACE("%#x, %#x, %#x, %#x\n", params->device, params->pCreateInfo, params->pAllocator, params->pSwapchain);
init_conversion_context(ctx); - convert_VkSwapchainCreateInfoKHR_win32_to_driver(ctx, (const VkSwapchainCreateInfoKHR32 *)UlongToPtr(params->pCreateInfo), &pCreateInfo_host); - params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkCreateSwapchainKHR(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, &pCreateInfo_host, NULL, (VkSwapchainKHR *)UlongToPtr(params->pSwapchain)); + convert_VkSwapchainCreateInfoKHR_win32_to_unwrapped_host(ctx, (const VkSwapchainCreateInfoKHR32 *)UlongToPtr(params->pCreateInfo), &pCreateInfo_host); + params->result = wine_vkCreateSwapchainKHR((VkDevice)UlongToPtr(params->device), &pCreateInfo_host, (const VkAllocationCallbacks *)UlongToPtr(params->pAllocator), (VkSwapchainKHR *)UlongToPtr(params->pSwapchain)); free_conversion_context(ctx); return STATUS_SUCCESS; } @@ -37898,7 +38211,7 @@ static NTSTATUS thunk64_vkDestroySwapchainKHR(void *args)
TRACE("%p, 0x%s, %p\n", params->device, wine_dbgstr_longlong(params->swapchain), params->pAllocator);
- wine_device_from_handle(params->device)->funcs.p_vkDestroySwapchainKHR(wine_device_from_handle(params->device)->host_device, params->swapchain, NULL); + wine_vkDestroySwapchainKHR(params->device, params->swapchain, params->pAllocator); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -37914,7 +38227,7 @@ static NTSTATUS thunk32_vkDestroySwapchainKHR(void *args)
TRACE("%#x, 0x%s, %#x\n", params->device, wine_dbgstr_longlong(params->swapchain), params->pAllocator);
- wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkDestroySwapchainKHR(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, params->swapchain, NULL); + wine_vkDestroySwapchainKHR((VkDevice)UlongToPtr(params->device), params->swapchain, (const VkAllocationCallbacks *)UlongToPtr(params->pAllocator)); return STATUS_SUCCESS; }
@@ -39416,10 +39729,16 @@ static NTSTATUS thunk32_vkGetDeviceGroupSurfacePresentModesKHR(void *args) static NTSTATUS thunk64_vkGetDeviceImageMemoryRequirements(void *args) { struct vkGetDeviceImageMemoryRequirements_params *params = args; + VkDeviceImageMemoryRequirements pInfo_host; + struct conversion_context local_ctx; + struct conversion_context *ctx = &local_ctx;
TRACE("%p, %p, %p\n", params->device, params->pInfo, params->pMemoryRequirements);
- wine_device_from_handle(params->device)->funcs.p_vkGetDeviceImageMemoryRequirements(wine_device_from_handle(params->device)->host_device, params->pInfo, params->pMemoryRequirements); + init_conversion_context(ctx); + convert_VkDeviceImageMemoryRequirements_win64_to_host(ctx, params->pInfo, &pInfo_host); + wine_device_from_handle(params->device)->funcs.p_vkGetDeviceImageMemoryRequirements(wine_device_from_handle(params->device)->host_device, &pInfo_host, params->pMemoryRequirements); + free_conversion_context(ctx); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -39452,10 +39771,16 @@ static NTSTATUS thunk32_vkGetDeviceImageMemoryRequirements(void *args) static NTSTATUS thunk64_vkGetDeviceImageMemoryRequirementsKHR(void *args) { struct vkGetDeviceImageMemoryRequirementsKHR_params *params = args; + VkDeviceImageMemoryRequirements pInfo_host; + struct conversion_context local_ctx; + struct conversion_context *ctx = &local_ctx;
TRACE("%p, %p, %p\n", params->device, params->pInfo, params->pMemoryRequirements);
- wine_device_from_handle(params->device)->funcs.p_vkGetDeviceImageMemoryRequirementsKHR(wine_device_from_handle(params->device)->host_device, params->pInfo, params->pMemoryRequirements); + init_conversion_context(ctx); + convert_VkDeviceImageMemoryRequirements_win64_to_host(ctx, params->pInfo, &pInfo_host); + wine_device_from_handle(params->device)->funcs.p_vkGetDeviceImageMemoryRequirementsKHR(wine_device_from_handle(params->device)->host_device, &pInfo_host, params->pMemoryRequirements); + free_conversion_context(ctx); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -39488,10 +39813,16 @@ static NTSTATUS thunk32_vkGetDeviceImageMemoryRequirementsKHR(void *args) static NTSTATUS thunk64_vkGetDeviceImageSparseMemoryRequirements(void *args) { struct vkGetDeviceImageSparseMemoryRequirements_params *params = args; + VkDeviceImageMemoryRequirements pInfo_host; + struct conversion_context local_ctx; + struct conversion_context *ctx = &local_ctx;
TRACE("%p, %p, %p, %p\n", params->device, params->pInfo, params->pSparseMemoryRequirementCount, params->pSparseMemoryRequirements);
- wine_device_from_handle(params->device)->funcs.p_vkGetDeviceImageSparseMemoryRequirements(wine_device_from_handle(params->device)->host_device, params->pInfo, params->pSparseMemoryRequirementCount, params->pSparseMemoryRequirements); + init_conversion_context(ctx); + convert_VkDeviceImageMemoryRequirements_win64_to_host(ctx, params->pInfo, &pInfo_host); + wine_device_from_handle(params->device)->funcs.p_vkGetDeviceImageSparseMemoryRequirements(wine_device_from_handle(params->device)->host_device, &pInfo_host, params->pSparseMemoryRequirementCount, params->pSparseMemoryRequirements); + free_conversion_context(ctx); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -39525,10 +39856,16 @@ static NTSTATUS thunk32_vkGetDeviceImageSparseMemoryRequirements(void *args) static NTSTATUS thunk64_vkGetDeviceImageSparseMemoryRequirementsKHR(void *args) { struct vkGetDeviceImageSparseMemoryRequirementsKHR_params *params = args; + VkDeviceImageMemoryRequirements pInfo_host; + struct conversion_context local_ctx; + struct conversion_context *ctx = &local_ctx;
TRACE("%p, %p, %p, %p\n", params->device, params->pInfo, params->pSparseMemoryRequirementCount, params->pSparseMemoryRequirements);
- wine_device_from_handle(params->device)->funcs.p_vkGetDeviceImageSparseMemoryRequirementsKHR(wine_device_from_handle(params->device)->host_device, params->pInfo, params->pSparseMemoryRequirementCount, params->pSparseMemoryRequirements); + init_conversion_context(ctx); + convert_VkDeviceImageMemoryRequirements_win64_to_host(ctx, params->pInfo, &pInfo_host); + wine_device_from_handle(params->device)->funcs.p_vkGetDeviceImageSparseMemoryRequirementsKHR(wine_device_from_handle(params->device)->host_device, &pInfo_host, params->pSparseMemoryRequirementCount, params->pSparseMemoryRequirements); + free_conversion_context(ctx); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -39562,10 +39899,16 @@ static NTSTATUS thunk32_vkGetDeviceImageSparseMemoryRequirementsKHR(void *args) static NTSTATUS thunk64_vkGetDeviceImageSubresourceLayoutKHR(void *args) { struct vkGetDeviceImageSubresourceLayoutKHR_params *params = args; + VkDeviceImageSubresourceInfoKHR pInfo_host; + struct conversion_context local_ctx; + struct conversion_context *ctx = &local_ctx;
TRACE("%p, %p, %p\n", params->device, params->pInfo, params->pLayout);
- wine_device_from_handle(params->device)->funcs.p_vkGetDeviceImageSubresourceLayoutKHR(wine_device_from_handle(params->device)->host_device, params->pInfo, params->pLayout); + init_conversion_context(ctx); + convert_VkDeviceImageSubresourceInfoKHR_win64_to_host(ctx, params->pInfo, &pInfo_host); + wine_device_from_handle(params->device)->funcs.p_vkGetDeviceImageSubresourceLayoutKHR(wine_device_from_handle(params->device)->host_device, &pInfo_host, params->pLayout); + free_conversion_context(ctx); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -40408,7 +40751,7 @@ static NTSTATUS thunk64_vkGetLatencyTimingsNV(void *args)
TRACE("%p, 0x%s, %p\n", params->device, wine_dbgstr_longlong(params->swapchain), params->pLatencyMarkerInfo);
- wine_device_from_handle(params->device)->funcs.p_vkGetLatencyTimingsNV(wine_device_from_handle(params->device)->host_device, params->swapchain, params->pLatencyMarkerInfo); + wine_device_from_handle(params->device)->funcs.p_vkGetLatencyTimingsNV(wine_device_from_handle(params->device)->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, params->pLatencyMarkerInfo); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -40429,7 +40772,7 @@ static NTSTATUS thunk32_vkGetLatencyTimingsNV(void *args)
init_conversion_context(ctx); convert_VkGetLatencyMarkerInfoNV_win32_to_host(ctx, (VkGetLatencyMarkerInfoNV32 *)UlongToPtr(params->pLatencyMarkerInfo), &pLatencyMarkerInfo_host); - wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkGetLatencyTimingsNV(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, params->swapchain, &pLatencyMarkerInfo_host); + wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkGetLatencyTimingsNV(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, &pLatencyMarkerInfo_host); convert_VkGetLatencyMarkerInfoNV_host_to_win32(&pLatencyMarkerInfo_host, (VkGetLatencyMarkerInfoNV32 *)UlongToPtr(params->pLatencyMarkerInfo)); free_conversion_context(ctx); return STATUS_SUCCESS; @@ -42819,7 +43162,7 @@ static NTSTATUS thunk64_vkGetSwapchainImagesKHR(void *args)
TRACE("%p, 0x%s, %p, %p\n", params->device, wine_dbgstr_longlong(params->swapchain), params->pSwapchainImageCount, params->pSwapchainImages);
- params->result = wine_device_from_handle(params->device)->funcs.p_vkGetSwapchainImagesKHR(wine_device_from_handle(params->device)->host_device, params->swapchain, params->pSwapchainImageCount, params->pSwapchainImages); + params->result = wine_device_from_handle(params->device)->funcs.p_vkGetSwapchainImagesKHR(wine_device_from_handle(params->device)->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, params->pSwapchainImageCount, params->pSwapchainImages); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -42837,7 +43180,7 @@ static NTSTATUS thunk32_vkGetSwapchainImagesKHR(void *args)
TRACE("%#x, 0x%s, %#x, %#x\n", params->device, wine_dbgstr_longlong(params->swapchain), params->pSwapchainImageCount, params->pSwapchainImages);
- params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkGetSwapchainImagesKHR(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, params->swapchain, (uint32_t *)UlongToPtr(params->pSwapchainImageCount), (VkImage *)UlongToPtr(params->pSwapchainImages)); + params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkGetSwapchainImagesKHR(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, (uint32_t *)UlongToPtr(params->pSwapchainImageCount), (VkImage *)UlongToPtr(params->pSwapchainImages)); return STATUS_SUCCESS; }
@@ -42949,7 +43292,7 @@ static NTSTATUS thunk64_vkLatencySleepNV(void *args)
TRACE("%p, 0x%s, %p\n", params->device, wine_dbgstr_longlong(params->swapchain), params->pSleepInfo);
- params->result = wine_device_from_handle(params->device)->funcs.p_vkLatencySleepNV(wine_device_from_handle(params->device)->host_device, params->swapchain, params->pSleepInfo); + params->result = wine_device_from_handle(params->device)->funcs.p_vkLatencySleepNV(wine_device_from_handle(params->device)->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, params->pSleepInfo); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -42968,7 +43311,7 @@ static NTSTATUS thunk32_vkLatencySleepNV(void *args) TRACE("%#x, 0x%s, %#x\n", params->device, wine_dbgstr_longlong(params->swapchain), params->pSleepInfo);
convert_VkLatencySleepInfoNV_win32_to_host((const VkLatencySleepInfoNV32 *)UlongToPtr(params->pSleepInfo), &pSleepInfo_host); - params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkLatencySleepNV(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, params->swapchain, &pSleepInfo_host); + params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkLatencySleepNV(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, &pSleepInfo_host); return STATUS_SUCCESS; }
@@ -43245,10 +43588,16 @@ static NTSTATUS thunk32_vkQueueNotifyOutOfBandNV(void *args) static NTSTATUS thunk64_vkQueuePresentKHR(void *args) { struct vkQueuePresentKHR_params *params = args; + VkPresentInfoKHR pPresentInfo_host; + struct conversion_context local_ctx; + struct conversion_context *ctx = &local_ctx;
TRACE("%p, %p\n", params->queue, params->pPresentInfo);
- params->result = wine_queue_from_handle(params->queue)->device->funcs.p_vkQueuePresentKHR(wine_queue_from_handle(params->queue)->host_queue, params->pPresentInfo); + init_conversion_context(ctx); + convert_VkPresentInfoKHR_win64_to_driver(ctx, params->pPresentInfo, &pPresentInfo_host); + params->result = wine_queue_from_handle(params->queue)->device->funcs.p_vkQueuePresentKHR(wine_queue_from_handle(params->queue)->host_queue, &pPresentInfo_host); + free_conversion_context(ctx); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -43268,7 +43617,7 @@ static NTSTATUS thunk32_vkQueuePresentKHR(void *args) TRACE("%#x, %#x\n", params->queue, params->pPresentInfo);
init_conversion_context(ctx); - convert_VkPresentInfoKHR_win32_to_host(ctx, (const VkPresentInfoKHR32 *)UlongToPtr(params->pPresentInfo), &pPresentInfo_host); + convert_VkPresentInfoKHR_win32_to_driver(ctx, (const VkPresentInfoKHR32 *)UlongToPtr(params->pPresentInfo), &pPresentInfo_host); params->result = wine_queue_from_handle((VkQueue)UlongToPtr(params->queue))->device->funcs.p_vkQueuePresentKHR(wine_queue_from_handle((VkQueue)UlongToPtr(params->queue))->host_queue, &pPresentInfo_host); free_conversion_context(ctx); return STATUS_SUCCESS; @@ -43506,10 +43855,12 @@ static NTSTATUS thunk32_vkReleaseProfilingLockKHR(void *args) static NTSTATUS thunk64_vkReleaseSwapchainImagesEXT(void *args) { struct vkReleaseSwapchainImagesEXT_params *params = args; + VkReleaseSwapchainImagesInfoEXT pReleaseInfo_host;
TRACE("%p, %p\n", params->device, params->pReleaseInfo);
- params->result = wine_device_from_handle(params->device)->funcs.p_vkReleaseSwapchainImagesEXT(wine_device_from_handle(params->device)->host_device, params->pReleaseInfo); + convert_VkReleaseSwapchainImagesInfoEXT_win64_to_host(params->pReleaseInfo, &pReleaseInfo_host); + params->result = wine_device_from_handle(params->device)->funcs.p_vkReleaseSwapchainImagesEXT(wine_device_from_handle(params->device)->host_device, &pReleaseInfo_host); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -43845,10 +44196,16 @@ static NTSTATUS thunk32_vkSetEvent(void *args) static NTSTATUS thunk64_vkSetHdrMetadataEXT(void *args) { struct vkSetHdrMetadataEXT_params *params = args; + const VkSwapchainKHR *pSwapchains_host; + struct conversion_context local_ctx; + struct conversion_context *ctx = &local_ctx;
TRACE("%p, %u, %p, %p\n", params->device, params->swapchainCount, params->pSwapchains, params->pMetadata);
- wine_device_from_handle(params->device)->funcs.p_vkSetHdrMetadataEXT(wine_device_from_handle(params->device)->host_device, params->swapchainCount, params->pSwapchains, params->pMetadata); + init_conversion_context(ctx); + pSwapchains_host = convert_VkSwapchainKHR_array_win64_to_host(ctx, params->pSwapchains, params->swapchainCount); + wine_device_from_handle(params->device)->funcs.p_vkSetHdrMetadataEXT(wine_device_from_handle(params->device)->host_device, params->swapchainCount, pSwapchains_host, params->pMetadata); + free_conversion_context(ctx); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -43862,6 +44219,7 @@ static NTSTATUS thunk32_vkSetHdrMetadataEXT(void *args) PTR32 pSwapchains; PTR32 pMetadata; } *params = args; + const VkSwapchainKHR *pSwapchains_host; const VkHdrMetadataEXT *pMetadata_host; struct conversion_context local_ctx; struct conversion_context *ctx = &local_ctx; @@ -43869,8 +44227,9 @@ static NTSTATUS thunk32_vkSetHdrMetadataEXT(void *args) TRACE("%#x, %u, %#x, %#x\n", params->device, params->swapchainCount, params->pSwapchains, params->pMetadata);
init_conversion_context(ctx); + pSwapchains_host = convert_VkSwapchainKHR_array_win32_to_host(ctx, (const VkSwapchainKHR *)UlongToPtr(params->pSwapchains), params->swapchainCount); pMetadata_host = convert_VkHdrMetadataEXT_array_win32_to_host(ctx, (const VkHdrMetadataEXT32 *)UlongToPtr(params->pMetadata), params->swapchainCount); - wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkSetHdrMetadataEXT(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, params->swapchainCount, (const VkSwapchainKHR *)UlongToPtr(params->pSwapchains), pMetadata_host); + wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkSetHdrMetadataEXT(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, params->swapchainCount, pSwapchains_host, pMetadata_host); free_conversion_context(ctx); return STATUS_SUCCESS; } @@ -43882,7 +44241,7 @@ static NTSTATUS thunk64_vkSetLatencyMarkerNV(void *args)
TRACE("%p, 0x%s, %p\n", params->device, wine_dbgstr_longlong(params->swapchain), params->pLatencyMarkerInfo);
- wine_device_from_handle(params->device)->funcs.p_vkSetLatencyMarkerNV(wine_device_from_handle(params->device)->host_device, params->swapchain, params->pLatencyMarkerInfo); + wine_device_from_handle(params->device)->funcs.p_vkSetLatencyMarkerNV(wine_device_from_handle(params->device)->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, params->pLatencyMarkerInfo); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -43900,7 +44259,7 @@ static NTSTATUS thunk32_vkSetLatencyMarkerNV(void *args) TRACE("%#x, 0x%s, %#x\n", params->device, wine_dbgstr_longlong(params->swapchain), params->pLatencyMarkerInfo);
convert_VkSetLatencyMarkerInfoNV_win32_to_host((const VkSetLatencyMarkerInfoNV32 *)UlongToPtr(params->pLatencyMarkerInfo), &pLatencyMarkerInfo_host); - wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkSetLatencyMarkerNV(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, params->swapchain, &pLatencyMarkerInfo_host); + wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkSetLatencyMarkerNV(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, &pLatencyMarkerInfo_host); return STATUS_SUCCESS; }
@@ -43911,7 +44270,7 @@ static NTSTATUS thunk64_vkSetLatencySleepModeNV(void *args)
TRACE("%p, 0x%s, %p\n", params->device, wine_dbgstr_longlong(params->swapchain), params->pSleepModeInfo);
- params->result = wine_device_from_handle(params->device)->funcs.p_vkSetLatencySleepModeNV(wine_device_from_handle(params->device)->host_device, params->swapchain, params->pSleepModeInfo); + params->result = wine_device_from_handle(params->device)->funcs.p_vkSetLatencySleepModeNV(wine_device_from_handle(params->device)->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, params->pSleepModeInfo); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -43930,7 +44289,7 @@ static NTSTATUS thunk32_vkSetLatencySleepModeNV(void *args) TRACE("%#x, 0x%s, %#x\n", params->device, wine_dbgstr_longlong(params->swapchain), params->pSleepModeInfo);
convert_VkLatencySleepModeInfoNV_win32_to_host((const VkLatencySleepModeInfoNV32 *)UlongToPtr(params->pSleepModeInfo), &pSleepModeInfo_host); - params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkSetLatencySleepModeNV(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, params->swapchain, &pSleepModeInfo_host); + params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkSetLatencySleepModeNV(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, &pSleepModeInfo_host); return STATUS_SUCCESS; }
@@ -44378,7 +44737,7 @@ static NTSTATUS thunk64_vkWaitForPresentKHR(void *args)
TRACE("%p, 0x%s, 0x%s, 0x%s\n", params->device, wine_dbgstr_longlong(params->swapchain), wine_dbgstr_longlong(params->presentId), wine_dbgstr_longlong(params->timeout));
- params->result = wine_device_from_handle(params->device)->funcs.p_vkWaitForPresentKHR(wine_device_from_handle(params->device)->host_device, params->swapchain, params->presentId, params->timeout); + params->result = wine_device_from_handle(params->device)->funcs.p_vkWaitForPresentKHR(wine_device_from_handle(params->device)->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, params->presentId, params->timeout); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -44396,7 +44755,7 @@ static NTSTATUS thunk32_vkWaitForPresentKHR(void *args)
TRACE("%#x, 0x%s, 0x%s, 0x%s\n", params->device, wine_dbgstr_longlong(params->swapchain), wine_dbgstr_longlong(params->presentId), wine_dbgstr_longlong(params->timeout));
- params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkWaitForPresentKHR(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, params->swapchain, params->presentId, params->timeout); + params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkWaitForPresentKHR(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, params->presentId, params->timeout); return STATUS_SUCCESS; }
@@ -44852,7 +45211,8 @@ BOOL wine_vk_is_type_wrapped(VkObjectType type) type == VK_OBJECT_TYPE_INSTANCE || type == VK_OBJECT_TYPE_PHYSICAL_DEVICE || type == VK_OBJECT_TYPE_QUEUE || - type == VK_OBJECT_TYPE_SURFACE_KHR; + type == VK_OBJECT_TYPE_SURFACE_KHR || + type == VK_OBJECT_TYPE_SWAPCHAIN_KHR; }
#ifdef _WIN64 diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h index 8b0d43fadf5..6b965893ebf 100644 --- a/dlls/winevulkan/vulkan_thunks.h +++ b/dlls/winevulkan/vulkan_thunks.h @@ -25,6 +25,7 @@ VkResult wine_vkCreateDeferredOperationKHR(VkDevice device, const VkAllocationCa VkResult wine_vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, void *client_ptr); VkResult wine_vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage); VkResult wine_vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance, void *client_ptr); +VkResult wine_vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain); VkResult wine_vkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); void wine_vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator); void wine_vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks *pAllocator); @@ -33,6 +34,7 @@ void wine_vkDestroyDeferredOperationKHR(VkDevice device, VkDeferredOperationKHR void wine_vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator); void wine_vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator); void wine_vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator); +void wine_vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator); VkResult wine_vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties); VkResult wine_vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkLayerProperties *pProperties); VkResult wine_vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/vulkan-1/tests/vulkan.c | 2 -- dlls/winevulkan/vulkan.c | 33 +++++++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/dlls/vulkan-1/tests/vulkan.c b/dlls/vulkan-1/tests/vulkan.c index 5417585e00c..e2ab609925b 100644 --- a/dlls/vulkan-1/tests/vulkan.c +++ b/dlls/vulkan-1/tests/vulkan.c @@ -595,10 +595,8 @@ static void test_win32_surface_hwnd(VkInstance vk_instance, VkPhysicalDevice vk_ ok(surf_caps.maxImageCount > 2, "Got minImageCount %u\n", surf_caps.maxImageCount); ok(surf_caps.minImageCount <= surf_caps.maxImageCount, "Got maxImageCount %u\n", surf_caps.maxImageCount);
- todo_wine_if(IsRectEmpty(&client_rect)) ok(surf_caps.currentExtent.width == client_rect.right - client_rect.left, "Got currentExtent.width %d\n", surf_caps.currentExtent.width); - todo_wine_if(IsRectEmpty(&client_rect)) ok(surf_caps.currentExtent.height == client_rect.bottom - client_rect.top, "Got currentExtent.height %d\n", surf_caps.currentExtent.height);
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 25d78f02347..59f34e882ae 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1499,12 +1499,23 @@ VkResult wine_vkCreateSwapchainKHR(VkDevice device_handle, const VkSwapchainCrea struct wine_swapchain *object, *old_swapchain = wine_swapchain_from_handle(create_info->oldSwapchain); 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; VkSwapchainCreateInfoKHR create_info_host = *create_info; + VkSurfaceCapabilitiesKHR capabilities; VkResult res;
if (surface) create_info_host.surface = surface->driver_surface; if (old_swapchain) create_info_host.oldSwapchain = old_swapchain->host_swapchain;
+ /* Windows allows client rect to be empty, but host Vulkan often doesn't, adjust extents back to the host capabilities */ + res = instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device->host_physical_device, + surface->driver_surface, &capabilities); + if (res != VK_SUCCESS) return res; + + create_info_host.imageExtent.width = max(create_info_host.imageExtent.width, capabilities.minImageExtent.width); + create_info_host.imageExtent.height = max(create_info_host.imageExtent.height, capabilities.minImageExtent.height); + if (!(object = calloc(1, sizeof(*object)))) return VK_ERROR_OUT_OF_HOST_MEMORY; res = device->funcs.p_vkCreateSwapchainKHR(device->host_device, &create_info_host, NULL, &object->host_swapchain); if (res != VK_SUCCESS) @@ -1772,8 +1783,11 @@ VkResult wine_vkCreateImage(VkDevice handle, const VkImageCreateInfo *create_inf return device->funcs.p_vkCreateImage(device->host_device, &info, NULL, image); }
-static inline void adjust_max_image_count(struct wine_phys_dev *phys_dev, VkSurfaceCapabilitiesKHR* capabilities) +static void adjust_surface_capabilities(struct wine_instance *instance, struct wine_surface *surface, + VkSurfaceCapabilitiesKHR *capabilities) { + RECT client_rect; + /* Many Windows games, for example Strange Brigade, No Man's Sky, Path of Exile * and World War Z, do not expect that maxImageCount can be set to 0. * A value of 0 means that there is no limit on the number of images. @@ -1781,10 +1795,17 @@ static inline void adjust_max_image_count(struct wine_phys_dev *phys_dev, VkSurf * https://vulkan.gpuinfo.org/displayreport.php?id=9122#surface * https://vulkan.gpuinfo.org/displayreport.php?id=9121#surface */ - if ((phys_dev->instance->quirks & WINEVULKAN_QUIRK_ADJUST_MAX_IMAGE_COUNT) && !capabilities->maxImageCount) - { + if ((instance->quirks & WINEVULKAN_QUIRK_ADJUST_MAX_IMAGE_COUNT) && !capabilities->maxImageCount) capabilities->maxImageCount = max(capabilities->minImageCount, 16); - } + + /* Update the image extents to match what the Win32 WSI would provide. */ + NtUserGetClientRect(surface->hwnd, &client_rect); + capabilities->minImageExtent.width = client_rect.right - client_rect.left; + capabilities->minImageExtent.height = client_rect.bottom - client_rect.top; + capabilities->maxImageExtent.width = client_rect.right - client_rect.left; + capabilities->maxImageExtent.height = client_rect.bottom - client_rect.top; + capabilities->currentExtent.width = client_rect.right - client_rect.left; + capabilities->currentExtent.height = client_rect.bottom - client_rect.top; }
VkResult wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice device_handle, VkSurfaceKHR surface_handle, @@ -1798,7 +1819,7 @@ VkResult wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice device_ if (!NtUserIsWindow(surface->hwnd)) return VK_ERROR_SURFACE_LOST_KHR; res = instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device->host_physical_device, surface->driver_surface, capabilities); - if (res == VK_SUCCESS) adjust_max_image_count(physical_device, capabilities); + if (res == VK_SUCCESS) adjust_surface_capabilities(instance, surface, capabilities); return res; }
@@ -1816,7 +1837,7 @@ VkResult wine_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice device if (!NtUserIsWindow(surface->hwnd)) return VK_ERROR_SURFACE_LOST_KHR; res = instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilities2KHR(physical_device->host_physical_device, &surface_info_host, capabilities); - if (res == VK_SUCCESS) adjust_max_image_count(physical_device, &capabilities->surfaceCapabilities); + if (res == VK_SUCCESS) adjust_surface_capabilities(instance, surface, &capabilities->surfaceCapabilities); return res; }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winewayland.drv/vulkan.c | 68 ++++------------------------------- 1 file changed, 6 insertions(+), 62 deletions(-)
diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index c9bb8acceed..355270e14f8 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -204,37 +204,6 @@ static const char *wine_vk_host_fn_name(const char *name) return name; }
-/* Update the capabilities to match what the Win32 WSI would provide. */ -static VkResult wine_vk_surface_update_caps(struct wine_vk_surface *wine_vk_surface, - VkSurfaceCapabilitiesKHR *caps) -{ - struct wayland_surface *wayland_surface; - int client_width, client_height; - HWND hwnd = wine_vk_surface_get_hwnd(wine_vk_surface); - - if (!(wayland_surface = wayland_surface_lock_hwnd(hwnd))) - return VK_ERROR_SURFACE_LOST_KHR; - - client_width = wayland_surface->window.client_rect.right - - wayland_surface->window.client_rect.left; - client_height = wayland_surface->window.client_rect.bottom - - wayland_surface->window.client_rect.top; - - pthread_mutex_unlock(&wayland_surface->mutex); - - caps->minImageExtent.width = client_width; - caps->minImageExtent.height = client_height; - caps->maxImageExtent.width = client_width; - caps->maxImageExtent.height = client_height; - caps->currentExtent.width = client_width; - caps->currentExtent.height = client_height; - - TRACE("hwnd=%p extent=%dx%d\n", hwnd, - caps->currentExtent.width, caps->currentExtent.height); - - return VK_SUCCESS; -} - static void vk_result_update_out_of_date(VkResult *res) { /* If the current result is less severe than out_of_date, which for @@ -355,16 +324,6 @@ static VkResult wayland_vkCreateSwapchainKHR(VkDevice device, create_info_host = *create_info; create_info_host.surface = wine_vk_surface->host_surface;
- /* Some apps do not properly handle a 0x0 image extent in capabilities, - * and erroneously try to create a swapchain with it, so use the minimum - * 1x1 to accommodate them. */ - if (create_info_host.imageExtent.width == 0 || - create_info_host.imageExtent.height == 0) - { - create_info_host.imageExtent.width = 1; - create_info_host.imageExtent.height = 1; - } - res = pvkCreateSwapchainKHR(device, &create_info_host, NULL /* allocator */, swapchain); if (res != VK_SUCCESS) @@ -596,7 +555,6 @@ static VkResult wayland_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDev { struct wine_vk_surface *wine_vk_surface = wine_vk_surface_from_handle(surface_info->surface); VkPhysicalDeviceSurfaceInfo2KHR surface_info_host; - VkResult res;
TRACE("%p, %p, %p\n", phys_dev, surface_info, capabilities);
@@ -604,11 +562,8 @@ static VkResult wayland_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDev surface_info_host.surface = wine_vk_surface->host_surface;
if (pvkGetPhysicalDeviceSurfaceCapabilities2KHR) - { - res = pvkGetPhysicalDeviceSurfaceCapabilities2KHR(phys_dev, &surface_info_host, - capabilities); - goto out; - } + return pvkGetPhysicalDeviceSurfaceCapabilities2KHR(phys_dev, &surface_info_host, + capabilities);
/* Until the loader version exporting this function is common, emulate it * using the older non-2 version. */ @@ -618,14 +573,8 @@ static VkResult wayland_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDev "vkGetPhysicalDeviceSurfaceCapabilitiesKHR, pNext is ignored.\n"); }
- res = pvkGetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev, surface_info_host.surface, - &capabilities->surfaceCapabilities); - -out: - if (res == VK_SUCCESS) - res = wine_vk_surface_update_caps(wine_vk_surface, &capabilities->surfaceCapabilities); - - return res; + return pvkGetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev, surface_info_host.surface, + &capabilities->surfaceCapabilities); }
static VkResult wayland_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice phys_dev, @@ -633,16 +582,11 @@ static VkResult wayland_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevi VkSurfaceCapabilitiesKHR *capabilities) { struct wine_vk_surface *wine_vk_surface = wine_vk_surface_from_handle(surface); - VkResult res;
TRACE("%p, 0x%s, %p\n", phys_dev, wine_dbgstr_longlong(surface), capabilities);
- res = pvkGetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev, wine_vk_surface->host_surface, - capabilities); - if (res == VK_SUCCESS) - res = wine_vk_surface_update_caps(wine_vk_surface, capabilities); - - return res; + return pvkGetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev, wine_vk_surface->host_surface, + capabilities); }
static VkResult wayland_vkGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice phys_dev,
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/vulkan.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 59f34e882ae..a4329f61c44 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1832,6 +1832,14 @@ VkResult wine_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice device struct wine_instance *instance = physical_device->instance; VkResult res;
+ if (!instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilities2KHR) + { + /* Until the loader version exporting this function is common, emulate it using the older non-2 version. */ + if (surface_info->pNext || capabilities->pNext) FIXME("Emulating vkGetPhysicalDeviceSurfaceCapabilities2KHR, ignoring pNext.\n"); + return wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device_handle, surface_info->surface, + &capabilities->surfaceCapabilities); + } + surface_info_host.surface = surface->driver_surface;
if (!NtUserIsWindow(surface->hwnd)) return VK_ERROR_SURFACE_LOST_KHR;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winemac.drv/vulkan.c | 15 --------------- dlls/winevulkan/make_vulkan | 3 +-- dlls/winevulkan/vulkan.c | 2 +- dlls/winewayland.drv/vulkan.c | 31 ------------------------------- dlls/winex11.drv/vulkan.c | 22 ---------------------- include/wine/vulkan_driver.h | 5 +---- 6 files changed, 3 insertions(+), 75 deletions(-)
diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 434d11542aa..f5f8dc28a22 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -121,7 +121,6 @@ static void wine_vk_init(void) LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties) LOAD_FUNCPTR(vkGetDeviceProcAddr) LOAD_FUNCPTR(vkGetInstanceProcAddr) - LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilities2KHR) LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceFormats2KHR) LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceFormatsKHR) @@ -462,19 +461,6 @@ static void *macdrv_vkGetInstanceProcAddr(VkInstance instance, const char *name) return pvkGetInstanceProcAddr(instance, name); }
-static VkResult macdrv_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice phys_dev, - const VkPhysicalDeviceSurfaceInfo2KHR *surface_info, VkSurfaceCapabilities2KHR *capabilities) -{ - VkPhysicalDeviceSurfaceInfo2KHR surface_info_host; - - TRACE("%p, %p, %p\n", phys_dev, surface_info, capabilities); - - surface_info_host = *surface_info; - surface_info_host.surface = surface_from_handle(surface_info->surface)->host_surface; - - return pvkGetPhysicalDeviceSurfaceCapabilities2KHR(phys_dev, &surface_info_host, capabilities); -} - static VkResult macdrv_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice phys_dev, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *capabilities) { @@ -575,7 +561,6 @@ static const struct vulkan_funcs vulkan_funcs = macdrv_vkGetDeviceProcAddr, macdrv_vkGetInstanceProcAddr, NULL, - macdrv_vkGetPhysicalDeviceSurfaceCapabilities2KHR, macdrv_vkGetPhysicalDeviceSurfaceCapabilitiesKHR, macdrv_vkGetPhysicalDeviceSurfaceFormats2KHR, macdrv_vkGetPhysicalDeviceSurfaceFormatsKHR, diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index e901a986609..4f77e5888ef 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -160,7 +160,7 @@ PERF_CRITICAL_FUNCTIONS = [ # Functions part of our winevulkan graphics driver interface. # DRIVER_VERSION should be bumped on any change to driver interface # in FUNCTION_OVERRIDES -DRIVER_VERSION = 14 +DRIVER_VERSION = 15
# Table of functions for which we have a special implementation. # These are regular device / instance functions for which we need @@ -204,7 +204,6 @@ USER_DRIVER_FUNCS = { "vkGetDeviceProcAddr", "vkGetInstanceProcAddr", "vkGetPhysicalDevicePresentRectanglesKHR", - "vkGetPhysicalDeviceSurfaceCapabilities2KHR", "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", "vkGetPhysicalDeviceSurfaceFormats2KHR", "vkGetPhysicalDeviceSurfaceFormatsKHR", diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index a4329f61c44..23d75899d0a 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1840,7 +1840,7 @@ VkResult wine_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice device &capabilities->surfaceCapabilities); }
- surface_info_host.surface = surface->driver_surface; + surface_info_host.surface = surface->host_surface;
if (!NtUserIsWindow(surface->hwnd)) return VK_ERROR_SURFACE_LOST_KHR; res = instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilities2KHR(physical_device->host_physical_device, diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 355270e14f8..93c95e86d2a 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -61,7 +61,6 @@ static VkResult (*pvkEnumerateInstanceExtensionProperties)(const char *, uint32_ static void * (*pvkGetDeviceProcAddr)(VkDevice, const char *); static void * (*pvkGetInstanceProcAddr)(VkInstance, const char *); static VkResult (*pvkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkRect2D *); -static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, VkSurfaceCapabilities2KHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, uint32_t *, VkSurfaceFormat2KHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *); @@ -549,34 +548,6 @@ static VkResult wayland_vkGetPhysicalDevicePresentRectanglesKHR(VkPhysicalDevice count, rects); }
-static VkResult wayland_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice phys_dev, - const VkPhysicalDeviceSurfaceInfo2KHR *surface_info, - VkSurfaceCapabilities2KHR *capabilities) -{ - struct wine_vk_surface *wine_vk_surface = wine_vk_surface_from_handle(surface_info->surface); - VkPhysicalDeviceSurfaceInfo2KHR surface_info_host; - - TRACE("%p, %p, %p\n", phys_dev, surface_info, capabilities); - - surface_info_host = *surface_info; - surface_info_host.surface = wine_vk_surface->host_surface; - - if (pvkGetPhysicalDeviceSurfaceCapabilities2KHR) - return pvkGetPhysicalDeviceSurfaceCapabilities2KHR(phys_dev, &surface_info_host, - capabilities); - - /* Until the loader version exporting this function is common, emulate it - * using the older non-2 version. */ - if (surface_info->pNext || capabilities->pNext) - { - FIXME("Emulating vkGetPhysicalDeviceSurfaceCapabilities2KHR with " - "vkGetPhysicalDeviceSurfaceCapabilitiesKHR, pNext is ignored.\n"); - } - - return pvkGetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev, surface_info_host.surface, - &capabilities->surfaceCapabilities); -} - static VkResult wayland_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice phys_dev, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *capabilities) @@ -705,7 +676,6 @@ static void wine_vk_init(void) LOAD_FUNCPTR(vkGetDeviceProcAddr); LOAD_FUNCPTR(vkGetInstanceProcAddr); LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDevicePresentRectanglesKHR); - LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilities2KHR); LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR); LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDeviceSurfaceFormats2KHR); LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceFormatsKHR); @@ -734,7 +704,6 @@ static const struct vulkan_funcs vulkan_funcs = .p_vkGetDeviceProcAddr = wayland_vkGetDeviceProcAddr, .p_vkGetInstanceProcAddr = wayland_vkGetInstanceProcAddr, .p_vkGetPhysicalDevicePresentRectanglesKHR = wayland_vkGetPhysicalDevicePresentRectanglesKHR, - .p_vkGetPhysicalDeviceSurfaceCapabilities2KHR = wayland_vkGetPhysicalDeviceSurfaceCapabilities2KHR, .p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = wayland_vkGetPhysicalDeviceSurfaceCapabilitiesKHR, .p_vkGetPhysicalDeviceSurfaceFormats2KHR = wayland_vkGetPhysicalDeviceSurfaceFormats2KHR, .p_vkGetPhysicalDeviceSurfaceFormatsKHR = wayland_vkGetPhysicalDeviceSurfaceFormatsKHR, diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 576c0788fc1..ef2bfe1378e 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -84,7 +84,6 @@ static VkResult (*pvkEnumerateInstanceExtensionProperties)(const char *, uint32_ static void * (*pvkGetDeviceProcAddr)(VkDevice, const char *); static void * (*pvkGetInstanceProcAddr)(VkInstance, const char *); static VkResult (*pvkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkRect2D *); -static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, VkSurfaceCapabilities2KHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, uint32_t *, VkSurfaceFormat2KHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *); @@ -123,7 +122,6 @@ static void wine_vk_init(void) LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties); LOAD_FUNCPTR(vkGetDeviceProcAddr); LOAD_FUNCPTR(vkGetInstanceProcAddr); - LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilities2KHR); LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR); LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDeviceSurfaceFormats2KHR); LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceFormatsKHR); @@ -509,25 +507,6 @@ static VkResult X11DRV_vkGetPhysicalDevicePresentRectanglesKHR(VkPhysicalDevice return pvkGetPhysicalDevicePresentRectanglesKHR( phys_dev, x11_surface->host_surface, count, rects ); }
-static VkResult X11DRV_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice phys_dev, - const VkPhysicalDeviceSurfaceInfo2KHR *surface_info, VkSurfaceCapabilities2KHR *capabilities) -{ - VkPhysicalDeviceSurfaceInfo2KHR surface_info_host; - TRACE("%p, %p, %p\n", phys_dev, surface_info, capabilities); - - surface_info_host = *surface_info; - surface_info_host.surface = surface_from_handle( surface_info->surface )->host_surface; - - if (pvkGetPhysicalDeviceSurfaceCapabilities2KHR) - return pvkGetPhysicalDeviceSurfaceCapabilities2KHR(phys_dev, &surface_info_host, capabilities); - - /* Until the loader version exporting this function is common, emulate it using the older non-2 version. */ - if (surface_info->pNext || capabilities->pNext) - FIXME("Emulating vkGetPhysicalDeviceSurfaceCapabilities2KHR with vkGetPhysicalDeviceSurfaceCapabilitiesKHR, pNext is ignored.\n"); - - return pvkGetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev, surface_info_host.surface, &capabilities->surfaceCapabilities); -} - static VkResult X11DRV_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice phys_dev, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *capabilities) { @@ -655,7 +634,6 @@ static const struct vulkan_funcs vulkan_funcs = X11DRV_vkGetDeviceProcAddr, X11DRV_vkGetInstanceProcAddr, X11DRV_vkGetPhysicalDevicePresentRectanglesKHR, - X11DRV_vkGetPhysicalDeviceSurfaceCapabilities2KHR, X11DRV_vkGetPhysicalDeviceSurfaceCapabilitiesKHR, X11DRV_vkGetPhysicalDeviceSurfaceFormats2KHR, X11DRV_vkGetPhysicalDeviceSurfaceFormatsKHR, diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 7e2e2e5ea70..0f3213b0eb2 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -13,7 +13,7 @@ #define __WINE_VULKAN_DRIVER_H
/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ -#define WINE_VULKAN_DRIVER_VERSION 14 +#define WINE_VULKAN_DRIVER_VERSION 15
struct vulkan_funcs { @@ -31,7 +31,6 @@ struct vulkan_funcs void * (*p_vkGetDeviceProcAddr)(VkDevice, const char *); void * (*p_vkGetInstanceProcAddr)(VkInstance, const char *); VkResult (*p_vkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkRect2D *); - VkResult (*p_vkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, VkSurfaceCapabilities2KHR *); VkResult (*p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *); VkResult (*p_vkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, uint32_t *, VkSurfaceFormat2KHR *); VkResult (*p_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *); @@ -88,8 +87,6 @@ static inline void *get_vulkan_driver_instance_proc_addr( return vulkan_funcs->p_vkGetInstanceProcAddr; if (!strcmp(name, "GetPhysicalDevicePresentRectanglesKHR")) return vulkan_funcs->p_vkGetPhysicalDevicePresentRectanglesKHR; - if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilities2KHR")) - return vulkan_funcs->p_vkGetPhysicalDeviceSurfaceCapabilities2KHR; if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilitiesKHR")) return vulkan_funcs->p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR; if (!strcmp(name, "GetPhysicalDeviceSurfaceFormats2KHR"))
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winemac.drv/vulkan.c | 14 -------------- dlls/winevulkan/make_vulkan | 3 +-- dlls/winevulkan/vulkan.c | 4 ++-- dlls/winewayland.drv/vulkan.c | 15 --------------- dlls/winex11.drv/vulkan.c | 16 ---------------- include/wine/vulkan_driver.h | 5 +---- 6 files changed, 4 insertions(+), 53 deletions(-)
diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index f5f8dc28a22..bf0d66a30c0 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -86,7 +86,6 @@ static VkResult (*pvkEnumerateInstanceExtensionProperties)(const char *, uint32_ static void * (*pvkGetDeviceProcAddr)(VkDevice, const char *); static void * (*pvkGetInstanceProcAddr)(VkInstance, const char *); static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, VkSurfaceCapabilities2KHR *); -static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, uint32_t *, VkSurfaceFormat2KHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *); static VkResult (*pvkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); @@ -121,7 +120,6 @@ static void wine_vk_init(void) LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties) LOAD_FUNCPTR(vkGetDeviceProcAddr) LOAD_FUNCPTR(vkGetInstanceProcAddr) - LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceFormats2KHR) LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceFormatsKHR) LOAD_FUNCPTR(vkGetSwapchainImagesKHR) @@ -461,17 +459,6 @@ static void *macdrv_vkGetInstanceProcAddr(VkInstance instance, const char *name) return pvkGetInstanceProcAddr(instance, name); }
-static VkResult macdrv_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice phys_dev, - VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *capabilities) -{ - struct wine_vk_surface *mac_surface = surface_from_handle(surface); - - TRACE("%p, 0x%s, %p\n", phys_dev, wine_dbgstr_longlong(surface), capabilities); - - return pvkGetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev, mac_surface->host_surface, - capabilities); -} - static VkResult macdrv_vkGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice phys_dev, const VkPhysicalDeviceSurfaceInfo2KHR *surface_info, uint32_t *count, VkSurfaceFormat2KHR *formats) { @@ -561,7 +548,6 @@ static const struct vulkan_funcs vulkan_funcs = macdrv_vkGetDeviceProcAddr, macdrv_vkGetInstanceProcAddr, NULL, - macdrv_vkGetPhysicalDeviceSurfaceCapabilitiesKHR, macdrv_vkGetPhysicalDeviceSurfaceFormats2KHR, macdrv_vkGetPhysicalDeviceSurfaceFormatsKHR, macdrv_vkGetPhysicalDeviceWin32PresentationSupportKHR, diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 4f77e5888ef..6aa21e376c2 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -160,7 +160,7 @@ PERF_CRITICAL_FUNCTIONS = [ # Functions part of our winevulkan graphics driver interface. # DRIVER_VERSION should be bumped on any change to driver interface # in FUNCTION_OVERRIDES -DRIVER_VERSION = 15 +DRIVER_VERSION = 16
# Table of functions for which we have a special implementation. # These are regular device / instance functions for which we need @@ -204,7 +204,6 @@ USER_DRIVER_FUNCS = { "vkGetDeviceProcAddr", "vkGetInstanceProcAddr", "vkGetPhysicalDevicePresentRectanglesKHR", - "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", "vkGetPhysicalDeviceSurfaceFormats2KHR", "vkGetPhysicalDeviceSurfaceFormatsKHR", "vkGetPhysicalDeviceWin32PresentationSupportKHR", diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 23d75899d0a..89e9d19bc10 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1510,7 +1510,7 @@ VkResult wine_vkCreateSwapchainKHR(VkDevice device_handle, const VkSwapchainCrea
/* Windows allows client rect to be empty, but host Vulkan often doesn't, adjust extents back to the host capabilities */ res = instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device->host_physical_device, - surface->driver_surface, &capabilities); + surface->host_surface, &capabilities); if (res != VK_SUCCESS) return res;
create_info_host.imageExtent.width = max(create_info_host.imageExtent.width, capabilities.minImageExtent.width); @@ -1818,7 +1818,7 @@ VkResult wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice device_
if (!NtUserIsWindow(surface->hwnd)) return VK_ERROR_SURFACE_LOST_KHR; res = instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device->host_physical_device, - surface->driver_surface, capabilities); + surface->host_surface, capabilities); if (res == VK_SUCCESS) adjust_surface_capabilities(instance, surface, capabilities); return res; } diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 93c95e86d2a..2ebe5be5641 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -61,7 +61,6 @@ static VkResult (*pvkEnumerateInstanceExtensionProperties)(const char *, uint32_ static void * (*pvkGetDeviceProcAddr)(VkDevice, const char *); static void * (*pvkGetInstanceProcAddr)(VkInstance, const char *); static VkResult (*pvkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkRect2D *); -static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, uint32_t *, VkSurfaceFormat2KHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *); static VkBool32 (*pvkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice, uint32_t, struct wl_display *); @@ -548,18 +547,6 @@ static VkResult wayland_vkGetPhysicalDevicePresentRectanglesKHR(VkPhysicalDevice count, rects); }
-static VkResult wayland_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice phys_dev, - VkSurfaceKHR surface, - VkSurfaceCapabilitiesKHR *capabilities) -{ - struct wine_vk_surface *wine_vk_surface = wine_vk_surface_from_handle(surface); - - TRACE("%p, 0x%s, %p\n", phys_dev, wine_dbgstr_longlong(surface), capabilities); - - return pvkGetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev, wine_vk_surface->host_surface, - capabilities); -} - static VkResult wayland_vkGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice phys_dev, const VkPhysicalDeviceSurfaceInfo2KHR *surface_info, uint32_t *count, @@ -676,7 +663,6 @@ static void wine_vk_init(void) LOAD_FUNCPTR(vkGetDeviceProcAddr); LOAD_FUNCPTR(vkGetInstanceProcAddr); LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDevicePresentRectanglesKHR); - LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR); LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDeviceSurfaceFormats2KHR); LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceFormatsKHR); LOAD_FUNCPTR(vkGetPhysicalDeviceWaylandPresentationSupportKHR); @@ -704,7 +690,6 @@ static const struct vulkan_funcs vulkan_funcs = .p_vkGetDeviceProcAddr = wayland_vkGetDeviceProcAddr, .p_vkGetInstanceProcAddr = wayland_vkGetInstanceProcAddr, .p_vkGetPhysicalDevicePresentRectanglesKHR = wayland_vkGetPhysicalDevicePresentRectanglesKHR, - .p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = wayland_vkGetPhysicalDeviceSurfaceCapabilitiesKHR, .p_vkGetPhysicalDeviceSurfaceFormats2KHR = wayland_vkGetPhysicalDeviceSurfaceFormats2KHR, .p_vkGetPhysicalDeviceSurfaceFormatsKHR = wayland_vkGetPhysicalDeviceSurfaceFormatsKHR, .p_vkGetPhysicalDeviceWin32PresentationSupportKHR = wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR, diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index ef2bfe1378e..d812d9e8972 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -84,7 +84,6 @@ static VkResult (*pvkEnumerateInstanceExtensionProperties)(const char *, uint32_ static void * (*pvkGetDeviceProcAddr)(VkDevice, const char *); static void * (*pvkGetInstanceProcAddr)(VkInstance, const char *); static VkResult (*pvkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkRect2D *); -static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, uint32_t *, VkSurfaceFormat2KHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *); static VkBool32 (*pvkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice, uint32_t, Display *, VisualID); @@ -122,7 +121,6 @@ static void wine_vk_init(void) LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties); LOAD_FUNCPTR(vkGetDeviceProcAddr); LOAD_FUNCPTR(vkGetInstanceProcAddr); - LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR); LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDeviceSurfaceFormats2KHR); LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceFormatsKHR); LOAD_FUNCPTR(vkGetPhysicalDeviceXlibPresentationSupportKHR); @@ -507,19 +505,6 @@ static VkResult X11DRV_vkGetPhysicalDevicePresentRectanglesKHR(VkPhysicalDevice return pvkGetPhysicalDevicePresentRectanglesKHR( phys_dev, x11_surface->host_surface, count, rects ); }
-static VkResult X11DRV_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice phys_dev, - VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *capabilities) -{ - struct wine_vk_surface *x11_surface = surface_from_handle(surface); - - TRACE("%p, 0x%s, %p\n", phys_dev, wine_dbgstr_longlong(surface), capabilities); - - if (!x11_surface->hwnd) - return VK_ERROR_SURFACE_LOST_KHR; - - return pvkGetPhysicalDeviceSurfaceCapabilitiesKHR( phys_dev, x11_surface->host_surface, capabilities ); -} - static VkResult X11DRV_vkGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice phys_dev, const VkPhysicalDeviceSurfaceInfo2KHR *surface_info, uint32_t *count, VkSurfaceFormat2KHR *formats) { @@ -634,7 +619,6 @@ static const struct vulkan_funcs vulkan_funcs = X11DRV_vkGetDeviceProcAddr, X11DRV_vkGetInstanceProcAddr, X11DRV_vkGetPhysicalDevicePresentRectanglesKHR, - X11DRV_vkGetPhysicalDeviceSurfaceCapabilitiesKHR, X11DRV_vkGetPhysicalDeviceSurfaceFormats2KHR, X11DRV_vkGetPhysicalDeviceSurfaceFormatsKHR, X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR, diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 0f3213b0eb2..6cb179fa5e0 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -13,7 +13,7 @@ #define __WINE_VULKAN_DRIVER_H
/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ -#define WINE_VULKAN_DRIVER_VERSION 15 +#define WINE_VULKAN_DRIVER_VERSION 16
struct vulkan_funcs { @@ -31,7 +31,6 @@ struct vulkan_funcs void * (*p_vkGetDeviceProcAddr)(VkDevice, const char *); void * (*p_vkGetInstanceProcAddr)(VkInstance, const char *); VkResult (*p_vkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkRect2D *); - VkResult (*p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *); VkResult (*p_vkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, uint32_t *, VkSurfaceFormat2KHR *); VkResult (*p_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *); VkBool32 (*p_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice, uint32_t); @@ -87,8 +86,6 @@ static inline void *get_vulkan_driver_instance_proc_addr( return vulkan_funcs->p_vkGetInstanceProcAddr; if (!strcmp(name, "GetPhysicalDevicePresentRectanglesKHR")) return vulkan_funcs->p_vkGetPhysicalDevicePresentRectanglesKHR; - if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilitiesKHR")) - return vulkan_funcs->p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR; if (!strcmp(name, "GetPhysicalDeviceSurfaceFormats2KHR")) return vulkan_funcs->p_vkGetPhysicalDeviceSurfaceFormats2KHR; if (!strcmp(name, "GetPhysicalDeviceSurfaceFormatsKHR"))
The idea here is to factor the WSI workarounds that are implemented in the graphics drivers into winevulkan. Wrapping the swapchain handles should be fine now that winevulkan code generator handles the driver/host handle unwrapping correctly. Most of the changes in the first patch is generated code.
While I agree that wrapping swapchains outside drivers and handling more there is the right direction, I think this deserves some consideration where to do that. The alternative would be doing that in win32u. Giving win32u the ability to manage swapchains seems interesting for things like a compositor in the future, where win32u may want to interfere more (or even take a full driver-independent control in cases like child window rendering) in swapchains. It also gives swapchains access to win32u internals.
If we'd indeed want to do that, then another layer of wrapping in winevulkan becomes redundant. One way to implement it (not the only one and I'm not saying it's the best one) would be to intercept driver `vulkan_functions` in `__wine_get_vulkan_driver` and chain some of those calls. If we wanted something like that, we'd need to revert a good chunk of this MR, so I'd be interested in your opinion on above.
Yes, I also think that some things will need to be moved to win32u, but it's not completely clear how this would be done yet. In any case I'm not completely sure that this means that the MR would need to be reverted.
My current view is that anything WSI compatibility code belongs to winevulkan, as it acts as the actual vulkan driver. Code in win32u/user drivers would be more about integration with the host. With that in mind, surface extents fixups better belong to winevulkan than in win32u or the user drivers.
For future development, and for instance to implement this compositing idea, I'm not completely sure that this should be done on the vulkan level directly, and maybe instead it should use a different one (say D3DKMT*) that would work with other APIs too, and that would be what win32u would expose and implement.
Alternatively, maybe we could expose winevulkan wrapper structures in wine/gdi_driver.h, making them usable for win32u / user drivers and avoid having to wrap them again.
My current view is that anything WSI compatibility code belongs to winevulkan, as it acts as the actual vulkan driver.
I think that the claim that it acts as the actual driver is ambiguous, it all depends on how you define a driver. Yes, winevulkan.dll acts as Vulkan driver from PE Vulkan loader's point of view. Its implementation is different than conventional Vulkan ICDs as we go straight into syscalls (well, Unix calls) and the whole implementation is in kernel (well, Unix libs). On kernel side, winevulkan.so acts currently as ABI translator, it exposes client interface and passes that to the driver. Calling winevulkan.so itself a driver is not quite right. If anything winex11.so is more of a driver than winevulkan.so.
Now, winevulkan.so forwards calls to whatever it gets from win32u. In that sense, the fact that it's forwarded further to winex11.so is already abstracted from winevulkan. As far as winevulkan is concerned it already is win32u that provides the functionality.
In other words implementing Window System Integration in a module that implements window system (win32u) feels right to me.
And yes, we will want more of D3DKMT for the client interface. I imagine this will be useful for dxgi/wined3d/dwm etc, but we already have a dedicated interface for Vulkan. winevulkan.so is already on "kernel" side and already has a dedicated win32u interface, we may as well use it more.
In any case I'm not completely sure that this means that the MR would need to be reverted.
Wrapping swapchains in winevulkan.so could most likely be removed once we have win32u-side swapchains. Depending on implementation details, we may need to reintroduce some driver entry points.
I don't know, I feel that we don't really need all these layers? I would be fine with moving WSI compat code to win32u, it was only that for the moment we only have either winevulkan wrapping, or driver wrapping, and the only common place for code is in winevulkan.
If we want to wrap swapchains in win32u as well, we'd need to make that replace the winevulkan wrapping, or the driver wrapping, or introduce a third layer which doesn't look like a good idea.
So, alternatively we could either 1) move the "driver wrapping" to win32u somehow, sharing the wrapped structures between win32u and the user drivers, but some drivers store different data there, so would need a way to tell win32u to allocate the right size. Or, 2) we could move winevulkan wrapping there instead, which might be a bit more complicated. Or, 3) we could share winevulkan wrapped structures between winevulkan and win32u. Or 4) share the wrapped structures between all three layers somehow and get rid of the driver-level wrapping, still has the same problem as 1).
Another thing that might get annoying if we intend to do more things with the wrapped swapchains in win32u, is that we don't have access to all the things winevulkan keeps track of, such as the full `swapchain -> surface -> device -> phys_dev -> instance` chain, which might be important to have.
Right now for this MR specifically it already becomes an issue, as we cannot get a physical device to call `vkGetPhysicalDeviceSurfaceCapabilitiesKHR` from `vkCreateSwapchainKHR`.
I can probably do this MR in win32u but I have the feeling that wrapping swapchains, even with compositing in mind, will be better in winevulkan anyway.
As winevulkan already links with win32u it'll be easier to export some functions from win32u for winevulkan to use them to implement compositing than the other way around if we need to access any other related structures such as the surface's device, physical device and so on.
I don't think we should see winevulkan unix side and win32u unix side as truly separate things, they both implement the kernel-side of some part of the window graphics stack, but unless we want to merge all of winevulkan unix side into win32u, they have to be split.
Imo the same thing would go with the opengl driver, as even if it is simpler -we don't wrap so many things- you can see for now every single GL function has to be exposed from the win32u driver to opengl. I think we could move that to be more contained in opengl32.so, with a smaller interface between opengl and win32u.
This merge request was approved by Jacek Caban.
While extending winevulkan<->win32u Unix interface is easy, I'm not convinced it's better long term. There are things that simply can be better inside win32u. For example, surface tracking: instead of a combination of `NtUserIsWindow` in winevulkan and drivers tracking windows and threads destruction, we could properly track it in window object, etc.
But yeah, things like tracking swapchain's physical device would need even more wrapping in win32u, so maybe when the time comes, it will make sense to just move majority of current `winevulkan/vulkan.c` to win32u. Anyway, it's nice to move more things out of drivers, I approved the MR.