nDisplay + DLSS: render resolution is divided by r.ScreenPercentage instead of multiplied, crashing every render node

Summary

When an nDisplay viewport uses DLSS as its upscaling method, the render resolution is computed as ViewportSize * ResolutionFraction / (r.ScreenPercentage / 100). With r.ScreenPercentage below 100 this makes the render resolution larger than the viewport, and once ResolutionFraction exceeds r.ScreenPercentage / 100 the DLSS input exceeds its output, NGX rejects the parameters, and every render node in the cluster crashes at the same moment. Selecting TSR instead, with nothing else changed, applies the same r.ScreenPercentage correctly as a multiplier.

What Type of Bug are you experiencing?

Virtual Production

Steps to Reproduce

  1. Set r.ScreenPercentage below 100. Ours came from Scalability — selecting Medium in Viewport Scalability sets sg.ResolutionQuality=71, which maps directly to r.ScreenPercentage=71.
  2. Launch an nDisplay cluster from Switchboard and join a Multi-User session.
  3. On the nDisplay Root Actor, set Viewports > Upscaler Settings > Upscaling Method to NVIDIA DLSS Super Resolution.
  4. Set Quality to DLAA.
  5. Every render node crashes immediately. The same happens when the setting is applied to the ICVFXCamera inner frustum instead of the outer viewports.

Expected Result

r.ScreenPercentage does not affect the DLSS render resolution; the quality mode’s resolution fraction determines it on its own. For DLAA (fraction 1.0) the render resolution equals the viewport resolution, and no quality mode can produce a DLSS input larger than its output.

Observed Result

The viewport is 2816 x 5120. DLSS receives 3967 x 7212, which is 2816 / 0.71 by 5120 / 0.71.

[NGXDLAA::CreateDlssInstance:2064] Error: Application passed invalid creation dimensions.
Input dimensions (3967 x 7212) must be <= output dimensions (2816 x 5120).

stat unit RenderRes on that viewport, with r.ScreenPercentage = 71. Every value matches ResolutionFraction / 0.71:

With the upscaling method set to TSR and nothing else changed, RenderRes is 71.0% on every node, i.e. viewport x 0.71, which is correct. Verified on four nodes with different viewport sizes and aspect ratios (2816x5120, 1536x5120, 1536x1536, 1536x768) — the factor is identical, so it is not derived from the projection geometry.

Affects Versions

5.8

Platform(s)

Windows

Upload an image

For crash reports, include your callstack

Assertion failed: (((ResultCreate) & 0xFFF00000) != NVSDK_NGX_Result_Fail)
[File: …\Plugins\DLSS\Source\NGXD3D12RHI\Private\NGXD3D12RHI.cpp] [Line: 367]
NGX_D3D12_CREATE_DLSS_EXT (CreationNodeMask=0x1 VisibilityNodeMask=0x1) failed!
(3134193669 NVSDK_NGX_Result_FAIL_InvalidParameter),
SrcRect=[0x0->3967x7212], DestRect=[0x0->2816x5120],
ScaleX=1.408736, ScaleY=1.408594, NGXDLSSPreset=Preset K(11),
NGXPerfQuality=DLAA(5), DenoiseMode=Off

[Callstack] UnrealEditor-Core.dll!UnknownFunction
[Callstack] UnrealEditor-NGXD3D12RHI.dll!FNGXD3D12RHI::ExecuteDLSS()
[NGXD3D12RHI.cpp:367]
[Callstack] UnrealEditor-DLSS.dll!FDLSSSceneViewFamilyUpscaler::AddDLSSPass’::::operator()()
[DLSSUpscaler.cpp:1196]
[Callstack] UnrealEditor-DLSS.dll!TRHILambdaCommand<FRHICommandListImmediate, …>::ExecuteAndDestruct()
[Engine\Source\Runtime\RHI\Public\RHICommandList.h:371]
[Callstack] UnrealEditor-RHI.dll!UnknownFunction
[Callstack] UnrealEditor-RHI.dll!UnknownFunction
[Callstack] UnrealEditor-RHI.dll!UnknownFunction
[Callstack] UnrealEditor-RHI.dll!UnknownFunction
[Callstack] UnrealEditor-Core.dll!UnknownFunction
[Callstack] UnrealEditor-Core.dll!UnknownFunction
[Callstack] UnrealEditor-Core.dll!UnknownFunction
[Callstack] UnrealEditor-RenderCore.dll!UnknownFunction
[Callstack] UnrealEditor-Core.dll!UnknownFunction
[Callstack] UnrealEditor-Core.dll!UnknownFunction
[Callstack] KERNEL32.DLL!UnknownFunction

Crash in runnable thread RHIThread

Additional Notes

Changing Viewport Scalability in the editor during a Multi-User session propagates to the running render nodes. We confirmed this by reading r.ScreenPercentage on a node before and after changing the quality level in the editor — the Scalability slot changed from 71 to 50 immediately. An artist lowering the scalability preset can therefore crash the whole cluster without touching any DLSS setting, and lower values make more quality modes fail, not only DLAA. Each node also writes the value into its own Saved/Config/WindowsEditor/GameUserSettings.ini on shutdown, so it persists into later sessions.

Workaround. r.ScreenPercentage=100 under [SystemSettings] in DefaultEngine.ini, which outranks SetByScalability. No quality mode crashes after that.

Environment. UE 5.8.2 (CL-56702186), Development. DLSS plugin 8.7.2-NGX310.6.0, driver 580.97, RTX 6000 Ada Generation, Windows 11 23H2. nDisplay cluster with Mesh projection policy, launched from Switchboard, Multi-User enabled.

Related. The assertion itself is in the NVIDIA DLSS plugin, and the failure handling has been reported to NVIDIA separately: . This report is about the resolution calculation on the nDisplay side.