RTX Upscaler & Refiner
NVIDIA's RTX Video SDK as a 3-pass node
- images
- images
This node wraps NVIDIA's RTX Video SDK - the same tech behind RTX Video Super Resolution in the NVIDIA app and browser - into a 3-pass ComfyUI node: Denoise, Deblur, and Upscale, run frame by frame so VRAM stays flat no matter how long your clip is. If you've tried a bare RTX VSR node before and come away unimpressed, that's a known result, not user error, and it's exactly why this node doesn't stop at Upscale alone.
Why the multi-pass design, specifically
RTX VSR-only nodes have a reputation problem in the ComfyUI community: run VSR by itself and it can look like it's barely doing anything compared to the same SDK's output inside the NVIDIA app. The reason, once someone dug into the underlying nvidia-vfx module, is that a meaningful chunk of what the native app's "VSR" actually looks like is deblur layered on top of the upscale, not the upscale alone. This node treats Denoise and Deblur as their own independent passes you run before the Upscale pass, which is the two-step method that gets you results people expect from "RTX upscaling" instead of a flat resize with a marketing name on it.
How it works
Three stages, each toggleable independently and each processed frame-by-frame to keep memory use predictable on video batches:
- Refine -
denoiseanddeblurare separate booleans, each with its own_qualitytier (Low/Medium/High/Ultra). Turn on Deblur if your source is soft or AI-generated and looks smeared; turn on Denoise if it's grainy. - Upscale -
upscalepicks the mode:Off,VSR(the standard RTX super-resolution path), orHigh Bitrate(tuned for cleaner source video rather than restoring detail).upscale_qualityis the same four-tier scale. - Resize -
resize_type(Scale/Manual/Keep Ratio/Preset Ratio/Same Size) decides how the target dimensions are derived, backed byscale(1–4x),megapixels,width/height,divisible_by, andratio_presetdepending on which mode you pick.resize_methodchooses Center Crop or Letterbox when the source aspect doesn't match the target.
device_id picks which GPU runs the SDK if you have more than one NVIDIA card in the box.
The inputs and outputs that matter
Beyond the toggles above: images in, single images output - this is a mid-pipeline node, not a saver, so chain it into your Video Combine or Save node afterward.
How to install it
This is the one node in the pack with a real hardware requirement. Per the README: NVIDIA RTX GPU with drivers 530+. Windows users may additionally need the NVIDIA Broadcast SDK; Linux generally works out of the box once the pip package is installed.
ComfyUI Manager - search DaSiWa-Nodes, install, restart.
Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/darksidewalker/ComfyUI-DaSiWa-Nodes
pip install -r ComfyUI-DaSiWa-Nodes/requirements.txt
The RTX implementation itself is credited to Deno2026/comfyui-deno-custom-nodes - worth knowing if you've seen a similar "Deno RTX" node floating around; this is a different pack building on the same underlying approach, alongside Comfy-Org's own official RTX nodes package. Several implementations of the same NVIDIA SDK exist; don't be surprised if workflows online reference a different one.
Common issues & troubleshooting
Upscale looks like it did almost nothing. This is the exact community complaint above - bare VSR can be underwhelming. Turn on deblur (Medium or higher) before judging the Upscale pass; the combination is where the quality actually shows up.
It errors or silently no-ops on non-NVIDIA hardware. The RTX Video SDK is NVIDIA-only by definition - there's no CPU or AMD/Intel fallback for this specific node, unlike DaSiWa's Torch Resize, which is deliberately hardware-agnostic.
Older driver, weird behavior or install failure. Confirm you're at 530+ first; this is the single most common gate for any RTX-SDK-based tool, and it's worth checking before assuming the node itself is broken.
Inputs (34)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | IMAGE batch of still images or decoded video frames, not a VIDEO object. No audio, FPS or timestamps are passed through. Frame order/count stay unchanged; RGB output unless preserve_alpha is enabled. | |
| denoise | BOOLEAN | false | Enable NVIDIA RTX Denoise pass to clean up image grain and noise. |
| denoise_quality | COMBO | Ultra | Denoise SDK tier: Low favors speed, Medium is the middle tier, High favors quality, Ultra is the highest tier. Active only when denoise is on; actual cost/results depend on source, GPU and SDK. |
| deblur | BOOLEAN | false | Enable NVIDIA RTX Deblur pass to reduce motion or focus blur. |
| deblur_quality | COMBO | Ultra | Deblur SDK tier: Low favors speed, Medium is the middle tier, High favors quality, Ultra is the highest tier. Active only when deblur is on; no guaranteed detail recovery. |
| upscale | COMBO | VSR | Upscale mode: - Off: Skip upscale and keep source dimensions; resize controls are ignored. - VSR: Standard reconstruction for typical compressed sources. - High Bitrate: SDK high-bitrate reconstruction for clean/high-bitrate sources. - Streaming Medium / Streaming Ultra: SDK streaming quality presets when available; ignore upscale_quality. These do not stream VIDEO input/output or reduce full IMAGE batch storage. |
| upscale_quality | COMBO | Ultra | VSR / High Bitrate SDK tier: Low favors speed, Medium is the middle tier, High favors quality, Ultra is the highest tier. Ignored for Off and Streaming Medium / Streaming Ultra (preset defines the tier). |
| resize_type | COMBO | Scale | Active only when upscale is not Off. Same Size: exact source dimensions (ignores alignment). Scale: multiply width/height by scale. Keep Ratio: target megapixels and source aspect. Preset Ratio: target megapixels and ratio_preset. Manual: width/height. Other resize modes align by divisible_by; megapixels/aspect can be approximate. |
| scale | FLOAT | 2.001–4 | Multiplier for resolution (used by 'Scale' type). 2.0 = 4x the total pixels. |
| megapixels | FLOAT | 2.000.01–64 | Target total area in millions of pixels (used by Ratio types). |
| width | INT | 192064–8192 | Target width in pixels, active only for Manual with upscale enabled; divisible_by may adjust it. |
| height | INT | 108064–8192 | Target height in pixels, active only for Manual with upscale enabled; divisible_by may adjust it. |
| divisible_by | COMBO | 8 | For Scale, Keep Ratio, Preset Ratio and Manual with upscale enabled, align dimensions to the selected pixel multiple. 8 matches typical RTX sizes; 16, 32, 64 and 128 select progressively coarser pixel grids and may change requested dimensions. Use larger multiples only if a downstream model requires them. Ignored for Same Size or when upscale is Off. |
| ratio_preset | COMBO | 16:9 | Width:height shape, active only for Preset Ratio with upscale enabled: 1:1 square, 4:3 classic, 3:2 photo, 16:9 widescreen, 21:9 ultrawide. Alignment can slightly approximate the ratio. |
| resize_method | COMBO | Center Crop (Fill) | When upscale is enabled and source/target aspect differs: Center Crop (Fill) removes centered edges to fill the frame; Letterbox (Fit) retains the whole image and adds black padding. No effect for matching aspects or upscale Off. |
| device_id | INT | 00–8 | CUDA device index for NVIDIA RTX computation (0 is the first GPU). Must identify a supported NVIDIA device; output placement follows the allocator/input device, not necessarily this compute device. |
| empty_cacheopt | BOOLEAN | false | Run a lightweight GC + empty_cache before allocation; also calls model_management.soft_empty_cache() on the selected device (does not unload models). |
| use_mmapopt | BOOLEAN | false | OFF (default): never use disk; fail clearly if neither budgeted VRAM nor available RAM can hold the complete output. **WARN:** enable this ONLY for very long video batches that genuinely exceed available RAM; when on, disk is used as the last tier of the VRAM -> RAM -> disk chain and a multi-giB .mmap temp file is written to your temp drive for the whole run. |
| auto_unload_modelsopt | BOOLEAN | true | Reclaim targeted GPU memory under pressure. Before RAM output allocation, reclaim native execution caches and model pins, then re-check. Never reset the running executor or globally offload GPU models into RAM. Native cache eviction requires ComfyUI RAM-pressure cache support. |
| chunkingopt | BOOLEAN | true | Process frames in bounded internal chunks; output remains one standard IMAGE batch. |
| lossless_fp16opt | BOOLEAN | true | Use FP16 for output storage only when every FP32 pixel round-trips exactly; otherwise keep FP32. May provide no saving for typical VSR output. |
| chunk_framesopt | INT | 161–1024 | Maximum frames per internal processing chunk when chunking is on; also used by the optional FP16 storage check. Does not limit complete input/output batch allocation. |
| image_encodingopt | COMBO | 8-bit RGB | 8-bit RGB: default SDK encoding. 10-bit RGB (RGB10A2): packed 10-bit SDR SDK processing when supported, unpacked to FP32. Not HDR, restored source detail, or smaller IMAGE storage. |
| denoise_strengthopt | FLOAT | 1.000–1 | Denoise SDK strength from 0 to 1; 1.0 retains the SDK default. Active only when the denoise stage is enabled; changing it does not enable a skipped stage. |
| deblur_strengthopt | FLOAT | 1.000–1 | Deblur SDK strength from 0 to 1; 1.0 retains the SDK default. Active only when the deblur stage is enabled; changing it does not enable a skipped stage. |
| upscale_strengthopt | FLOAT | 1.000–1 | Upscale SDK strength from 0 to 1; 1.0 retains the SDK default. Active only when the upscale stage is enabled; changing it does not enable a skipped stage. |
| preserve_alphaopt | BOOLEAN | false | Keep input alpha separately, applying the same crop/letterbox/resize; no SDK filtering. |
| channel_integrity_checkopt | BOOLEAN | false | Sampled NaN/Inf and channel-collapse diagnosis before clamp. Heuristic: legitimate color changes can trigger it. |
| hdr_enabledopt | BOOLEAN | false | Final TrueHDR pass: normalized BT.2020/PQ HDR10 values, NOT SDR. IMAGE carries no HDR metadata; use a verified HDR encoder. |
| hdr_contrastopt | INT | 1000–200 | TrueHDR contrast control (0-200, default 100); affects light/dark separation. Active only with hdr_enabled. |
| hdr_saturationopt | INT | 1000–200 | TrueHDR color saturation control (0-200, default 100); affects color intensity. Active only with hdr_enabled. |
| hdr_middle_grayopt | INT | 5010–100 | TrueHDR middle-gray control (10-100, default 50); sets the midtone brightness reference, not peak luminance. Active only with hdr_enabled. |
| hdr_luminanceopt | INT | 650400–2000 | TrueHDR target peak luminance in nits (400-2000, default 650); choose for the HDR display/export target. Active only with hdr_enabled. |
| hdr_debandingopt | BOOLEAN | true | On: enable TrueHDR DL-Debander to reduce visible banding; Off: disable it. Active only with hdr_enabled; on is the NVIDIA default. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |