Skip to content

Hide CrossOver options the FEX build cannot use - #12

Closed
LaganYT wants to merge 2 commits into
NotProtonNot:devfrom
LaganYT:feat/hide-fex-incompatible-options
Closed

LaganYT wants to merge 2 commits into
NotProtonNot:devfrom
LaganYT:feat/hide-fex-incompatible-options

Conversation

@LaganYT

@LaganYT LaganYT commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Refs #3

Summary

 CrossOver panel, for a game set to a FEX compatibility tool
- offer D3DMetal, its DLSS row, and Advertise AVX2 to Rosetta
+ hide the three controls FEX cannot use
+ keep D3DMetal selected, with a note, for games already set to it

A FEX tool runs arm64 Wine. D3DMetal.framework and libd3dshared.dylib are x86_64 only, D3DM_ENABLE_METALFX is read only by D3DMetal, and ROSETTA_ADVERTISE_AVX is read only by Rosetta (bin/wine: "Advertise AVX under Rosetta"). DXMT, DXVK, MetalFX upscaling, MSync and High Resolution all ship aarch64 pieces and stay.

Since 1.1.0 runs each CrossOver build as its own compatibility tool, the choice is made per game. The hook fills a replacement byte in the panel with the names of the tools that run through FEX (np_compat_fex_tools_js), using the same check compat_run.sh makes: a fex flavor, and an arm64 loader and wineserver in that tool's build. The panel compares that list against the game's strCompatToolName. A game with no tool name runs under the first tool, so the list also holds "" when that tool is FEX. A FEX tool and the Rosetta tool of the same Preview build can sit side by side, and each game gets the options of its own tool. Hidden settings keep their values, so they apply again after switching a game to a Rosetta tool.

Evidence

  • Before: On FEX, the panel offered D3DMetal, and the game silently ran on another backend (Doesn't Start With D3DM #3). The D3DMetal DLSS and AVX2 rows did nothing.
  • After, live on the 1.0 runner layout (before the rebase, Zuma Deluxe → Properties → Compatibility):
    • Automatic shows Metal HUD, MSync and High Resolution.
    • The backend list is Automatic, DXMT, DXVK and WineD3D.
    • With CX_GRAPHICS_BACKEND=d3dmetal, the dropdown still shows D3DMetal, with the note and without the DLSS row.
    • Picking DXMT from the real menu wrote CX_GRAPHICS_BACKEND=dxmt and dropped D3DM_ENABLE_METALFX.
  • Tests: fex.js checks a FEX tool and a Rosetta tool side by side, and unmapped games with either tool first, in both Steam page layouts. compatcheck checks which listed tools count as FEX against fake builds on disk. gatecheck refuses anchors that contain the runner byte. make all compatcheck panel-behavior webpatch-fixtures passes on top of dev, as do the other dylib checks.
  • Limit: not yet re-tested live on the 1.1.0 tool setup. I assumed Steam leaves strCompatToolName empty for a game on the automatic CrossOver default. If Steam fills in the tool name instead, the list still matches by name.

Merge Danger

Door: Two-way

Blast Radius: The injected CrossOver panel on both Steam UI layouts, plus a read-only check of the tool list and runner files when the hook serves the patched chunk. It doesn't touch launches, prefixes or saved launch options.

@LaganYT LaganYT mentioned this pull request Sep 30, 2026
@NotProtonNot

Copy link
Copy Markdown
Owner

Haven't had a chance to look at this yet. Will take a brief look tomorrow. If it doesn't need much work, it's in for the upcoming release. if it needs work, I'll have to bump it to a small update coming briefly after that release - sorry, just trying to get the big update out the door.

- Hide D3DMetal, its DLSS row, and Advertise AVX2 to Rosetta when the current runner is the FEX build
- Keep D3DMetal selected with a note for games already set to it, since FEX runs them on another backend
- Tell the panel about the runner through a replacement byte the hook fills in, using the arm64 loader check compat_run.sh makes
- Cover both runners in both page shapes with fex.js, and refuse anchors that hold the runner byte in gatecheck
- runners/current is the 1.0 record and is pruned once every run script reads its own build, so the panel would offer FEX games the Rosetta options again
- Fill the runner byte with the names of the tools that run through FEX, by the flavor and arm64 loader check compat_run.sh makes, and match it against the game's tool
- List "" too when the first tool is FEX, since that is what an unmapped game runs under
- Cover a FEX and a Rosetta tool side by side and unmapped games in fex.js, and the tool list in compatcheck
@LaganYT
LaganYT force-pushed the feat/hide-fex-incompatible-options branch from 569942e to 2d09997 Compare October 3, 2026 23:42
@LaganYT
LaganYT changed the base branch from main to dev October 3, 2026 23:43
@LaganYT
LaganYT marked this pull request as ready for review October 3, 2026 23:43
@LaganYT

LaganYT commented Oct 3, 2026

Copy link
Copy Markdown
Contributor Author

Rebased onto dev. Since the 1.1.0 compatibility tools landed, the panel now checks the tool each game is set to instead of runners/current, so a FEX tool and a Rosetta tool can sit side by side and each game gets the right options. All tests pass; not yet re-tested live on the 1.1.0 tool setup.

@NotProtonNot
NotProtonNot deleted the branch NotProtonNot:dev October 8, 2026 00:58
@LaganYT
LaganYT deleted the feat/hide-fex-incompatible-options branch October 8, 2026 02:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants