The floor is the display
The hull cutout is generated from the scull’s own taper. Profile and plan set the lines; the mask is the unlit region the projectors leave as boat.



(a) Profile and plan of a racing scull. (b) Hull lines that set the taper. (c) The mask the projectors leave unlit.
Read ping, write pong, then swap
Every simulation field lives in a paired half-float slab. A pass reads ping, writes pong, then the pair swaps, so ownership is visible in the resource itself rather than in a comment.[004] The pressure solve is the one in-place exception on Apple Silicon — a deliberate departure, not an accident of the API. Stam’s ping-pong fields are the ancestry.[113]
GPU memory
Names stay. Roles flip.
Two fixed textures. A pass samples one and writes the other; swap() then trades the roles.
01 · PassSample READ into the kernel, then write the result into WRITE — never the same texture.
Sample READ into a pass, write to WRITE, then swap() flips the roles. Semaphore(3) caps in-flight frames.
Allocate once, stretch later
The simulation grid is built on the first resize. Later window changes stretch that grid through UV rather than reallocating it. Host points stay coherent because they scale with the same ratio.
Domain & resize
Fixed grid. Live window.
Fluid state survives resize because the slabs never move — only the view mapping does.
01 · AllocateFirst resize builds the simulation grid once. After that, resolution stays fixed.
Slabs allocate once; later resizes stretch via UV. UnitMapping keeps host input coherent.
Build once, dispatch often
Metal pipeline states are memoised on the shared device. Repeated passes do not pay construction cost twice. Crane, Llamas and Tariq’s real-time fluids on the GPU already treated the pipeline as a scarce object;[031] the same discipline is what keeps a sixty-hertz floor from hitching when a kernel is asked for the second time.[Th.]
Pipeline cache
Lookup. Hit or miss. Dispatch.
MetalDevice memoises pipeline states so the seventeen-stage graph never recompiles hot.
01 · AskA pass asks MetalDevice for a pipeline by name — never builds one inline.
Pass asks MetalDevice: hit reuses a memoised PSO; miss compiles once, then dispatches.
Uniforms are a contract
A three-buffer uniform ring carries host state to the GPU without stalling the previous frame. The ring is the seam between Swift and Metal: what the host has decided a stroke means, written once, read by every pass that needs it.
Python bridge
One legal path.
Research tooling may emit packets. Only the host may write the fluid field.
01 · EmitPython normalizes sensors and emits host-shaped packets. It never opens a Metal texture.
Python → UDP → host → Metal. One legal path; the host is the only writer into the fluid core.
Explicit branches beat silent fallbacks
Apple Silicon and Intel are different machines: solver, bloom, particles, ripple radius. Infer the branch from the host and name it. A silent fallback would make two sessions incomparable; an explicit one makes the comparison possible.
Reproducibility
Name the branch.
Compile-time paths are honest machines — not one binary quietly degrading.
01 · SiliconApple Silicon compute: RBGS pressure, bloom, particles, ripple radius 16.
Apple Silicon vs Intel: different solver, bloom, particles, and ripple radius. Infer the branch from the host.