This allows 32-bit DXVK games (like NFS Underground) to work again after the recent Vulkan changes.
From: Aida Jonikienė aidas957@gmail.com
32-bit DXVK doesn't find the surface creation function without this. --- dlls/winevulkan/vulkan.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index f6de197f720..61b3a42d63f 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -2144,8 +2144,14 @@ NTSTATUS vk_is_available_instance_function32(void *arg) UINT32 instance; UINT32 name; } *params = arg; - struct vulkan_instance *instance = vulkan_instance_from_handle(UlongToPtr(params->instance)); - return !!vk_funcs->p_vkGetInstanceProcAddr(instance->host.instance, UlongToPtr(params->name)); + struct wine_instance *instance = wine_instance_from_handle(UlongToPtr(params->instance)); + + if (!strcmp(UlongToPtr(params->name), "vkCreateWin32SurfaceKHR")) + return instance->enable_win32_surface; + if (!strcmp(UlongToPtr(params->name), "vkGetPhysicalDeviceWin32PresentationSupportKHR")) + return instance->enable_win32_surface; + + return !!vk_funcs->p_vkGetInstanceProcAddr(instance->obj.host.instance, UlongToPtr(params->name)); }
NTSTATUS vk_is_available_device_function32(void *arg)
From: Aida Jonikienė aidas957@gmail.com
The alignment of some Vulkan structs doesn't match the winevulkan Unix library otherwise (causing strange segfaults on 32-bit). --- dlls/win32u/vulkan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index ae6ab974a53..b4304ddc407 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -30,10 +30,10 @@ #include "ntstatus.h" #define WIN32_NO_STATUS #include "win32u_private.h" -#include "ntuser_private.h"
#define VK_NO_PROTOTYPES #define WINE_VK_HOST +#include "ntuser_private.h" #include "wine/vulkan.h" #include "wine/vulkan_driver.h"
Rémi Bernon (@rbernon) commented about dlls/win32u/vulkan.c:
#include "ntstatus.h" #define WIN32_NO_STATUS #include "win32u_private.h" -#include "ntuser_private.h"
#define VK_NO_PROTOTYPES #define WINE_VK_HOST +#include "ntuser_private.h"
We should probably move these to `ntuser_private.h`, instead of including `wine/vulkan.h`: ``` #define VK_NO_PROTOTYPES #define WINE_VK_HOST #include "wine/vulkan.h" #include "wine/vulkan_driver.h" ```
And then remove it from `win32u/vulkan.c` and from `win32u/d3dkmt.c`
On Tue Dec 3 11:38:23 2024 +0000, Rémi Bernon wrote:
We should probably move these to `ntuser_private.h`, instead of including `wine/vulkan.h`:
#define VK_NO_PROTOTYPES #define WINE_VK_HOST #include "wine/vulkan.h" #include "wine/vulkan_driver.h"
And then remove it from `win32u/vulkan.c` and from `win32u/d3dkmt.c`
I was thinking about getting rid of `WINE_VK_HOST` and using `WINE_UNIX_LIB` in `vulkan.h` instead. We could also default to no prototypes for unixlibs too.