Amp-Thread-ID: https://ampcode.com/threads/T-01a01380-b478-77d0-84a0-102880a5c5ae Co-authored-by: Heaust Azure <heaust.azure@gmail.com>
2.9 KiB
Core boundary
@yawn/core deliberately contains no scene types and no WGSL. It owns two things:
- a 64-byte-aligned arena of named f32/u32/i32 SOA rows in one
SharedArrayBuffer; - render-graph compilation, up-front WebGPU loadouts, transient resource aliasing, render bundles, and the paced render loop.
infrequent worker messages hot shared mutations
┌──────────────────────────────┐ ┌──────────────────────┐
│ create/delete rows │ │ transforms │
│ allocate/delete object slot │ │ cameras/materials │
│ compile/switch graph │ │ lights/app data │
│ play/pause/set FPS │ │ info.skipRender │
└──────────────┬───────────────┘ └──────────┬───────────┘
└─────────────────┬─────────────────────┘
▼
┌─────────────────┐
│ Rust/WASM core │
└─────────────────┘
Use core directly
import { YawnCore } from "@yawn/core";
const core = new YawnCore(canvas, { arenaBytes: 64 * 1024 * 1024 });
await core.ready;
const values = await core.createRows({
name: "application.values",
rows: 1024,
stride: 16,
format: "f32",
});
const id = await core.allocateObject("application.values");
values.row(id).set([1, 2, 3, 4]);
Graph frontends serialize plain data to (yawn-graph 1 ...). Named after edges preserve DAG fan-out; Rust sorts passes, detects cycles, culls unused declarations, aliases compatible transient lifetimes, merges compatible render passes into bundles, and allocates the active loadout. Unchanged persistent textures survive loadout rebuilds.
The Scene addon is one such frontend. It is replaceable and has no privileged core API.
Profile physical GPU passes
const stop = core.onProfile((frame) => {
console.table(frame.passes); // name + GPU milliseconds
});
const supported = await core.setProfiler(true);
// Later:
await core.setProfiler(false);
stop();
new YawnCore(canvas, { debug: true }) enables the same timestamp-query mode at startup. Timings describe the physical compute and render passes produced by graph compilation, so 138 compatible draws appear as one bundled forward pass. The fullscreen playground’s Profile button shows the stream in a toggleable sidebar.