DroidDeck-Proton
A GE-Proton based Proton build for ARM64 (aarch64) Linux, made for DroidDeck: Valve's Steam client in an Arch Linux ARM rootfs, running Windows games through ARM64 Proton with FEX.
Important
DroidDeck-Proton is an unofficial build. It is not GE-Proton, Proton-CachyOS or Valve's Proton and is not affiliated with GloriousEggroll, CachyOS or Valve. Please report problems here, not to those projects.
Install
- Download
DroidDeck-Proton-<version>-aarch64.tar.gzfrom Releases. - Extract it into Steam's
compatibilitytools.dfolder. - Restart Steam and pick DroidDeck-Proton <version> as the game's compatibility tool.
What's inside
DroidDeck-Proton is GE-Proton (DXVK, vkd3d-proton, FEX, protonfixes, media stack and the proton
script, unchanged) with Wine built in seven tiers. Each tier is a tag on the Wine branch, so any one of
them can be bisected or turned off on its own.
| Tier | Contents | Tag |
|---|---|---|
| 1 | Valve Proton Wine, bleeding-edge |
bp-11.11-tier1 |
| 2 | Everything GE-Proton11-11 applies to Wine, plus two GE fixes from after 11-11 | bp-11.11-tier2 |
| 3 | CachyOS game fixes GE doesn't already carry | bp-11.11-tier3 |
| 4 | Our portable fixes from the Bannerlator layers | bp-11.11-tier4 |
| 5 | DroidDeck esync, built in | bp-11.11-tier5 |
| 6 | SD card fixes (games on noexec storage, drive-root copies) |
bp-11.11-tier6 |
| 7 | .NET mod loaders on ARM64 (upstream Wine fix, since 11-11.2) | bp-11.11-tier7 |
Up to 11-10.1 tier 7 was the DirectShow FMV row order fix. GE-Proton11-11 carries the same fix
(ge-video-rework/0096), so it is part of tier 2 now, and tier 7 is a new fix since 11-11.2.
Wine source: The412Banner/proton-wine, branch
banner-proton/11.11 (the wine submodule). Versions and pins: banner-proton/VERSION and banner-proton/PINS.
Formerly Banner-Proton; releases up to 11-7.2 used the old name.
Pins (11-11.3)
| Component | Commit |
|---|---|
GE-Proton (proton-ge-custom tag GE-Proton11-11) |
c0c2ee35e6d4d3bff4d39c6246ac46636434feb8 |
| DXVK (same as GE: v3.1.1-134) | 2cb40186c43d617b5bd349a3756721aa4bd24b6d |
Valve Wine bleeding-edge (same as GE, 2026-10-16) |
c53678ab22a85f0fad3588dd34f0452a463bd015 |
FEX (same as GE: FEX-2610-30) |
741e146fdf5a89517e1a67e3c899907cfba6131a |
CachyOS Wine cachyos_11.0_20261014/main (release cachyos-11.0-20261015-slr) |
cd14106e4fc0f96006005b07985e49cc1517e9c0 |
DroidDeck-Proton Wine banner-proton/11.11 |
406534191c15deab2c47de3dc7b4b7e6af8da028 |
vkd3d-proton, vkd3d, d7vk, dxvk-nvapi, dxvk-igdext, lsteamclient, wineopenxr and protonfixes are GE-Proton11-11's pins. DXVK, Valve Wine and FEX did not change from 11-10.1. 11-11.2 is 11-11.1 plus tier 7. 11-11.3 is 11-11.2 plus the WoW ARM64EC game patch.
Tier 2 – GE-Proton
All of GE-Proton's Wine patching at GE-Proton11-11 (c0c2ee35) plus two later GE fixes (below), applied by GE's own protonprep
Wine section on tier 1, one commit per section: configure revert, EM-11 wine-wayland + wineopenxr + EM fixups,
wine-staging (with GE's exclusions and rebased sets), game patches, hotfixes, pending upstream patches
and GE's custom patches (FSR, Reflex, OptiScaler, video rework, DS5 haptics, Bluetooth LE, …). Everything
applied cleanly. The Verify wine tier 2 workflow re-runs GE's section on tier 1 and checks the result
matches tier 2 plus its follow-ups.
New in GE-Proton11-11 (hotfix): games no longer freeze when a video is skipped while MPEG-1 audio plays (GE #865), MPEG-1 video through AMStream no longer upside down (GE #863), no heap corruption from scaled video frames (GE #864, aderumier), vkd3d-proton no longer trips Easy Anti-Cheat in Star Citizen and Hunt: Showdown (GE #858), Star Citizen AMD AGS override removed, protonfixes update (Star Citizen .NET 4.8, mod loaders, Windows version re-applied after winetricks).
Taken from GE's master after 11-11 (cherry-picked with -x into this repo's protonprep):
- ntdll: take the in-flight alert when a
RtlWaitOnAddress()wait times out (Space Marine 2 crash after long play; from proton-je, Jason Eggleston) – GE98efe1cd - winewayland: advertise the OpenVR/OpenXR Vulkan device pseudo-extensions like winex11 (VR games on
Wine's Wayland driver) – GE
e15b1e15, GE #852 - lsteamclient: keep the automatic PlayStation (Sony) Steam Input fallback when Steam Input is off for
the game but on globally – GE
bbef7006(lsteamclient patch 0017, applied at build time)
Earlier, in GE-Proton11-10: Valve Wine bleeding-edge 2026-10-16 (upstream syscall emulation for EAC/EOS
launchers, x86_64 only), ACE anti-cheat driver fixes (ntoskrnl, lsass SamSs stub; Arknights: Endfield),
Star Citizen's bundled AMD AGS, faster shared SRW lock releases, llvm-libc fixes, the PlayStation
controller XInput fallback no longer rescanning HID devices on every poll, Bluetooth DS4/DualSense
rumble through the fallback, KWin per-monitor HDR state and owned-popup destruction fixes
(em-fixups/0071, 0072), MonoGame song replay fix (ge-video-rework/0093, 0094).
GE's non-Wine changes arrive through the ge-master merge: DXVK v3.1.1-134, D7VK rebased on it,
vkd3d-proton synchronization fix, FEX-2610-30, and the proton script's controller defaults.
Tier 3 – CachyOS
Cherry-picked (-x) from CachyOS Wine (the first 18 carried from 11-10.1 and still in CachyOS
cd14106e, release cachyos-11.0-20261015-slr):
- ntdll:
WINE_DISABLE_SFNoption (Yakuza 5 cutscenes) – Pedro Nishiyama - win32u: opaque webviews for Wuthering Waves – NelloKudo
- pdh: no access violation in PdhCloseQuery on a bad handle; powrprof: stub PowerReadACValueIndex – Ziia Shi
- ntdll: SystemPowerInformation semi-stub, RtlAreLongPathsEnabled – Etaash Mathamsetty
- mountmgr.sys: StorageDeviceTrimProperty stub – Jactry Zeng
- d3d8: valid box in vertex/index buffer Lock – Stefan Dösinger
- ddraw: enumerate the ramp device; pass the active device to material_activate – Elizabeth Figura, Rémi Bernon
- wined3d: pixel-format fixes – Elizabeth Figura, Zhiyi Zhang, Patrick Zacharias
- xaudio2_7: Darksiders Warmastered crash workaround – NelloKudo
- mfplat: R8_UINT in MFCreateDXGISurfaceBuffer – Nikolay Sivov
- setupapi: initialize the Service value size when checking for winehid devices – M0n7y5 (new in 20261014)
- crypt32: keep the order of authenticated attributes when verifying signatures, with tests (WineHQ MR 11824: FL Studio, Genshin Impact / Zenless Zone Zero CN editions) – Michael Nelson (new in 20261015)
Not picked: anything GE or Valve Wine already carries (CachyOS 20261014's crypt32 certificate-chain and schannel fixes, the ACE anti-cheat fixes); win32u "don't decorate maximized windows" (same line as GE's frameless-window change), and CachyOS 20261015's revert of it; CachyOS 20261015's winewayland owned-popup reparenting (written against CachyOS's wine-wayland, conflicts with GE's EM-11 tree); x86_64-only code (EAC/EOS syscall forwarding); changes that conflict with GE's winedmo video rework; branding/policy defaults (fsync on, Windows 11, version string, font smoothing); larger features left for later (winepipewire, futex tuning, FSR4/MLFG, kernel-object series, LTO/clang).
Tier 4 – Our fixes (Bannerlator layer v14)
WINE_FORCE_SSBSswitch on top of Wine MR 12262 (=0restores the old behaviour)WINEVMEMMAXSIZE(MB): cap a single NtAllocateVirtualMemory (inert when unset)- ntdll: bounds-check
RtlIsEcCode(Denuvo unwinding loop, Need for Speed Heat) - mf/topology_loader: restore the upstream type when optional insertion fails – NelloKudo
- sharedgpures.sys: earlier shared-resource protocol (D3D9→D3D11 video on DXVK < 3.0)
- rsaenh: hold the public key during CPVerifySignature
- gdiplus: clamp degenerate spans instead of asserting (EA app installer)
- xinput: survive a transient WAIT_FAILED in the update thread
- win32u: MAX_FONT_HANDLES 5000 → 32768
- GE game fix
dai_xinput(Dragon Age: Inquisition controller, SteamGameId 1222690 only)
Not carried: winegstreamer and media fixes that GE's winedmo rework replaces or already covers, fixes Valve Wine already has, and everything Android/bionic-specific.
Tier 5 – DroidDeck esync
droiddeck-esync/patches/valve-11/0001-droiddeck-esync.patch from
Droid-Deck/DroidDeck-Components 780ab619de
(maxjivi05), applied unchanged. Adds eventfd/shared-memory sync to wineserver and ntdll (Elizabeth
Figura's esync design), so no separate esync pack is needed. Sync order stays ntsync → fsync → esync
(WINEESYNC) → server; the log says droiddeck-esync: up and running. when esync is used. No wineserver
request or ntdll.so export changes (CI checks both).
Tier 6 – SD card fixes (Arihany)
From our Wine 11 port (proton-wine proton_11.0, 497c384f), offsets only:
- ntdll – PE images in anonymous memory (
virtual.c; originally GameNative's). Private image mappings are read into anonymous memory instead ofmmaped, so games on anoexecmount (an Android SD card) start instead of failing with "noexec filesystem?". - shell32 – drive-root copies (
shlfileop.c). A bare root likeD:\keeps its backslash, soSHFileOperationcopies between drive roots no longer crash.
Not taken: the LC_ALL=C.UTF-8 default (bionic-only; DroidDeck uses glibc).
Game patch – WoW Forever ARM64EC
Deferred build-time patch for WowB-ARM64.exe (ARM64EC) on aarch64 — not committed in the wine submodule:
patches/game-patches/wow-forever-arm64ec-ntdll.patch
Applied after banner-proton/prep.sh by banner-proton/apply-deferred-game-patches.sh
(.github/workflows/_group.yml). Omitted from patches/protonprep-valve-staging.sh
until the same change is tagged on The412Banner/proton-wine.
| Area | What it fixes |
|---|---|
signal_arm64.c |
Zero CONTEXT before save_context (stale debug regs → intermittent Game Initialization Failed: I) |
asm.h |
TEB → KSDT syscall stubs; ARM64EC fallback to __wine_syscall_dispatcher when TEB slots are empty |
syscall.c / thread.c |
Publish dispatcher in KSDT; ntdll_arm64ec_sync_syscall_dispatch() on EC thread start / after ChpeV2 |
env.c |
NLS section map fallback when section maps fail |
virtual.c |
Map-time init of __wine_syscall_dispatcher for manually mapped ntdll SEC_IMAGE views |
Tier 7 – .NET mod loaders on ARM64
Upstream Wine c5a96a0b6c (Brendan Shanks, CodeWeavers; in Wine 11.4), cherry-picked by maxjivi05
(proton-wine PR #1):
- kernelbase –
GetNativeSystemInfo()in x64 processes (memory.c). An x64 process under ARM64EC now getsPROCESSOR_ARCHITECTURE_AMD64, as on Windows, instead of ARM64. .NET 6 reported ARM64 from it, so MonoMod (Harmony, SMAPI, MelonLoader 0.7.x) wrote an ARM64 jump into x64 CoreCLR code and the runtime died withc000001d(FEX-Emu/FEX#6014, Droid-Deck/DroidDeck#611). Diagnosis by utkarshdalal (GameNative/proton-wine#94), report by whatsupbros.
Building
Builds run on GitHub Actions (ubuntu-24.04-arm, Valve's steamrt4 arm64 Proton SDK), like GE's
aarch64 builds.
Build DroidDeck-Proton (aarch64)– GE'sconfigure.sh --target-arch=arm64, split into parallel groups (graphics, FEX, misc, media → Wine, then assemble). Output is stripped (Wine-Mono debug files removed) and packed asDroidDeck-Proton-<version>-aarch64.tar.gz+.sha512sumin GE's layout. Inputs: publish (release from main), prerelease (not marked latest), compare_with (diff against an earlier release).- Caches – each group's output is keyed by its sources and skipped when cached; per-group ccache; SDK image cache.
- CI guards – Wine protocol and ntdll exports unchanged; tier 6 and 7 fixes and the winedmo row order fix present in source and
binaries (trace strings); WoW Forever deferred patch markers after
apply-deferred-game-patches.sh; no leftover "Banner-Proton" names.
Local builds: follow docs/README.GE-Proton.md, using banner-proton/prep.sh
instead of patches/protonprep-valve-staging.sh and
../configure.sh --target-arch=arm64 --build-name=DroidDeck-Proton-<version> --display-name="DroidDeck-Proton <version>".
Credits
Valve (Proton, Wine, Steam Linux Runtime) · GloriousEggroll and GE-Proton contributors · Wine and wine-staging developers · CachyOS · NelloKudo · Etaash Mathamsetty · Elizabeth Figura (esync, fsync, ntsync) · maxjivi05 / DroidDeck (droiddeck-esync) · Arihany and GameNative (SD card fixes) · Brendan Shanks, utkarshdalal, whatsupbros (.NET fix) · arusiasotto (WoW ARM64EC fix) · FEX-Emu, DXVK, vkd3d-proton, dxvk-nvapi, d7vk and every patch author named in the commit history.
License
Proton and its components keep their own licenses: see LICENSE, LICENSE.proton
and dist.LICENSE in the tarball. Wine is LGPL-2.1-or-later. DroidDeck-Proton's own scripts and patches
follow the licenses of the files they change.