Compatibility tool for Steam Play based on Wine with Wayland improvements and additional components
  • C++ 66.4%
  • C 31.3%
  • C# 1.3%
  • Python 0.7%
  • Makefile 0.2%
  • Other 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Erhan Bilgili c82d7ec84b Update mesa.
2026-10-31 21:37:02 +01:00
.github ci: Add manual ARM draft builds. 2026-10-06 13:10:42 +02:00
dav1d@54706fc6bc Update graphics, media and runtime components. 2026-09-10 15:40:36 +02:00
docker docker: Use LLVM 22.1.8. 2026-06-24 16:31:04 +03:00
docs docs: Change DEBUGGING.md to DEBUGGING-LINUX.md. 2025-04-24 18:05:59 +03:00
dxvk@249fa3b43c Update components. 2026-10-29 09:22:32 +01:00
dxvk-nvapi@0f26995d81 Update components. 2026-10-04 20:33:26 +02:00
extras Revert "extras: Remove DXVK Low Latency." 2026-10-24 12:26:08 +02:00
FEX@395b132f34 Update graphics, media and runtime components. 2026-09-19 20:23:05 +02:00
ffmpeg@946fcce07b ffmpeg: Update to 9.0.2 and work around GCC 14. 2026-09-19 20:20:43 +02:00
fonts fonts: Add Microsoft YaHei Bold from Source Han Sans Bold. 2026-09-07 17:23:18 +02:00
glslang@e1b562a8be Update graphics, media and runtime components. 2026-09-19 20:23:05 +02:00
graphene@4e25784508 gst-base: Enable GL video processing plugins. 2022-08-15 17:47:03 +03:00
gst-orc@6b2ee01b87 Update graphics, media and runtime components. 2026-09-10 15:40:36 +02:00
gst-plugins-rs@d8db1f502d Update graphics, media and runtime components. 2026-09-19 20:23:05 +02:00
gstreamer@070125524a Update graphics, media and runtime components. 2026-09-10 15:40:36 +02:00
icu icu: Add LICENSE. 2025-04-24 18:05:59 +03:00
kaldi@bc5baf1423 Update graphics, media and runtime components. 2026-09-19 20:23:05 +02:00
libsoup@7d43af25f1 Update components. 2026-10-01 15:00:32 +02:00
locale locale: build: include x11 locale files. 2026-07-24 03:11:36 +03:00
lsteamclient lsteamclient: Bound install-directory matching. 2026-10-22 09:53:55 +02:00
make Update components. 2026-10-29 09:22:32 +01:00
media media: Add an option to disable the SMPTE video stream. 2026-04-16 12:37:58 +03:00
mesa@946f106f87 Update mesa. 2026-10-31 21:37:02 +01:00
meson@70598bb782 Update components. 2026-10-01 15:00:32 +02:00
nvidia-libs Update graphics, media and runtime components. 2026-09-19 20:23:05 +02:00
openfst@18e94e6387 update openfst 2026-04-16 10:06:52 +03:00
openvr@0924064316 Update graphics, media and runtime components. 2026-09-19 20:23:05 +02:00
OpenXR-SDK@f2448a8797 Update graphics, media and runtime components. 2026-09-19 20:23:05 +02:00
patches build: Update wayland-protocols to 1.49. 2026-10-29 09:32:13 +01:00
piper@9d06b74959 build: Add and build piper submodule. 2025-04-24 17:58:12 +03:00
protonfixes@73c55866ee Update components. 2026-10-01 15:00:32 +02:00
SPIRV-Headers@29981f6524 Update graphics, media and runtime components. 2026-09-19 20:23:05 +02:00
steam_helper steam_helper: Also recognize steam2ea:// as EA launcher. 2026-09-07 17:10:09 +02:00
steamrtdeps build: Update wayland-protocols to 1.49. 2026-10-29 09:32:13 +01:00
symstore Don't ship proton dist files in a tarball anymore 2024-02-15 15:53:29 +02:00
tests Update components. 2026-10-29 09:22:32 +01:00
umu_helper discord-rpc-bridge: umu_helper: add bridge service 2026-07-17 22:54:47 +03:00
vkd3d@ac39f7306c Update graphics, media and runtime components. 2026-09-19 20:23:05 +02:00
vkd3d-proton@e962c0d0d6 Update components. 2026-10-31 15:06:17 +01:00
vklayers vklayers: Remove low_latency_layer. 2026-10-20 15:23:31 +02:00
vosk-api@05adbfcc0d Update graphics, media and runtime components. 2026-09-19 20:23:05 +02:00
vrclient_x64 vrclient_x64: fix hwnd redefinition 2026-07-24 03:11:35 +03:00
Vulkan-Headers@6802bb4733 Update graphics, media and runtime components. 2026-09-19 20:23:05 +02:00
wine@a4250c7243 Update Wine. 2026-10-24 14:46:23 +02:00
wineopenxr wineopenxr: Map VK_FORMAT_X8_D24_UNORM_PACK32 Vulkan format. 2026-10-29 09:42:53 +01:00
.gitattributes gitattributes: Tell Github Linguist to ignore .sc files 2020-06-05 08:58:23 -05:00
.gitignore Makefile: Remove Vagrant build path 2022-01-19 11:29:54 +02:00
.gitmodules build: Fetch Mesa from the Salkim fork. 2026-10-29 12:10:29 +01:00
compatibilitytool.vdf.template compatibilitytool.vdf: Make sure internal tool name includes 'proton'. 2025-04-24 17:58:12 +03:00
configure.sh Revert "extras: Remove DXVK Low Latency." 2026-10-24 12:26:08 +02:00
default_pfx.py build: update makefile for more configurability and higher cpu instruction sets 2026-07-24 00:16:47 +03:00
desktop_monitor.py proton: Detect the initial monitor across Wayland desktops. 2026-09-06 17:23:58 +02:00
dist.LICENSE build: Switch shader compilers to upstream and add licenses. 2026-09-28 09:07:02 +02:00
FEX_Config.json make: Install a default FEX config. 2026-04-16 10:07:17 +03:00
filelock.py update filelock.py 2019-10-18 09:52:24 -05:00
LICENSE LICENSE: Fix a typo. 2023-02-14 16:07:44 +02:00
LICENSE.proton Update copyright dates 2022-01-19 11:39:44 +02:00
Makefile build: Route development targets to ARM objects. 2026-10-06 13:08:03 +02:00
Makefile.in Revert "extras: Remove DXVK Low Latency." 2026-10-24 12:26:08 +02:00
mesa.py proton: Rename the bundled RADV option to PROTON_RADV. 2026-10-22 10:58:05 +02:00
proton Revert "extras: Remove DXVK Low Latency." 2026-10-24 12:26:08 +02:00
proton_3.7_tracked_files proton: Track prefix files and remove them on a major proton version change 2018-10-12 08:30:19 -05:00
README.md Revert "extras: Remove DXVK Low Latency." 2026-10-24 12:26:08 +02:00
README_PROTON.md Update README.md file. 2026-08-19 13:58:06 +02:00
steampipe_fixups.py Handle steampipe quirks in deploy builds 2024-02-15 15:53:29 +02:00
toolmanifest_arm64.vdf Switch to steamrt4. 2026-04-16 12:37:58 +03:00
toolmanifest_x86_64.vdf Switch to steamrt4. 2026-04-16 12:37:58 +03:00
user_settings.sample.py user_settings.sample.py: Add Xalia. 2026-04-16 12:37:59 +03:00
utilities.py proton: Rename the bundled RADV option to PROTON_RADV. 2026-10-22 10:58:05 +02:00
vulkan.py utilities: also expose driver info 2026-07-24 03:11:19 +03:00
vulkan_layers.py proton: Order Vulkan overlays through loader settings. 2026-09-19 18:16:01 +02:00
wineland-banner.png Update README.md file. 2026-08-19 13:58:06 +02:00
xalia-fixups.gudl xalia-fixups.gudl: Refine detection of Nixxes launchers. 2026-10-04 00:35:58 +02:00

Proton Wineland

What is Proton Wineland?

Proton Wineland aims to solve Linux gaming problems through complete solutions rather than accumulating hacks and workarounds for individual games. Its goal is to address issues that are genuinely solvable when the necessary time and care are invested.

The project began with the lack of robust Wayland support. Since then, it has grown beyond launchers to address broader compatibility, rendering, input, and media issues across games and applications.

While upstream compatibility was an early consideration, it should not limit what the project can achieve. Proton Wineland's focus is the quality of the solution and the experience it delivers to Linux gamers.

What does Proton Wineland offer over other Proton versions?

Proton Wineland is not intended to change how every game runs. Its advantages are most noticeable when a game or launcher runs into Wayland problems that other Proton versions may work around only partially.

It can provide:

  • More reliable Windows game launchers, including Chromium and CEF applications such as Battle.net, Ubisoft Connect, Rockstar Games Launcher, and the native Windows Steam client.

  • Better fullscreen and borderless window behaviour, including minimising, maximising, restoring, Alt+Tab, and switching monitors, particularly with multiple monitors and mixed scaling.

  • Correct rendering for overlays, popups, login windows, and other content created by a separate Windows process from the visible game window.

  • Improved video and media playback compatibility in applications that use Windows Media Foundation.

  • More accurate mouse and keyboard behaviour when a game is fullscreen, scaled, or moved between monitors.

  • Better integration with Wayland desktops, including Windows tray icons, application menus, and compatible HDR and colour management paths.

These improvements work automatically where they are applicable. They are intended to solve underlying compatibility problems rather than require environment variables or launch options tailored to each game.

These benefits depend on the game, GPU driver, compositor, and desktop setup. A game that already works well with another Proton version may not show a visible difference.

What does it improve?

Proton Wineland aims to make Windows games and their supporting applications feel at home on a Wayland desktop. It improves launcher compatibility, fullscreen behaviour, and common window actions such as minimising, maximising, restoring, and moving games between monitors. It also works to improve video and media playback, and the rendering of overlays or companion windows, including cases where those windows are created by a separate process.

What does it not promise?

No Proton version can guarantee that every game will work perfectly. Not every problem originates in Proton or can be solved within Wine. Issues may also come from the game itself, graphics drivers, the desktop compositor, or another part of the Linux graphics stack.

Is it experimental?

Yes, but "experimental" does not mean inherently unstable. Proton Wineland takes a different approach from the usual pattern of relying on environment variables, command line parameters, and Wine workarounds for individual titles.

Where possible, it aims to solve the underlying problem in a durable way. This does not mean the project has no bugs, including in newly added areas, but being experimental does not mean deliberately sacrificing stability. In some situations, it may even be more stable than other Proton versions.

How is artificial intelligence used?

AI tools are a regular part of Proton Wineland's development process. I use them to analyse logs, investigate problems, review changes, and help fix or generate code when I consider that appropriate.

Before delivery, every commit goes through a review assisted by AI. I examine the findings and decide whether the suggested changes are technically sound and suitable for the project. When they are, I may let the AI modify the code and then review the result again.

AI does not replace engineering judgement, testing, or responsibility for the code that is delivered. Used thoughtfully, however, it is a valuable software development tool that can accelerate investigation and help identify problems that might otherwise be missed.

How do I activate the Wayland features?

You do not need to enable anything manually. Proton Wineland enables Wayland by default by setting PROTON_ENABLE_WAYLAND=1, so games and supporting applications run through Wayland automatically.

How do I use the bundled RADV driver?

For AMD Vulkan games, set this launch option:

PROTON_RADV=1 %command%

This uses the bundled radv-salkim driver for that launch without replacing your system driver. On x86-64 systems, standard builds include both 64-bit and 32-bit RADV libraries. ARM64 is not supported. It is built from a snapshot of Mesa's development branch (main) and may be less stable than your system RADV driver.

How are Vulkan overlays ordered?

With a compatible Vulkan loader (1.4.304 or later), Proton uses loader settings to place Steam's overlay before the Wineland surface translator. Other enabled layers follow the translator and keep their normal activation rules. This also supports distribution-specific overlay names without special handling for each overlay.

The settings stay inside the game's compatibility directory. They are exposed only to that launch and its child processes through XDG_CONFIG_DIRS. Existing user Vulkan loader settings are not replaced. Proton checks runtime support at startup. If private ordering cannot be verified, it logs the reason and disables the Steam overlay bridge for that launch, including the optional OpenGL adapter. Normal Wayland presentation and other overlays keep their existing settings. Wine also verifies the order in each native process architecture and disables the Vulkan bridge if verification fails. There is no per-frame checking.

How is the initial monitor selected?

At launch, Proton reads KDE's or GNOME's configured primary monitor, niri's focused monitor, or COSMIC's preferred display for X11 games. COSMIC's preference is reused for native Wayland games. This does not switch them to Xwayland. The query runs once, does not change desktop settings, and leaves Wine's default unchanged if the desktop is unsupported or no unambiguous answer is available.

An explicit WAYLANDDRV_PRIMARY_MONITOR always takes precedence, for example:

WAYLANDDRV_PRIMARY_MONITOR=DP-2 %command%

How do I disable window slicing?

Slicing clips GPU-rendered content to shaped windows and complex child-window regions. To disable it for a game or launcher, use:

PROTON_WAYLAND_SLICING=0 %command%

Each affected buffer then uses a single rectangular surface. This also disables the four-pixel shape approximation, while preserving the original input region. Non-rectangular visual clipping is lost, so rectangular edges or child-window overlap may appear. Slicing is enabled by default. Remove the option or set it to 1 to restore it. Restart the game after changing this setting.

How do I resize a game's cursor?

For custom bitmap cursors supplied through Wine, set a size multiplier in the Steam launch options, for example:

PROTON_WAYLAND_CURSOR_SCALE=2 %command%

This doubles the cursor size without changing game resolution or mouse sensitivity. Fractional values from 0.25 to 8 are supported. The default is 1, and invalid values leave the default unchanged. The setting is read when Wine initializes the Wayland pointer and requires cursor viewport scaling support from the compositor.

Cursor shapes provided by the compositor, including the Steam overlay cursor, keep their desktop size. Cursors drawn into the game image cannot be resized by this option.

How do I enable the HUD with PROTON_HUD?

Set a preset in Steam's launch options:

PROTON_HUD=3 %command%
Level Information
1 FPS, 1% and 0.1% lows, and window system.
2 Adds GPU and CPU load, power, temperature, and Proton and GPU driver versions.
3 Adds GPU and CPU clocks and VRAM usage.
4 Adds presentation latency timings above level 3.
5 All HUD elements except systeminfo, arranged on the left.

Levels 1 to 4 use centred horizontal rows, with window system information at the bottom. HDR and direct scanout (DSO) status appear when available.

Press Ctrl+Shift+O to hide or show the HUD. Visibility updates once per second, including while hidden. The shortcut uses DXVK_HUD, whether set directly or generated by PROTON_HUD. An unset, empty or 0 value disables the shortcut. An empty HUD does not poll for visibility. Append hide to start with the HUD hidden, for example PROTON_HUD=3,hide %command%, then press Ctrl+Shift+O to show it.

This extends the existing DXVK HUD, which VKD3D Proton also uses for Direct3D 12 games. Wine samples CPU and GPU telemetry once per second in background threads when requested. Available readings depend on hardware, drivers, and permissions.

The same HUD is available with PROTON_DXVK_LOWLATENCY=1. Its existing renderlatency, jitter and latencydetails items remain available alongside the Wineland HUD options. This does not add HUD support to vkd3d-low-latency.

Append DXVK HUD options after the preset to customise it, for example:

PROTON_HUD=3,scale=1.25,-gpu.temp %command%

Add present.mode to show the Vulkan presentation mode, such as FIFO, MAILBOX or IMMEDIATE, in Direct3D 8 through 12 games:

PROTON_HUD=3,present.mode %command%

This shows the renderer's selected mode. The compositor may still control how frames reach the display. No latency telemetry is needed for this field.

An explicit DXVK_HUD takes precedence. See the DXVK HUD options for individual metrics, layout, and appearance settings.

What do the presentation latency readings measure?

PROTON_HUD=4 adds these readings for DXVK and VKD3D Proton when the driver and presentation stack support VK_EXT_present_timing. All four are displayed in milliseconds. They use three timestamps:

  • T0 is recorded by us shortly before calling vkQueuePresentKHR. In VKD3D Proton this happens on the command queue's submission thread. Time queued between the application's DXGI Present() call and that point is excluded.
  • T1 is the Vulkan driver's QUEUE_OPERATIONS_END timestamp.
  • T2 is the Vulkan driver's FIRST_PIXEL_OUT timestamp when available.

The driver supplies the event timestamps through Vulkan presentation-timing reports. We do not take new timestamps when the reports arrive. A report arriving several frames later does not add to the measured latency. First pixel out means data leaving the presentation engine toward the display, not pixels already visible.

The original timing source depends on the driver and presentation stack. Mesa's Wayland implementation gets first pixel out from the compositor's presentation feedback. On KWin's DRM backend this normally comes from the kernel page-flip completion timestamp for the frame containing the game's image, not a measurement of the display's pixel response. Other drivers can obtain timing differently.

HUD label Calculation Meaning
Queue latency T1 - T0 Submission work, dependency waits, and queued presentation work.
Output latency T2 - T1 Downstream presentation processing and waiting, which can include compositor work.
Present latency T2 - T0 Total of the two stages for the same frame.
Output interval T2(current frame) - T2(previous frame) Spacing between consecutive frames reaching output.

Output interval can be lower than Present latency because several frames can be in flight. A frame can take 20 ms to reach output while frames emerge every 8 ms. These readings do not measure total CPU or GPU rendering time or full input latency.

If first pixel out is unavailable, the latency endpoint falls back to first pixel visible, then request dequeued. The last fallback does not confirm display output. Output interval stays unavailable without consecutive first pixel out measurements. Text refreshes every 500 ms using the latest valid readings, not an average. Individual fields may come from different frames.

Wine disables presentation timing for surfaces eligible for its managed dmabuf path, including cross-process presentation. Those surfaces can show -- even when the host driver supports the extension. This is a Wine presentation-path limitation rather than missing driver support.

The configuration keywords remain latency.queue, latency.display, latency.present, and latency.interval. See the measurement details and timeline.

How do I use OptiScaler nightlies?

Use PROTON_USE_OPTISCALER=1 for stable releases. For the latest official nightly, set this Steam launch option:

PROTON_USE_OPTISCALER=nightly %command%

To pin a specific nightly:

PROTON_USE_OPTISCALER=nightly-20260906 %command%

Nightlies are downloaded from OptiScaler's official releases and verified before installation. Updates are checked at launch, not during gameplay. Previous INI files are saved as .ini.old, and PROTON_OPTISCALER_CONFIG is reapplied. Switch back to 1 to use stable again.

Nightlies also fetch the latest official NVIDIA Streamline runtime for the frame-generation combinations that require it. Its DLLs and licence notices are installed under umu/OptiScaler/streamline, with links to the existing managed DLSS DLLs instead of duplicate copies. Private nightly libraries stay under OptiScaler. The entry DLL and INI stay in umu.

Nightlies use their bundled XeSS and FidelityFX libraries instead of fetching extra standalone copies. Explicit upscaler upgrades remain available. Existing installer-owned duplicates are removed only when unchanged. Modified files and custom library paths are preserved.

The first Streamline download is the full SDK archive (currently about 276 MB). The installed runtime is about 10 MB. Downloads are verified and cached, and a failed update keeps the previous installation without disabling OptiScaler. Stable OptiScaler installations do not fetch Streamline automatically.

What is the relationship to CachyOS Proton?

Proton Wineland is currently based on CachyOS Proton. Proton is made up of many components, with Wine being only one of them. Most Proton Wineland changes are made to Wine, while CachyOS Proton provides the surrounding build, integration, and runtime framework.

Early on, Proton Wineland was regularly rebased onto the latest CachyOS branches. As its Wayland work expanded, rebasing the Wine component became increasingly difficult. Repeatedly resolving the growing number of conflicts began to destabilise the codebase, so Proton Wineland now maintains its Wine work independently and selectively picks compatible upstream and bleeding edge changes.

An early possibility was contributing the Wineland changes directly to CachyOS. As the project grew in scope and followed its own technical direction, independent development became the better fit. This gives Proton Wineland room to pursue broader solutions when they can improve the Proton experience.

CachyOS has its own development priorities and established relationships with the Wine development process. Proton Wineland complements that work with an independent focus. I have great respect for the CachyOS maintainers and developers, and value their tremendous work.

Original Proton documentation

The original Proton documentation, including build instructions, is available in README_PROTON.md.