feat(vk): Intel XeSS Super Resolution as a temporal upscaler (Vulkan, the player's libxess.dll) #459
No reviewers
Labels
No labels
area/accessibility
area/audio
area/input
area/install
area/menu
area/renderer
area/saves
area/upscaling
good first issue
gpu/amd
gpu/igpu
gpu/intel
gpu/nvidia
help wanted
kind
bug
kind
chore
kind
docs
kind
feature
kind
performance
kind
question
needs measurements
platform/linux
platform/macos
platform/steam-deck
platform/windows
preview
priority
critical
priority
high
priority
low
status
blocked
status
confirmed
status
duplicate
status
invalid
status
needs-info
status
wontfix
testing wanted
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Longshot!459
Loading…
Reference in a new issue
No description provided.
Delete branch "nyannoying/Longshot:feat/xess-sr"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why
Intel Arc owners have no upscaler made for their GPU: DLSS needs an NVIDIA card and FSR 4 an RDNA 4 one. Intel's XeSS Super Resolution has a Vulkan API, so it can sit on Longshot's frame chain beside them.
What changed
gpu/vk/vk_xess.cpp(new) loads the player'slibxess.dllwithLoadLibraryExA, resolves its functions by name, asks it for the Vulkan instance extensions, device extensions and features it needs before the instance and the device are made, and runs XeSS on the temporal chain.gpu/vk/xess_rules.h(new) chooses the preset for a render size.vk_temporal.cpp,vk_main.cppandvk_draw.cppcall it; on Linux it is a stub that says why.upscaler_rows.h,vk_menu.cpp,auto_settings.h). When Intel's file or something it needs is missing, the row's hint says what; the game starts as before.third_party/xessholds Intel's MIT-licensed API headers only (xess.h,xess_vk.h,MIT.txt) with aPROVENANCE.md.libxess.dllis Intel's, under Intel's own licence, and is never in the repository or a build: the player puts it beside the game.nx2/build.py,nx2/pipeline_share.pyandscripts/dev_packs.pyknow the new file; no shader-stamp input changed.tests/test_xess_rules.py(new) and the upscaler rows, menu keys, temporal jitter, recorder sync and shader stamp checks updated for the two values.RX_VK_XESSrow indocs/development.md, a line inCONTRIBUTING.md.Flags and settings
dlss=7), Intel XeSS Native AA (dlss=8)RX_VK_XESS=0/1/2RX_VK_XESS_DIR=<folder>libxess.dllRX_VK_XESS_HDR=0Measurements
main:
cf605c85(2026-11-14)this PR: feat/xess-sr @
9cd76becHardware: Intel Arc B580 12 GB, driver 32.0.101.9154; Core i5-13600K; 64 GB; Windows 11 Pro (26100-series Insider, 10.0.29704)
Scene: Kokiri Forest (child), the spawn spot on Link's balcony after the opening, standing still; 2048x1152 output, render size 1366x768 (67%), frame generation off, uncapped (
HOS_FPS_MAX=1000);libxess.dllfrom Intel's XeSS SDK 3.0.2 (it reports XeSS 2.0.2)Method: 6 runs on one build, the upscaler alternated (off, XeSS, Native AA, off, XeSS, Native AA) with
RX_VK_XESS=0/1/2, each about 50 s standing after the load; fps from the log'svi: ... frames presented (... fps over the last 5.0 s)lines (last 8 windows, their median), GPU time fromvk: GPU time ... ms a frame(last 5 lines, their median).How to reproduce: put
libxess.dllbeside the game, choose Upscaler > Intel XeSS in the Graphics tab (orRX_VK_XESS=1), stand in Kokiri Forest; the log saysvk: Intel XeSS: 1366x768 -> 2048x1152 (Ultra Quality).Baseline: this PR @
9cd76bec,RX_VK_XESS=0(the game's own upscaler), the build with XeSS never loaded. main itself was not the comparison because on the B580 it loses the device entering Kokiri Forest (#444). The build that ran is b46daa73, this change on maincf605c85, with three more changes in: #444's float-add fix, the uniform snapshot of #446 and the split rule of #443. The branch has since been rebased onto main26a2eab0(9cd76bec; one conflict, inscripts/dev_packs.py's list of renderer-only folders, where main's new lines are kept andthird_party/xess/added) and was not run in the game again: a main-based build has another shader stamp than this card's prepared caches.9cd76bec,RX_VK_XESS=0(the game's own upscaler)9cd76bec, Intel XeSS (1366x768 -> 2048x1152)9cd76bec, Intel XeSS Native AA (2048x1152)At this spot the frame is limited by the CPU (about 28 ms a frame against 12-15 ms of GPU time), so the frame rate is about the same three ways; what XeSS costs shows in the GPU time: about 1.7 ms a frame more than the game's own upscaler at the same render size, and 3.6 ms more for Native AA, which also renders at full size.
Testing
Tested: Arc B580, 101.9154, Windows 11, Kokiri Forest: the six runs above (files in
docs/tested/); XeSS and Native AA both make their context, run every frame and show a right picture (first comment). WithRX_VK_XESS=0Intel's library is not loaded.python -I -B tests/run_all.pyon the rebased head: 487 passed, 6 failed, 70 skipped; the failures aretest_module_ids,test_pad_layout,test_tested_configurations,test_oot_state_tap,test_fpx_stickyandtest_spawn_emit, which fail the same way on main here.python -I scripts/check_third_party.pypasses with the newthird_party/xess.Not tested: choosing the value in the menu in this session (the runs used
RX_VK_XESS); native HDR with XeSS; the render sizes other than 67% and 100%; other areas; cutscenes; frame generation together with XeSS; GPUs other than the B580 (XeSS's path for non-Intel GPUs); a missing or oldlibxess.dllin the game; the rebased head in the game (see Baseline); a Linux build (no Linux compiler on this PC; the Linux side is a stub, so the template's two-platform box is left out, not ticked).Needs other testers:
libxess.dllbeside the game: Upscaler > Intel XeSS and Intel XeSS Native AA from the menu, expecting a right picture and thevk: Intel XeSS:lines in the log (T-UUJ4)Screenshots
Kokiri Forest spawn, Arc B580: posted in the first comment (the game's own upscaler, Intel XeSS, Intel XeSS Native AA, from the measured runs).
Risk and rollback
Nothing changes until the player chooses XeSS and has put Intel's file beside the game: without the file the two rows say so. With the file there, its Vulkan extensions are asked for at start even when another upscaler is chosen (
RX_VK_XESS=0prevents the load). Windows only. Reverting the commit removes it.Reviewer notes
third_party/xess/PROVENANCE.mdhas the blob ids).libxess.dllis loaded by name at run time and the import library is not linked.Issues
None.
Checklist
For everyone
type(scope): description).main.python -I -B tests/run_all.pyrun and passing (any failure that also fails onmainis named above).third_party/untouched (a new folder with aPROVENANCE.mdinstead).If applicable
Assisted-by:/Co-Authored-By:trailers.docs/tested/for each new measured run (format indocs/tested-configurations.md; no appended row or assembled view).tests/that reads changed source updated in this PR, not weakened.🤖 Generated with Claude Code
Kokiri Forest, the spawn spot, Arc B580 (101.9154), 2048x1152 output, from runs X4 to X6 of the Measurements (one build, only
RX_VK_XESSdiffers; the scene moves a little between runs).The three test requests are open (T-UUJ4: Arc A-series or an Intel iGPU; T-3X7L: an AMD or NVIDIA GPU; T-3N56: a Linux build) and named in the description; they wait for a maintainer's testing wanted label.
WIP: feat(vk): Intel XeSS Super Resolution as a temporal upscaler (Vulkan, the player's libxess.dll)to feat(vk): Intel XeSS Super Resolution as a temporal upscaler (Vulkan, the player's libxess.dll)00458c6d1b3fdd4ed8eeRebased onto main
26a2eab0(it had moved; one conflict in scripts/dev_packs.py, main's new stamp lines kept and third_party/xess/ added to the renderer-only folders). The diff of the change is otherwise the same, so the measurements stand; the suite on the new head: 487 passed, 6 failed (the six that fail on main here), 70 skipped.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.