Skip to content

M4.02

Pre-release
Pre-release

Choose a tag to compare

@VTSTech VTSTech released this 18 Oct 15:41
· 66 commits to main since this release

Changelog

All notable changes to libslang-vk — a C++23 Vulkan runner for libretro
slang shader presets — are documented in this file.

Milestones follow the M-series plan in PLAN.md §11 (M0 → M5).
Each milestone corresponds to the matching M* commit(s) on main (no git
tags yet). Format adapted from
Keep a Changelog.

Unreleased

Planned

  • Remaining 91 corpus failures (out of 2658 presets at the pinned corpus rev),
    all one class: sampled-but-unbound textures behind preprocessor dead code —
    ReflectionPass in MBZ NO-REFLECT variants (~60), ambi_temporal_pass
    uborder (~15), play nedi (~9). Next fix: run the texture-reference check
    against preprocessed text instead of raw source.
  • M3 leftovers: golden-image conformance suite, perf budgets.
  • M5 (1.0): API freeze, packaging, docs/API.md.

M4.02 — 2026-10-18

Corpus rescan release: full-corpus verdict went from 826 LOAD / 1832 FAIL
(2026-10-17 baseline) to 2567 LOAD / 91 FAIL — zero regressions at the
pinned revision.

Fixed

  • #reference merge rebase stored cwd-relative paths (RebaseReferenceFilePath()
    in src/core/preset_parser.cpp): when the scan root was relative (the
    documented corpus_sweep slang-shaders invocation), rebased pass/texture
    paths were joined onto the importing preset's directory at load time,
    producing garbled paths and failing ~700 otherwise-healthy presets. Rebased
    paths are now absolutized inside the SEC-01 shader root. Regression test in
    tests/test_preset_parser.cpp (relative root + #reference chdir fixture
    asserts an absolute, existing merged path).

Added

  • corpus_sweep --only-from FILE whitelist for chunked rescans (keeps
    corpus-root semantics; enables full-corpus sweeps in sandboxed/short-lived
    environments).
  • CI: the Windows shader-demo artifact now bundles corpus_sweep.exe (Linux
    ships corpus_sweep), with an updated USAGE.txt section showing the
    absolute-root invocation.
  • .github/workflows/corpus.yml workflow_dispatch can regenerate the ledger
    without any local binary.

Changed

  • corpus/baseline-ledger.txt refreshed at the same corpus rev: 2658 presets
    → 2567 LOAD / 91 FAIL, 0 regressions, +1741 improved (bezel +1367,
    presets +160, hdr +146, crt +32, ...). Added/gone: 0/0.

M4.01 — 2026-10-18

Fixed

  • slang: unknown texture reference 'PhosphorPassFeedback' on presets
    whose passes are named only via #pragma name (no aliasN — e.g.
    crt-yah.slangp): the translator's texture-name universe only knew LUT
    names, aliasN and User#, while the chain runtime already resolved pragma
    names, Feedback-suffix taps and <name>Size. Pass names from
    #pragma name are now collected at load time and seeded into the universe,
    so bare-name taps, previous-frame <name>Feedback taps and <name>Size
    UBO members all bind.

Added

  • Public API slv::preset::CollectSlangPragmaNames(shaderPath, out)
    (include/slangvk/core/slang_translate.hpp): soft-fail include-once scan
    with the same ResolveIncludes bucketing as TranslateSlang; scan failure
    is silent and real errors surface from per-pass translation.

Tests

  • Four feedback-tap regressions in tests/test_slang_translate.cpp: collector
    finds the pragma name; seeded universe binds PhosphorPassFeedback in set 2;
    lowercase spelling resolves; empty universe still hard-fails with the
    original diagnostic.

M4 — 2026-10-17/18

DevilutionX presentation spike (plan §8 mode (a)) plus the shader_demo
example app and its first two real-world fix waves.

Added

  • examples/shader_demo: hybrid windowed/headless demo — GLFW backend
    probing with headless-only fallback, TUI preset browser, animated-pattern +
    image inputs, PNG frame writer, and a --headless --no-menu --frames N --out DIR sweep mode used for corpus verification (~2k lines across
    shader_demo.cpp, window_target.hpp, input_source.hpp,
    preset_browser.hpp, frame_writer.hpp).
  • Default input: bundled assets/testcard.png (480×320 pixel-art
    Goku/Mario/Luigi, generated by tools/make_testcard.py + tools/sprites/),
    with a 5-level portable asset lookup starting at the executable's directory.
  • Corpus tooling: corpus/baseline-ledger.txt (per-preset LOAD/FAIL
    baseline) + .github/workflows/corpus.yml — nightly pinned-rev sweep with a
    no-regression gate.
  • Runner presentation: SwapchainFrame with letterbox and rotation;
    push-block / size-param runner coverage (test_runner_m4.cpp,
    test_runner_pushblock.cpp, sizeparam/pushfrag golden shaders).
  • docs/CHECKLIST.md, tools/scan_codefindings.py, vendored
    stb_image_write.h; README CI badge + screenshot.

Fixed

  • crt-consumer.slangp black screen: UBO member parsing stripped smooth
    from float smoothness; via a left-token match, leaving member ness
    zero-initialized and the corner mask at 0. Added a right-token-boundary
    check plus a SLANGVK_FILL_DEBUG block-fill dump in chain.cpp, with a
    byte-exact golden regression (tests/data/runner/smoothqual.*).
  • analog-service-menu.slangp include target outside the shaders root:
    the SEC-01 ancestor-retry now also fires on that error string (previously
    only on cannot-open).
  • shader_demo defaulted to the animated pattern (characters never visible);
    it now defaults to the testcard image and falls back only if the asset is
    missing.

M3 — 2026-10-17

Conformance + perf wave (partial per PLAN.md §11).

Added

  • src/vk/lut.cpp: LUT texture upload paths (plain, mipmap, <texture>Size
    user bindings), golden runner3 presets (lut, lut_mip, lut_size,
    lut_user + PNG fixtures).
  • examples/corpus_sweep.cpp: batch load/render sweep over a preset tree —
    the basis of the corpus baseline ledger.
  • Chain/images/device hardening (+~350 lines) and parser fixes; CI updates.

M2 — 2026-10-17

Added

  • Chain semantics on the Vulkan runner, proven by the test_runner_m2
    canary suite: feedback ping-pong (previous-frame output), history ring taps
    (OriginalHistory1/3), pass formats (default/float/srgb), include/cycle
    resolution, mipmap refill (textureLod), FBO + history-ring recreation on
    input-size change, live setParameter(), validation-error gating, and a
    negative control (PassOutput0 self-read must fail LOAD).

M1 — 2026-10-17

Added

  • Vulkan runner skeleton (src/vk/ — device.cpp, images.cpp, preset.cpp,
    chain.cpp + VMA): headless golden blit on lavapipe with zero validation
    errors; runner test presets (blit, param).

Fixed

  • MSVC build fix; MinGW64 CI matrix additions (libslangvk.dll / .a
    artifacts).

M0 — 2026-10-17

Added

  • Scaffold: core trio ported clean — preset parser, slang→GLSL translator,
    slang compiler glue (src/core/, include/slangvk/); 12/12 tests green;
    field-preset round-trip fixtures (feedback / history / format / include
    cycles).
  • CI: Linux tests on lavapipe + asan/ubsan build; Windows MinGW
    libslangvk.dll / .a artifacts; vendored CMake deps.
  • Docs: PLAN.md (architecture + milestones), SPEC.md (libretro slang
    preset conformance scope), PROVENANCE.md (MIT + upstream ledger).