@aardworx/wombat.rendering 0.9.11 → 0.9.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/runtime/derivedUniforms/codegen.d.ts +8 -0
  2. package/dist/runtime/derivedUniforms/codegen.d.ts.map +1 -0
  3. package/dist/runtime/derivedUniforms/codegen.js +449 -0
  4. package/dist/runtime/derivedUniforms/codegen.js.map +1 -0
  5. package/dist/runtime/derivedUniforms/dispatch.d.ts +14 -93
  6. package/dist/runtime/derivedUniforms/dispatch.d.ts.map +1 -1
  7. package/dist/runtime/derivedUniforms/dispatch.js +123 -299
  8. package/dist/runtime/derivedUniforms/dispatch.js.map +1 -1
  9. package/dist/runtime/derivedUniforms/flatten.d.ts +25 -0
  10. package/dist/runtime/derivedUniforms/flatten.d.ts.map +1 -0
  11. package/dist/runtime/derivedUniforms/flatten.js +71 -0
  12. package/dist/runtime/derivedUniforms/flatten.js.map +1 -0
  13. package/dist/runtime/derivedUniforms/index.d.ts +10 -5
  14. package/dist/runtime/derivedUniforms/index.d.ts.map +1 -1
  15. package/dist/runtime/derivedUniforms/index.js +24 -19
  16. package/dist/runtime/derivedUniforms/index.js.map +1 -1
  17. package/dist/runtime/derivedUniforms/marker.d.ts +76 -0
  18. package/dist/runtime/derivedUniforms/marker.d.ts.map +1 -0
  19. package/dist/runtime/derivedUniforms/marker.js +156 -0
  20. package/dist/runtime/derivedUniforms/marker.js.map +1 -0
  21. package/dist/runtime/derivedUniforms/recipes.d.ts +6 -41
  22. package/dist/runtime/derivedUniforms/recipes.d.ts.map +1 -1
  23. package/dist/runtime/derivedUniforms/recipes.js +53 -129
  24. package/dist/runtime/derivedUniforms/recipes.js.map +1 -1
  25. package/dist/runtime/derivedUniforms/records.d.ts +40 -0
  26. package/dist/runtime/derivedUniforms/records.d.ts.map +1 -0
  27. package/dist/runtime/derivedUniforms/records.js +151 -0
  28. package/dist/runtime/derivedUniforms/records.js.map +1 -0
  29. package/dist/runtime/derivedUniforms/registry.d.ts +33 -0
  30. package/dist/runtime/derivedUniforms/registry.d.ts.map +1 -0
  31. package/dist/runtime/derivedUniforms/registry.js +58 -0
  32. package/dist/runtime/derivedUniforms/registry.js.map +1 -0
  33. package/dist/runtime/derivedUniforms/rule.d.ts +26 -0
  34. package/dist/runtime/derivedUniforms/rule.d.ts.map +1 -0
  35. package/dist/runtime/derivedUniforms/rule.js +35 -0
  36. package/dist/runtime/derivedUniforms/rule.js.map +1 -0
  37. package/dist/runtime/derivedUniforms/sceneIntegration.d.ts +34 -33
  38. package/dist/runtime/derivedUniforms/sceneIntegration.d.ts.map +1 -1
  39. package/dist/runtime/derivedUniforms/sceneIntegration.js +80 -90
  40. package/dist/runtime/derivedUniforms/sceneIntegration.js.map +1 -1
  41. package/dist/runtime/heapScene.d.ts.map +1 -1
  42. package/dist/runtime/heapScene.js +78 -26
  43. package/dist/runtime/heapScene.js.map +1 -1
  44. package/dist/runtime/hybridScene.js +1 -1
  45. package/dist/runtime/hybridScene.js.map +1 -1
  46. package/dist/runtime/index.d.ts +1 -0
  47. package/dist/runtime/index.d.ts.map +1 -1
  48. package/dist/runtime/index.js +2 -0
  49. package/dist/runtime/index.js.map +1 -1
  50. package/dist/runtime/renderTask.js +1 -1
  51. package/dist/runtime/renderTask.js.map +1 -1
  52. package/dist/runtime/runtime.js +1 -1
  53. package/dist/runtime/runtime.js.map +1 -1
  54. package/package.json +1 -1
  55. package/src/runtime/derivedUniforms/codegen.ts +477 -0
  56. package/src/runtime/derivedUniforms/dispatch.ts +135 -341
  57. package/src/runtime/derivedUniforms/flatten.ts +89 -0
  58. package/src/runtime/derivedUniforms/index.ts +50 -34
  59. package/src/runtime/derivedUniforms/marker.ts +169 -0
  60. package/src/runtime/derivedUniforms/recipes.ts +63 -155
  61. package/src/runtime/derivedUniforms/records.ts +158 -0
  62. package/src/runtime/derivedUniforms/registry.ts +77 -0
  63. package/src/runtime/derivedUniforms/rule.ts +59 -0
  64. package/src/runtime/derivedUniforms/sceneIntegration.ts +115 -149
  65. package/src/runtime/heapScene.ts +77 -28
  66. package/src/runtime/hybridScene.ts +1 -1
  67. package/src/runtime/index.ts +8 -0
  68. package/src/runtime/renderTask.ts +1 -1
  69. package/src/runtime/runtime.ts +1 -1
  70. package/dist/runtime/derivedUniforms/slotId.d.ts +0 -15
  71. package/dist/runtime/derivedUniforms/slotId.d.ts.map +0 -1
  72. package/dist/runtime/derivedUniforms/slotId.js +0 -30
  73. package/dist/runtime/derivedUniforms/slotId.js.map +0 -1
  74. package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts +0 -13
  75. package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts.map +0 -1
  76. package/dist/runtime/derivedUniforms/uberKernel.wgsl.js +0 -218
  77. package/dist/runtime/derivedUniforms/uberKernel.wgsl.js.map +0 -1
  78. package/src/runtime/derivedUniforms/slotId.ts +0 -35
  79. package/src/runtime/derivedUniforms/uberKernel.wgsl.ts +0 -220
@@ -0,0 +1,8 @@
1
+ import type { DerivedUniformRegistry } from "./registry.js";
2
+ export interface UberKernel {
3
+ readonly wgsl: string;
4
+ /** Record stride (u32 words) the kernel was generated for — must match RecordsBuffer.strideWords. */
5
+ readonly strideU32: number;
6
+ }
7
+ export declare function buildUberKernel(registry: DerivedUniformRegistry, strideU32: number): UberKernel;
8
+ //# sourceMappingURL=codegen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/codegen.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,sBAAsB,EAAa,MAAM,eAAe,CAAC;AAEvE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qGAAqG;IACrG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAoaD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAiC/F"}
@@ -0,0 +1,449 @@
1
+ // §7 v2 — uber-kernel codegen.
2
+ //
3
+ // Emits the single compute kernel from the rule registry. One thread per
4
+ // record; each thread switches on `rule_id` and runs the matching arm:
5
+ // load the inputs (df32 from a constituent slot, or plain f32 from the
6
+ // drawHeader), do the math, write the result to MainHeap.
7
+ //
8
+ // v0 supports the rule shapes the standard trafo recipes need:
9
+ // • a single mat4 input, output mat4 → collapse
10
+ // • a left-fold MulMatMat over N mat4 inputs, output mat4 → dfmulN + collapse
11
+ // • a single mat4 input, output mat3 → upper-3×3 of the transposed input (normal matrix)
12
+ // Arbitrary IR rules (the wgsl `expr()` lowering path) land in a follow-up;
13
+ // codegen throws on a shape it doesn't recognise. See docs/derived-uniforms-extensible.md.
14
+ import { visitExprChildren } from "@aardworx/wombat.shader/ir";
15
+ import { mapExpr } from "@aardworx/wombat.shader/passes";
16
+ function isMat4(e) {
17
+ const t = e.type;
18
+ return t.kind === "Matrix" && t.rows === 4 && t.cols === 4 && t.element.kind === "Float";
19
+ }
20
+ function isMat3(t) {
21
+ return t.kind === "Matrix" && t.rows === 3 && t.cols === 3 && t.element.kind === "Float";
22
+ }
23
+ /** A mat4 "leaf" is `ReadInput("Uniform", …)` or `Inverse(ReadInput("Uniform", …))`. */
24
+ function isMat4Leaf(e) {
25
+ if (e.kind === "ReadInput" && e.scope === "Uniform" && isMat4(e))
26
+ return true;
27
+ if (e.kind === "Inverse" && isMat4(e) && e.value.kind === "ReadInput" && e.value.scope === "Uniform")
28
+ return true;
29
+ return false;
30
+ }
31
+ /** Flatten a left-assoc `MulMatMat` tree into its leaf list (left→right), or undefined if it isn't one. */
32
+ function matmulChainLeaves(e) {
33
+ if (isMat4Leaf(e))
34
+ return [e];
35
+ if (e.kind === "MulMatMat" && isMat4(e)) {
36
+ const left = matmulChainLeaves(e.lhs);
37
+ const right = matmulChainLeaves(e.rhs);
38
+ if (left && right)
39
+ return [...left, ...right];
40
+ }
41
+ return undefined;
42
+ }
43
+ function classify(entry) {
44
+ const ir = entry.ir;
45
+ // Preferred (df32-precise) shapes for the standard trafo recipes.
46
+ if (isMat3(entry.outputType) && entry.inputs.length === 1)
47
+ return { kind: "normalMatrix", arity: 1 };
48
+ if (!isMat3(entry.outputType)) {
49
+ const chain = matmulChainLeaves(ir);
50
+ if (chain !== undefined) {
51
+ if (chain.length === 1)
52
+ return { kind: "collapse", arity: 1 };
53
+ // The arm consumes inputs positionally in chain order; that matches `entry.inputs`
54
+ // (first-appearance order) only when no leaf is repeated — otherwise fall to generic.
55
+ if (chain.length === entry.inputs.length)
56
+ return { kind: "matmulChain", arity: chain.length };
57
+ }
58
+ }
59
+ // Anything else: lower the IR via the wgsl printer (single precision).
60
+ return { kind: "generic", arity: entry.inputs.length };
61
+ }
62
+ // ─── WGSL fragments ───────────────────────────────────────────────────
63
+ const DF32_LIB = /* wgsl */ `
64
+ fn split12(a: f32) -> vec2<f32> {
65
+ let hi = bitcast<f32>(bitcast<u32>(a) & 0xFFFFE000u);
66
+ return vec2<f32>(hi, a - hi);
67
+ }
68
+ fn two_sum(a: f32, b: f32) -> vec2<f32> {
69
+ let s = a + b;
70
+ let bb = fma(1.0, s, -a);
71
+ let t1 = fma(1.0, s, -bb);
72
+ let t2 = fma(1.0, a, -t1);
73
+ let t3 = fma(1.0, b, -bb);
74
+ return vec2<f32>(s, t2 + t3);
75
+ }
76
+ fn quick_two_sum(a: f32, b: f32) -> vec2<f32> {
77
+ let s = a + b;
78
+ let t = fma(1.0, s, -a);
79
+ return vec2<f32>(s, fma(1.0, b, -t));
80
+ }
81
+ fn two_prod(a: f32, b: f32) -> vec2<f32> {
82
+ let p = a * b;
83
+ let A = split12(a);
84
+ let B = split12(b);
85
+ let err = ((A.x * B.x - p) + A.x * B.y + A.y * B.x) + A.y * B.y;
86
+ return vec2<f32>(p, err);
87
+ }
88
+ fn df_add(a: vec2<f32>, b: vec2<f32>) -> vec2<f32> {
89
+ let s = two_sum(a.x, b.x);
90
+ let t = two_sum(a.y, b.y);
91
+ let s3 = quick_two_sum(s.x, s.y + t.x);
92
+ return quick_two_sum(s3.x, s3.y + t.y);
93
+ }
94
+ fn df_mul(a: vec2<f32>, b: vec2<f32>) -> vec2<f32> {
95
+ let p = two_prod(a.x, b.x);
96
+ let cross1 = fma(a.x, b.y, p.y);
97
+ let cross = fma(a.y, b.x, cross1);
98
+ return quick_two_sum(p.x, cross);
99
+ }
100
+ `;
101
+ // Tagged-handle decode (must mirror records.ts: tag in top 3 bits, payload in low 29).
102
+ const HANDLE_HELPERS = /* wgsl */ `
103
+ const SLOT_PAYLOAD_MASK: u32 = 0x1FFFFFFFu;
104
+ fn slot_tag(h: u32) -> u32 { return h >> 29u; }
105
+ fn slot_payload(h: u32) -> u32 { return h & SLOT_PAYLOAD_MASK; }
106
+
107
+ // One df32 mat4 entry (r,c) of the matrix referenced by handle h.
108
+ // tag 0 = constituent slot: Constituents[idx*16 + r*4 + c] (df32 hi/lo)
109
+ // tag 1 = host drawHeader: MainHeap[(byte>>2) + r*4 + c] (plain f32 → (v, 0))
110
+ fn load_entry_mat4(h: u32, r: u32, c: u32) -> vec2<f32> {
111
+ let tag = slot_tag(h);
112
+ let p = slot_payload(h);
113
+ if (tag == 0u) {
114
+ return Constituents[p * 16u + r * 4u + c];
115
+ }
116
+ return vec2<f32>(MainHeap[(p >> 2u) + r * 4u + c], 0.0);
117
+ }
118
+
119
+ fn write_mat4_entry(out_byte: u32, r: u32, c: u32, v: f32) {
120
+ MainHeap[(out_byte >> 2u) + r * 4u + c] = v;
121
+ }
122
+ fn write_mat3_entry(out_byte: u32, r: u32, c: u32, v: f32) {
123
+ // std140 mat3<f32>: 3 rows × 4-float stride; the 4th column per row is left untouched.
124
+ MainHeap[(out_byte >> 2u) + r * 4u + c] = v;
125
+ }
126
+ `;
127
+ function bindings(strideU32) {
128
+ return /* wgsl */ `
129
+ @group(0) @binding(0) var<storage, read> Constituents: array<vec2<f32>>;
130
+ @group(0) @binding(1) var<storage, read_write> MainHeap: array<f32>;
131
+ @group(0) @binding(2) var<storage, read> RecordData: array<u32>;
132
+ struct CountUniform { count: u32 }
133
+ @group(0) @binding(3) var<uniform> Count: CountUniform;
134
+
135
+ const RECORD_STRIDE: u32 = ${strideU32 >>> 0}u;
136
+ `;
137
+ }
138
+ /** `collapse`: copy a single mat4 input (collapsing df32 hi+lo) to the output. */
139
+ function emitCollapseArm(id) {
140
+ return /* wgsl */ `
141
+ fn arm_${id}(in0: u32, out_byte: u32) {
142
+ for (var r: u32 = 0u; r < 4u; r = r + 1u) {
143
+ for (var c: u32 = 0u; c < 4u; c = c + 1u) {
144
+ let e = load_entry_mat4(in0, r, c);
145
+ write_mat4_entry(out_byte, r, c, e.x + e.y);
146
+ }
147
+ }
148
+ }
149
+ `;
150
+ }
151
+ /** `normalMatrix`: mat3 = upper-3×3 of the transpose of the single mat4 input. NM[i,j] = M[j,i]. */
152
+ function emitNormalMatrixArm(id) {
153
+ return /* wgsl */ `
154
+ fn arm_${id}(in0: u32, out_byte: u32) {
155
+ for (var i: u32 = 0u; i < 3u; i = i + 1u) {
156
+ for (var j: u32 = 0u; j < 3u; j = j + 1u) {
157
+ let e = load_entry_mat4(in0, j, i);
158
+ write_mat3_entry(out_byte, i, j, e.x + e.y);
159
+ }
160
+ }
161
+ }
162
+ `;
163
+ }
164
+ /** `matmulChain` of N mat4 inputs L0·L1·…·L(N-1), collapsed to f32. */
165
+ function emitMatMulChainArm(id, n) {
166
+ const params = Array.from({ length: n }, (_, i) => `in${i}: u32`).join(", ");
167
+ // P holds the running product in df32, row-major (16 entries). Start P = L0, then P = P · Lk.
168
+ let body = ` var P: array<vec2<f32>, 16>;\n`;
169
+ body += ` for (var r: u32 = 0u; r < 4u; r = r + 1u) {\n`;
170
+ body += ` for (var c: u32 = 0u; c < 4u; c = c + 1u) { P[r * 4u + c] = load_entry_mat4(in0, r, c); }\n`;
171
+ body += ` }\n`;
172
+ for (let k = 1; k < n; k++) {
173
+ body += ` {\n`;
174
+ body += ` var Q: array<vec2<f32>, 16>;\n`;
175
+ body += ` for (var r: u32 = 0u; r < 4u; r = r + 1u) {\n`;
176
+ body += ` for (var c: u32 = 0u; c < 4u; c = c + 1u) {\n`;
177
+ body += ` var acc = vec2<f32>(0.0, 0.0);\n`;
178
+ body += ` for (var t: u32 = 0u; t < 4u; t = t + 1u) {\n`;
179
+ body += ` acc = df_add(acc, df_mul(P[r * 4u + t], load_entry_mat4(in${k}, t, c)));\n`;
180
+ body += ` }\n`;
181
+ body += ` Q[r * 4u + c] = acc;\n`;
182
+ body += ` }\n`;
183
+ body += ` }\n`;
184
+ body += ` P = Q;\n`;
185
+ body += ` }\n`;
186
+ }
187
+ body += ` for (var r: u32 = 0u; r < 4u; r = r + 1u) {\n`;
188
+ body += ` for (var c: u32 = 0u; c < 4u; c = c + 1u) {\n`;
189
+ body += ` let e = P[r * 4u + c];\n`;
190
+ body += ` write_mat4_entry(out_byte, r, c, e.x + e.y);\n`;
191
+ body += ` }\n`;
192
+ body += ` }\n`;
193
+ return `\nfn arm_${id}(${params}, out_byte: u32) {\n${body}}\n`;
194
+ }
195
+ function wgslTypeOf(t, where) {
196
+ switch (t.kind) {
197
+ case "Float": return { wgsl: "f32", sym: "f32", isMat: false, dim: 1 };
198
+ case "Bool": throw new Error(`derived rule (${where}): bool is not a heap-storable type`);
199
+ case "Int": return t.signed
200
+ ? { wgsl: "i32", sym: "i32", isMat: false, dim: 1 }
201
+ : { wgsl: "u32", sym: "u32", isMat: false, dim: 1 };
202
+ case "Vector": {
203
+ if (t.element.kind !== "Float")
204
+ throw new Error(`derived rule (${where}): only vecN<f32> supported`);
205
+ return { wgsl: `vec${t.dim}<f32>`, sym: `vec${t.dim}_f32`, isMat: false, dim: t.dim };
206
+ }
207
+ case "Matrix": {
208
+ if (t.element.kind !== "Float")
209
+ throw new Error(`derived rule (${where}): only matNxM<f32> supported`);
210
+ if (t.rows !== t.cols || (t.rows !== 3 && t.rows !== 4)) {
211
+ throw new Error(`derived rule (${where}): only mat3x3<f32> / mat4x4<f32> supported`);
212
+ }
213
+ return { wgsl: `mat${t.cols}x${t.rows}<f32>`, sym: `mat${t.cols}x${t.rows}_f32`, isMat: true, dim: t.rows };
214
+ }
215
+ default: throw new Error(`derived rule (${where}): unsupported type kind '${t.kind}'`);
216
+ }
217
+ }
218
+ /** `load_<sym>(h: u32) -> <wgsl>` — from a constituent slot (df32, collapsed) or the main heap. */
219
+ function emitLoader(t) {
220
+ if (t.isMat) {
221
+ const n = t.dim;
222
+ return `
223
+ fn load_${t.sym}(h: u32) -> ${t.wgsl} {
224
+ var m: ${t.wgsl};
225
+ for (var r: u32 = 0u; r < ${n}u; r = r + 1u) {
226
+ for (var c: u32 = 0u; c < ${n}u; c = c + 1u) {
227
+ let e = load_entry_mat4(h, r, c);
228
+ m[c][r] = e.x + e.y;
229
+ }
230
+ }
231
+ return m;
232
+ }
233
+ `;
234
+ }
235
+ // Scalar / vector: from the main heap only (constituents are mat4 trafos).
236
+ const b = "let b = slot_payload(h) >> 2u;";
237
+ if (t.dim === 1) {
238
+ const conv = t.wgsl === "f32" ? "MainHeap[b]" : `bitcast<${t.wgsl}>(MainHeap[b])`;
239
+ return `\nfn load_${t.sym}(h: u32) -> ${t.wgsl} { ${b} return ${conv}; }\n`;
240
+ }
241
+ const comps = Array.from({ length: t.dim }, (_, i) => (i === 0 ? "MainHeap[b]" : `MainHeap[b + ${i}u]`)).join(", ");
242
+ return `\nfn load_${t.sym}(h: u32) -> ${t.wgsl} { ${b} return ${t.wgsl}(${comps}); }\n`;
243
+ }
244
+ /** `store_<sym>(out_byte: u32, v: <wgsl>)` — into the main heap. */
245
+ function emitStorer(t) {
246
+ if (t.isMat) {
247
+ const n = t.dim;
248
+ const writeFn = n === 3 ? "write_mat3_entry" : "write_mat4_entry";
249
+ return `
250
+ fn store_${t.sym}(out_byte: u32, v: ${t.wgsl}) {
251
+ for (var r: u32 = 0u; r < ${n}u; r = r + 1u) {
252
+ for (var c: u32 = 0u; c < ${n}u; c = c + 1u) { ${writeFn}(out_byte, r, c, v[c][r]); }
253
+ }
254
+ }
255
+ `;
256
+ }
257
+ const b = "let b = out_byte >> 2u;";
258
+ if (t.dim === 1) {
259
+ const v = t.wgsl === "f32" ? "v" : "bitcast<f32>(v)";
260
+ return `\nfn store_${t.sym}(out_byte: u32, v: ${t.wgsl}) { ${b} MainHeap[b] = ${v}; }\n`;
261
+ }
262
+ const comp = ["x", "y", "z", "w"];
263
+ const writes = Array.from({ length: t.dim }, (_, i) => `MainHeap[b + ${i}u] = v.${comp[i]};`).join(" ");
264
+ return `\nfn store_${t.sym}(out_byte: u32, v: ${t.wgsl}) { ${b} ${writes} }\n`;
265
+ }
266
+ function varExpr(idx, type) {
267
+ return { kind: "Var", var: { name: `in${idx}`, type, mutable: false }, type };
268
+ }
269
+ // ── Minimal IR → WGSL expression printer (self-contained; covers the subset a
270
+ // derived-rule body can be). Throws on anything not lowerable to plain WGSL. ──
271
+ function wgslScalar(t) {
272
+ switch (t.kind) {
273
+ case "Float": return "f32";
274
+ case "Bool": return "bool";
275
+ case "Int": return t.signed ? "i32" : "u32";
276
+ default: throw new Error(`derived rule: non-scalar type where scalar expected`);
277
+ }
278
+ }
279
+ function wgslTypeName(t) {
280
+ switch (t.kind) {
281
+ case "Float": return "f32";
282
+ case "Bool": return "bool";
283
+ case "Int": return t.signed ? "i32" : "u32";
284
+ case "Vector": return `vec${t.dim}<${wgslScalar(t.element)}>`;
285
+ case "Matrix": return `mat${t.cols}x${t.rows}<${wgslScalar(t.element)}>`;
286
+ default: throw new Error(`derived rule: unsupported type '${t.kind}' in rule body`);
287
+ }
288
+ }
289
+ function wgslLiteral(l) {
290
+ switch (l.kind) {
291
+ case "Bool": return l.value ? "true" : "false";
292
+ case "Int": return l.signed ? `${l.value}i` : `${l.value >>> 0}u`;
293
+ case "Float": return Number.isFinite(l.value) ? (Number.isInteger(l.value) ? `${l.value}.0` : `${l.value}`) : "0.0";
294
+ case "Null": return "0";
295
+ }
296
+ }
297
+ const BIN = {
298
+ Add: "+", Sub: "-", Mul: "*", Div: "/", Mod: "%",
299
+ MulMatMat: "*", MulMatVec: "*", MulVecMat: "*",
300
+ And: "&&", Or: "||", BitAnd: "&", BitOr: "|", BitXor: "^",
301
+ Eq: "==", Neq: "!=", Lt: "<", Le: "<=", Gt: ">", Ge: ">=",
302
+ };
303
+ function printExpr(e) {
304
+ switch (e.kind) {
305
+ case "Var": return e.var.name;
306
+ case "Const": return wgslLiteral(e.value);
307
+ case "Neg": return `(-${printExpr(e.value)})`;
308
+ case "Not": return `(!${printExpr(e.value)})`;
309
+ case "BitNot": return `(~${printExpr(e.value)})`;
310
+ case "Add":
311
+ case "Sub":
312
+ case "Mul":
313
+ case "Div":
314
+ case "Mod":
315
+ case "MulMatMat":
316
+ case "MulMatVec":
317
+ case "MulVecMat":
318
+ case "And":
319
+ case "Or":
320
+ case "BitAnd":
321
+ case "BitOr":
322
+ case "BitXor":
323
+ case "Eq":
324
+ case "Neq":
325
+ case "Lt":
326
+ case "Le":
327
+ case "Gt":
328
+ case "Ge":
329
+ return `(${printExpr(e.lhs)} ${BIN[e.kind]} ${printExpr(e.rhs)})`;
330
+ case "ShiftLeft":
331
+ case "ShiftRight": {
332
+ const op = e.kind === "ShiftLeft" ? "<<" : ">>";
333
+ const r = e.rhs.type.kind === "Int" && !e.rhs.type.signed ? printExpr(e.rhs) : `u32(${printExpr(e.rhs)})`;
334
+ return `(${printExpr(e.lhs)} ${op} ${r})`;
335
+ }
336
+ case "Transpose": return `transpose(${printExpr(e.value)})`;
337
+ case "Determinant": return `determinant(${printExpr(e.value)})`;
338
+ case "Dot": return `dot(${printExpr(e.lhs)}, ${printExpr(e.rhs)})`;
339
+ case "Cross": return `cross(${printExpr(e.lhs)}, ${printExpr(e.rhs)})`;
340
+ case "Length": return `length(${printExpr(e.value)})`;
341
+ case "VecSwizzle": return `${printExpr(e.value)}.${e.comps.join("")}`;
342
+ case "VecItem": return `${printExpr(e.value)}[${printExpr(e.index)}]`;
343
+ case "MatrixCol": return `${printExpr(e.matrix)}[${printExpr(e.col)}]`;
344
+ case "MatrixElement": return `${printExpr(e.matrix)}[${printExpr(e.col)}][${printExpr(e.row)}]`;
345
+ case "NewVector": return `${wgslTypeName(e.type)}(${e.components.map(printExpr).join(", ")})`;
346
+ case "Conditional": return `select(${printExpr(e.ifFalse)}, ${printExpr(e.ifTrue)}, ${printExpr(e.cond)})`;
347
+ case "Convert":
348
+ case "ConvertMatrix": return `${wgslTypeName(e.type)}(${printExpr(e.value)})`;
349
+ case "Field": return `${printExpr(e.target)}.${e.name}`;
350
+ case "Item": return `${printExpr(e.target)}[${printExpr(e.index)}]`;
351
+ case "CallIntrinsic": return `${e.op.emit.wgsl}(${e.args.map(printExpr).join(", ")})`;
352
+ default:
353
+ throw new Error(`derived rule: IR node '${e.kind}' is not supported in a rule body`);
354
+ }
355
+ }
356
+ const INV_SUFFIX = "inv"; // names a synthetic "inverted constituent" leaf during rewriting
357
+ /** Rewrite `entry.ir` so input leaves become `Var("in<i>")`, then print the body via wgsl `expr()`. */
358
+ function emitGenericRuleFn(entry) {
359
+ const byName = new Map();
360
+ entry.inputs.forEach((inp, i) => byName.set(inp.inverse ? inp.name + INV_SUFFIX : inp.name, i));
361
+ // Pass 1: collapse `Inverse(ReadInput("Uniform", x))` → `ReadInput("Uniform", xinv)`.
362
+ const collapsed = mapExpr(entry.ir, (e) => e.kind === "Inverse" && e.value.kind === "ReadInput" && e.value.scope === "Uniform"
363
+ ? { kind: "ReadInput", scope: "Uniform", name: e.value.name + INV_SUFFIX, type: e.type }
364
+ : e);
365
+ // Pass 2: every `ReadInput("Uniform", n)` → `Var("in<i>")`.
366
+ const body = mapExpr(collapsed, (e) => {
367
+ if (e.kind === "ReadInput" && e.scope === "Uniform") {
368
+ const idx = byName.get(e.name);
369
+ if (idx === undefined)
370
+ throw new Error(`derived rule ${entry.id}: input leaf '${e.name}' not in the rule's input list`);
371
+ return varExpr(idx, e.type);
372
+ }
373
+ return e;
374
+ });
375
+ // Anything not lowerable to plain WGSL?
376
+ const walk = (e) => {
377
+ if (e.kind === "Inverse") {
378
+ throw new Error(`derived rule ${entry.id}: a matrix inverse in the rule body is not supported (WGSL has no inverse — only Inverse of a constituent input is, which reads its stored backward half)`);
379
+ }
380
+ if (e.kind === "ReadInput")
381
+ throw new Error(`derived rule ${entry.id}: unresolved input leaf '${e.name}'`);
382
+ visitExprChildren(e, walk);
383
+ };
384
+ walk(body);
385
+ const params = entry.inputs.map((inp, i) => `in${i}: ${wgslTypeOf(inp.type, `rule ${entry.id} input ${i}`).wgsl}`).join(", ");
386
+ const ret = wgslTypeOf(entry.outputType, `rule ${entry.id} output`).wgsl;
387
+ return `\nfn rule_${entry.id}(${params}) -> ${ret} {\n return ${printExpr(body)};\n}\n`;
388
+ }
389
+ function emitGenericArm(entry) {
390
+ const inTs = entry.inputs.map((inp, i) => wgslTypeOf(inp.type, `rule ${entry.id} input ${i}`));
391
+ const outT = wgslTypeOf(entry.outputType, `rule ${entry.id} output`);
392
+ const params = inTs.map((_, i) => `in${i}: u32`).join(", ");
393
+ let body = "";
394
+ inTs.forEach((t, i) => { body += ` let a${i} = load_${t.sym}(in${i});\n`; });
395
+ const callArgs = inTs.map((_, i) => `a${i}`).join(", ");
396
+ body += ` store_${outT.sym}(out_byte, rule_${entry.id}(${callArgs}));\n`;
397
+ return `${emitGenericRuleFn(entry)}\nfn arm_${entry.id}(${params}, out_byte: u32) {\n${body}}\n`;
398
+ }
399
+ function genericTypes(entry) {
400
+ return [...entry.inputs.map((inp, i) => wgslTypeOf(inp.type, `rule ${entry.id} input ${i}`)), wgslTypeOf(entry.outputType, `rule ${entry.id} output`)];
401
+ }
402
+ function emitArm(entry, shape) {
403
+ switch (shape.kind) {
404
+ case "collapse": return emitCollapseArm(entry.id);
405
+ case "normalMatrix": return emitNormalMatrixArm(entry.id);
406
+ case "matmulChain": return emitMatMulChainArm(entry.id, shape.arity);
407
+ case "generic": return emitGenericArm(entry);
408
+ }
409
+ }
410
+ function emitCase(entry, shape) {
411
+ const ins = Array.from({ length: shape.arity }, (_, i) => `RecordData[base + ${2 + i}u]`).join(", ");
412
+ const args = shape.arity === 0 ? "out_byte" : `${ins}, out_byte`;
413
+ return ` case ${entry.id >>> 0}u: { arm_${entry.id}(${args}); }`;
414
+ }
415
+ // ─── Top-level ────────────────────────────────────────────────────────
416
+ export function buildUberKernel(registry, strideU32) {
417
+ const entries = registry.entries();
418
+ const shapes = entries.map((e) => classify(e));
419
+ // Loaders / storers needed by the generic-path rules, deduped by WGSL type symbol.
420
+ const ioTypes = new Map();
421
+ entries.forEach((e, i) => {
422
+ if (shapes[i].kind === "generic")
423
+ for (const t of genericTypes(e))
424
+ ioTypes.set(t.sym, t);
425
+ });
426
+ const loadersStorers = [...ioTypes.values()].map((t) => emitLoader(t) + emitStorer(t)).join("");
427
+ const arms = entries.map((e, i) => emitArm(e, shapes[i])).join("");
428
+ const cases = entries.map((e, i) => emitCase(e, shapes[i])).join("\n");
429
+ const needsDf32 = shapes.some((s) => s.kind === "matmulChain");
430
+ const wgsl = `${bindings(strideU32)}
431
+ ${needsDf32 ? DF32_LIB : ""}
432
+ ${HANDLE_HELPERS}
433
+ ${loadersStorers}
434
+ ${arms}
435
+ @compute @workgroup_size(64)
436
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
437
+ if (gid.x >= Count.count) { return; }
438
+ let base = gid.x * RECORD_STRIDE;
439
+ let rule_id = RecordData[base];
440
+ let out_byte = RecordData[base + 1u] & SLOT_PAYLOAD_MASK;
441
+ switch rule_id {
442
+ ${cases}
443
+ default: { return; }
444
+ }
445
+ }
446
+ `;
447
+ return { wgsl, strideU32 };
448
+ }
449
+ //# sourceMappingURL=codegen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/codegen.ts"],"names":[],"mappings":"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"}
@@ -1,105 +1,26 @@
1
- import { type DerivationRecord, type SlotIndex } from "./slots.js";
2
- /** Live getters for the GPU resources the dispatcher needs. The scene
3
- * may replace these buffers in-place when capacity grows; the
4
- * dispatcher rebinds each frame. */
1
+ import type { DerivedUniformRegistry } from "./registry.js";
2
+ import type { RecordsBuffer } from "./records.js";
3
+ import { type SlotIndex } from "./slots.js";
4
+ /** Upload the changed-constituent value range to the constituents GPU buffer. */
5
+ export declare function uploadConstituentsRange(device: GPUDevice, buf: GPUBuffer, mirror: Float32Array, dirty: ReadonlySet<SlotIndex>): void;
6
+ /** Live getters for the GPU buffers the kernel binds (scene may grow/replace them). */
5
7
  export interface DerivedUniformsResources {
8
+ /** `array<vec2<f32>>` — df32 trafo halves (the constituents heap). */
6
9
  readonly constituentsBuf: () => GPUBuffer;
10
+ /** `array<f32>` — the main heap (drawHeaders); written by the kernel. */
7
11
  readonly mainHeapBuf: () => GPUBuffer;
8
12
  }
9
- /** Per-bucket records buffer. Records are added/removed when ROs
10
- * enter/leave the bucket. Uses swap-remove to keep the buffer dense.
11
- * CPU mirror is kept up-to-date; the dirty range is uploaded once
12
- * per `flush()`. */
13
- export declare class RecordsBuffer {
14
- private readonly device;
15
- private cpu;
16
- private cap;
17
- private count;
18
- private nextId;
19
- private readonly slotById;
20
- private readonly idBySlot;
21
- /** Dirty CPU-mirror byte range that must be uploaded next flush. */
22
- private dirtyMinByte;
23
- private dirtyMaxByte;
24
- private gpu;
25
- private gpuCap;
26
- constructor(device: GPUDevice, initialCapacity?: number);
27
- /** Add a record. Returns a stable handle for later removal. */
28
- add(rec: DerivationRecord): number;
29
- /** Swap-remove. The last record moves into the freed slot. */
30
- remove(id: number): void;
31
- /** Live record count. */
32
- get recordCount(): number;
33
- /** Ensure GPU buffer matches cap and upload dirty CPU range. Call
34
- * before `encode`. */
35
- flush(): void;
36
- buffer(): GPUBuffer;
37
- dispose(): void;
38
- private writeAt;
39
- private markDirty;
40
- private growCpu;
41
- }
42
- /** One compute pipeline shared across buckets — created once per scene. */
43
- export declare class DerivedUniformsPipeline {
44
- readonly pipeline: GPUComputePipeline;
45
- readonly bgl: GPUBindGroupLayout;
46
- constructor(device: GPUDevice);
47
- }
48
- /** Per-bucket dispatcher. One bind group cached, rebuilt only when a
49
- * bound buffer reference changes (constituents or main heap grew, or
50
- * records buffer was re-created). */
51
13
  export declare class DerivedUniformsDispatcher {
52
14
  private readonly device;
53
- private readonly pipe;
54
15
  private readonly resources;
55
- readonly records: RecordsBuffer;
16
+ private readonly gpu;
17
+ private readonly pipe;
56
18
  private cachedBg;
57
- private bgKeyConsts;
58
- private bgKeyHeap;
59
- private bgKeyRecs;
60
- /** Tiny uniform holding the live record count — gates threads past
61
- * the live range from reading stale swap-removed records. */
62
- private readonly countBuf;
63
- private readonly countCpu;
64
- private lastCountUploaded;
65
- constructor(device: GPUDevice, pipe: DerivedUniformsPipeline, resources: DerivedUniformsResources, initialRecordCapacity?: number);
66
- /** Dispatch into an open compute pass. Caller is responsible for
67
- * beginning/ending the pass and setting the pipeline once across
68
- * all dispatchers (the pipeline is shared). */
69
- dispatchInto(pass: GPUComputePassEncoder): boolean;
70
- /** Convenience: open/close a pass and dispatch. Use only when this
71
- * is the sole dispatcher in the pass; otherwise use `dispatchInto`
72
- * inside a caller-managed pass. */
73
- encode(enc: GPUCommandEncoder): boolean;
19
+ private bgKey;
20
+ constructor(device: GPUDevice, resources: DerivedUniformsResources);
21
+ /** Open a compute pass and run the uber-kernel. No-ops if there are no records / no rules. */
22
+ encode(enc: GPUCommandEncoder, registry: DerivedUniformRegistry, records: RecordsBuffer): boolean;
74
23
  dispose(): void;
75
24
  private bindGroup;
76
25
  }
77
- /** Scene-side helper: O(changed) maintenance of a GPU dirty bitmask.
78
- *
79
- * Steady state (clean frame): zero work. The CPU mirror reflects the
80
- * GPU buffer, so we only ever touch bits that actually flip.
81
- *
82
- * Each `upload(dirty)` call:
83
- * 1. Clears the bits set last frame (O(prev_dirty)).
84
- * 2. Sets the bits dirty this frame (O(dirty)).
85
- * 3. Writes only the affected u32 range to the GPU (one writeBuffer).
86
- * If both sets are empty, returns immediately. */
87
- export declare class DirtyMaskUploader {
88
- private readonly device;
89
- private cpu;
90
- private gpu;
91
- private gpuCapU32;
92
- /** Bits set on the previous upload — must be cleared next time. */
93
- private prevDirty;
94
- constructor(device: GPUDevice, initialU32?: number);
95
- /** Resize CPU + GPU mirrors so they cover `slotCount` bits. */
96
- ensureCapacity(slotCount: number): void;
97
- /** Apply the new dirty set. O(prev_dirty + dirty), no O(slotCount). */
98
- upload(dirty: ReadonlySet<SlotIndex>): void;
99
- buffer(): GPUBuffer;
100
- dispose(): void;
101
- }
102
- /** Upload the dirty constituent value range to the constituents GPU
103
- * buffer. Helper used by the scene each frame after draining. */
104
- export declare function uploadConstituentsRange(device: GPUDevice, buf: GPUBuffer, mirror: Float32Array, dirty: ReadonlySet<SlotIndex>): void;
105
26
  //# sourceMappingURL=dispatch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/dispatch.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE7D,iFAAiF;AACjF,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,GAC5B,IAAI,CAWN;AAED,uFAAuF;AACvF,MAAM,WAAW,wBAAwB;IACvC,sEAAsE;IACtE,QAAQ,CAAC,eAAe,EAAE,MAAM,SAAS,CAAC;IAC1C,yEAAyE;IACzE,QAAQ,CAAC,WAAW,EAAE,MAAM,SAAS,CAAC;CACvC;AA2GD,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IACrD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,KAAK,CAA4G;gBAE7G,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,wBAAwB;IAOlE,8FAA8F;IAC9F,MAAM,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,sBAAsB,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO;IAajG,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,SAAS;CAoBlB"}