Skip to content

HARDWARE_TESTS.md — things only real hardware can answer

How the work is split: the AI side does the design, code, and every measurement the sandbox can make (a software-rendered Vulkan device, optionally pinned to one core to emulate min-spec). Anything that needs a real GPU, real cores, a real display, or real feel goes on this list for a person to run. When something here gets run, fill in its "Result" and move it to "Done," so the next session (human or AI) can see what has actually been checked on hardware and what hasn't.

Send back the log lines each test asks for, not just "it works" — the numbers are what make runs on different machines comparable.

The two reference machines

Name What it is Why
Min-spec 1 CPU core, ~2 GB RAM, software or weakest GPU The floor. Every claim is "works on min-spec, with these limits." The sandbox emulates this: taskset -c 0 pins to one core, and peak memory is measured with /usr/bin/time -v (see below).
Dev box Ryzen 7 9800X3D (8 cores / 16 threads), RX 9070 XT, Arch Linux What the engine should feel great on.

Emulating min-spec on the dev box

cd build-release/bin   # or build/bin
# 1 core + 2 GB memory cap (systemd user scope; works on Arch)
systemd-run --user --scope -p MemoryMax=2G -p AllowedCPUs=0 \
    env KKE_PHYSICS_BENCH=1200 ./physics_demo

If systemd-run rejects AllowedCPUs (depends on cgroup delegation), drop that property and put taskset -c 0 in front of env instead. The physics thread pool now counts the cores it's actually allowed to use, so a 1-core run really does use 1 worker thread (check the Task system: N worker(s) log line).

Open — please run these

Benchmarks now write files to benchmark/ (next to where you run them): a .txt to read and a .json for analysis, including your CPU, GPU, driver, RAM, OS and build type. Paste either file back instead of log lines.

HW-018 · Voice chat echo and noise, with speakers (dev box + a second PC or phone hotspot)

Voice chat now cleans the microphone (docs/NETWORKING.md "Voice"). Only a real microphone and real speakers can check it. Host kke_demo on one PC (KKE_NET=host KKE_NET_NAME=A ./kke_demo), join from another (KKE_NET=join:ADDRESS KKE_NET_NAME=B ./kke_demo). On A use speakers, not headphones, Voice panel (F1) on Open mic. 1. B talks: does B hear themselves back from A's speakers? Untick A's "Echo cancellation": does the echo come back? (It should, clearly.) The number next to the tick box is how much it takes out, in dB. 2. Turn on a fan or type loudly near A's mic while A says nothing: does B hear it? Untick "Noise suppression": does it come back? 3. A talks with the fan on: is A's voice clear, or watery/robotic? Send back: yes/no for each, the dB number, and the Voice chat ready and any Voice / SpeexDSP log lines from both. Result: —

HW-017 · Audio demo with headphones (dev box)

cd build/bin && ./audio_demo, headphones on. Click through the stations (or tick Tour). For each, does it sound like what "Listen for" says? In particular: is the great hall's echo believable or too much? Is the padded room dry? Behind wood, glass and stone: is the order of loudness right, and does stone still sound like something? Round through a door: does the sound seem to come from the door? Around your head: does the tick go behind you with Binaural on? Anything that clicks, crackles or pumps when you turn the camera? Send back: station by station, "right" or what's off; and, if you can, KKE_AUDIO_DEMO_TOUR=1 KKE_AUDIO_RECORD=tour.wav ./audio_demo and the WAV it writes. Result: Passed 2026-09-27. Kees listened to the recorded tours on headphones: "it sounds very good ... perfectly balanced". Real sound files come later.

HW-016 · Play mode with a controller and a touchscreen (dev box)

./sandbox opens in Play mode. With a gamepad plugged in: left stick moves the ring cursor, RB/LB jump along the pictures, hold A on Person and move the stick up, let go; RB to the bat, A, then A near the person. Right stick turns, triggers zoom, Y stands them up, B drops the tool. If you have a touchscreen (laptop or monitor): drag Person out with a finger, tap the bat, tap the person; two fingers drag to turn, pinch to zoom, and a second finger while dragging should put the piece back. Send back: is the cursor speed right (too fast / too slow for aiming)? Does anything need two tries? Which controller did you use? For touch: does the palette feel big enough under a finger? Result: —

HW-015 · End-user stress test (dev box, and the laptop if you can)

KKE_STRESS_TEST=1 ./kke_demo (or the showcase's Performance panel → "Run stress test"). Runs 36 s by itself (walk, crate rain, impacts), then quits. Hands off the mouse while it runs. Run it once as is and once with "3D render scale" at 0.5 (Performance panel, then Save settings), so we see what render scale buys on a real GPU. Send back: the two benchmark/stress_<time>_<host>.txt files. Sandbox reference (4-core VM, software GPU): 20 fps avg, 11 fps 1% low, "too slow"; walk 29 fps, crates 18 fps, impacts 13 fps. Result: —

HW-014 · Breaking things, again (dev box)

Two parts. 1. KKE_PHYSICS_SCENES=breaktest ./physics_demo (or the "Scene: Break test" button): glass on two supports, a wooden plank as a bridge, a stone wall; iron balls drop/fly at them after ~4 s. Glass should shatter in a star around the hit, the plank snap into long splinters, the wall lose irregular chunks. Change "Fracture seed" and run it again: different pieces, same kind of break. 2. ./sandbox: X on props with each "Breaks as" material, shoot with 2 + click or F. Nothing may break before it's hit; a hit at the default 18 m/s should visibly break it; a 30-40 m/s hit (Ball speed) should break more than an 18 m/s one. Walk around a broken prop: crack faces from every side, nothing hollow. Move a prop around (G) with the grid look on: the grid must stay stuck to it. "Reroll" gives one prop new pieces; the World seed changes all of them; save + load keeps them. Send back: screenshots (before/after per material), FPS during and after a big break, anything that explodes, flies off or sinks. Result: —

HW-013 · Sea demo (dev box)

cd build/bin && ./sea_demo. Drive (arrows), throw things (click, 1-5), turn the wind up to 14 m/s. Does the boat feel like a boat (not too twitchy, not too stiff)? Do the objects float/sink the way their names say? Any shimmering or "swimming" of the sea surface when the camera moves? FPS with 40 bodies in the water? Send back: screenshots or a short clip, FPS, and anything that feels off. Result: 2026-09-26, dev box: "seems good for now". ✅ for now; revisit with Synty props as floaters.

HW-012 · Melt demo feel and speed (dev box)

cd build/bin && ./melt_demo, then each block (Block combo or KKE_MELT_PRESET=0..3). In the sandbox it only reached ~8 FPS (software GPU), so the simulation ran at ~0.27x speed and I tuned melting headless in simulated time. Does it look like pouring lava? Does the ice melt at a satisfying pace (target: about half gone in ~10 s), does lava crust too much or too little, does anything fly off unnaturally? Note the panel's "Fluid ms / melt ms" at a full 3,000 particles. The liquid now draws as one smooth surface (screen-space fluid rendering); press L to compare with the raw particles — FPS with each, and does the smooth surface look like liquid (any flicker, streaks, halos at the edges)? Send back: a short screen recording or 3 screenshots per block, the panel numbers, and what feels off. Result: 2026-09-26, dev box: melting itself "feels correct", but the melt pooled inside an invisible cube before it flowed (BUG-049, fixed). Re-run: does melt run off the block from the first drop now?

HW-011 · Sandbox with your packs (dev box, interactive)

cd build/bin && ./sandbox with your packs in assets/synty/ (or type the folder into the Assets panel). Does it find all your packs, and do the categories make sense? Build something: floor tiles, walls, stacked props (placement, snapping, rotate, move, duplicate, delete), then save, quit, restart and load it. Then play: K on a character, X on props with each "Breaks as" material, then the Shoot tool (2, click) or F/Space. Wood should splinter, stone crumble into chunks, glass shatter radially, metal dent without breaking — and nothing should break before you shoot it. Does it feel right? Watch FPS after big breaks (debris is slow to sleep). Anything that loads wrong (textures missing, pieces in the floor) or feels awkward is exactly what I need. Send back: screenshots, the saved sandbox_layout.json, the asset count line from the Assets panel, and log warnings. Result: 2026-09-26, dev box: placing/duplicating/selecting "perfectly fine"; breaking was not: every material broke into the same square pieces, seen from one side only, and the grid texture slid over moving objects (BUG-045..048, 050, 051, all fixed). Re-test as HW-014.

HW-010 · Physics thread scaling, as one file (dev box)

Replaces HW-003 (which only produced one line — KKE_PHYSICS_THREADS probably didn't take effect in that shell). From the repository root:

cmake --workflow --preset everything-release   # if not built yet
cmake -P tools/run_physics_benchmarks.cmake
Runs the benchmark at 1, 2, 4, 8, 16 threads (up to your core count). Send back: benchmark/sweep_<time>/summary.txt. Result: 2026-09-26, dev box: one run came back (8 threads, RelWithDebInfo): realtime 1.00x, step avg 3.86 ms, p99 5.88 ms, max 12.6 ms, 481 pieces / 2,400 tets, 104 MB peak RSS, render prep 0.11 ms. Still no 1/2/4-thread comparison, so scaling is unknown. Note the scene changed since (brick and glass are now breakables with ~800 tets each, see OPTIMIZATION.md #21), so re-run the whole sweep.

HW-002 · Same benchmark, Debug build (dev box)

Same as HW-001 but from build/ (cmake --workflow --preset everything). FEMFX itself is optimized in both now; this measures how much the rest of the engine costs at -O0. Send back: the BENCH RESULT line. Result: —

HW-004 · Min-spec emulation (dev box)

Run the systemd-run command above with the release build. Send back: the BENCH RESULT line, and whether the Physics panel's "Simulation can't keep up — running in slow motion" message shows during the big breaks. Expectation from the sandbox: ~10 FPS average while debris is flying, then physics drops to ~0.2 ms/step once it settles. Result: —

HW-005 · Does it look and feel right? (dev box, interactive)

Run ./physics_demo normally and click through every scene button, several times each. - Do shattered objects show all their pieces, including the inside faces along the cracks? (Before this change, most pieces were invisible — see BUGS.md BUG-026.) - Does anything fall through the floor, jitter forever, or float? - After things settle, does the Physics panel show (0 awake)? - Do shadows follow the pieces? - Is the floor a pale green, and the shards pastel pink/yellow/green? That's how it looks in the sandbox's software renderer both before and after this change. If it looks different on a real GPU, that's worth a screenshot — it may be related to BUGS.md BUG-021. Send back: yes/no per bullet, plus a screenshot of a big pile. Result: —

HW-006 · Clean exit (dev box)

Close each demo (physics_demo, kke_demo, rmlui_demo, imgui_demo) with the window's close button. None should crash (BUGS.md BUG-025 used to crash all of them on exit). Send back: any crash output. Result: —

HW-007 · FEMFX capacity warnings (dev box)

While doing HW-001/HW-005, watch the log for FEMFX hit a scene capacity limit. It shouldn't appear. If it does, send the line — the hex flags say exactly which limit (FM_WARNING_FLAG_* in external/FEMFX/amd_femfx/inc/AMD_FEMFX.h). Result: —

HW-008 · UI showcase on a real desktop (dev box)

cd build/bin && ./rmlui_demo. Click through every nav tab. Then in Settings: toggle Fullscreen and VSync, set a frame-rate limit, drag UI scale and FOV, toggle Shadows, rebind a key, then Apply & save and restart — do your choices come back? - Does clicking land exactly where you click? (Especially with desktop scaling at 125%/150% — this was broken before, BUG-032.) - Does typing work in the chat box? Does Enter send? - Drag items around the inventory and onto equipment slots. - Resize the window small and large: does everything stay on screen and readable? - Do colors look like the screenshots in the session (dark navy panels, not washed-out grey)? - Is VSync on really capped to your refresh rate, and off uncapped (check with F1 → Performance panel)? Send back: anything that looks or behaves wrong, with a screenshot. Result: —

HW-009 · Synty demo, and your other Synty packs (dev box)

cd build/bin && ./synty_demo with the Prototype pack in assets/synty/POLYGON_Prototype/. Check the level and characters look right, press B for bones, pose a bone from the Characters panel. Ragdolls: R, Shift+R, T, and G (glass pane) — does the fall look believable, does anything explode, jitter, or sink through the floor? How does the frame rate hold when everything falls at once? Then try another pack you own: unzip it the same way and point KKE_SYNTY_DIR at it — the demo only builds the Prototype level, but the log line loaded '...': ... bone(s), ... animation(s), bounds ... and any texture ... not found warnings for the other pack's files are what matter. (A quick way to load one: change a path in games/synty_demo/SyntySceneModule.cpp.) Send back: screenshot, plus any warnings/errors from the log. Result: —

Done

HW-001 · Physics benchmark, optimized build — ✅ 2026-09-25

Dev box (Ryzen 7 9800X3D, RX 9070 XT). BENCH RESULT: 1200 ticks in 19.98 s wall (1.00x realtime), 162884 frames (8151.0 fps avg), step avg 1.38 ms max 5.77 ms, render prep avg 0.03 ms, 19 objects / 484 pieces / 2178 tets. The simulation kept up with real time the entire run; the worst physics step (5.8 ms) is a third of a 60 Hz frame. For comparison the 1-core sandbox emulation needs 21 ms average. Settled pile: 0.06 ms.

HW-003 · Thread scaling — ⚠️ inconclusive 2026-09-25

Only one run came back (step avg 1.40 ms, same as HW-001), so the thread count most likely didn't change. Superseded by HW-010.

VK_EXT_layer_settings crash — are recorded in BUILDING.md.)