MWSR next to FSR1, NIS and SGSR1
Four single-frame upscalers draw the same picture on your GPU. Each pane shows its output pixel for pixel, next to the native frame it tries to rebuild. The table scores each one against that frame and times it on this device. The README explains the method and gives the figures for two GPUs.
Your picture stays on this device. This page decodes, upscales and measures it inside this tab and uploads nothing. The site counts page views without cookies, and that count carries nothing of your picture.
Drag a pane to move all of them. Click the small picture to jump. In the wipe view, the slider moves the line. Each pane shows the pixels as they are, enlarged without smoothing.
Scores on this device
| Upscaler | Fidelity SSIM of the luma ×100, higher is closer | Colour SSIM of R, G and B ×100 | Overshoot pixels past their 4 input texels | GPU time per draw, ms |
|---|
How to read it
- The native frame is the picture at 2560×1440. The input is that frame reduced to 1920×1080 or 1280×720, by Lanczos-3 in linear light, the same reduction as the README. Each upscaler draws the input back at 2560×1440.
- Fidelity is the SSIM of the luma against the native frame, ×100: the README's measure, computed here on what your GPU drew. Colour is the mean SSIM of the red, green and blue channels, which sees the edges the luma misses: those of the colour text, whose colours all have one luma. On HDR both are taken on the PQ code of each BT.2020 channel, and the overshoot in nits (past 1 % + 0.5 nit), as the lab measures HDR.
- Overshoot is the share of pixels that leave the range of their four input texels by more than 2/255. It counts halos and ringing.
- GPU time is the median of batches of 100 draws, each batch timed by two GPU timestamps. The
browser rounds those timestamps (to 0.1 ms in Chrome), and a batch of 100 makes the rounding a small share. When
your GPU has
shader-f16, MWSR, FSR1 and SGSR1 are also timed in 16-bit and the faster of their two precisions is shown. Their 16-bit picture is first held to their 32-bit one: within 4/255 on 99.9 % of the pixels. The pictures and the scores are those of the 32-bit texts. Timings vary with the GPU's clock: run them twice before you trust a small gap. - 4:2:0 gives every upscaler the input a 4:2:0 stream would give it: its colour averaged over
2×2 pixels and brought back by interpolation, as a decoder hands it over.
CHROMA444is MWSR's mode for 4:4:4 streams. It is off by default, as in the README's figures, and the colour text shows what it does. - HDR: the pictures are the lab's, drawn by this page with 1.0 = 203 nits and highlights up to
1000 nits. MWSR and bilinear read the floats past 1.0 as they are. FSR1 runs inside AMD's reversible tone map
(
FsrSrtm), as AMD prescribes. NIS and SGSR1 run inside the same tone map, because neither port reads past 1.0 (MoonlightWeb's NIS port has noNIS_HDR_MODE, and SGSR1 clamps to 0..1). The tone map is not timed. - Your picture is decoded in this tab, and a picture larger than 3840×2160 is first reduced to fit. As the native frame, it is reduced and rebuilt, and scored. As the input, it is upscaled as it is and only the overshoot is scored. Pictures are read as 8-bit SDR.
The ports
These are MoonlightWeb's ports, the ones the client runs, not the vendors' own builds. FSR1 is firdawolf's WGSL
port of EASU and RCAS (RCAS at 0.75 stops), with the lab's port of AMD's 16-bit path (FsrEasuH,
FsrRcasH). NIS is a per-fragment transcription of NVScaler (SDK 1.0.3) at sharpness 0.5. NVIDIA ships
a compute shader with shared memory, which is faster, so its time here is the port's, not NIS's. SGSR1 is a port
of sgsr1.h (mode 1, edge threshold 6/255, edge sharpness 1.5), in 32-bit and in half precision.
MWSR runs with its defaults.
FSR and FidelityFX are trademarks of Advanced Micro Devices, NVIDIA is a trademark of NVIDIA Corporation, and Snapdragon is a trademark of Qualcomm. MoonlightWeb made this comparison with its own ports, and none of these companies made or endorsed it. The ports keep their vendors' notices (MIT for FSR1 and NIS, BSD-3-Clause for SGSR1) in kernels.js. MWSR is under the MIT License.
The 0 A.D. picture is © Wildfire Games. The screenshot is by PantheraLeo1359531 on Wikimedia Commons, under CC BY-SA 3.0, reduced to 2560×1440. The text chart is the MoonlightWeb lab's.