Shaders: fingerprint without node positions, compile counter hook; 760 checks (#65)

admin committed 2026-09-13 18:00:51 +02:00
1 parent 359b366f4b
commit f80df5e085
2 files changed
+6 -3

No files matched your search

+2 -2
@@ -12,7 +12,7 @@ npm run check # typecheck + lint + format:check + tests, the gate CI runs
# code is lost (tail's is reported), so a red run reads as green # code is lost (tail's is reported), so a red run reads as green
npm run build # writes dist/ and regenerates index.html npm run build # writes dist/ and regenerates index.html
./build.sh # the same under `set -o pipefail`, for callers that pipe the output ./build.sh # the same under `set -o pipefail`, for callers that pipe the output
node tools/seed-e2e.mjs && node tools/e2e.mjs # 758 editor checks, screenshots in /tmp/gm-e2e-*.png node tools/seed-e2e.mjs && node tools/e2e.mjs # 760 editor checks, screenshots in /tmp/gm-e2e-*.png
GM_STEPS=20 node tools/e2e.mjs # or 1-12, or 6,20 — a subset while working on one step GM_STEPS=20 node tools/e2e.mjs # or 1-12, or 6,20 — a subset while working on one step
./e2e.sh start [GM_STEPS] # the same run detached, see below ./e2e.sh start [GM_STEPS] # the same run detached, see below
./e2e.sh status # live progress, or the last run's result ./e2e.sh status # live progress, or the last run's result
@@ -151,4 +151,4 @@ widths to find click points. The **render device is not in this repo** — `/dev
and a 1 GB `/dev/shm` come from `container.options` in the runner's own `config.yaml`, which and a 1 GB `/dev/shm` come from `container.options` in the runner's own `config.yaml`, which
applies to every job on that runner. Without them chromium falls back to llvmpipe, which gets applies to every job on that runner. Without them chromium falls back to llvmpipe, which gets
WebGL 1.0 only. Measured in the job container: `ANGLE (Intel, Vulkan 1.3.230, HD Graphics 630)`, WebGL 1.0 only. Measured in the job container: `ANGLE (Intel, Vulkan 1.3.230, HD Graphics 630)`,
WebGL 2.0, and the same 758 checks as here. WebGL 2.0, and the same 760 checks as here.
+4 -1
@@ -150,7 +150,10 @@ quad has four corners and stays a quad (#79 is the vertex-side step that would c
fragment (every node reachable from the Output becomes one local per output, in dependency order; fragment (every node reachable from the Output becomes one local per output, in dependency order;
every Property a `uniform float u_<name>`), `src/viewport/shaders.ts` wraps the result in a Pixi every Property a `uniform float u_<name>`), `src/viewport/shaders.ts` wraps the result in a Pixi
`Shader` for the sprite's mesh (`GraphShader`, with a vertex stage of its own) and `Shader` for the sprite's mesh (`GraphShader`, with a vertex stage of its own) and
`src/viewport/ShaderLibrary.ts` caches the compiled graph per asset. A sprite's picture is a `Mesh` `src/viewport/ShaderLibrary.ts` caches the compiled graph per asset, keyed by a fingerprint of what
the fragment depends on — node ids, types, params, declared ports, and which port feeds which — so
moving, collapsing or folding compiles nothing again; a changed param or link does, once
(`__gm.shaderCompiles()` counts it for the checks). A sprite's picture is a `Mesh`
(a unit quad sized by its scale, `symbols.ts`), a sibling of the sprite's `Graphics` node under the (a unit quad sized by its scale, `symbols.ts`), a sibling of the sprite's `Graphics` node under the
same parent: Pixi 8 lets only plain containers have children, and the node keeps just the hit area. same parent: Pixi 8 lets only plain containers have children, and the node keeps just the hit area.
Two Pixi facts the code leans on: a mesh's texture is bound only for Pixi's own shader, so Two Pixi facts the code leans on: a mesh's texture is bound only for Pixi's own shader, so