LTX25 Spatial Split Params
The tile controls that keep LTX2.5 sampling inside your VRAM
- spatial_split_param
- tile_width
- tile_height
This is the inner loop of LTX25 Ultimate Upscale: it decides how each time chunk gets cut into spatial tiles so the sampler never has to hold a whole frame in VRAM at once. Its spatial_split_param output wires into the main node's input of the same name. Don't connect it and each chunk is sampled whole - which is fine for small frames, and pointless for the high-res upscaled output this pack exists to produce.
The two tile-sizing modes
specific_size (default) is the direct one: set tile_width/tile_height in pixels. Both must be multiples of 32 - one LTX VAE token. Defaults are 512x512, which is a sane starting point on a mid-range card.
rows_cols is the smarter one for a known target: give it upscale_width/upscale_height (the upscaled frame size, matching what you set in LTX25 Latent Upscale Params) plus grid_rows x grid_cols (1-9 each), and it solves an equal-size tile grid for you - every tile identical, edge tiles included - with the per-axis overlap auto-solved to a multiple of 32. If the solved tiles would be smaller than min_tile_size, it errors rather than silently giving you slivers. Bonus: the node exposes the resolved tile_width and tile_height as real INT outputs, which is handy if you want to wire the actual tile size into other nodes.
The seam controls
spatial_w_overlap/spatial_h_overlap(default 128px) - overlap between neighbouring tiles, multiples of 32 and smaller than the tile. Inrows_colsmode these are desired values; the node solves the real ones.fade_width/fade_height(default 32px) - the width of the fade segment at the interior edge of the overlap band. The band splits into a frozen segment (seam side, mask 0) plus this fade. Set to 0 to freeze the entire overlap strip; it clamps to the solved overlap inrows_colsmode.min_tile_size(default 256) - edge tiles smaller than this get pulled back until they qualify.overlap_mode- who wins a shared band on stitch:earlier(already-stitched content wins, default) orlater(the re-sampled tile wins).overlap_blend- how the band transitions:linearcross-fade (default),smoothstep,overwrite, ormidpoint.
The economics, briefly
Tiling isn't free. Each tile is sampled at its true extent plus overlap, so the redundancy is roughly ((tile + overlap) / tile)² - 512px tiles with 128px overlap is about 1.56x wasted compute. Shrink tiles to 256px with the same 128px overlap and it jumps to ~2.25x. So the sweet spot is the largest tiles that keep peak VRAM just under capacity; the README's guidance to keep tiles at 256px or above applies to LTX2.5's 32px grid too. Watch the VRAM meter during the first tile and adjust one axis at a time.
A note on what the frozen-overlap machinery buys you: each tile's shared seams are pre-filled from already-stitched neighbours and locked with a noise mask, so the re-sample can only change the free interior. That's what stops tiled upscaling from looking like a patchwork quilt - the seam content is preserved, not re-guessed.
Installing
Part of bbaudio-2025/Comfyui-MMH3-UltimateUpscale. ComfyUI Manager (search "Comfyui-MMH3-UltimateUpscale"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/bbaudio-2025/Comfyui-MMH3-UltimateUpscale
Restart. No pip deps; needs a current ComfyUI.
Troubleshooting
- "must be a multiple of 32 pixels" - anything off the LTX grid errors at execution. Keep tiles, overlaps, fades and
min_tile_sizeon multiples of 32. - "spatial_w_overlap must be smaller than tile_width" / "fade_width must not exceed spatial_w_overlap" - the validation is explicit; read the error and fix the offending pair.
- "solved tile size … smaller than min_tile_size" (rows_cols) - reduce
grid_rows/grid_cols, or lowermin_tile_size. - Blocky tile boundaries - raise the overlap, or switch
overlap_blendtosmoothstep; if tiles are diverging, the freeze-mask logic is doing its job and your problem is per-tile sampling consistency, not the split.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| upscale_width | INT | 102432–100000 | [rows_cols mode] Overall upscaled frame WIDTH in PIXELS that gets split into grid_cols equal-size tile columns. Must be a multiple of 32 and must match the width set in 'LTX25 Latent Upscale Params'. Ignored in specific_size mode. |
| upscale_height | INT | 102432–100000 | [rows_cols mode] Overall upscaled frame HEIGHT in PIXELS that gets split into grid_rows equal-size tile rows. Must be a multiple of 32 and must match the height set in 'LTX25 Latent Upscale Params'. Ignored in specific_size mode. |
| tile_size_mode | COMBO | specific_size | How the tile size is determined. 'specific_size' (default): use tile_width/tile_height below. 'rows_cols': split the frame given by upscale_width/upscale_height into grid_rows x grid_cols EQUAL-SIZE tiles (edge tiles included) - the per-axis overlap is auto-solved (multiple of 32px, one LTX latent token) so every tile ends up exactly the same size; errors out if the solved tiles would be smaller than min_tile_size. |
| tile_width | INT | 51232–100000 | [specific_size mode] Tile width in PIXELS at the (upscaled) chunk resolution. Must be a multiple of 32 (LTX VAE 32x). |
| tile_height | INT | 51232–100000 | [specific_size mode] Tile height in PIXELS at the (upscaled) chunk resolution. Must be a multiple of 32. |
| grid_rows | INT | 21–9 | [rows_cols mode] Number of tile ROWS along the height axis (1-9). |
| grid_cols | INT | 21–9 | [rows_cols mode] Number of tile COLUMNS along the width axis (1-9). |
| spatial_w_overlap | INT | 1280–100000 | Horizontal overlap in PIXELS between neighbouring tiles. Must be a multiple of 32 and smaller than the tile width. In rows_cols mode this is the DESIRED overlap; the node auto-solves the actual value. |
| spatial_h_overlap | INT | 1280–100000 | Vertical overlap in PIXELS between neighbouring tiles. Must be a multiple of 32 and smaller than the tile height. In rows_cols mode this is the DESIRED overlap; the node auto-solves the actual value. |
| fade_width | INT | 320–100000 | Width in PIXELS of the FADE segment (mask 0->1) at the interior edge of the overlap band. The overlap band splits into a FROZEN segment (seam side, mask=0) + this FADE segment (interior side). fade_width sets the fade length; the frozen segment takes the rest. Default 32. Set to 0 to freeze the entire overlap strip. Clamped to the solved overlap in rows_cols mode. |
| fade_height | INT | 320–100000 | Height in PIXELS of the FADE segment (mask 0->1) at the interior edge of the overlap band. See fade_width. Clamped to the solved overlap in rows_cols mode. |
| min_tile_size | INT | 2560–100000 | Minimum PIXEL size of edge tiles. If a leftover edge tile would be smaller, the last tile is pulled back until it reaches at least this size. Must not exceed the tile size. In rows_cols mode an error is raised if the solved tile size falls below this. |
| overlap_mode | COMBO | earlier | Who wins each shared overlap band when stitching. 'earlier' (default): the already-stitched content wins. 'later': the re-sampled tile wins. |
| overlap_blend | COMBO | linear | How the overlap band transitions when stitching: linear cross-fade (default), smoothstep (eased), overwrite (whole band from the overlap_mode side), midpoint (hard switch at the band's middle). |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| spatial_split_param | LTX_SPATIAL_PARAM | Spatial split settings consumed by 'LTX25 Ultimate Upscale'. |
| tile_width | INT | Resolved tile width in PIXELS: the validated input in specific_size mode, or the equal-tile solution computed from upscale_width/grid_cols in rows_cols mode. |
| tile_height | INT | Resolved tile height in PIXELS: the validated input in specific_size mode, or the equal-tile solution computed from upscale_height/grid_rows in rows_cols mode. |