Skip to content

Releases: slushiimusic/NetherSX2-Slushii-Turnip-Fix

NetherSX2 (Slushii's Turnip Fix) v12812639

Choose a tag to compare

@slushiimusic slushiimusic released this 18 Aug 07:47

Build 12812639 (pink, xyz.aethersx2.cpink02).

Fixed

Frame generation ran at the wrong capture resolution, and fought itself doing it.
The capture default was derived from user_ir.txt, a file written by one code path
only and unwritable by the app if it was ever pushed with adb push. On the test
device it was frozen at IR 2.5 while the real setting was 1.5, so the capture buffers
were built 1280x1120 while the GS target was 768x672. The two then flipped against
each other on every boot, rebuilding the LSFG context each time, with an
AHB MISMATCH ... picture would be corner-boxed warning in the log.

The internal resolution is now read from PCSX2's own live setting, the same source the
GS expectation uses, so the two cannot disagree. Measured after the fix:
frame generation LIVE at 768x672 (ctx built 768x672, out told 768x672) — context,
capture and the value handed to LSFG all agree, with no flips.

A previous note held that the 512x448 x IR formula "does not describe this renderer".
It does. 1280x1120 was this bug, not the renderer.

The letterbox / game-rect route was never dead — it was never installed.
The viewport hooks had one install site, behind a switch tied to an old FSR-era
config key that the app now strips, so they were never registered. A silent probe
inside them had been read as "PCSX2 never calls vkCmdSetViewport" and the whole route
retired on it. They install under frame generation now and fire immediately.

Driver picker: its listing is logged, so what it enumerates is verifiable without
opening the dialog, and the row's fallback lookup searched for a title the row does
not have ("Turnip Driver" vs "Vulkan Driver"), which is fixed.

Frame generation cost guard logs when it arms, so a guard that is watching is
distinguishable from one that never got to.

Known / not verified in this build

  • Which viewport is the on-screen one is unresolved. With the hooks live, four
    distinct rects rotate every frame (measured on GTA Vice City: 1280x960, 960x672,
    960x336, 960x360, near-equal counts). This build reports a histogram once per
    window and deliberately claims no game rect while the window is ambiguous;
    it only issues a letterbox verdict when a window shows exactly one rect.
    Picking the right one needs the present pass identified.
  • The capture-extent fix and the viewport hooks were measured in game on 12812637.
    12812639 differs from it only in how one native function throttles its logging
    (that build emitted 30,831 log lines in two minutes), and that change was not
    re-verified in gameplay — the test game would not boot by intent on the last
    attempt.
  • The frame generation self-gate at IR 2.5 remains unverified.

NetherSX2 (Slushii's Turnip Fix) v12812553

Choose a tag to compare

@slushiimusic slushiimusic released this 17 Aug 23:55

Frame generation works now, and it ships off by default.

Frame generation

It previously produced no frames at all. Two things were wrong. The capture path was guessing which of PCSX2's render targets held the frame, and on a fresh install the native side wrote a default turnip.conf and then returned without reading it, so lsfg_overlay was parsed exactly once, before the file existed. Turning the switch on updated the file, the Java side believed it and reported the pipeline live, and the native side never heard about it. The framegen keys are hot reloadable now, so the switch reaches the shim while the game is running.

Measured on a Retroid (Snapdragon 8 Gen 2, Adreno 740, 120 Hz panel), Ultimate Spider-Man at 2x internal resolution with the 60 fps patch:

source multiplier output emulator
60 fps 2x 119 fps locked 60, no frames skipped
native 30 fps 4x 120 fps 29.97, unchanged

It is OFF by default. It needs your own Lossless.dll, it costs GPU time, and it adds roughly one frame of input latency. Turn it on under Settings, Graphics, Frame Generation, then restart the game: the swapchain has to be created with capture enabled, so toggling it mid game cannot take effect on its own.

Tuning

turnip.conf:

  • fg_capture_src is gs by default, which blits PCSX2's render target 1:1. Set it to swapchain for games where that target cannot be identified. The swapchain route works everywhere but downscales 1280x960 to the capture size and costs UBWC compression.
  • fg_multiplier is pinned at 2. Set it to 4 for 30 fps games on a 120 Hz panel, or to auto to have it pick per game. Auto is opt in because every change rebuilds the pipeline, and rebuilding mid motion looks like torn or invented frames.

Frame generation switches itself off, with the reason on screen, if it starts costing the emulator frames or producing fewer frames than the game already had.

Drivers

Bundled Turnip builds are selectable with driver= in turnip.conf. This release adds vauzi's Adreno 710/720/722 v3.5 build (Mesa 26.3.0, Vulkan 1.4.359) as libvulkan_freedreno_V710_722_v35.so, for handhelds on those parts. It is not for the Snapdragon 8 Gen 2 this was developed on, and is untested here because that is a different device family. The existing T29, T28, T24, T19, Gmem and Gen8 builds are unchanged, and the default is still T29.

Source: https://github.com/Vauzi-17/710

Fixes

  • Dark mode no longer reverts to light when you re-enter Settings. A background poll was reading the theme row on screen and writing its stale value back over your choice.
  • The "Frame generation needs Lossless.dll" prompt stops once you have supplied the file, and does not come back if the dll is later moved or deleted. The extracted shader cache is what matters, not the file it came from.
  • The Frame Generation switch in Graphics does something now. Every switch read in the shim had been failing silently on this build.
  • The black panel after entering the in-game settings menu now recovers on its own. The gs capture route can end up latched on a render target that PCSX2 has stopped drawing into, which shows every counter as healthy (real 59, gen 61, out 123 fps, 99% speed) while the screen is pure black. When the captured image stops changing for 8 seconds while the emulator is still running, capture switches to the swapchain, which by definition holds whatever was actually presented. The switch is safe even if the scene was merely still, because a still scene looks the same through either route.
  • The frame generation overlay recovers if the window manager drops it, instead of leaving output stuck offscreen with the counters reading zero.
  • The status row no longer says "rebuilding" forever when nothing is being rebuilt.
  • Present mode is left alone again. Forcing FIFO stalled the emulator at a 60 fps source and gained nothing at 30.

Not measured

Input latency, battery life and sustained thermals have not been measured. All testing was on one device with one driver.

NetherSX2 (Slushii's Turnip Fix) v12812247

Choose a tag to compare

@slushiimusic slushiimusic released this 15 Aug 05:50

Final Pink build.

NetherSX2 (Slushii's Turnip Fix) v12812077

Choose a tag to compare

@slushiimusic slushiimusic released this 15 Aug 04:55
Add release guide

NetherSX2 (Slushii's Turnip Fix) v12812067

Choose a tag to compare

@slushiimusic slushiimusic released this 15 Aug 04:52
Prepare v12812047 release

NetherSX2 (Slushii's Turnip Fix) v12812057

Choose a tag to compare

@slushiimusic slushiimusic released this 15 Aug 04:50
Prepare v12812047 release