Notice. Not affiliated with NVIDIA; NVIDIA, DLSS and the NVIDIA logo are NVIDIA Corporation's trademarks. The bundled NVIDIA runtimes are NVIDIA's property, included unmodified as received, research/educational use only, no warranty, use at your own risk.
Warning
NeuralScreen requires the latest NVIDIA driver. Operation with older drivers or unsupported/non-standard configurations is not guaranteed.
Important
AMD Radeon build - an active call for testers. A separate repository, NeuralScreen-AMD - the same overlay with the neural pass aimed at RX 7000 / 9000 (RDNA3/RDNA4). It has not run on a real Radeon yet. Start with native/AMD.md, and if it does not come up, press Settings -> Program -> Create diagnostic package and attach that one file: log, card, driver, the stage it stopped at, paths already scrubbed.
One user-visible fix, one that only shows up in a game, one diagnostic change that decides the open z-order reports, and a build fix from a contributor.
Fixes
The status line dropped the readings you actually watch. The line laid its values out from the RIGHT edge in reverse order and silently skipped whatever ran out of room - so the first casualty was NR, the rate people watch, and FG followed, while the resolution (printed again in the source section above) stayed. At 4K with a real card name the screen showed SKIP 0 3840x2160 and no rates at all. Reported as "no frame count shown", and the counter really was absent: it had been removed from the line in 2caf312 while the main loop kept handing it to the panel, so it reached no font. The line is now one row again - state and card on the left, readings anchored to the right edge with FG at the very edge - and the resolution, the skipped-frame count and the frame counter are gone from it by decision: none of the three is a number anyone acts on, and the resolution is already printed above.
The first hotkey press in a game did nothing. Hotkeys have two paths: RegisterHotKey (which delivers WM_HOTKEY and stops the key reaching the game) and a polling fallback for engines that grab the keyboard, where the message never arrives and GetAsyncKeyState is all we have. The polling fallback takes the key state at start as its baseline, so a key already held does not fire - correct, and it fixed a stuck-key bug. But the baseline was taken on the poller's FIRST SAMPLE, so in a game the first press after launch fell inside that sample, was recorded as "already down", and was swallowed. Reproduced 6 runs out of 6 in the poller-only case, and it is the first thing a player tries. The baseline now comes from registration, which happens before the poller's first tick: a key held at startup still does not fire, and a key pressed after it does.
The z-order guard now says what it saw. It decides whether the panel is re-asserted above the worker picture, and until now it decided silently. That made #96 and #89 undiagnosable: a reporter sends a bundle, nothing in the log names the window the guard found, and the only next step is to guess - which is what happened twice. Every branch now writes one line naming the class, title, pid and rect of the window that took the top and the branch it took (hud-on-top, picture-above-hud, foreign-above-hud, nothing-covers). The healthy state is logged too, so a log proves the code was reached rather than skipped. First live run named a case we had not seen: the NVIDIA GeForce overlay takes the top of the stack and the guard re-asserts over it.
Build scripts no longer assume the author's machine (contributed). Six scripts hardcoded a BuildTools path under C:\Program Files (x86), so on any other box - VS Community/Professional/Enterprise, or the tools on another drive - every build died with "The system cannot find the path specified." several lines before the real error, and the call discarded its own failure. They now resolve the toolchain through vswhere, with the lookup in one shared vcvars.bat that checks its result. Thanks to @HyperRamzey, who also added a clang-cl path for the same sources.
Tests
Seven test files in this package, each proven by mutation (the test fails when the thing it names is broken): the status line contract (9 mutations caught), the z-order decision log (8), the portable build scripts (3), the hotkey first-press case (the game path), the NGX result names (9), the FG step-down (8), and the taskbar activation discriminator (4).
Suite: 173 checks, 170 PASS / 0 FAIL / 3 SKIP, GUI-E2E 9/9. The three SKIPs are opt-in tests that need a live GPU run.