Update bundled Slang to 2026.13.1 - #1093
Conversation
The bundled Slang pin (2026.12) predates the -fp-mode precise NoContraction fix (shader-slang/slang#11935, 33f9ed0c), so SlangPy users cannot get it regardless of which Slang is released. 2026.13.1 is the earliest release containing that fix. It also clears a residue of the auto-diff-era compile-time regression: upstream compile-perf data shows the minimal-workload linkAndOptimizeIR floor at 3.55 ms on 2026.12 versus 1.03 ms on 2026.13.1. Fixes #1092
88fbfc8 to
8536e9e
Compare
|
Note Superseded — read the next comment instead.
|
8536e9e to
88fbfc8
Compare
Correction: this PR's head was briefly changed to
|
| commit | v2026.13 | v2026.13.1 | v2026.14.1 |
|---|---|---|---|
33f9ed0c (NoContraction, #11935) |
present | present | present |
22d27646 (#11779) |
present | present | present |
caa2ff45 (#11954) |
absent | present | present |
85d79c676 (#12041) |
absent | present | present |
So 2026.13.1 is the earliest release carrying all four — the smallest move that fixes the issue, which is why it is what this PR proposes. 2026.14.1 is a legitimate alternative on perf grounds (minimal workload linkAndOptimizeIR 0.65 ms vs 1.03 ms, i.e. below the pre-regression 2026.5 floor) but it is a larger jump, not a more correct one.
Asset paths for 2026.14.1 are verified, should you prefer it — all six platform archives plus all six -debug-info variants exist in v2026.14.1 (published 2026-07-30T06:48:50Z), covering every branch interpolated at external/CMakeLists.txt:89-113; the debug-info set matters because SGL_SLANG_DEBUG_INFO defaults ON at :79 and is consumed at :211-213.
A note on CI coverage, in the interest of not overstating green. The 13 build jobs cover 4 of the 6 platform/arch pairs this file can select — macos-x86_64 and windows-aarch64 have no jobs. Since the pin feeds six version-interpolated download branches, two live download paths are exercised by no CI job on either version. That is a pre-existing coverage gap, not something this change introduces.
If you would like 2026.14.1 instead, say so on this PR and I will push it as a normal commit. Otherwise 2026.13.1 stands.
🤖 Generated by an automated SlangPy coworker — may be inaccurate. A human maintainer should verify.
Summary
external/CMakeLists.txt:85,2026.12→2026.13.1. Not merge-ready; opened for a maintainer decision.33f9ed0c).-fp-mode preciseNoContractionfix, so users of the bundled/default Slang configuration cannot get it no matter which Slang is released (building withSGL_LOCAL_SLANG=ONagainst a newer local Slang is the existing workaround). The bump also clears a residue of the auto-diff-era compile-time regression.external/slang-rhishould move in lockstep. Version-pin selection has been maintainer-owned (Update slang to version 2026.10.2 #1012, Downgrade slang to version 2026.5.2 #1016, Update to slang 2026.12 #1037).Why a bump is needed
src/sgl/device/shader.cpp:455-456setsfloatingPointModeper target, globally — exactly the global-fp-mode precisepath that slang#11935 fixed. For users on the bundled/default configuration, the pin is what stands between them and the fix.Version
2026.13.1is the earliest release containing all four relevant commits — the smallest move that fixes the issue:-fp-mode precise(#11935)33f9ed0c22d27646caa2ff4585d79c676Verified with
git merge-base --is-ancestoron a real clone (not justcomparestatus), plus agit patch-id --stablecherry-pick check and a revert check.2026.14.1is an equally correct alternative if you'd prefer the latest release: it contains everything 13.1 does (compare/v2026.13.1...v2026.14.1→aheadby 106, behind 0) and measures better on compile time (minimallinkAndOptimizeIR0.65 ms vs 1.03 ms), but it is a larger jump, not a more correct one. Say so on the PR and I'll push it as a normal commit — I'm not changing the head again unprompted.2026.12.0.1. It was published 2026-07-16, later than 2026.13.1 (07-13), but is cut off the old 2026.12 branch and contains none of these fixes. Its assets match the naming pattern line 87 builds, so it would configure and download cleanly while fixing nothing. (comparereportsdivergedfor it — a fourth status that a two-status check mis-buckets.)Compile-time perf — the historical blocker
The last downgrade (#1016) cited "severe perf regressions", and
ci-benchmark.yml:75,104has the "Build latest Slang" step and theSGL_LOCAL_SLANGconfigure line commented out. So the lane always benchmarks whatever is pinned — a manualworkflow_dispatchrun on this branch would measure the new pin, but nothing proactively tests unpinned upstream Slang ahead of a bump. Rather than guess, this uses upstream's published dataset (slang-compile-perf/ dashboard).minimalworkload — the per-compile floor slang#11781 says the auto-diff refactor inflated:Aggregate, using only low-confound pairs (control phase
frontEndExecute≈ 0%, which reduces the machine-drift confound):12→13linkAndOptimizeIR −9.8% / median wall −1.7%;13→13.1−35.5% / median wall −2.6%.Acceptance test, no SlangPy build required. I ran this myself against the official linux-x86_64 release binaries, on a Neumaier compensated-summation kernel of the shape from slang#12285:
-fp-mode preciseslang-2026.12.0.1NoContractionslang-2026.13.1(this PR)NoContractionslang-2026.14.1NoContractionBoth controls hold: the default-mode column is 0 for every binary, so the decorations come from the flag rather than merely from a newer version; and stripping the decorations makes all three disassemblies identical modulo SSA ids (
OpFAdd=5,OpExtInst=2 throughout) — so the fixed releases decorate the same instruction graph rather than emitting different code. The 7 decorated instructions are exactly the compensation arithmetic (%t, the twoOpFSub/OpFAddcorrection pairs, and the accumulators).What is not verified
module_link,codegen_spirv) against 1–3% repeatability. "Aggregate improved" is not "nothing regressed".13→13.1window contains two quadratic fixes, so the gain cannot be pinned on either alone.33f9ed0cintentionally addsNoContraction, which disables FMA fusion and can cost runtime — but SlangPy defaults toSlangFloatingPointMode::default_(src/sgl/device/shader.h:178) and nothing insrc/orslangpy/requestsprecise, so the codegen change is strictly opt-in and cannot reach a default-configuration user.libslang-glslang-${VER},libslang-glsl-module-${VER},slang-standard-module-${VER}/, and the resolvedlib/libslang-compiler.so.0.${VER}.dwarf. NoURL_HASHanywhere, so nothing to re-checksum. CI is the real test.Scope
Slang-only, so
external/slang-rhiis untouched andsrc/sgl/device/types.h:124'sstatic_assert(Feature::count == rhi::Feature::_Count)cannot fire. Whether rhi should move in lockstep (as #1037 did) is a maintainer call.Unrelated observation, not addressed here:
external/CMakeLists.txt:208onlymessage(STATUS)s a missing standard-module directory, so a bad version silently drops the standard module instead of failing configure.🤖 Generated by an automated SlangPy coworker — may be inaccurate. A human maintainer should verify.