Releases: slushiimusic/NetherSX2-Slushii-Turnip-Fix
Release list
NetherSX2 (Slushii's Turnip Fix) v12812639
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
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_srcisgsby default, which blits PCSX2's render target 1:1. Set it toswapchainfor games where that target cannot be identified. The swapchain route works everywhere but downscales 1280x960 to the capture size and costs UBWC compression.fg_multiplieris pinned at2. Set it to4for 30 fps games on a 120 Hz panel, or toautoto 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
Final Pink build.
NetherSX2 (Slushii's Turnip Fix) v12812077
Add release guide
NetherSX2 (Slushii's Turnip Fix) v12812067
Prepare v12812047 release
NetherSX2 (Slushii's Turnip Fix) v12812057
Prepare v12812047 release