Late Christmas Present: FSR 4.0.3 for RDNA3/RDNA4 (Before AMD Does) 😄

Hello 😄


Sorry this is a *late* Christmas **present** — I swear it got stuck somewhere between Santa’s sleigh and Valve’s shader cache.

But hey: consider it a **New Year’s present** 🎁✨  
**FSR 4.0.3 (local)** for all **RDNA3 / RDNA4** owners — available *before 2026* and before AMD’s “official implementation” arrives in the distant future™.

Install, launch, enjoy… and if anyone asks, it’s not magic — it’s just GPU wizardry 🧙‍♂️🖥️:

- **RDNA3/RDNA3.5:** `PROTON_FSR4_RDNA3_UPGRADE=4.0.3`
- **RDNA4:** `PROTON_FSR4_UPGRADE=4.0.3`

And yep — **here are a couple of in-game screenshots as proof-of-concept / it’s working:** 📸👇  
# FSR4 4.0.3 local tools (Fish) 🧰

This repo/bundle contains **two Fish functions**:

- **`amd_fsr4_install`** — fetches and extracts AMD’s **FSR4 4.0.3 `amdxcffx64.dll`** from an AMD driver package and places it in your cache (default: `~/.cache/fsr4/amdxcffx64-4.0.3.dll`).

- **`proton_fsr403_rebuild`** — clones **Proton-CachyOS** compatibility tools into `*-fsr403` variants and patches them so Proton can use the **local FSR4 4.0.3 DLL** via environment variables.

> ✅ **Low-risk by design:** `proton_fsr403_rebuild` **clones** your existing Proton-CachyOS tools into `*-fsr403` folders and only edits the **clones** (original `_v2/_v3/_v4` tools stay untouched).  

> 🛡️ **Fail-safes:** no sudo • refuses real rebuilds while Steam is open • `--dry-run` plan mode • `.bak` backups + rollback on failure • `py_compile` validation of patched `upscalers.py` • `--clean` removes only the clones.  

> ⚠️ Still, **use at your own risk** (you’re changing files under your Steam compatibility tools directory).

---

## ✅ Requirements

### Shell
- **Fish shell**

### Proton tool sources
- Proton-CachyOS installed under:
  - `~/.local/share/Steam/compatibilitytools.d/`
  - with folders like: `proton-cachyos-10.0-<DATE>-..._v2` (and `_v3` / `_v4`)

### Dependencies
Install missing tools via your package manager. `proton_fsr403_rebuild --check` will tell you what’s missing.

- `amd_fsr4_install`: `wget, 7z, fd, rg, file, md5sum`, and one of (`exiftool` / `strings`) (optional: `cabextract`)  
  *(you don’t run wget yourself; the script uses it for `--url` downloads)*

- `proton_fsr403_rebuild`: `fd, rg, python3, mktemp, stat, cp, rm, basename, sort, printf` (recommended: `pgrep` or `pidof` for Steam-running check)

---
## 🛠️ Install (Fish autoload)

### Option A: download into Fish autoload path (curl)

mkdir -p ~/.config/fish/functions

curl -L -o ~/.config/fish/functions/proton_fsr403_rebuild.fish \
  "https://raw.githubusercontent.com/furbakka/gENVW/main/proton_fsr403_rebuild.fish"

curl -L -o ~/.config/fish/functions/amd_fsr4_install.fish \
  "https://raw.githubusercontent.com/furbakka/gENVW/main/amd_fsr4_install.fish"

# Reload functions
functions -e proton_fsr403_rebuild amd_fsr4_install 2>/dev/null
source ~/.config/fish/functions/proton_fsr403_rebuild.fish
source ~/.config/fish/functions/amd_fsr4_install.fish


### Option B: copy from Downloads

mkdir -p ~/.config/fish/functions

cp -f ~/Downloads/amd_fsr4_install.fish ~/.config/fish/functions/amd_fsr4_install.fish
cp -f ~/Downloads/proton_fsr403_rebuild.fish ~/.config/fish/functions/proton_fsr403_rebuild.fish

fish -n ~/.config/fish/functions/amd_fsr4_install.fish; or return
fish -n ~/.config/fish/functions/proton_fsr403_rebuild.fish; or return

functions -e amd_fsr4_install proton_fsr403_rebuild 2>/dev/null
source ~/.config/fish/functions/amd_fsr4_install.fish
source ~/.config/fish/functions/proton_fsr403_rebuild.fish


---

## 1) Get the FSR4 DLL

See available flags:

amd_fsr4_install --help


### Option A: download from AMD’s official site (browser), then use `--exe`

1) Go to AMD Drivers & Support, download the Windows driver EXE (Adrenalin) for your GPU/OS.  
2) Save it into `~/Downloads/`, then run:


amd_fsr4_install --exe ~/Downloads/whql-amd-software-adrenalin-edition-25.12.1-win11-b.exe --want 4.0.3


### Option B: let the script download via `--url` (example)


amd_fsr4_install --url "https://drivers.amd.com/drivers/whql-amd-software-adrenalin-edition-25.12.1-win11-b.exe" --want 4.0.3


Keep extracted files (optional):


amd_fsr4_install --url "https://drivers.amd.com/drivers/whql-amd-software-adrenalin-edition-25.12.1-win11-b.exe" --want 4.0.3 --keep-extracted


Verify:


ls -lah ~/.cache/fsr4/amdxcffx64-4.0.3.dll


---

## 2) Build Proton-CachyOS `*-fsr403` clones

Preflight:

proton_fsr403_rebuild --check


Plan mode (no changes):

proton_fsr403_rebuild --dry-run


Real run (close Steam first):

proton_fsr403_rebuild


Clean (remove clones):

proton_fsr403_rebuild --clean


---

## 🎮 Steam launch options (FSR4 4.0.3 local)

Use **only one** upgrade var (**don’t set both at once**):

### RDNA4

PROTON_FSR4_UPGRADE=4.0.3 PROTON_FSR4_403_LOCAL="$HOME/.cache/fsr4/amdxcffx64-4.0.3.dll" game-performance %command%


### RDNA3 / RDNA3.5

PROTON_FSR4_RDNA3_UPGRADE=4.0.3 PROTON_FSR4_403_LOCAL="$HOME/.cache/fsr4/amdxcffx64-4.0.3.dll" game-performance %command%


(Optional) indicator:

PROTON_FSR4_INDICATOR=1


---

## Optional: use with gENVW (wrapper)

Works great with **gENVW** (Gaming Env Wrapper) to keep Launch Options clean.

Repo: https://github.com/furbakka/gENVW

### Example (RDNA3/RDNA3.5 + indicator + HDR toggles)

HDR=1 LSC=1 NVMD=1 NTS=1 GP=1 PROTON_FSR4_INDICATOR=1 PROTON_FSR4_RDNA3_UPGRADE=4.0.3 PROTON_FSR4_403_LOCAL="$HOME/.cache/fsr4/amdxcffx64-4.0.3.dll" genvw %command%


### Example (RDNA4)

HDR=1 LSC=1 NVMD=1 NTS=1 GP=1 PROTON_FSR4_INDICATOR=1 PROTON_FSR4_UPGRADE=4.0.3 PROTON_FSR4_403_LOCAL="$HOME/.cache/fsr4/amdxcffx64-4.0.3.dll" genvw %command%


Tip: set only **one** of `PROTON_FSR4_UPGRADE` /`PROTON_FSR4_RDNA3_UPGRADE` (don’t set both).

---

## Troubleshooting
- Tool not showing in Steam: restart Steam (it only re-scans compatibility tools on startup).

- Game won’t launch: run `proton_fsr403_rebuild --check`, confirm the DLL exists at `~/.cache/fsr4/amdxcffx64-4.0.3.dll`, and make sure you set **only one** of `PROTON_FSR4_UPGRADE` / `PROTON_FSR4_RDNA3_UPGRADE`.
- Need logs: add `PROTON_LOG=1` to launch options and check `~/steam-<appid>.log`.

## Help
- `amd_fsr4_install --help`
- `proton_fsr403_rebuild --help`

Update: I am in the process of rewriting it all in bash and streamlining it into gENVW with a lot of automation/interactive mode that makes it easier and would allow you to basically have FSR4 4.0.3 with FSR4=4.0.3 genvw %command% or FSR4_RDNA3=4.0.3 genvw %command. It will also work with future FSR 4 4.0.4/5/6 etc. but how good that will be on RDNA3 is to be seen, if ever. Unfortunately i only have RDNA3 i can test with 7900xtx and when i am not sleeping after doing my 11 hour night shift duty work i try to get a couple of lines of code in between or fix existing bugs. Ask for your patience :slight_smile:

Hey how does this work, do I need to install something or will It just work with the command? What about fsr4.1?

https://overclock3d.net/news/gpu-displays/amd-fsr-4-1-upscaler-leaks-image-quality-gains-revealed/

Hi, just like I wrote in the instructions. I would advise you to wait, unless you wanna test it out. I’ve been working over two months now redesigning gENVW without public push/updates. It will be available for public release very soon. It will also support 4.1.0 you speak of or any FSR4 e.g 4.4.0 version for that matter with just one simple command, with a proper safe fallbacks depending on RDNA3/4 type. Outside the game you will also be able to check which FSR4 version your game is using with one short command. Not a mangohud replacement or optiscaler but made to work along side them if needed or on its own. This just started as a hobby project since I wanted newer FSR4 in my games on 7900xtx but ended up being over 11k lines of code as of yet.. Think of it as an FSR4 switch for FSR 3.x and 4.x games + much more that Windows driver provides for RDNA4 (9070XT) but now we have it simplified on Cachyos with RDNA2/3 and 4. Good stuff coming :+1:

From personal testing, all I had to do was make a symlink to the Redstone 4.0.3 upscaler DLL for the Proton amdxc64.dll shim to target: ln -s amd_fidelityfx_upscaler_dx12.dll amdxcffx64.dll
Worked trivially for loading the int8 4.0.2 DLL as well (for FSR4 upgrade using the int8 algorithm).

The legality of packaging and/or distributing the int8 DLL is questionable though.

The best approach to fiddling with FSR4 stuff is inside the Proton amdxc64.dll shim. It might be possible to get OptiScaler like behavior via this mechanism. But I haven’t delved too deeply here. It might be better to go about this another way.

Does anyone know if the FSR4 4.1.0 DLL has been uploaded? I’m curious if my trick will load it.

Edit: Found it.

Wow. I think I’m wrong on how the Proton amdxc64.dll shim works. I believe that it actually targets the amd_fidelityfx_upscaler_dx12.dll file directly.

$ lsof -t /home/user/.wine/drive_c/windows/system32/amdxc64.dll
28435
$ lsof -p 28435 | grep amd
wineserve 28435 user 1034r      REG   0,53       67088 2103137 /home/user/.wine/drive_c/windows/system32/amdxc64.dll
wineserve 28435 user 1251r      REG   0,53    13138192 2101778 /home/user/titan_quest_ii/TQ2/Binaries/Win64/amd_fidelityfx_upscaler_dx12.dll
wineserve 28435 user 1253r      REG   0,53     1090832 2101777 /home/user/titan_quest_ii/TQ2/Binaries/Win64/amd_fidelityfx_framegeneration_dx12.dll

Of note, amdxcffx64.dll is not loaded.

Looks like I need to do some more testing.

Baffling, looking at the strings inside the Proton amdxc64.dll shows that it wants to use and looks for amdxcffx64.dll (which means that it should be possible to load this pre-release 4.1.0 DLL). However, the FSR4 upgrade is enabled for me when I don’t even have the amdxcffx64.dll present. I only need to use the vkd3d-proton DLLs from proton-cachyos and the requisite RDNA3 envvar.

Yep, it never loads:

0024:trace:loaddll:build_module Loaded L"C:\\windows\\system32\\amdxc64.dll" at 00006FFFF5D40000: builtin
21213.598:0020:0024:info:vkd3d-proton:d3d12_device_init_vendor_hacks: Loaded amdxc64.dll successfully.
[...]
21213.604:0020:0024:info:vkd3d-proton:vkd3d_compute_shader_interface_key: Using DXIL_SPIRV_CONFIG = wmma_rdna3_workaround
[...]
0024:trace:loaddll:build_module Loaded L"G:\\home\\user\\titan_quest_ii\\TQ2\\Binaries\\Win64\\amd_fidelityfx_upscaler_dx12.dll" at 00006FFFF5070000: native
0024:trace:loaddll:build_module Loaded L"G:\\home\\user\\titan_quest_ii\\TQ2\\Binaries\\Win64\\amd_fidelityfx_framegeneration_dx12.dll" at 00006FFFF4F50000: native

And yet… the FSR4 upgrade works. Weird.

So, apparently, there is a fall-back path that performs the “FSR4 upgrade” using the upscaler DLL and there must be another toggle required to load amdxcffx64.dll.

I’ll need to slog through the vkd3d-proton and amdxc64.dll code. But maybe I’ll just install Proton and debug from there. Could be another Proton DLL or SO that gets used to orchestrate all this jazz with the amdxcffx64.dll that isn’t shipped with Wine.


UPDATE:

Solved it. You just need to add envvar FSR4_UPGRADE=1 to load the amdxcffx64.dll. Otherwise it falls back to the upscaler DLL. Which is actually a nice behavior to have when testing.

gENVW custom Patched CachyOS Proton

gENVW launch options in steam

In Game Options.

As soon you can see from FPS4 Overlay build date is FSR4 4.1.0

Looks like everthing is working on gENVW end. I added a direct --dll install option instead of just --exe/url and then having my CLI app search for FSR4 driver.
Just an example of new FSR4 ver install using gENVW. This release is not public as of yet. i still have a few issues to solve. Should push it to repo in less then a week.
Like i said this is just a hobby of mine and i work nights 12hr shifts finding time to do any of this is a pain :smiley:
I will never and do not distribute AMD dll’s. You have to source this on your own. Screenshots look crap, ingame looks great.

[furbacca@cachyos-x ~]$ genvw proton gpu
DRI_PRIME input:
DRI_PRIME parsed BDF: (none)
:desktop_computer: GPU detection
RDNA_GEN=3
Best-match device line:
03:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 [Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M] [1002:744c] (rev c8)
[furbacca@cachyos-x ~]$

Installing any FSR4 dll with gENVW

[furbacca@cachyos-x ~]$ genvw proton dll install --dll /home/furbacca/Downloads/amdxcffx64_v4.1.0.dll --ver 4.1.0
:white_check_mark: Installed from local DLL: /home/furbacca/Downloads/amdxcffx64_v4.1.0.dll
:white_check_mark: Installed: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.dll
:white_check_mark: Wrote provenance: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.meta.txt
:white_check_mark: Wrote report: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.report.txt
:warning: :shield: Allowlist: ALLOWLIST_MATCH=0 REASON=allowlist_missing
ALLOWLIST_PATH=/home/furbacca/.local/share/genvw/allowlists/amdxcffx64_v4.1.0.allowlist
:wrench: Fix: append fingerprint to allowlist: /home/furbacca/.local/share/genvw/allowlists/amdxcffx64_v4.1.0.allowlist
cmd: printf ‘%s\n’ ‘446e27b7eab3213a1fcb584516fcf24ffbdeb23be72136f3633e508320e71813 51084008 2401cb24a41a6609d67af99322c4959b’ >> ‘/home/furbacca/.local/share/genvw/allowlists/amdxcffx64_v4.1.0.allowlist’
:information_source: Run with --verbose/–debug for details.
:shield: Provenance integrity: :white_check_mark: META_MATCH=1 (ok)
:warning: :shield: DLL trust: Not trusted (META_MATCH=1, ALLOWLIST_MATCH=0)
:warning: Install finished, but the DLL is not fully trusted yet (META_MATCH and/or ALLOWLIST_MATCH failed).
:warning: gENVW will fall back to RDNA architecture defaults in soft mode (or refuse in strict mode) until you fix it.

Temp work around while i fix up my allowlist. In the pub release you will not have to type this huge wall of text. This step will not be required.
[furbacca@cachyos-x ~]$ mkdir -p ~/.local/share/genvw/allowlists
printf ‘%s\n’ \
‘446e27b7eab3213a1fcb584516fcf24ffbdeb23be72136f3633e508320e71813 51084008
2401cb24a41a6609d67af99322c4959b’ \

~/.local/share/genvw/allowlists/amdxcffx64_v4.1.0.allowlist

Verfying DLL
[furbacca@cachyos-x ~]$ genvw proton dll verify --ver 4.1.0
:white_check_mark: Installed: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.dll
size: 51084008 bytes
sha256: 446e27b7eab3213a1fcb584516fcf24ffbdeb23be72136f3633e508320e71813
md5: 2401cb24a41a6609d67af99322c4959b
:white_check_mark: Meta: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.meta.txt
:white_check_mark: Report: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.report.txt
:shield: Provenance integrity: :white_check_mark: META_MATCH=1 (ok)
:shield: Allowlist: :white_check_mark: ALLOWLIST_MATCH=1 (ok)
:white_check_mark: :shield: DLL trust: Trusted (META_MATCH=1, ALLOWLIST_MATCH=1)

DLL Check before running the game for the first time..
[furbacca@cachyos-x ~]$ genvw proton dll prefix-sync --ver 4.1.0 --appid 3764200
:white_check_mark: Installed: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.dll
size: 51084008 bytes
sha256: 446e27b7eab3213a1fcb584516fcf24ffbdeb23be72136f3633e508320e71813
md5: 2401cb24a41a6609d67af99322c4959b
:white_check_mark: Meta: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.meta.txt
:white_check_mark: Report: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.report.txt
:shield: Provenance integrity: :white_check_mark: META_MATCH=1 (ok)
:shield: Allowlist: :white_check_mark: ALLOWLIST_MATCH=1 (ok)
:cross_mark: prefix-sync: prefix DLL not found
:information_source: appid: 3764200

After running the game/in-game
[furbacca@cachyos-x ~]$ genvw proton dll prefix-sync --ver 4.1.0 --appid 3764200
:white_check_mark: Installed: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.dll
size: 51084008 bytes
sha256: 446e27b7eab3213a1fcb584516fcf24ffbdeb23be72136f3633e508320e71813
md5: 2401cb24a41a6609d67af99322c4959b
:white_check_mark: Meta: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.meta.txt
:white_check_mark: Report: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.report.txt
:shield: Provenance integrity: :white_check_mark: META_MATCH=1 (ok)
:shield: Allowlist: :white_check_mark: ALLOWLIST_MATCH=1 (ok)
:warning: prefix-sync: prefix DLL looks in use; close the game/Steam before syncing
:information_source: Tip: run this while the game is not running
:play_button: prefix-sync: installing cache DLL into prefix (creates amdxcffx64.dll.~N~ backup if existing)
cache: /home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.dll
pfx: /media/games/SteamLibrary/steamapps/compatdata/3764200/pfx/drive_c/windows/system32/amdxcffx64.dll
:white_check_mark: prefix-sync: prefix DLL updated
backup: /media/games/SteamLibrary/steamapps/compatdata/3764200/pfx/drive_c/windows/system32/amdxcffx64.dll.~1~
PFX_DLL=/media/games/SteamLibrary/steamapps/compatdata/3764200/pfx/drive_c/windows/system32/amdxcffx64.dll
PFX_SHA256=446e27b7eab3213a1fcb584516fcf24ffbdeb23be72136f3633e508320e71813
CACHE_DLL=/home/furbacca/.cache/protonfixes/upscalers/genvw/amdxcffx64_v4.1.0.dll
CACHE_SHA256=446e27b7eab3213a1fcb584516fcf24ffbdeb23be72136f3633e508320e71813
:white_check_mark: MATCH: prefix DLL matches cache DLL (v4.1.0)
[furbacca@cachyos-x ~]$

Nice job!

I also got it working too; but man, does 4.1.0 look bad (with notable flickering like FSR3)! Maybe it works better on RDNA4?