Skip to content

Commit

Permalink
create stable 5.9 branch
Browse files Browse the repository at this point in the history
  • Loading branch information
GloriousEggroll committed Jul 6, 2020
1 parent b57fa33 commit 6e7fcc3
Show file tree
Hide file tree
Showing 53 changed files with 57,957 additions and 3 deletions.
3,713 changes: 3,713 additions & 0 deletions patches/game-patches/gofman_dac.patch

Large diffs are not rendered by default.

77 changes: 77 additions & 0 deletions patches/proton-5.9/proton-FS_bypass_compositor.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
From 141ba5cf73029029a5a0bd2cdcfd5f9f9ab7ee7b Mon Sep 17 00:00:00 2001
From: Kai Krakow <kai@kaishome.de>
Date: Thu, 4 Oct 2018 05:51:20 +0200
Subject: [PATCH] winex11.drv: Bypass compositor in fullscreen mode

Bypass the compositor in fullscreen mode. This reduces stutter
introduced by window updates in the background and also allows for maybe
a few more FPS. To not change the visual appearance of the desktop for
windowed games, this hack only enables itself when the game was switched
to fullscreen mode, and returns to default WM setting when the game
leaves fullscreen mode.

Compositors tend to cause severe stutter if the game is GPU-bound.
---
dlls/winex11.drv/window.c | 8 +++++++
dlls/winex11.drv/x11drv.h | 1 +
dlls/winex11.drv/x11drv_main.c | 1 +
3 files changed, 9 insertions(+)

diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 8256749a8d..ec29e875d2 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -985,6 +985,7 @@ void update_user_time( Time time )
void update_net_wm_states( struct x11drv_win_data *data )
{
DWORD i, style, ex_style, new_state = 0;
+ unsigned long net_wm_bypass_compositor = 0;

if (!data->managed) return;
if (data->whole_window == root_window) return;
@@ -997,7 +998,10 @@ void update_net_wm_states( struct x11drv_win_data *data )
if ((style & WS_MAXIMIZE) && (style & WS_CAPTION) == WS_CAPTION)
new_state |= (1 << NET_WM_STATE_MAXIMIZED);
else if (!(style & WS_MINIMIZE))
+ {
+ net_wm_bypass_compositor = 1;
new_state |= (1 << NET_WM_STATE_FULLSCREEN);
+ }
}
else if (style & WS_MAXIMIZE)
new_state |= (1 << NET_WM_STATE_MAXIMIZED);
@@ -1064,6 +1068,10 @@ void update_net_wm_states( struct x11drv_win_data *data )
}
}
data->net_wm_state = new_state;
+
+ XChangeProperty( data->display, data->whole_window, x11drv_atom(_NET_WM_BYPASS_COMPOSITOR), XA_CARDINAL,
+ 32, PropModeReplace, (unsigned char *)&net_wm_bypass_compositor, 1 );
+
}

/***********************************************************************
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index ccdb6c6efa..9aa41a80b7 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -444,6 +444,7 @@ enum x11drv_atoms
XATOM__NET_SYSTEM_TRAY_OPCODE,
XATOM__NET_SYSTEM_TRAY_S0,
XATOM__NET_SYSTEM_TRAY_VISUAL,
+ XATOM__NET_WM_BYPASS_COMPOSITOR,
XATOM__NET_WM_ICON,
XATOM__NET_WM_MOVERESIZE,
XATOM__NET_WM_NAME,
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 7a7ce335c7..2b11bba229 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -135,6 +135,7 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
"_NET_SYSTEM_TRAY_OPCODE",
"_NET_SYSTEM_TRAY_S0",
"_NET_SYSTEM_TRAY_VISUAL",
+ "_NET_WM_BYPASS_COMPOSITOR",
"_NET_WM_ICON",
"_NET_WM_MOVERESIZE",
"_NET_WM_NAME",
235 changes: 235 additions & 0 deletions patches/proton-5.9/proton-LAA_staging.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
From 62c9478e4768e94e841da2ef75eb778ed346e3ab Mon Sep 17 00:00:00 2001
From: Steven Noonan <steven@valvesoftware.com>
Date: Wed, 17 Oct 2018 04:13:37 -0700
Subject: [PATCH] ntdll/loader: add support for overriding
IMAGE_FILE_LARGE_ADDRESS_AWARE

Signed-off-by: Steven Noonan <steven@valvesoftware.com>
---
dlls/kernel32/heap.c | 9 ++-
dlls/ntdll/loader.c | 123 +++++++++++++++++++++++++++++++++++++++-
dlls/ntdll/ntdll.spec | 1 +
dlls/ntdll/ntdll_misc.h | 2 +-
dlls/ntdll/virtual.c | 5 +-
5 files changed, 135 insertions(+), 5 deletions(-)

diff --git a/dlls/kernel32/heap.c b/dlls/kernel32/heap.c
index e68420a55bb..3aa65a212aa 100644
--- a/dlls/kernel32/heap.c
+++ b/dlls/kernel32/heap.c
@@ -75,6 +75,8 @@ WINE_DECLARE_DEBUG_CHANNEL(globalmem);

static HANDLE systemHeap; /* globally shared heap */

+extern BOOL CDECL __wine_needs_override_large_address_aware(void);
+

/***********************************************************************
* HEAP_CreateSystemHeap
@@ -1375,6 +1377,10 @@ VOID WINAPI GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer )
MEMORYSTATUSEX memstatus;
OSVERSIONINFOW osver;
IMAGE_NT_HEADERS *nt = RtlImageNtHeader( GetModuleHandleW(0) );
+ static int force_large_address_aware = -1;
+
+ if (force_large_address_aware == -1)
+ force_large_address_aware = __wine_needs_override_large_address_aware();

/* Because GlobalMemoryStatus is identical to GlobalMemoryStatusEX save
for one extra field in the struct, and the lack of a bug, we simply
@@ -1415,7 +1421,8 @@ VOID WINAPI GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer )

/* values are limited to 2Gb unless the app has the IMAGE_FILE_LARGE_ADDRESS_AWARE flag */
/* page file sizes are not limited (Adobe Illustrator 8 depends on this) */
- if (!(nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE))
+ if (!(nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE) &&
+ !force_large_address_aware)
{
if (lpBuffer->dwTotalPhys > MAXLONG) lpBuffer->dwTotalPhys = MAXLONG;
if (lpBuffer->dwAvailPhys > MAXLONG) lpBuffer->dwAvailPhys = MAXLONG;
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index d7dbe573a4f..e03335a2709 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -1985,6 +1985,127 @@ static BOOL is_valid_binary( HMODULE module, const pe_image_info_t *info )
#endif
}

+/***************************************************************************
+ * get_basename
+ *
+ * Return the base name of a file name (i.e. remove the path components).
+ */
+static const WCHAR *get_basename( const WCHAR *name )
+{
+ const WCHAR *ptr;
+
+ if (name[0] && name[1] == ':') name += 2; /* strip drive specification */
+ if ((ptr = wcsrchr( name, '\\' ))) name = ptr + 1;
+ if ((ptr = wcsrchr( name, '/' ))) name = ptr + 1;
+ return name;
+}
+
+
+/***************************************************************************
+ * large_address_aware_env
+ *
+ * Checks for override for LARGE_ADDRESS_AWARE bit in environment. Takes
+ * precedence over any AppDefaults registry entry.
+ *
+ * Returns:
+ * -1 if not defined in environment (prefer registry entries)
+ * 0 if disabled
+ * 1 if enabled
+ */
+static int large_address_aware_env( void )
+{
+ static int large_address_aware_cached = -2;
+
+ if (large_address_aware_cached == -2) {
+ const char *envvar = getenv("WINE_LARGE_ADDRESS_AWARE");
+ if (envvar)
+ large_address_aware_cached = atoi(envvar);
+ else
+ large_address_aware_cached = -1;
+ }
+
+ return large_address_aware_cached;
+}
+
+/***************************************************************************
+ * needs_override_large_address_aware
+ *
+ * Checks for AppDefaults override for LARGE_ADDRESS_AWARE bit.
+ *
+ * Returns:
+ * TRUE if override was found in the registry, or environment variable
+ * explicitly enabled this override
+ * FALSE if no override was found in the registry, or environment variable
+ * explicitly disabled this override
+ */
+static BOOL needs_override_large_address_aware(const WCHAR *exename)
+{
+ BOOL result;
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING nameW;
+ UNICODE_STRING valueNameW;
+ HANDLE root;
+ WCHAR *str;
+ static const WCHAR AppDefaultsW[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
+ 'A','p','p','D','e','f','a','u','l','t','s','\\',0};
+ static const WCHAR LargeAddressAwareW[] = {'L','a','r','g','e','A','d','d','r','e','s','s','A','w','a','r','e',0};
+ char tmp[64];
+ KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION *)tmp;
+ DWORD count;
+ int env_override;
+ HANDLE app_key = (HANDLE)-1;
+
+ /* Environment variable takes precedence. */
+ env_override = large_address_aware_env();
+ if (large_address_aware_env() >= 0)
+ return env_override;
+
+ exename = get_basename(exename);
+
+ if (app_key != (HANDLE)-1) return FALSE;
+
+ str = RtlAllocateHeap( GetProcessHeap(), 0,
+ sizeof(AppDefaultsW) + strlenW(exename) * sizeof(WCHAR) );
+ if (!str) return FALSE;
+ strcpyW( str, AppDefaultsW );
+ strcatW( str, exename );
+
+ RtlOpenCurrentUser( KEY_ALL_ACCESS, &root );
+ attr.Length = sizeof(attr);
+ attr.RootDirectory = root;
+ attr.ObjectName = &nameW;
+ attr.Attributes = 0;
+ attr.SecurityDescriptor = NULL;
+ attr.SecurityQualityOfService = NULL;
+ RtlInitUnicodeString( &nameW, str );
+ RtlInitUnicodeString( &valueNameW, LargeAddressAwareW );
+
+ result = FALSE;
+
+ /* @@ Wine registry key: HKCU\Software\Wine\AppDefaults\app.exe */
+ if (!NtOpenKey( &app_key, KEY_ALL_ACCESS, &attr ))
+ {
+ if (!NtQueryValueKey( app_key, &valueNameW, KeyValuePartialInformation, tmp, sizeof(tmp)-1, &count))
+ {
+ if (info->DataLength >= sizeof(DWORD))
+ {
+ if ((*(DWORD *)info->Data) != 0)
+ result = TRUE;
+ }
+ }
+ NtClose( app_key );
+ }
+ NtClose( root );
+ RtlFreeHeap( GetProcessHeap(), 0, str );
+ return result;
+}
+
+BOOL CDECL __wine_needs_override_large_address_aware(void)
+{
+ PEB *peb = NtCurrentTeb()->Peb;
+ return needs_override_large_address_aware(peb->ProcessParameters->ImagePathName.Buffer);
+}
+

/******************************************************************************
* load_native_dll (internal)
@@ -3550,7 +3671,7 @@ void __wine_process_init(void)
user_shared_data_init();
hidden_exports_init( wm->ldr.FullDllName.Buffer );

- virtual_set_large_address_space();
+ virtual_set_large_address_space(needs_override_large_address_aware(NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer));

/* elevate process if necessary */
status = RtlQueryInformationActivationContext( 0, NULL, 0, RunlevelInformationInActivationContext,
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index fe96472cb86..42f6ee2576d 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -1507,6 +1507,7 @@

# Virtual memory
@ cdecl __wine_locked_recvmsg(long ptr long)
+@ cdecl __wine_needs_override_large_address_aware()

# Version
@ cdecl wine_get_version() NTDLL_wine_get_version
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index cf0d50de720..0acf2784669 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -189,7 +189,7 @@ extern SIZE_T virtual_uninterrupted_read_memory( const void *addr, void *buffer,
extern NTSTATUS virtual_uninterrupted_write_memory( void *addr, const void *buffer, SIZE_T size ) DECLSPEC_HIDDEN;
extern void VIRTUAL_SetForceExec( BOOL enable ) DECLSPEC_HIDDEN;
extern void virtual_release_address_space(void) DECLSPEC_HIDDEN;
-extern void virtual_set_large_address_space(void) DECLSPEC_HIDDEN;
+extern void virtual_set_large_address_space( BOOL force ) DECLSPEC_HIDDEN;
extern void virtual_fill_image_information( const pe_image_info_t *pe_info,
SECTION_IMAGE_INFORMATION *info ) DECLSPEC_HIDDEN;
extern struct _KUSER_SHARED_DATA *user_shared_data DECLSPEC_HIDDEN;
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 6ad2d21e01..e171b76950 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -2651,11 +2651,13 @@ void virtual_release_address_space(void)
*
* Enable use of a large address space when allowed by the application.
*/
-void virtual_set_large_address_space(void)
+void virtual_set_large_address_space(BOOL force_large_address)
{
IMAGE_NT_HEADERS *nt = RtlImageNtHeader( NtCurrentTeb()->Peb->ImageBaseAddress );

- if (!(nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE)) return;
+ if (is_win64) return;
+ if (!(nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE) && !force_large_address) return;
+
/* no large address space on win9x */
if (NtCurrentTeb()->Peb->OSPlatformId != VER_PLATFORM_WIN32_NT) return;

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
From 3c9b9d5a290cff5ebf2ad56e09fbb6c857b9f775 Mon Sep 17 00:00:00 2001
From: Andrew Eikum <aeikum@codeweavers.com>
Date: Tue, 24 Jul 2018 13:33:15 -0500
Subject: [PATCH] wine.inf: Set amd_ags_x64 to built-in for Wolfenstein 2

---
loader/wine.inf.in | 1 +
1 file changed, 1 insertion(+)

diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 2f389d3af7..b197622b97 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -3966,6 +3966,7 @@ HKCU,Software\Valve\Steam\ActiveProcess,"SteamClientDll64",,"%16426%\Steam\steam
HKCU,Software\Wine\DllOverrides,"vcomp140",0x2,"native,builtin"
HKCU,Software\Wine\DllOverrides,"vcruntime140",0x2,"native,builtin"
HKCU,Software\Wine\AppDefaults\Bayonetta.exe,"LargeAddressAware",0x10003,1
+HKCU,Software\Wine\AppDefaults\NewColossus_x64vk.exe\DllOverrides,"amd_ags_x64",0x2,"builtin,native"

[DestinationDirs]
l_intl_section = 11
Loading

0 comments on commit 6e7fcc3

Please sign in to comment.