From 7a972f513d293e34f89bf543a223eece8bf7576b Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Mon, 14 Sep 2026 17:26:09 +0200 Subject: [PATCH] fix(ablation): tunnel-core ablation no longer disables the fused evaluator Salvaged from the parked exact-culling round (wip/exact-cull-20260914, 49369ac). This is the only change ported. `if (!VoxelDensityAblation::IsTunnelCoreOff() && CP_UseOpStack)` becomes `if (CP_UseOpStack)`: with the tunnel-core ablation on, the old condition also sent coarse tiles to the scalar per-chunk cache path. That was the 2.9x "tunnel core off" anomaly in 6ccf371. In normal runs (ablation off) the condition is unchanged. Salvage round (Codex; checked by me): - Baseline confirmed on this machine: static worker 33.98 s. So the parked round really was a regression (~41 s with all its switches off), not machine drift. - The parked round's always-on cost: EvaluateSDFCached did a tile-window/candidate lookup unconditionally; tunnel-chain signatures added candidate range checks and per-segment AABB/Sqrt lower bounds; CanSkipSmoothMin read exported globals + TLS per primitive even when disabled; passage candidate setup ran before the disabled check; the passage/landing/post paths copied density and built debug closures with debug off. No FORCEINLINE was lost; the added work was inlined into the hot sample path. - Not ported: tile candidates (48.26 s on vs 46.19 s off even inside the WIP), the SmoothMin cutoff, the post early-outs (a measured loss) and the debug hooks. Final vs baseline DLL, two interleaved runs each: static worker 33.98 -> 33.56 s, moving 73.89 -> 74.70 s; LOD0 generation p50 66.1 -> 65.5 ms static, 64.7 -> 65.3 ms moving. Equal within noise, as expected from a change that is inert in normal runs. Field exact: 841/841 keyed tiles, export b3e5f4c3..9b377, capability 20,830 / 10,909. Every launch was serialized (prelaunch UnrealEditor count 0); no crash folders; two harness-only trace wrapper failures preceded the passing trace. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01TaFdXhTdYMkW1xrV6ApT6Y --- Source/VoxelForge/Private/VoxelGenerator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/VoxelForge/Private/VoxelGenerator.cpp b/Source/VoxelForge/Private/VoxelGenerator.cpp index 97c323c..0f48ce7 100644 --- a/Source/VoxelForge/Private/VoxelGenerator.cpp +++ b/Source/VoxelForge/Private/VoxelGenerator.cpp @@ -2597,7 +2597,7 @@ float UVoxelGenerator::GetDensityAt(float WorldX, float WorldY, float WorldZ) co // Le seul point d'entrée de la pile dans le chemin de production. Elle rend la convention // MC (négatif = solide) comme les fonctions d'archétype, donc les disturbances et la couche // de diff qui suivent ne voient aucune différence. - if (!VoxelDensityAblation::IsTunnelCoreOff() && CP_UseOpStack) + if (CP_UseOpStack) { const bool bCanUseFusedEvaluator = GVoxelForgeUseFusedEvaluator != 0