Files
logan 4fa9a6ab81 feat(bench): automate B7 shader profiles, wire B12b trials, settle 45s
- gen_shader_profiles.py + shader-profiles/: Iris per-pack option files
  resolved from each pack's profile.* lines (Iris has no profile key)
- bench.py: flag rows shader_not_loaded when Iris falls back to vanilla
  rendering (analyze.py treats it as invalid)
- matrix: shader_options session key, trial jar globs pinned to the
  downloaded Modrinth builds, post-join settle 45 s (B0 v1 showed rep 1
  still warming at 10 s)
2026-10-16 23:34:52 -04:00

299 lines
15 KiB
TOML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Declarative encoding of BENCH-MATRIX.md §4 (blocks B0-B14) for the proxy bench machine
# (Ryzen 9 9900X / RX 7800 XT). Driven by matrix.py; every session becomes one
# `python3 bench.py session ...` launch. BENCH-MATRIX.md is authoritative - if this file
# disagrees with it, fix this file.
#
# Session keys:
# variant proposed-configs/out/<ID> (or an entry in [[missing_variants]] -> blocked)
# plan scenes in S1->S5 order: s1,s2,s2s,s3,s4,s5 (S6 is not automatable)
# reps windows per scene inside the session (phase0: 3 runs)
# repeat separate sessions (= cold launches) of the same config (B0: 3)
# tag distinguishes sessions that share a variant but differ by flags; the
# bench label becomes "<block>.<tag>" so analyze.py groups them apart
# jvm/heap BENCH-MATRIX JVM set / MaxMemAlloc MB
# shader shaderpack file name or "off"; shader_profile = the pack's profile name
# shader_options Iris per-pack options file (harness-relative), copied to
# shaderpacks/<pack>.txt; gen_shader_profiles.py builds them from the zips
# dh "on" | "off" (dh-off row of B3)
# disable_mods globs matched in the instance mods/ (B12a)
# add_mods jar paths/globs added for the session only (B12b)
# world key of [worlds]; restored from the zip before the session
# warmup/capture per-window seconds (bench.py defaults 15 / 30; S5 is fixed 10 + 120)
# manual true = cannot run unattended; `run` skips it unless --include-manual
# note free text shown by `plan`
# ${name} in variant/jvm/plan is a block parameter, supplied with `--param name=value`.
[defaults]
reps = 3
warmup = 15
capture = 30
settle = 45 # post-join settle; B0 v1 showed rep 1 still warming at settle 10
display = "gamescope-headless"
res = "1920x1080"
world = "v1"
shader = "off" # pin: a shader/DH state must never leak from one session to the next
dh = "on"
launch_overhead_s = 60 # launch->join (~31 s measured) + world-zip restore + teardown
[worlds]
# BENCH-MATRIX §2. Built 2026-10-16 (sha256 in .pi/journal.md). `run --live-world`
# uses the instance's saves/onionbench as-is (no restore).
v1 = "~/onion-bench/worlds/bench-world-v1.zip"
s4-0 = "~/onion-bench/worlds/bench-world-v1-s4-0.zip"
s4-1 = "~/onion-bench/worlds/bench-world-v1-s4-1.zip"
s4-4 = "~/onion-bench/worlds/bench-world-v1.zip" # the main zip carries all 4 ships
[trials]
# B12b trial jars (NeoForge 1.21.1, Modrinth, sha512-verified 2026-10-16; see /tmp/pi-trials.md
# or the journal). Each glob matches exactly one file in ~/onion-bench/trials/.
gnetum = "~/onion-bench/trials/gnetum-3.3.6.jar"
better_block_entities = "~/onion-bench/trials/bbe-neoforge-1.3.4+mc1.21.1.jar"
flerovium = "~/onion-bench/trials/flerovium-neoforge-1.21.1-1.1.2-all.jar"
super_resolution = "~/onion-bench/trials/super_resolution-neoforge-*-0.9.2-alpha.2+opengl.jar"
ixeris = "~/onion-bench/trials/Ixeris-4.6.8+1.21.1-neoforge.jar"
iris_flywheel_compat = "~/onion-bench/trials/iris-flywheel-compat-NeoForge-2.4.0.jar"
cull_leaves = "~/onion-bench/trials/cullleaves-neoforge-4.1.1+1.21.1.jar"
# Variants a block needs that build.py does not generate. Sessions using them are
# reported as blocked until they exist in proposed-configs/out/. (C1-fa, C1-fa-ext,
# emf-lod20-fa, emf-lod8-fa and C1-bl are now generated by build.py; every bench
# variant pins options.txt resourcePacks.)
[[missing_variants]]
id = "dh-off"
blocks = []
contents = """Not needed as a directory: BENCH-MATRIX defines dh-off as C1 with DH rendering \
toggled off in the GUI. Encoded as variant C1 + `dh = "off"` (bench.py --dh off)."""
# ---------------------------------------------------------------------------------------
[[block]]
id = "B0"
title = "noise floor"
rule = "Defines each machine's threshold. P2 also checks `MemAvailable` drift (phase0 Step 4)."
proxy_note = "Single proxy machine. Re-run whenever the mod set changes (matrix.py warns)."
manual_checks = ["MemAvailable drift: compare mem_available_mb before/after across the 3 sessions (recorded per row)"]
sessions = [
{ variant = "C0", plan = "s1", repeat = 3 },
]
[[block]]
id = "B1"
title = "baseline"
rule = "Reference numbers for everything below"
manual_checks = [
"S6 (GUI/JEI overlay) needs a key press - run by hand",
"/sparkc heapsummary after S1 loads",
"VRAM peak",
]
sessions = [
{ variant = "C0", plan = "s1,s2,s3,s4,s5" },
]
[[block]]
id = "B2"
title = "composite"
rule = "If C1 isn't a win on ≥ 2 machines, stop and bisect with B3–B11 before shipping anything"
proxy_note = "Proxy runs all three composites; one machine = single-machine evidence, fleet confirmation pending. Baseline is C0 (pooled from B1)."
manual_checks = ["S6 by hand", "/sparkc heapsummary after S1 loads", "VRAM peak"]
sessions = [
{ variant = "C1", plan = "s1,s2,s3,s4,s5" },
{ variant = "C1-deck", plan = "s1,s2,s3,s4,s5" },
{ variant = "C1-high", plan = "s1,s2,s3,s4,s5" },
]
[[block]]
id = "B3"
title = "Distant Horizons"
rule = """**Radius per tier** = the largest radius meeting the FPS floor on S1 *and* S5: P0 → deck, P1 → default, P2 → high. \
| Adopt SSAO-off / LOW-quality for that tier on a win. \
| Keep 2 threads unless 4 is a win on S5 *and* not a loss on S1"""
proxy_note = "Absolute floors are fleet values; on the proxy use relative wins only. P0/P1-only rows (dh-ssao, dh-qlow) run here too."
manual_checks = ["DH memory in F3"]
sessions = [
{ variant = "dh-r256", plan = "s1,s5" },
{ variant = "dh-r192", plan = "s1,s5" },
{ variant = "C1", plan = "s1,s5" },
{ variant = "dh-r64", plan = "s1,s5" },
{ variant = "C1", plan = "s1,s5", dh = "off", tag = "dh-off" },
{ variant = "dh-ssao", plan = "s1" },
{ variant = "dh-qlow", plan = "s1" },
{ variant = "dh-thr4", plan = "s1,s5" },
]
[[block]]
id = "B4"
title = "heap & GC: GC"
rule = "GC = best S5 1 % low. Heap = the smallest size within the spread of the best. Feeds `PLAYER-TUNING.md` §2. P1 isn't run (32 GB, not a constraint)."
proxy_note = "P2 values (-Xmx6G) on the proxy; the heap ladder (B4h) adds 8 G as the top rung."
manual_checks = ["/sparkc gc after S5 (pause count / max / total)", "swap delta"]
sessions = [
{ variant = "C1", plan = "s2,s5", jvm = "J0", heap = 6144, tag = "J0" },
{ variant = "C1", plan = "s2,s5", jvm = "J1", heap = 6144, tag = "J1" },
{ variant = "C1", plan = "s2,s5", jvm = "J2", heap = 6144, tag = "J2" },
{ variant = "C1", plan = "s2,s5", jvm = "J3", heap = 6144, tag = "J3" },
]
[[block]]
id = "B4h"
title = "heap & GC: heap ladder for the GC winner"
rule = "GC = best S5 1 % low. Heap = the smallest size within the spread of the best. Feeds `PLAYER-TUNING.md` §2. P1 isn't run (32 GB, not a constraint)."
params = ["gc"]
proxy_note = "Run after B4 with --param gc=<winning J set>."
sessions = [
{ variant = "C1", plan = "s2,s5", jvm = "${gc}", heap = 4096, tag = "heap4" },
{ variant = "C1", plan = "s2,s5", jvm = "${gc}", heap = 5120, tag = "heap5" },
{ variant = "C1", plan = "s2,s5", jvm = "${gc}", heap = 6144, tag = "heap6" },
{ variant = "C1", plan = "s2,s5", jvm = "${gc}", heap = 8192, tag = "heap8" },
]
[[block]]
id = "B5"
title = "Sable / SSRD"
deferred = true
rule = """SSRD per tier = the largest value meeting the floor with 4 ships. sable-noshade ships only on a win *and* if it looks acceptable. \
| Decay > spread is a Sable #1011-class finding: report it, no config fix"""
proxy_note = "Fleet-only (P0/P1) per BENCH-MATRIX; deferred on the proxy. Needs the S4 world zips. The 45-min decay run exceeds mangohud-local log_duration=1800 and needs FPS at 0/15/30/45 min + heapsummary by hand."
manual_checks = ["sub-level count", "sable-noshade visual acceptability", "/sparkc heapsummary at 0/15/30/45 min"]
sessions = [
{ variant = "C1", plan = "s4", world = "s4-0", tag = "ships0" },
{ variant = "C1", plan = "s4", world = "s4-1", tag = "ships1" },
{ variant = "C1", plan = "s4", world = "s4-4", tag = "ships4" },
{ variant = "ssrd-32", plan = "s4", world = "s4-4" },
{ variant = "ssrd-64", plan = "s4", world = "s4-4" },
{ variant = "ssrd-128", plan = "s4", world = "s4-4" },
{ variant = "sable-noshade", plan = "s4", world = "s4-4" },
{ variant = "C1", plan = "s4", world = "s4-4", jvm = "J0", reps = 1, capture = 2700, repeat = 2, tag = "decay", manual = true, note = "45-min decay; CSV capped at 30 min by mangohud-local" },
]
[[block]]
id = "B6"
title = "ModernFix dynamic_resources"
rule = "Ship `dynamic_resources=true` only if: heap −300 MB or more *or* startup faster beyond spread, **and** zero missing textures, **and** no crash in 3 launches"
interleave = true
manual_checks = [
"S6 by hand",
"heap after load (/sparkc heapsummary)",
"Missing-texture check: JEI @chipped/@rechiseled/@handcrafted, 4x4 Rechiseled CTM wall",
]
sessions = [
{ variant = "C1", plan = "s1,s2", repeat = 3 },
{ variant = "mf-dynres-off", plan = "s1,s2", repeat = 3 },
]
[[block]]
id = "B7"
title = "shaders"
rule = "Data for the owner's shader policy, no auto-decision. Report the FPS cost per profile and whether ship corruption appears with shadow profiles"
proxy_note = "Profiles are reproduced by shader-profiles/*.txt (gen_shader_profiles.py resolves the pack's profile.NAME into an Iris options file); rows run unattended. Visual checks stay manual."
manual_checks = ["Flywheel backend line in F3 (expect off with shaders)", "visual check for Iris #3164 on ships (shadow profiles: makeup-medium, compl-medium)", "confirm Iris' shader screen shows the intended profile once per pack"]
sessions = [
{ variant = "C1", plan = "s1,s2,s4", world = "s4-4", shader = "off", tag = "noshader" },
{ variant = "C1", plan = "s1,s2,s4", world = "s4-4", shader = "MakeUp-UltraFast-9.5f.zip", shader_profile = "shadowless_medium", shader_options = "shader-profiles/MakeUp-UltraFast-9.5f.shadowless_medium.txt", tag = "makeup-shadowless" },
{ variant = "C1", plan = "s1,s2,s4", world = "s4-4", shader = "MakeUp-UltraFast-9.5f.zip", shader_profile = "medium", shader_options = "shader-profiles/MakeUp-UltraFast-9.5f.medium.txt", tag = "makeup-medium" },
{ variant = "C1", plan = "s1,s2,s4", world = "s4-4", shader = "ComplementaryReimagined_r5.9.3.zip", shader_profile = "LOW", shader_options = "shader-profiles/ComplementaryReimagined_r5.9.3.LOW.txt", tag = "compl-low" },
{ variant = "C1", plan = "s1,s2,s4", world = "s4-4", shader = "ComplementaryReimagined_r5.9.3.zip", shader_profile = "MEDIUM", shader_options = "shader-profiles/ComplementaryReimagined_r5.9.3.MEDIUM.txt", tag = "compl-medium" },
]
[[block]]
id = "B8"
title = "entities"
rule = "EMF: adopt the smallest LOD that's a win with FA on. LDL: per tier, the cheapest mode that's a win. FA guidance → `PLAYER-TUNING.md` §4"
sessions = [
{ variant = "C1", plan = "s3" },
{ variant = "C1-fa", plan = "s3" },
{ variant = "C1-fa-ext", plan = "s3" },
{ variant = "emf-lod20-fa", plan = "s3" },
{ variant = "emf-lod8-fa", plan = "s3" },
{ variant = "ldl-fancy", plan = "s3" },
{ variant = "ldl-fastest", plan = "s3" },
]
[[block]]
id = "B9"
title = "Flywheel"
rule = "Per tier: the smoothest value meeting the floor"
sessions = [
{ variant = "fw-flat", plan = "s2", shader = "off" },
{ variant = "C1", plan = "s2", shader = "off" },
{ variant = "fw-smooth", plan = "s2", shader = "off" },
]
[[block]]
id = "B10"
title = "Sound Physics"
rule = "Adopt each change that's a win. Listen for obvious audio breakage."
manual_checks = ["listen for audio breakage"]
sessions = [
{ variant = "spr-up", plan = "s2s" },
{ variant = "C1", plan = "s2s" },
{ variant = "spr-strict", plan = "s2s" },
{ variant = "spr-nocap", plan = "s2s" },
]
[[block]]
id = "B11"
title = "vanilla / Sodium"
rule = """3 threads only if S5 wins and S1 doesn't lose \
| Lowest blend radius that's a win, per tier \
| Mip 4 for mid/high only if VRAM peak ≤ 5.5 GB and no loss"""
proxy_note = "C1 baseline session added in-block so analyze.py compares within the label."
manual_checks = ["VRAM peak for opt-mip4"]
sessions = [
{ variant = "C1", plan = "s1,s2,s5", tag = "baseline" },
{ variant = "sod-thr3", plan = "s1,s5" },
{ variant = "opt-blend2", plan = "s5" },
{ variant = "opt-blend0", plan = "s5" },
{ variant = "opt-mip4", plan = "s1,s2" },
]
[[block]]
id = "B12a"
title = "added-mod ablation"
rule = "Keep the mod unless removing it is a win (it costs FPS) or it breaks something visible. Sodium Extra + RSO stay regardless for their per-machine options."
sessions = [
{ variant = "C1", plan = "s1,s2s,s3" },
{ variant = "C1", plan = "s1,s2s,s3", disable_mods = ["BadOptimizations-*.jar"], tag = "no-badopt" },
{ variant = "C1", plan = "s1,s2s,s3", disable_mods = ["particle_core-*.jar"], tag = "no-particlecore" },
{ variant = "C1", plan = "s1,s2s,s3", disable_mods = ["sodium-extra-*.jar"], tag = "no-sodiumextra" },
]
[[block]]
id = "B12b"
title = "trial mods"
rule = "Owner pre-approved helpful adds. Add with `packwiz modrinth add` only on a win with no breakage. **Not More Culling**: its NeoForge build declares `minecraft [1.21,1.21.1)`. A new mod set means re-running B0 first."
proxy_note = "add_mods entries name [trials] keys. Trials are temporary for the session; a permanent add changes the mod set and invalidates B0."
manual_checks = ["breakage check per trial", "S6 for Gnetum/Flerovium (GUI paths) by hand"]
sessions = [
{ variant = "C1", plan = "s1,s2,s3,s5", tag = "baseline" },
{ variant = "C1", plan = "s1,s2,s3,s5", add_mods = ["gnetum"], tag = "gnetum" },
{ variant = "C1", plan = "s2,s3", add_mods = ["better_block_entities"], tag = "bbe" },
{ variant = "C1-fa", plan = "s3", tag = "fa-baseline" },
{ variant = "C1-fa", plan = "s3", add_mods = ["better_block_entities"], tag = "bbe-fa" },
{ variant = "C1", plan = "s1,s2,s3,s5", add_mods = ["flerovium"], tag = "flerovium" },
{ variant = "C1", plan = "s1,s2,s5", add_mods = ["super_resolution"], tag = "superres" },
{ variant = "C1", plan = "s1,s2,s5", add_mods = ["ixeris"], tag = "ixeris" },
{ variant = "C1", plan = "s1,s2,s4", world = "s4-4", shader = "MakeUp-UltraFast-9.5f.zip", tag = "shader-baseline" },
{ variant = "C1", plan = "s1,s2,s4", world = "s4-4", shader = "MakeUp-UltraFast-9.5f.zip", add_mods = ["iris_flywheel_compat"], tag = "irisflw" },
{ variant = "C1-bl", plan = "s1,s5", tag = "bl-baseline" },
{ variant = "C1-bl", plan = "s1,s5", add_mods = ["cull_leaves"], tag = "cull-leaves", note = "MidnightLib is already in the pack (1.10.0)" },
]
[[block]]
id = "B13"
title = "profile"
rule = "Flag any mod over 5 % of render-thread time that isn't Sodium, Iris, DH or Flywheel"
params = ["scene"]
proxy_note = "Scene = the worst scene from B2 under C1 (--param scene=sN)."
manual_checks = ["/sparkc profiler start --timeout 60 during the capture; save the report"]
sessions = [
{ variant = "C1", plan = "${scene}", reps = 1, capture = 75, manual = true, note = "/sparkc is a client command; start it by hand at BENCH_MARK start" },
]
[[block]]
id = "B14"
title = "spawn tuning"
manual = true
rule = "Procedure and keep/back-off rule: `SPAWN-TUNING.md` §B14"
proxy_note = "Singleplayer fresh world `onionspawn`; river, jungle, warm ocean 10 min each; per-species and total entity counts, defaults vs shipped spawn files. Not a frametime session - run by hand."
sessions = []