This allows 32-bit DXVK games (like NFS Underground) to work again after the recent Vulkan changes.
-- v3: win32u: Make sure some Vulkan defines get defined.
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/d3dkmt.c | 2 -- dlls/win32u/ntuser_private.h | 4 ++++ dlls/win32u/vulkan.c | 5 ----- 3 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 15b0b870b56..24a668a85b4 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -29,8 +29,6 @@ #include "ntgdi_private.h" #include "win32u_private.h" #include "ntuser_private.h" -#include "wine/vulkan.h" -#include "wine/vulkan_driver.h"
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h index 6cc47dcada4..bef1ab0bcfa 100644 --- a/dlls/win32u/ntuser_private.h +++ b/dlls/win32u/ntuser_private.h @@ -26,7 +26,11 @@ #include "shellapi.h" #include "shlobj.h" #include "wine/list.h" + +#define VK_NO_PROTOTYPES +#define WINE_VK_HOST #include "wine/vulkan.h" +#include "wine/vulkan_driver.h"
#define WM_POPUPSYSTEMMENU 0x0313 diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index ae6ab974a53..c676ae10e54 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -32,11 +32,6 @@ #include "win32u_private.h" #include "ntuser_private.h"
-#define VK_NO_PROTOTYPES -#define WINE_VK_HOST -#include "wine/vulkan.h" -#include "wine/vulkan_driver.h" - WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
PFN_vkGetDeviceProcAddr p_vkGetDeviceProcAddr = NULL;
On Tue Dec 3 11:58:23 2024 +0000, Jacek Caban wrote:
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.
I moved the Vulkan defines to a common place
On Tue Dec 3 13:19:17 2024 +0000, Aida Jonikienė wrote:
I moved the Vulkan defines to a common place
Would you mind updating the MR to https://gitlab.winehq.org/rbernon/wine/-/commit/405484e1dae6681150998de20f1c... to implement what @jacek is suggesting?