Back to Blog
    Last Week in Unreal

    Last Week in Unreal: 5.8.4 Takes Shape, and ue6-main Switched D3D12 Residency to a New Tracker (October 5 to October 11, 2026)

    Venkat S31 min read
    Terminal-style commit analysis card on a dark navy background, showing 1,168 Unreal Engine 6 commits on the ue6-main branch for the week of October 5 to October 11, 2026, under the headline Last Week in Unreal.

    Unreal Engine Weekly: 5.8.4 Takes Shape, and ue6-main Switched D3D12 Residency to a New Tracker

    Week of October 5 to October 11, 2026 | 1,168 commits on ue6-main, 92 on ue5-main, 113 on the public 5.8 branch | Branch: ue6-main

    Overview

    If you ship on 5.8, start with the last section of this post. On Monday the public 5.8 branch was bumped with “Update version for 5.8.4,” a commit carrying a #lockdown tag, and 108 cherry-picked fixes landed alongside it in one block. One of them says outright that it is a “Backport UE-395636 for the UE 5.8.4 hotfix candidate.” There is no 5.8.4 release tag yet (the newest is 5.8.3), so this is a hotfix candidate still being assembled. What is in it matters for build farms: a UBT fix for binaries that were not being relinked, a UAT log stall, a Horde path traversal fix, an iOS lifecycle default change for Xcode 27, and a Vulkan fence default flip that applies to desktop.

    On ue6-main, this was a week of defaults. D3D12 residency management moved to a new tracker, opt-in on Monday and default by Thursday (c43ab669). Vulkan bindless now prefers descriptor heaps and shader objects (27c90725). The platform I/O dispatcher, which last week’s post reported as not enabled, is now on by default for game and client targets (b865826a). And the editor auto-starts its MCP server through per-user settings (9fb9185f). Lumen got a new runtime surface cache, LumenWorldCache (c249eca8), and in the same week lost its seven per-subsystem hardware ray tracing CVars (069e277d), so any config that toggled HWRT for one Lumen pass now does nothing.

    At 1,168 commits, ue6-main had its busiest week since this briefing started tracking it in June, above the previous high of 1,072 for September 21 to 27 and last week’s 1,065. Among named subsystems, build leads at 99, followed by editor at 81, core at 72, rendering at 71, and platform at 40.


    Agent tooling had its biggest week yet

    Pattern: counted the way we counted last week (commits touching the toolset registry, the AI Assistant plugin, the experimental toolsets, AsyncFunctionResult, and ToolsetCore, by path or by name in the message, with mesh modeling toolsets excluded), the cluster came to 64 this week. Including the ModelContextProtocol plugin and a few incidental sweeps brings it to 79. The four prior weeks were 20, 30, 56, and 46. Either way, this is the highest of the five.

    Interpretation: the new work gives agents more reach and more control over what they start. A new ToolCalls toolset lets the agent see and stop calls it backgrounded, with “ListRunning, GetResult, Cancel and CancelAll,” each “scoped to the conversation of the call that invoked it, so one conversation cannot read or stop another’s work.” (0551fdd9). A Knowledge Base plugin adds “a registry of providers with an in-memory SQLite/FTS5 index” (10061736). A FabToolset was added “for searching and installing Fab listings” (66b14bed). Sequencer and animation tools moved onto native scripting APIs, removing several Python toolsets (e4d068b7).

    Most teams will notice the MCP server change. One commit, part of a change that starts Python at editor boot, removed the “UEFN MCP Toolsets experimental setting, project-gated Python registration shim, and MCP server auto-start helper” (e0a3c77f). The next day, another enabled “MCP server auto-start by default in the editor and UEFN through editor per-user settings, keeping the C++ default disabled for runtime targets” (9fb9185f). It lands as bAutoStartServer=True in BaseEditorPerProjectUserSettings.ini, and the commit does not say what the server binds to. If you run the editor on build agents or shared machines, decide whether you want it running there and override the setting if not.

    Who cares: tools programmers, pipeline and automation teams, anyone responsible for what runs on editor machines.

    Signal strength: Strong.

    UBA volume fell, and authorship spread out

    Pattern: counting commits whose paths touch UnrealBuildAccelerator, this week came to 13, the lowest of the five weeks we have counted (the priors were 37, 19, 36, and 19). Last week all 19 came from one engineer. This week the 13 came from six engineers, split 6, 3, 1, 1, 1, and 1.

    Interpretation: last week we wrote that UBA was still one engineer’s work, and this week does not fit that reading. The work also leaned toward correctness (a wrong-size CAS entry, a heap overflow, a Linux deadlock), covered under Highlights. One week of broader authorship does not establish a pattern, so we will keep counting.

    Who cares: build and CI engineers, anyone whose build farm depends on UBA.

    Signal strength: Moderate.

    Land opt-in, then flip the default within days

    Pattern: three RHIs changed defaults. The D3D12 residency tracker landed as opt-in on Monday (65917c7e), took a startup crash fix on Tuesday (256bd31e), and became the default on Thursday (c43ab669). Vulkan bindless switched its preferred extension and enabled shader objects on Friday (27c90725). Mac enabled “the RHI thread by default at ES3_1” (4c5a115c). Outside the RHIs, the platform I/O dispatcher went default for game targets the same day its deadlock fix landed (a26cc9d9, b865826a).

    Interpretation: this week, Epic did not leave these new paths behind opt-in flags for long. A regression after a sync can come from a default you did not change. The D3D12 and I/O dispatcher commits document a way back, listed under Highlights. The Vulkan and Mac commits do not.

    Who cares: rendering and RHI engineers, anyone running performance or stability passes against ue6-main.

    Signal strength: Moderate.


    TL;DR

    • If you ship on 5.8, a 5.8.4 hotfix candidate is being assembled. The version bump came with 108 cherry-picks. They include a UBT fix for external libs “preventing binaries from being relinked,” a UAT log stall, a Horde path traversal fix, and two default changes, iOS UIScene lifecycle and Vulkan r.Vulkan.CpuWaitForFence. Details are in the 5.8 section below.
    • D3D12 residency now uses a new tracker by default. D3D12.ResidencyManagement went from 1 to 2. The commit says “Use D3D12.ResidencyManagement=1 to switch back” (c43ab669). It is read-only, so set it in config.
    • Per-pass Lumen HWRT CVars are gone. Seven were removed, and “r.Lumen.HardwareRayTracing is now the only CVar to toggle between SWRT and HWRT” (069e277d). LumenWorldCache arrived as an opt-in replacement for card-based surface caching (c249eca8).
    • The platform I/O dispatcher is on for game and client builds. UE_PLATFORM_IO_DISPATCHER_ENABLED “now defaults to UE_GAME instead of 0,” and “-NoPlatformIo disables the platform dispatcher at runtime” (b865826a).
    • More defaults moved. Vulkan bindless prefers VK_EXT_descriptor_heap with shader objects on (27c90725). r.ShaderPipelines became read-only (efc31233). r.AVBOIT.SampleBias went from -2 to 0 (602f1317). Nanite visualization modes now need r.ForceDebugViewModes=1 outside editor and ODSC shader maps (87860b5e). Low and Medium shadow quality now use Stochastic PCSS for directional VSM (3bf20216).
    • Expect one-time recooks. At least four commits announce them, including “one-time full recook” (a14aa680) and “one-time recook of all blueprint packages” (8d5abe19). A multithreaded save race that produced packages “with an empty header” is fixed (7ac3eb85).
    • UBA served wrong file content on Mac helpers. A symlink’s size was stored against its target’s hash, so “Mac helpers served 15 bytes” and remote compiles failed (711b4de2). A heap overflow in long sessions is also fixed (5d50dc97).
    • Check CI wrappers that key on exit codes. Invalid MRQ arguments now exit with an error code instead of crashing (b097d529), and Mac build-machine crashes exit “1 instead of 3” (4a65fd73). A title-only commit reads “[Mac] Require macOS 15 Sequoia” (8a45c509).

    Highlights

    D3D12 residency moved to a new tracker, opt-in Monday and default by Thursday

    What changed

    On Monday, “New D3D12 GPU residency tracker, replacing D3DX12Residency” landed with the line “Opt in with D3D12.ResidencyManagement=2; the default (1) keeps the existing D3DX12Residency path unchanged.” The commit describes it as “Much cheaper than D3DX12Residency on the submission and RHI threads” and says “The new tracker also covers work graphs, which D3DX12Residency never tracked, and frees their backing memory” (65917c7e). On Tuesday, a startup crash from “a bad robomerge resolve” was fixed (256bd31e). On Thursday: “Use the new D3D12 residency management code path by default,” with “Use D3D12.ResidencyManagement=1 to switch back to the D3DX12Residency library” (c43ab669).

    The diff confirms the default moved from 1 to 2, and the help text now marks the RHICore residency tracker as the default. The CVar is read-only, read once at device creation.

    Why this is important

    A new residency implementation can change hitching, paging, and device-removed behavior without any change in your content, and the commits say nothing about behavior under memory pressure. If a D3D12 build on ue6-main starts stalling or losing the device after this sync, set D3D12.ResidencyManagement=1 in config first, since the CVar cannot be changed at runtime.

    Who should care

    D3D12 rendering engineers, performance teams, anyone triaging GPU memory issues on Windows.

    Urgency

    Act now if you profile D3D12 memory or see new stalls after syncing. Track otherwise.


    Lumen added a runtime surface cache and removed its per-pass HWRT toggles

    What changed

    LumenWorldCache is described as an “automatic surface cache replacing previous LumenSurfaceCache relying on precomputed mesh cards.” It is “built at runtime by path tracing (by default 1/64 spp) from GBuffer and caching hits in sparse voxel cells” and “Requires ray tracing and hit-lighting (full/material ray tracing mode).” The claimed benefits include “No CPU overhead,” “x10 smaller memory usage,” and skipping the card cooking step. Measured on “FortGPUTestBed, console, 1080p, High scalability,” it came in “0.35ms slower indoors” and “0.4ms faster ourdoors” (sic). The “Missing functionality” list is long, including “Lumen hit-lighting support,” “Ambient Lighting Volume support,” and “Far Field support” (c249eca8).

    One detail needs care. The message says to enable it with “r.Lumen.WorldCache.Support 1,” but the diff registers r.Lumen.WorldCache.Supported (default false), plus r.Lumen.WorldCache.Allowed (default true) for scalability and device profiles. Use the name in the diff.

    Epic cleared the way in the same week. Two experimental paths, r.LumenScene.GPUDrivenUpdate (d9e01e2a) and r.LumenScene.DirectLighting.Stochastic 1 (771669e4), were removed for “fundamental issues” that “weren’t ever solved,” and both commits name LumenWorldCache as “a more promising approach.”

    Then the per-subsystem HWRT toggles went. “Those CVars were added during the initial HWRT bringup for debugging but they don’t make much sense anymore (nor they work well),” and “r.Lumen.HardwareRayTracing is now the only CVar to toggle between SWRT and HWRT” (069e277d). The diff removes seven:

    • r.Lumen.RadianceCache.HardwareRayTracing
    • r.LumenScene.Radiosity.HardwareRayTracing
    • r.Lumen.Reflections.HardwareRayTracing
    • r.LumenScene.DirectLighting.HardwareRayTracing
    • r.Lumen.ScreenProbeGather.HardwareRayTracing
    • r.Lumen.TranslucencyVolume.HardwareRayTracing
    • r.Lumen.Visualize.HardwareRayTracing

    Why this is important

    The CVar removal hits config today. A project that ran HWRT reflections but software tracing for screen probes, or turned HWRT off for one pass on a lower-end device profile, loses that split, and the ini lines stop doing anything. Search your config and device profiles. WorldCache is opt-in, needs full ray tracing, and still has gaps, but the removals show where Lumen is heading. If you have built anything on mesh card data, watch it.

    Who should care

    Rendering engineers, technical artists shipping Lumen with HWRT, anyone with Lumen CVars in device profiles.

    Urgency

    Act now if your config sets any of the seven removed CVars. Track WorldCache.


    Defaults that moved this week

    What changed

    • Vulkan bindless prefers descriptor heaps and shader objects. “VulkanRHI: Change default to shader_objects and descriptor_heaps for bindless” (27c90725). The diff changes r.Vulkan.Bindless.PreferredExtension from 0 to 1 (VK_EXT_descriptor_heap) and r.Vulkan.AllowShaderObject from 0 to 1.
    • The platform I/O dispatcher is on for game and client targets. “UE_PLATFORM_IO_DISPATCHER_ENABLED now defaults to UE_GAME instead of 0. Game and client targets use the platform I/O dispatcher; server and editor targets keep the existing I/O path.” The commit adds that “-NoPlatformIo disables the platform dispatcher at runtime” (b865826a). It landed right after “Fixed I/O dispatcher deadlock when running with the new platform dispatcher” (a26cc9d9).
    • The editor auto-starts its MCP server. Covered under Development Trends (9fb9185f). The C++ default stays disabled for runtime targets.
    • r.ShaderPipelines is read-only. Material shader pipelines are no longer compiled where the CVar is off, which the commit says includes Windows. “r.ShaderPipelines is now read-only, since toggling it on at runtime would find no pipelines and fall back to the default material” (efc31233). The code default stays 1, but the commit notes Windows runs with r.ShaderPipelines=0.
    • AVBOIT sample bias went from -2 to 0. The diff changes r.AVBOIT.SampleBias from -2.0 to 0.0, part of a transmittance fix covered below (602f1317).
    • Nanite visualization needs a flag in packaged builds. The raster VISUALIZE permutations now compile only “for editor and ODSC shader maps (or r.ForceDebugViewModes=1),” and the visualizations that need them are disabled elsewhere. Development builds show “an on-screen message” when one is requested but unavailable (87860b5e).
    • Directional VSM uses Stochastic PCSS at Low and Medium shadow quality. Set through BaseScalability.ini, covered below (3bf20216).
    • Win64 links write the PE checksum. WindowsTargetRules.bSetImageChecksum now defaults “to true for Win64,” for non-incremental links. Covered under the Wine fixes below (62be1807).

    Why this is important

    The Vulkan change switches the descriptor model and the pipeline object model at once, so test it first. The I/O dispatcher affects every packaged game build. If you see new loading hangs, -NoPlatformIo is your first bisect step. QA and performance teams that use Nanite visualize modes in packaged Development builds will need r.ForceDebugViewModes=1 for the target platform.

    Who should care

    RHI engineers, Vulkan teams, anyone shipping packaged builds from ue6-main, QA and performance teams.

    Urgency

    Act now on Vulkan and the I/O dispatcher if you run either. Track the rest.


    Nanite culling was rewritten, and translucency got correctness fixes

    What changed

    Nanite has a “New faster Nanite multi-pass culling implementation with SIMPLE/COMPLEX shader classification, adaptive fanout and cluster range encoding.” Instances needing expensive features such as skinning or WPO are classified COMPLEX and traversed by a separate permutation. The commit says “This new culling path is now used everywhere and the old persistent culling path has been removed,” and that “Performance tends to be at slightly better or at parity on tiny scene, but significantly better for even moderately large scenes.” New controls: r.Nanite.Culling.Classification (default 1) and r.Nanite.Culling.AdaptiveFanoutThreadBudget, “0 to disable” (ad75acf2).

    On translucency, an AVBOIT and MLAB fix corrects three visible problems. The old -2 slice bias “also discarded real occluders - geometry behind one slice of glass kept an untinted highlight,” and now “the bias defaults to 0.” On MLAB’s separate translucency path, the background was attenuated twice, “so a measured green of 0.24 reached the screen as 0.02.” And the combine sample array was resized to cover r.OIT.SortedPixels.MaxSampleCount, “which previously sorted out of bounds at 9 or 16” (602f1317).

    For low-end platforms, directional VSM gained a Stochastic PCSS projection, “usually taking less than half the time” of SMRT at reduced quality, with no local light support yet. The CVar’s code default stays SMRT, but the diff sets r.Shadow.Virtual.ProjectionMethodDirectional=1 in BaseScalability.ini at Low and Medium shadow quality, so those levels now use SPCSS by default (3bf20216).

    Why this is important

    There is no fallback to the old Nanite culling path. If your GPU frame time moves after this sync, in either direction, this is a likely place to look, and r.Nanite.Culling.Classification and the fanout budget are the knobs to bisect with. The AVBOIT change alters how translucency looks: anything tuned against the old bias, or against MLAB’s double attenuation, will render differently. And if you ship at Low or Medium shadow quality, directional shadows now use a different, cheaper projection unless your own scalability config sets the CVar back to 0.

    Who should care

    Graphics programmers, technical artists working with translucency, low-end platform teams.

    Urgency

    Track. Re-check translucent content if you use AVBOIT or MLAB, and directional shadows if you ship Low or Medium shadow quality.


    UBA: a wrong-content CAS entry, a heap overflow, and Wine farm fixes

    What changed

    The UBA fix with the most visible symptom is for Mac helpers. With symlink support on, “a symlink’s size is its target path length.” PopulateCasFromDirsRecursive “hashed the link target’s content but stored the link size, so a CAS entry could advertise the wrong size.” In practice, “Xcode’s usr/include/sched.h -> pthread/sched.h (15 bytes) shares a CAS key with AutoSDK AppleOSS sched.h, so Mac helpers served 15 bytes and remote compiles failed with” an unterminated /* comment error (711b4de2).

    Other correctness fixes:

    • Heap overflow. A fixed 1M-entry array “was written past its end when a directory chain grew longer (one link per mtime change, e.g. frequently touched lock files in a long session)” (5d50dc97).
    • Linux deadlock. “Linux: fix opendir/fstat deadlock” (3573b6fc).
    • ParkingLot race. A race in TimedWait caused “the later wait to end too early” (e0106d20).

    For Wine-hosted builds, two large fixes. On hosts with more than 64 logical processors, wineserver’s default affinity “pins every Wine thread, and therefore every spawned cl.exe/UbaObjTool.exe, to CPUs 0-63.” A preloaded shim fixes that, with a caveat: “A wineserver started earlier without the shim (e.g. by running any Wine program first) keeps the 0-63 pinning until it exits; ‘wineserver -k’ before building clears it” (fce0c399). And because editor DLLs carried a zero timestamp and checksum, “Every module load therefore made one server round trip per loaded module, which scales with the square of the module count: about 621k calls during editor startup.” UBT now writes the PE checksum for non-incremental Win64 links (incremental links still skip it), which fixed it. Under Wine 11.7, “Windows_LoadLibrary: 21.6s -> 5.9s (982 loads)” and “Cook wall time: about 110-116s -> 97s.” The commit says “native behavior is unchanged” (62be1807). A related fix for Wine cooks against UBA Horde agents, where “every distributed job failed,” keeps “existing Windows hashes and DDC keys” unchanged on native Windows (9719af0c).

    Two protocol changes. SessionNetworkVersion went to 68 with arm64 Wine helper and cross-architecture scheduling fixes (fb715dd6), then to 69 with keyed process reuse, where “processes without a key are not reused” and “The UbaController change that sets the key for ShaderCompileWorker must land with or before this” (6366bbe2). UBT now requests cross-architecture workers (534aa3cd).

    Why this is important

    If Mac remote compiles have failed on a stray comment error, take the CAS fix. The heap overflow needs a long session with frequently touched files, the example the commit gives. With the network version bumping twice in one week, update hosts and helpers together. The commits do not say how mismatched versions behave. If you build under Wine on large machines, start wineserver through a launcher that preloads the shim (the commit says ushell’s .build --wine does), and run wineserver -k first if one is already running.

    Who should care

    Build and CI engineers, build-farm owners, anyone running Mac, Linux, arm64, or Wine helpers.

    Urgency

    Act now if you run UBA with Mac helpers or Wine on more than 64 cores. Track otherwise.


    Cook and staging: an empty-header race, shader library collisions, and a run of one-time recooks

    What changed

    Under multithreaded save, a process-wide guard for unversioned content raced across save threads. “The guard that ends first restores 0 while another thread is still reading its summary; that read stops early and the optimizer produces the package with an empty header (no name map, imports or soft references), logging only a warning.” The allowance is now per package, and “A bad cooked summary is now Fatal, not a warning plus a broken package” (7ac3eb85).

    Staging and packaging fixes:

    • Named pakchunks and shader libraries. Sub-containers of a named pakchunk resolved “to the same shader library as the base container and closing it on unmount.” The mangled id also used “CityHash64 & 0xFF, a 1-in-256 collision that could skip opening a library” (b1794cbc).
    • Mac and Linux staging. “On Mac/Linux, DirectoriesToAlwaysStageAs* entries using Windows path separators are never found, so their contents go unstaged.” On one test, “Unable to find directory” warnings dropped “from 21 to 5” (94f3ceb6).
    • DDC graph forwarding. -ddc=<graph> “was passed to the cook and run commandlets but never to UnrealPak, so UnrealPak always used the project’s default DDC graph” (931595fd).

    Plan for recooks. Several commits announce one-time invalidations:

    • “Incremental cook impact: one-time recook of all blueprint packages” (8d5abe19).
    • “Incremental cook impact: one-time full recook. The global dependencies hash changes for every cook, in every reachability mode” (a14aa680).
    • “one-time recook of generated packages whose digest included transient or subsystem classes (WP cells with world subsystems)” (c5a81cbb).
    • Two CookIncrementalVersion bumps, both for a “Native change not picked up” (40579ca1, f10e20cc).
    • Shader source files are now hashed with FShaderHash, which “bumps shader map cache versions as a safety measure” (6bfb22a7), so expect a shader recompile as well.

    Two cook behavior changes apply without opting in. Loaded packages kept loader read buffers until GC, “which costs several GB of commit per cook process.” The flush now applies to “every cook-by-the-book cook outside the editor” (2cde43c5). A multithreaded save safety change notes, “This changes load timing for the default single-threaded cook too,” and cooks no longer write GatherableTextData (27b85436).

    Why this is important

    The empty-header bug produced a broken package with only a warning. If you cook with multithreaded save, take this fix and treat any packages from affected builds as suspect. The shader library collision “could skip opening a library.” On Mac or Linux staging hosts, check whether DirectoriesToAlwaysStageAs* entries with backslashes were ever staged. Schedule the recooks: one full recook, one of every blueprint, and a shader recompile are all in this week’s range.

    Who should care

    Build and release engineers, platform teams staging on Mac or Linux, anyone running multithreaded save or incremental cooks.

    Urgency

    Act now if you cook with multithreaded save or stage on Mac or Linux. Plan for the recooks.


    CI exit codes, toolchain floors, and Horde

    What changed

    Exit codes your wrappers may depend on:

    • Movie Render Queue. Invalid command line arguments “previously hit a Fatal log (crash, crash report). They now log an Error and exit with the existing MoviePipelineErrorCodes value (NoAsset = 2, NoConfig = 3, Critical = 1)” (b097d529).
    • Mac build-machine crashes. “Mac build machines installed a log-only crash handler, so a farm crash left no CrashReport-UE-* folder for Gauntlet to collect.” Now “build-machine crashes write the report folder and skip CrashReportClient, exiting 1 instead of 3” (4a65fd73).

    Toolchain changes:

    • Enforced minimums. UBT published its current floors: “MSVC 14.44.35211,” “Windows Clang 20.1.8,” “Linux Clang 20,” “Android NDK r27c, Clang 18.0.3,” and “Xcode 26.1.1, Apple Clang 17 or later, LLVM 19.1.5 or later” (18dae879).
    • MSVC 14.51. “UnrealBuildTool: Remove MSVC 14.51 from preferred” (37a2daf1). See the follow-up under Worth Tracking.
    • macOS 15. “[Mac] Require macOS 15 Sequoia” (8a45c509). bEnableOSX109Support is now deprecated and ignored (4753eda2).
    • Clang warnings as errors. “Clang’s -Wno-error=X overrides -Werror regardless of argument order, so these warnings stayed warnings.” Warning-level CppCompileWarnings now become errors under bWarningsAsErrors (2599812f).
    • Build.sh. Mac and Linux now refresh UBT before use and serialize Build.sh per engine: “Concurrent runs wait” (3ccad7e7).
    • Smaller fixes. A race writing PGO sidecar files during makefile creation on clean workspaces (551c4523), and a missing space that was “preventing -icf=all from working on Android” (7b9d5661).

    Horde:

    • Secrets in debug endpoints. “The config, app settings and environment debug endpoints returned secrets in clear text, also secrets resolved from the secret store.” They now show “[redacted]” (76e3d23a).
    • Upgrade ordering. Tool deployments now stay pending until their archive is built. The commit warns: “Hold tool uploads until all servers run this version, because older servers do not know the pending state” (67c42f3a).

    Why this is important

    If you build with warnings as errors on clang, this change can fail builds that previously passed, with no code change on your side. The exit code changes break the opposite way: a script that waited for a crash or matched exit code 3 on Mac will now misread the result. If you self-host Horde, upgrade for the redaction fix, consider whether anyone could reach those debug endpoints, and rotate secrets if so. Then upgrade every server before uploading tools.

    Who should care

    Build and CI engineers, render farm owners, Horde administrators, Mac and Linux build owners.

    Urgency

    Act now on Horde secrets and on clang warnings as errors. Check MRQ and Mac crash wrappers at your next sync.


    Worth Tracking

    New BCn realtime encoders. “New, higher-quality BCn realtime encoders” come in three levels. Level 1 costs “about 15-20% extra compute” over the lowest level. The sRGB entry points now “convert all pixels to encoded space first, which is more expensive but can make a quite significant difference depending on content” (3e4dc512). The commit does not list which call sites use the new encoders, so check any GPU texture compression you rely on.

    Ray tracing enablement semantics. IsRayTracingEnabledForProject and ShouldCompileRayTracingShadersForProject “aren’t affected by runtime settings when running non-editor executable” (b2d94575). IsRayTracingEnabled(EShaderPlatform) “now takes project settings into account,” and passes should use CanUseRayTracingShaders and CanUseInlineRayTracing at runtime (a73d5cc6). Custom ray tracing shaders should no longer use Hit.InstanceID or GetInstanceUserData() directly as a GPU Scene instance id, and should go “through DecodeRayTracingInstanceId(…)” (b083d033). If you maintain custom ray tracing passes, read all three.

    PCG Component Lite and UnrealConsole. PCG Component Lite went from P9 to P11 this week, adding “editor discovery, details actions, preview controls and debugging” (3344fa1a), interactive and manual-edit tools (0087d60c), and editor partitioning (8e742167), plus a “PCG Volume Lite that will instantiate a PCG Component Lite” (5a53d40b). A new switch, ShouldUsePCGVolumeLite(), now chooses between Lite and legacy volumes (f84cac56), but no commit states its default or a migration path. UnrealConsole, the headless editor host we flagged last week, kept moving: ULevelEditorSubsystem methods “now act as if no level editor is open, instead of check()ing or dereferencing null” (d3cf44c5).

    Two follow-ups on last week’s post. Last week we reported that the change enabling the new platform IO dispatcher on all platforms was backed out with no reland, so the new dispatcher was not enabled. This week it is on by default for game and client targets, after a deadlock fix (a26cc9d9, b865826a). Server and editor targets keep the old path. We also covered MSVC 14.51 being made the preferred toolchain and then banned for a miscompile. This week it was removed from the preferred list (37a2daf1), and the diff adds a SuggestedVisualCppVersion so the ban error no longer suggests a banned toolchain. Two other items we flagged last week, the occlusion feedback opt-in and the renamed ray-traced skinning cache CVars, had no new commits.


    What We Ignored

    This week we ignored most of the 1,168 commits: Verse and UEFN work, scene graph changes, Python API expansion, Niagara editor polish, test automation tooling, Mesh Partition churn, IoStore on-demand container TOC patching, and narrow editor crash fixes. There were 17 commits tagged [Backout], against 24 last week, inside the normal band for this branch. Most relanded in-window.

    Three that did not come back are worth naming, because their titles make them sound shipped. “[Component visualizers] Enable ITF Visualizers by default” (ee128853) was backed out (3dae15ca), so that default did not change. “Niagara - Fix crash when a GPU stage only reads an array data interface that another GPU stage in the same system writes to” (3b713266) was backed out (0639068e), so that crash is still unfixed on this branch. And “Linux: Rectify stacktrace cutoff-frame semantics” (a6a58aff) was backed out (da381317), so Linux stack trimming is unchanged.

    A few one-liners. A network ping bug wrote “into freed memory, which surfaced as heap corruption in unrelated systems (e.g. Slate FTextLayout teardown) on the Connecting screen” when two or more ping types were configured as moving averages (3ce03197). Perforce source control disabled the p4api signaler outside Windows, citing “evidence” that “concurrent connections corrupt the heap on Linux in particular” (d574ddfd). “Fixed vulnerability issue in InterchangePSDTranslator,” with no further detail in the message (4310366a). And the legacy Project Launcher was removed (92cf4524), along with its “deprecated Project Launcher and Launcher Services APIs” (70c92023).


    For teams shipping on 5.8

    On Monday, October 5, the public 5.8 branch took “Update version for 5.8.4” (8ef25888), which changes the patch version from 3 to 4 and carries a #lockdown tag. It came with 108 cherry-picked fixes, all dated the same day in one contiguous block of changelists. One of them is explicit: “Backport UE-395636 for the UE 5.8.4 hotfix candidate: prevent stale editor-instance access in UAssetEditorSubsystem::CloseAllEditorsForAsset,” noting “Static compatibility checked against Dev-Release-5.8” (f1190727). There is no 5.8.4 release tag yet. The newest is 5.8.3, so treat this as a candidate that can still change. Of the 113 commits, 4 are Localization Automation and none is a backout. About 30% of them (33 of 108) match the titles of fixes that were on ue5-main or ue6-main last week. About one in five of the rest (16 of 75) carry cherry-pick tags pointing at older changelists.

    In the 5.8.4 candidate

    • UBT was not relinking binaries when external libs changed. The FirstOrDefault check “was not equivalent to Contains’ behavior. This was breaking the timestamp check on external libs and preventing binaries from being relinked” (1fb9a4a0). If you link prebuilt external libraries, incremental builds could have shipped stale binaries. Take this one first.
    • UAT log output stalled. A bare = toolchain separator was mistaken “for an ASAN report header,” which “stalls all UAT log output until the LogEventParser 1024-line cap” (451845be). Separately, UAT now starts commandlets with a UTF-8 environment, fixing “garbled output from the commandlets when running UAT on a system that is set to a non-latin codepage (Japanese, Chinese…)” (8c37fa5d). Last week this fix was on ue5-main only.
    • Horde path traversal. “Horde: Prevent path traversal when extracting artifact and workspace contents.” Anything that “would resolve outside the target directory now fails closed and aborts the operation instead of writing the file” (b3f8a2e2). A security fix for anyone running Horde on 5.8.
    • Virtual texture DDC crash after a full disk. “If the disk was full (or on other IO errors) the temp file was left short but still flagged as available,” and “The existing file validation only hashes the first 32 KB, so a file truncated beyond that passed validation on later editor runs and kept crashing” (6fc486ee). Build machines with tight disks should take this.
    • iOS UIScene lifecycle is now the default. “Switch iOS client to use UIScene lifecycle by default to avoid crash on start. When an iOS app is compiled with Xcode27, iOS27 enforces use of UIScene” (915fcb2f). The diff sets bUseSceneBasedLifecycle=True in BaseEngine.ini. The C++ default stays false, so projects that explicitly set it to False in their own config keep the old lifecycle. The header calls it compile-time only, so a rebuild is required after changing it.
    • iOS finalize on macOS 27. iOS .app finalize failed with a “Bad file descriptor” error on macOS 27. The build executor spawned actions without stdin, and xcodebuild “then cannot launch /bin/sh for a scheme’s script phases” (269b89a9).
    • Vulkan fence default flipped. The message reads “change the default for r.Vulkan.CpuWaitForFence to use semaphores on desktop” (1ad8824e). The diff changes the code default from 1 to 0 with no platform check. Android already set 0 through AndroidEngine.ini, so in practice desktop Vulkan (Windows and Linux) is what changes. The CVar is read-only. To restore the old behavior, set r.Vulkan.CpuWaitForFence=1 in config.
    • D3D12 enhanced barriers. “Fix enhanced barrier layout selection and synchronization,” a manual integration of three changelists. Queue-specific layouts meant “resources transitioned on one pipe were left in layouts invalid to consume on the other,” and transient aliasing acquires now synchronize “with SYNC_ALL” (9d10f6af). Relevant if you use async compute on D3D12.
    • Shader preprocessor heap overread. “a source with an unmatched quote or apostrophe therefore scanned past the NUL terminator into adjacent heap memory,” traced to “material custom node text.” Such files now report “Unclosed string literal.” (b3eb2d65).
    • Linux crash reporting. “Stop Linux crash reporting from exhausting the crash allocator’s large pool.” A new unix.CaptureAllThreadStacksMaxChars bounds the all-thread dump (5d863562). The diff sets it to 96 * 1024 characters by default, with 0 meaning unbounded.
    • RigVM editor-only data in cooked packages. The editor asset was created RF_Public, so “the editor asset and its model/EdGraph tree were saved into cooked packages, producing missing class errors for ControlRigDeveloper/RigVMDeveloper types on load.” PostLoad now clears the flag “so existing assets are fixed too” (9576cbc6). ue5-main already had its own fix and took only the PostLoad cleanup for older assets, as a “Partial forward port” (049211f1).
    • DDC-dependent output. Substrate Toon materials lost a GBuffer write “when fetching from DDC” (74bd88e7), and Mutable’s DDC value changed “from compilation to compilation” (ee0e70f0).
    • Crashes and regressions. An XSX “EOS delay-load crash on launch with modern GDK folder layout” (4c0f5eda), alongside an EOSSDK 1.19.2.1 binary update that lists deprecated console SDKs “to be removed in a future release” (5da24655). A Mac editor exit crash whose crash group “reports 37 users and 37 occurrences on 5.8.x” (5561a4c5). A Sequencer world leak that “fatal errors as a world leak” when a level containing a level sequence actor is removed (17f4598e). A Promote To Variable rename bug that “regressed in 5.8” (f7583e0b), and Mover “concurrency-related crashes” (9bb4abbe).
    • Fixes we flagged earlier. The landscape edit layers assertion “when two landscape components overlap,” whose message notes “New functions intentionally omit LANDSCAPE_API to make the CL hotfix compatible” (5eb15c8c), is in the candidate. Last week we guessed it was headed for a hotfix. The CEF update that “Fixes editor crashes when the GPU process is reported as unusable” is in too (3d8fd89f).
    • Editor quality of life. A Control Rig fix cuts a save stall in Animation Mode that scaled with the number of characters. The repro “goes from 11-17s to 1.7s” (5a62d8e6). A PCG refresh fix adds pcg.ActorTracking.EnablePreviousDataCleanupHotFix, on by default in the diff, as a guard “if it ever has side effects” (3b767ba6).

    On ue5-main only

    ue5-main ran 92 commits with three backouts, one of them relanded in-window. None of the items below carries a message saying it is headed for 5.8.x.

    • Force delete crash. Force-deleting an asset whose editor edits more than one of its objects “closed the editor once per listing, and the first close destroys the toolkit, so the second ran on freed memory” (06cc4cd6).
    • Control Rig duplicate and paste. A regression where “every derived field was dropped on duplicate and paste,” so “A duplicated control lost its limits, rotation order and min/max” (d1ba8344).
    • Cook determinism. Package access tracking fixes for recording “that depended on load order, GC timing and which process (director or CookWorker) saved the package, which caused spurious and missed incremental recooks.” Expect a “one-time recook of most blueprints” (4425f181).
    • Sequencer spawnables. “Spawnables vanish permanently after undoing a space switch compensation” (77f056f7).
    • Smaller fixes. A water info LOD gather that “crashed the editor whenever a water zone rendered its info texture” (5263eb77), and a “noisy/black thumbnail when enabling separate translucency” (ae65f725).
    • Gaussian Splat came over from UE6. Seven batches merged “//UE6/Main Gaussian Splat work into //UE5/Main,” one of which includes “Enable the GaussianSplat plugin” (d7ec4548).

    Closing

    The 5.8.4 candidate is the part of this week most readers can use right now, and it is still open. On ue6-main, if behavior changes after this sync, check the defaults above before you start bisecting.

    Commit SHAs are cited inline, in parentheses, next to each claim. They reference the ue6-main branch of EpicGames/UnrealEngine, except in the “For teams shipping on 5.8” section: there, items under “In the 5.8.4 candidate” reference the public 5.8 branch (the forward port 049211f1 is on ue5-main), and items under “On ue5-main only” reference ue5-main.

    Share this article