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
Radeon testers wanted. The AMD build lives in a separate repository, NeuralScreen-AMD, and it has not run on a real Radeon yet. Start from native/AMD.md there, and if it does not come up, attach the diagnostic package (Settings -> Program -> Create diagnostic package).
A patch on the v2.1 line, from a contribution (PR #124): fixes across the worker, converter, panel and log - the frame generation pacing among them.
Frame generation is paced by the compositor now
FG was to wait for the compositor to release the previous back buffer, not present on wall-clock deadlines. It never did: SetMaximumFrameLatency(1) and GetFrameLatencyWaitableObject work only on a swap chain created with DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT, and the chain was created without it. v2.1.2 only made the log admit the fallback; this sets the flag.
The chain starts at latency 3, and only an FG session takes it to 1 (restoring 3 when it stops): a chain created with the flag starts at 1, which is what flickered the ordinary NR path in the R13 attempt. ResizeBuffers passes the chain's own flags back, so the flag survives an HDR switch. Confirmed live: [fg] the presenter is paced by the compositor (latency 1).
Six defects in the native worker
- The BYO runtime is loaded through a live buffer.
LoadLibraryWgot a pointer into a buffer scoped to the block that verified it, dead by the call - undefined behaviour MSVC survived by luck. - DRED breadcrumbs actually turn on. They were asked of the created device, which no Windows answers, so every log said
unavailable (0x80004002)and a removed device had nothing behind its reason code. They come fromD3D12GetDebugInterface, so the call moved beforeD3D12CreateDevice. - Window mode: a stale oversized picture no longer hangs past the window. The old clamp moved it left and back, leaving it past the right and bottom edges; it is hidden until the resize lands.
- A size mismatch hides the overlay. It cleared one flag and left the last frame frozen; in window mode that flag read as a minimise, so the overlay returned every frame.
- HDR composite on a flipped display (#47). The capture shader turns the SDR proxies over but the composite read the native frame as it was - upside down, a double image with NR on. It gets
rotate180like the capture shader. - A timestamped NVIDIA DLL with an expired certificate is accepted again. The gate built its chain at the current time and without the signature's own certificates, so two real
sl.dlss.dllwith expired certificates were refused as not NVIDIA-signed.
A converted file is seen the way its source is
- EXIF orientation is applied before the frame goes in and removed from the EXIF written back, so a portrait photo is not sideways.
- A photo's colour profile carries into every output format - a Display P3 photo saved without it is read as sRGB and looks washed out.
- A 16-bit grey image's range is scaled, not clipped: Pillow's
I;16to RGBA takes everything above 255 as white (a ramp measured 99.6% white). - A video's display matrix is read from the first frame and set on the output stream, so a portrait clip no longer plays sideways.
- A portrait still that fits on its side goes through turned and back upright instead of failing as "the network stopped": the worker's 7680x4320 limit is landscape-only and the converter never asked. Too large both ways is refused up front, in all twelve languages.
The panel
The window recreated by a display-mode change keeps the contrast theme and the panel height. That path held the third copy of the theme restore, accepted light and dark only, and so reverted contrast on the next save; it also took the panel height from the dying window and never gave it back.
The show-yourself message is registered. 0x8000 + 0x4E53 was called WM_APP, which ends at 0xBFFF; 0xC000-0xFFFF is where RegisterWindowMessage hands numbers to every program in the session. It is RegisterWindowMessageW("NeuralScreen.ShowSettings") now.
The log stops growing without a bound
A user's log reached 7.8 MB and 81,768 lines in two and a half days, almost all of it heartbeat lines. A start now moves a log past 8 MB to NeuralScreen.log.1.
Tests
New or extended, each failing on v2.1.3: test_convert_orientation, test_log_rotation, test_single_instance_message, test_theme_rebuild, test_worker_zorder_and_safety.