From 95ebcfa0829ef94171e7a206769455a281ea0b36 Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Fri, 29 Sep 2023 16:39:51 +0100 Subject: [PATCH 1/4] Revert "include: Don't align the stack for PE builds." This reverts commit 87fbf3305fe733b475a1f907a730f40b4823424b. We saw hangs in Phasmophobia with the commit, and then discovered this commit is not strictly necessary for ntlea, so we revert it. --- include/msvcrt/corecrt.h | 9 ++++++--- include/windef.h | 23 ++++++++++++++--------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/include/msvcrt/corecrt.h b/include/msvcrt/corecrt.h index 4ddea3edb1e3..aba9bc9422e7 100644 --- a/include/msvcrt/corecrt.h +++ b/include/msvcrt/corecrt.h @@ -82,7 +82,7 @@ #define __has_attribute(x) 0 #endif -#if !defined(_MSC_VER) && !defined(__MINGW32__) +#ifndef _MSC_VER # undef __stdcall # ifdef __i386__ # ifdef __GNUC__ @@ -100,13 +100,16 @@ # else # define __stdcall __attribute__((ms_abi)) # endif -# elif defined(__arm__) && defined (__GNUC__) && !defined(__SOFTFP__) && !defined(__CYGWIN__) +# elif defined(__arm__) && defined (__GNUC__) && !defined(__SOFTFP__) && !defined(__MINGW32__) && !defined(__CYGWIN__) # define __stdcall __attribute__((pcs("aapcs-vfp"))) # elif defined(__aarch64__) && defined (__GNUC__) && __has_attribute(ms_abi) # define __stdcall __attribute__((ms_abi)) # else /* __i386__ */ # define __stdcall # endif /* __i386__ */ +#endif /* __stdcall */ + +#ifndef _MSC_VER # undef __cdecl # if defined(__i386__) && defined(__GNUC__) # if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 2)) || defined(__APPLE__) @@ -117,7 +120,7 @@ # else # define __cdecl __stdcall # endif -#endif /* _MSC_VER || __MINGW32__ */ +#endif #if (defined(__x86_64__) || (defined(__aarch64__) && __has_attribute(ms_abi))) && defined (__GNUC__) # include diff --git a/include/windef.h b/include/windef.h index 827e9f92a268..cb7eb1179c88 100644 --- a/include/windef.h +++ b/include/windef.h @@ -54,7 +54,7 @@ extern "C" { # endif #endif -#if !defined(_MSC_VER) && !defined(__MINGW32__) +#ifndef _MSC_VER # undef __stdcall # ifdef __i386__ # ifdef __GNUC__ @@ -72,13 +72,16 @@ extern "C" { # else # define __stdcall __attribute__((ms_abi)) # endif -# elif defined(__arm__) && defined (__GNUC__) && !defined(__SOFTFP__) && !defined(__CYGWIN__) +# elif defined(__arm__) && defined (__GNUC__) && !defined(__SOFTFP__) && !defined(__MINGW32__) && !defined(__CYGWIN__) # define __stdcall __attribute__((pcs("aapcs-vfp"))) # elif defined(__aarch64__) && defined (__GNUC__) && __has_attribute(ms_abi) # define __stdcall __attribute__((ms_abi)) # else /* __i386__ */ # define __stdcall # endif /* __i386__ */ +#endif /* __stdcall */ + +#ifndef _MSC_VER # undef __cdecl # if defined(__i386__) && defined(__GNUC__) # if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 2)) || defined(__APPLE__) @@ -89,13 +92,15 @@ extern "C" { # else # define __cdecl __stdcall # endif -# ifndef __fastcall -# define __fastcall __stdcall -# endif -# ifndef __thiscall -# define __thiscall __stdcall -# endif -#endif /* _MSC_VER || __MINGW32__ */ +#endif + +#if !defined(_MSC_VER) && !defined(__fastcall) +# define __fastcall __stdcall +#endif + +#if (!defined(_MSC_VER) || !defined(__clang__)) && !defined(__thiscall) +# define __thiscall __stdcall +#endif #ifndef __ms_va_list # if (defined(__x86_64__) || (defined(__aarch64__) && __has_attribute(ms_abi))) && defined (__GNUC__) From 7fceaf7dbf043e2afc4901980eaa4d8c526949d9 Mon Sep 17 00:00:00 2001 From: Kai Krakow Date: Sat, 2 Sep 2023 23:00:29 +0200 Subject: [PATCH 2/4] winebus.sys: Also pass axis and button count to is_hidraw_enabled() This is useful to detect some devices which do not have a well-known PID set. Link: https://github.com/ValveSoftware/Proton/issues/6839#issuecomment-1703856375 --- dlls/winebus.sys/bus_udev.c | 11 +++++------ dlls/winebus.sys/unix_private.h | 2 +- dlls/winebus.sys/unixlib.c | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c index d3c4b7059682..5da979c6c5a5 100644 --- a/dlls/winebus.sys/bus_udev.c +++ b/dlls/winebus.sys/bus_udev.c @@ -1622,6 +1622,7 @@ static void udev_add_device(struct udev_device *dev, int fd) const char *subsystem; const char *devnode; int bus = 0; + int axes = -1, buttons = -1; if (!(devnode = udev_device_get_devnode(dev))) { @@ -1644,6 +1645,9 @@ static void udev_add_device(struct udev_device *dev, int fd) close(fd); return; } + + axes = count_abs_axis(fd); + buttons = count_buttons(fd, NULL); #endif get_device_subsystem_info(dev, "hid", &desc, &bus); @@ -1697,7 +1701,7 @@ static void udev_add_device(struct udev_device *dev, int fd) memcpy(desc.serialnumber, zeros, sizeof(zeros)); } - if (!is_hidraw_enabled(desc.vid, desc.pid)) + if (!is_hidraw_enabled(desc.vid, desc.pid, axes, buttons)) { TRACE("hidraw %s: deferring %s to a different backend\n", debugstr_a(devnode), debugstr_device_desc(&desc)); close(fd); @@ -1712,12 +1716,7 @@ static void udev_add_device(struct udev_device *dev, int fd) } #ifdef HAS_PROPER_INPUT_HEADER else - { - int axes=0, buttons=0; - axes = count_abs_axis(fd); - buttons = count_buttons(fd, NULL); desc.is_gamepad = (axes == 6 && buttons >= 14); - } #endif TRACE("dev %p, node %s, desc %s.\n", dev, debugstr_a(devnode), debugstr_device_desc(&desc)); diff --git a/dlls/winebus.sys/unix_private.h b/dlls/winebus.sys/unix_private.h index 87c3d4ad626e..4e2b943e9790 100644 --- a/dlls/winebus.sys/unix_private.h +++ b/dlls/winebus.sys/unix_private.h @@ -271,6 +271,6 @@ BOOL is_wine_blacklisted(WORD vid, WORD pid) DECLSPEC_HIDDEN; BOOL is_dualshock4_gamepad(WORD vid, WORD pid) DECLSPEC_HIDDEN; BOOL is_dualsense_gamepad(WORD vid, WORD pid) DECLSPEC_HIDDEN; BOOL is_logitech_g920(WORD vid, WORD pid) DECLSPEC_HIDDEN; -BOOL is_hidraw_enabled(WORD vid, WORD pid) DECLSPEC_HIDDEN; +BOOL is_hidraw_enabled(WORD vid, WORD pid, INT axes, INT buttons) DECLSPEC_HIDDEN; #endif /* __WINEBUS_UNIX_PRIVATE_H */ diff --git a/dlls/winebus.sys/unixlib.c b/dlls/winebus.sys/unixlib.c index d4adc78f6ec1..cbfc13cf578a 100644 --- a/dlls/winebus.sys/unixlib.c +++ b/dlls/winebus.sys/unixlib.c @@ -105,7 +105,7 @@ static BOOL is_fanatec_pedals(WORD vid, WORD pid) return FALSE; } -BOOL is_hidraw_enabled(WORD vid, WORD pid) +BOOL is_hidraw_enabled(WORD vid, WORD pid, INT axes, INT buttons) { const char *enabled = getenv("PROTON_ENABLE_HIDRAW"); char needle[16]; From d0ce7e808eeda697850c019cf226c59ba7ec787c Mon Sep 17 00:00:00 2001 From: Kai Krakow Date: Tue, 29 Aug 2023 19:09:31 +0200 Subject: [PATCH 3/4] winebus.sys: Enable hidraw for VKB Gladiator NXT EVO. These devices ship with 128 buttons by default. For game compatibility, the VKB Windows app can be used to change the HID descriptor to show only 32 buttons and have up to 4 virtual devices instead. These devices can also show up as a mouse or keyboard and send proper HID events for that configuration - not tested with this commit. The Linux input layer gets really confused by these devices as the HID descriptor spans multiple ranges of different device type event codes. Hopefully, winebus.sys hidraw mode can work around this. Also needs udev rules to enable hidraw access. Known limits: - Elite Dangerous: 32 buttons - Star Citizen: 50 buttons - some other games: 64 buttons Signed-off-by: Kai Krakow --- dlls/winebus.sys/unixlib.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/dlls/winebus.sys/unixlib.c b/dlls/winebus.sys/unixlib.c index cbfc13cf578a..32c1f9a00d9f 100644 --- a/dlls/winebus.sys/unixlib.c +++ b/dlls/winebus.sys/unixlib.c @@ -105,6 +105,19 @@ static BOOL is_fanatec_pedals(WORD vid, WORD pid) return FALSE; } +static BOOL is_vkb_controller(WORD vid, WORD pid, INT buttons) +{ + if (vid != 0x231D) return FALSE; + + /* comes with 128 buttons in the default configuration */ + if (buttons == 128) return TRUE; + + /* if customized, less than 128 buttons may be shown, decide by PID */ + if (pid == 0x0200) return TRUE; /* VKBsim Gladiator EVO Right Grip */ + if (pid == 0x0201) return TRUE; /* VKBsim Gladiator EVO Left Grip */ + return FALSE; +} + BOOL is_hidraw_enabled(WORD vid, WORD pid, INT axes, INT buttons) { const char *enabled = getenv("PROTON_ENABLE_HIDRAW"); @@ -115,6 +128,7 @@ BOOL is_hidraw_enabled(WORD vid, WORD pid, INT axes, INT buttons) if (is_thrustmaster_hotas(vid, pid)) return TRUE; if (is_simucube_wheel(vid, pid)) return TRUE; if (is_fanatec_pedals(vid, pid)) return TRUE; + if (is_vkb_controller(vid, pid, buttons)) return TRUE; sprintf(needle, "0x%04x/0x%04x", vid, pid); if (enabled) return strcasestr(enabled, needle) != NULL; From d324c522de913f70c83747c8675da2b5998a5352 Mon Sep 17 00:00:00 2001 From: Kai Krakow Date: Fri, 1 Sep 2023 05:12:21 +0200 Subject: [PATCH 4/4] winebus.sys: Enable hidraw for Virpil Constellation ALPHA-R. Fixes: https://github.com/ValveSoftware/Proton/issues/6839 --- dlls/winebus.sys/unixlib.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dlls/winebus.sys/unixlib.c b/dlls/winebus.sys/unixlib.c index 32c1f9a00d9f..1e08f4a1eadf 100644 --- a/dlls/winebus.sys/unixlib.c +++ b/dlls/winebus.sys/unixlib.c @@ -118,6 +118,18 @@ static BOOL is_vkb_controller(WORD vid, WORD pid, INT buttons) return FALSE; } +static BOOL is_virpil_controller(WORD vid, WORD pid, INT buttons) +{ + if (vid != 0x3344) return FALSE; + + /* comes with 31 buttons in the default configuration, or 128 max */ + if ((buttons == 31) || (buttons == 128)) return TRUE; + + /* if customized, arbitrary amount of buttons may be shown, decide by PID */ + if (pid == 0x412f) return TRUE; /* Virpil Constellation ALPHA-R */ + return FALSE; +} + BOOL is_hidraw_enabled(WORD vid, WORD pid, INT axes, INT buttons) { const char *enabled = getenv("PROTON_ENABLE_HIDRAW"); @@ -129,6 +141,7 @@ BOOL is_hidraw_enabled(WORD vid, WORD pid, INT axes, INT buttons) if (is_simucube_wheel(vid, pid)) return TRUE; if (is_fanatec_pedals(vid, pid)) return TRUE; if (is_vkb_controller(vid, pid, buttons)) return TRUE; + if (is_virpil_controller(vid, pid, buttons)) return TRUE; sprintf(needle, "0x%04x/0x%04x", vid, pid); if (enabled) return strcasestr(enabled, needle) != NULL;