@aardworx/wombat.rendering 0.9.33 → 0.19.0
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.
- package/dist/core/renderObject.d.ts +16 -0
- package/dist/core/renderObject.d.ts.map +1 -1
- package/dist/runtime/derivedModes/kernelCodegen.d.ts +90 -0
- package/dist/runtime/derivedModes/kernelCodegen.d.ts.map +1 -0
- package/dist/runtime/derivedModes/kernelCodegen.js +623 -0
- package/dist/runtime/derivedModes/kernelCodegen.js.map +1 -0
- package/dist/runtime/derivedModes/modeKeyCpu.d.ts.map +1 -1
- package/dist/runtime/derivedModes/modeKeyCpu.js +23 -67
- package/dist/runtime/derivedModes/modeKeyCpu.js.map +1 -1
- package/dist/runtime/derivedModes/partitionDispatcher.d.ts +79 -0
- package/dist/runtime/derivedModes/partitionDispatcher.d.ts.map +1 -0
- package/dist/runtime/derivedModes/partitionDispatcher.js +303 -0
- package/dist/runtime/derivedModes/partitionDispatcher.js.map +1 -0
- package/dist/runtime/derivedModes/partitionKernel.d.ts +12 -0
- package/dist/runtime/derivedModes/partitionKernel.d.ts.map +1 -0
- package/dist/runtime/derivedModes/partitionKernel.js +127 -0
- package/dist/runtime/derivedModes/partitionKernel.js.map +1 -0
- package/dist/runtime/derivedModes/partitionKernelLayout.d.ts +4 -0
- package/dist/runtime/derivedModes/partitionKernelLayout.d.ts.map +1 -0
- package/dist/runtime/derivedModes/partitionKernelLayout.js +24 -0
- package/dist/runtime/derivedModes/partitionKernelLayout.js.map +1 -0
- package/dist/runtime/derivedModes/rule.d.ts +38 -86
- package/dist/runtime/derivedModes/rule.d.ts.map +1 -1
- package/dist/runtime/derivedModes/rule.js +34 -74
- package/dist/runtime/derivedModes/rule.js.map +1 -1
- package/dist/runtime/derivedUniforms/dispatch.d.ts +10 -8
- package/dist/runtime/derivedUniforms/dispatch.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/dispatch.js +31 -18
- package/dist/runtime/derivedUniforms/dispatch.js.map +1 -1
- package/dist/runtime/derivedUniforms/marker.d.ts +90 -11
- package/dist/runtime/derivedUniforms/marker.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/marker.js +161 -15
- package/dist/runtime/derivedUniforms/marker.js.map +1 -1
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts +25 -6
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/sceneIntegration.js +61 -20
- package/dist/runtime/derivedUniforms/sceneIntegration.js.map +1 -1
- package/dist/runtime/heapAdapter.d.ts.map +1 -1
- package/dist/runtime/heapAdapter.js +17 -0
- package/dist/runtime/heapAdapter.js.map +1 -1
- package/dist/runtime/heapEligibility.d.ts.map +1 -1
- package/dist/runtime/heapEligibility.js +22 -2
- package/dist/runtime/heapEligibility.js.map +1 -1
- package/dist/runtime/heapScene/chunkedArena.d.ts +76 -0
- package/dist/runtime/heapScene/chunkedArena.d.ts.map +1 -0
- package/dist/runtime/heapScene/chunkedArena.js +223 -0
- package/dist/runtime/heapScene/chunkedArena.js.map +1 -0
- package/dist/runtime/heapScene/freelist.d.ts +55 -0
- package/dist/runtime/heapScene/freelist.d.ts.map +1 -0
- package/dist/runtime/heapScene/freelist.js +188 -0
- package/dist/runtime/heapScene/freelist.js.map +1 -0
- package/dist/runtime/heapScene/growBuffer.d.ts +23 -2
- package/dist/runtime/heapScene/growBuffer.d.ts.map +1 -1
- package/dist/runtime/heapScene/growBuffer.js +35 -3
- package/dist/runtime/heapScene/growBuffer.js.map +1 -1
- package/dist/runtime/heapScene/pools.d.ts +84 -42
- package/dist/runtime/heapScene/pools.d.ts.map +1 -1
- package/dist/runtime/heapScene/pools.js +309 -134
- package/dist/runtime/heapScene/pools.js.map +1 -1
- package/dist/runtime/heapScene.d.ts +24 -0
- package/dist/runtime/heapScene.d.ts.map +1 -1
- package/dist/runtime/heapScene.js +1158 -92
- package/dist/runtime/heapScene.js.map +1 -1
- package/dist/runtime/hybridScene.d.ts +15 -0
- package/dist/runtime/hybridScene.d.ts.map +1 -1
- package/dist/runtime/hybridScene.js +16 -0
- package/dist/runtime/hybridScene.js.map +1 -1
- package/dist/runtime/index.d.ts +4 -3
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +4 -3
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/renderTask.d.ts +5 -0
- package/dist/runtime/renderTask.d.ts.map +1 -1
- package/dist/runtime/renderTask.js +1 -0
- package/dist/runtime/renderTask.js.map +1 -1
- package/dist/runtime/runtime.d.ts +6 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +1 -0
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/textureAtlas/atlasPool.d.ts +12 -0
- package/dist/runtime/textureAtlas/atlasPool.d.ts.map +1 -1
- package/dist/runtime/textureAtlas/atlasPool.js +20 -0
- package/dist/runtime/textureAtlas/atlasPool.js.map +1 -1
- package/package.json +1 -1
- package/src/core/renderObject.ts +16 -0
- package/src/runtime/derivedModes/kernelCodegen.ts +673 -0
- package/src/runtime/derivedModes/modeKeyCpu.ts +22 -60
- package/src/runtime/derivedModes/partitionDispatcher.ts +349 -0
- package/src/runtime/derivedModes/partitionKernelLayout.ts +25 -0
- package/src/runtime/derivedModes/rule.ts +66 -145
- package/src/runtime/derivedUniforms/dispatch.ts +48 -21
- package/src/runtime/derivedUniforms/marker.ts +210 -16
- package/src/runtime/derivedUniforms/sceneIntegration.ts +67 -20
- package/src/runtime/heapAdapter.ts +17 -0
- package/src/runtime/heapEligibility.ts +22 -1
- package/src/runtime/heapScene/chunkedArena.ts +238 -0
- package/src/runtime/heapScene/freelist.ts +196 -0
- package/src/runtime/heapScene/growBuffer.ts +39 -2
- package/src/runtime/heapScene/pools.ts +350 -143
- package/src/runtime/heapScene.ts +1350 -88
- package/src/runtime/hybridScene.ts +31 -0
- package/src/runtime/index.ts +12 -9
- package/src/runtime/renderTask.ts +6 -0
- package/src/runtime/runtime.ts +7 -0
- package/src/runtime/textureAtlas/atlasPool.ts +19 -0
- package/src/runtime/derivedModes/gpuDispatcher.ts +0 -226
- package/src/runtime/derivedModes/gpuKernel.ts +0 -98
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
// Codegen the partition kernel from a derived-mode rule's shader IR.
|
|
2
|
+
//
|
|
3
|
+
// Input: one or more `RuleSpec` entries (axis + rule body Stmt +
|
|
4
|
+
// `declared` substitution value + intrinsic eval table + the
|
|
5
|
+
// resolved output set under that declared). Output: a WGSL kernel
|
|
6
|
+
// string with `clear` + `partitionRecords` entry points.
|
|
7
|
+
//
|
|
8
|
+
// The body of each axis-rule's evaluator function is emitted by
|
|
9
|
+
// walking the shader IR's Stmt/Expr tree directly (no shader
|
|
10
|
+
// `compileModule` call — we want a tight self-contained kernel,
|
|
11
|
+
// not a full pipeline). `declared` reads collapse to a Const at
|
|
12
|
+
// codegen time (one kernel per declared value, cached by
|
|
13
|
+
// `(axis, declaredU32, ruleHash)` upstream).
|
|
14
|
+
//
|
|
15
|
+
// Resolved-set → slot index: the rule body returns an axis-enum u32
|
|
16
|
+
// (e.g. CullMode 0/1/2). The bucket's slot ordering follows the
|
|
17
|
+
// resolved set sorted ascending. We emit a small inline lookup
|
|
18
|
+
// (`SLOT_LOOKUP_<axis>: array<u32, MAX_ENUM>`) so the kernel can
|
|
19
|
+
// translate "rule output 1" → "slot 0", "rule output 2" → "slot 1",
|
|
20
|
+
// etc. in O(1).
|
|
21
|
+
import { stableStringify } from "@aardworx/wombat.shader/ir";
|
|
22
|
+
/** Emit the WGSL partition kernel for the given rules + combos.
|
|
23
|
+
* Per-record dispatch:
|
|
24
|
+
* `switch (r.comboId) { case 0u: { return combo_0(r); } … }`
|
|
25
|
+
* Each `combo_<id>(r)` computes per-axis indices (calling
|
|
26
|
+
* `rule_<axis>_<axisRuleId>(r)` for axes the combo has a rule on,
|
|
27
|
+
* or using a const for the others) and composes them into a
|
|
28
|
+
* global slot index via mixed-radix encoding over `axes`. */
|
|
29
|
+
export function emitPartitionKernel(spec) {
|
|
30
|
+
if (spec.combos.length === 0) {
|
|
31
|
+
throw new Error("kernelCodegen: at least one combo is required");
|
|
32
|
+
}
|
|
33
|
+
if (spec.totalSlots > 16) {
|
|
34
|
+
throw new Error(`kernelCodegen: totalSlots ${spec.totalSlots} exceeds the v1 limit of 16`);
|
|
35
|
+
}
|
|
36
|
+
const N = spec.totalSlots;
|
|
37
|
+
// Bucket-wide uniform name → index (== refK position in the record
|
|
38
|
+
// tail). Rule bodies emit `r.ref<i>` for each `ReadInput("Uniform",
|
|
39
|
+
// name)`. Names not present in `uniformOrder` are a codegen bug —
|
|
40
|
+
// heapScene must have appended every distinct uniform read.
|
|
41
|
+
const uniformIdx = new Map();
|
|
42
|
+
for (let i = 0; i < spec.uniformOrder.length; i++)
|
|
43
|
+
uniformIdx.set(spec.uniformOrder[i], i);
|
|
44
|
+
// Emit one `rule_<axis>_<axisRuleId>(r) -> u32` per axis-rule.
|
|
45
|
+
// Helpers are deduped by string equality so two rules sharing the
|
|
46
|
+
// same WGSL helper don't double-emit (rule_<axis>_X and
|
|
47
|
+
// rule_<axis>_Y can both use a user-defined `flipCull` etc. that
|
|
48
|
+
// the shader frontend lifted into module scope).
|
|
49
|
+
const helperSet = new Set();
|
|
50
|
+
const ruleFns = [];
|
|
51
|
+
for (const r of spec.rules) {
|
|
52
|
+
if (r.helpersWGSL.trim().length > 0)
|
|
53
|
+
helperSet.add(r.helpersWGSL);
|
|
54
|
+
ruleFns.push(emitStmtAsWgslFn(r, uniformIdx));
|
|
55
|
+
}
|
|
56
|
+
const helpersWGSL = [...helperSet].join("\n");
|
|
57
|
+
const ruleFnsWGSL = ruleFns.join("\n");
|
|
58
|
+
// Emit one combo fn per combo: per-axis index via rule call or
|
|
59
|
+
// const, then mixed-radix encode into the global slot index.
|
|
60
|
+
const comboFns = [];
|
|
61
|
+
const dispatchCases = [];
|
|
62
|
+
for (const c of spec.combos) {
|
|
63
|
+
comboFns.push(emitComboFn(c));
|
|
64
|
+
dispatchCases.push(` case ${c.comboId}u: { return combo_${c.comboId}(r); }`);
|
|
65
|
+
}
|
|
66
|
+
const comboFnsWGSL = comboFns.join("\n");
|
|
67
|
+
const dispatcherWGSL = `
|
|
68
|
+
fn dispatch(r: Record) -> u32 {
|
|
69
|
+
switch (r.comboId) {
|
|
70
|
+
${dispatchCases.join("\n")}
|
|
71
|
+
default: { return ${N}u; }
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
`;
|
|
75
|
+
const slotCases = new Array(N).fill(0).map((_, slotIdx) => ` case ${slotIdx}u: { let off = atomicAdd(&slot${slotIdx}Count[0], 1u); let base = off * SCAN_REC_U32;` +
|
|
76
|
+
` slot${slotIdx}DrawTable[base + 0u] = 0u;` +
|
|
77
|
+
` slot${slotIdx}DrawTable[base + 1u] = r.drawIdx;` +
|
|
78
|
+
` slot${slotIdx}DrawTable[base + 2u] = r.indexStart;` +
|
|
79
|
+
` slot${slotIdx}DrawTable[base + 3u] = r.indexCount;` +
|
|
80
|
+
` slot${slotIdx}DrawTable[base + 4u] = r.instanceCount; }`).join("\n");
|
|
81
|
+
const slotCountClears = new Array(N).fill(0).map((_, i) => ` atomicStore(&slot${i}Count[0], 0u);`).join("\n");
|
|
82
|
+
let nextBinding = 3;
|
|
83
|
+
const countBindings = new Array(N).fill(0).map((_, i) => `@group(0) @binding(${nextBinding + i}) var<storage, read_write> slot${i}Count: array<atomic<u32>>;`).join("\n");
|
|
84
|
+
nextBinding += N;
|
|
85
|
+
const drawBindings = new Array(N).fill(0).map((_, i) => `@group(0) @binding(${nextBinding + i}) var<storage, read_write> slot${i}DrawTable: array<u32>;`).join("\n");
|
|
86
|
+
const refFields = spec.uniformOrder.map((_, i) => ` ref${i}: u32,`).join("\n");
|
|
87
|
+
return `
|
|
88
|
+
struct Record {
|
|
89
|
+
firstEmit: u32,
|
|
90
|
+
drawIdx: u32,
|
|
91
|
+
indexStart: u32,
|
|
92
|
+
indexCount: u32,
|
|
93
|
+
instanceCount: u32,
|
|
94
|
+
comboId: u32,
|
|
95
|
+
${refFields}
|
|
96
|
+
};
|
|
97
|
+
struct PartitionParams { numRecords: u32 };
|
|
98
|
+
|
|
99
|
+
@group(0) @binding(0) var<storage, read> arena: array<u32>;
|
|
100
|
+
@group(0) @binding(1) var<storage, read> masterRecords: array<Record>;
|
|
101
|
+
@group(0) @binding(2) var<uniform> params: PartitionParams;
|
|
102
|
+
${countBindings}
|
|
103
|
+
${drawBindings}
|
|
104
|
+
|
|
105
|
+
const SCAN_REC_U32: u32 = 5u;
|
|
106
|
+
|
|
107
|
+
${LOADERS}
|
|
108
|
+
|
|
109
|
+
${helpersWGSL}
|
|
110
|
+
|
|
111
|
+
${ruleFnsWGSL}
|
|
112
|
+
|
|
113
|
+
${comboFnsWGSL}
|
|
114
|
+
|
|
115
|
+
${dispatcherWGSL}
|
|
116
|
+
|
|
117
|
+
@compute @workgroup_size(64)
|
|
118
|
+
fn clear(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
119
|
+
if (gid.x != 0u) { return; }
|
|
120
|
+
${slotCountClears}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@compute @workgroup_size(64)
|
|
124
|
+
fn partitionRecords(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
125
|
+
let i = gid.x;
|
|
126
|
+
if (i >= params.numRecords) { return; }
|
|
127
|
+
let r = masterRecords[i];
|
|
128
|
+
let slotIdx = dispatch(r);
|
|
129
|
+
if (slotIdx >= ${N}u) { return; }
|
|
130
|
+
switch (slotIdx) {
|
|
131
|
+
${slotCases}
|
|
132
|
+
default: { }
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
`;
|
|
136
|
+
}
|
|
137
|
+
/** Emit one combo fn: per-axis index via rule call or const, then
|
|
138
|
+
* mixed-radix encode into a global slot index. Strides are
|
|
139
|
+
* precomputed (product of cardinalities of axes *after* the
|
|
140
|
+
* current one in `axes`). */
|
|
141
|
+
function emitComboFn(c) {
|
|
142
|
+
if (c.axes.length === 0) {
|
|
143
|
+
// Trivial combo (no active axes): always slot 0.
|
|
144
|
+
return `fn combo_${c.comboId}(r: Record) -> u32 {\n return 0u;\n}\n`;
|
|
145
|
+
}
|
|
146
|
+
// Mixed-radix strides: stride[i] = ∏_{j>i} cardinality[j].
|
|
147
|
+
const strides = new Array(c.axes.length).fill(1);
|
|
148
|
+
for (let i = c.axes.length - 2; i >= 0; i--) {
|
|
149
|
+
strides[i] = strides[i + 1] * c.axes[i + 1].cardinality;
|
|
150
|
+
}
|
|
151
|
+
const idxLines = [];
|
|
152
|
+
const sumTerms = [];
|
|
153
|
+
for (let i = 0; i < c.axes.length; i++) {
|
|
154
|
+
const a = c.axes[i];
|
|
155
|
+
const varName = `i_${a.axis}`;
|
|
156
|
+
if (a.source.kind === "rule") {
|
|
157
|
+
idxLines.push(` let ${varName} = rule_${a.axis}_${a.source.axisRuleId}(r);`);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
idxLines.push(` let ${varName} = ${a.source.idx >>> 0}u;`);
|
|
161
|
+
}
|
|
162
|
+
sumTerms.push(strides[i] === 1 ? `${varName}` : `${varName} * ${strides[i]}u`);
|
|
163
|
+
}
|
|
164
|
+
return `fn combo_${c.comboId}(r: Record) -> u32 {\n${idxLines.join("\n")}\n return ${sumTerms.join(" + ")};\n}\n`;
|
|
165
|
+
}
|
|
166
|
+
// Arena-uniform load helpers. Every entry has a 16-byte header
|
|
167
|
+
// `(typeId u32, length u32, pad u32, pad u32)`; the value's
|
|
168
|
+
// tightly-packed bytes follow. Scalars start at +16, vec/mat at
|
|
169
|
+
// +16 contiguous in WGSL row-vector × column-major layout matching
|
|
170
|
+
// the corresponding packer in `heapScene/packers.ts`.
|
|
171
|
+
const LOADERS = `
|
|
172
|
+
fn load_f32(r: u32) -> f32 { return bitcast<f32>(arena[(r + 16u) >> 2u]); }
|
|
173
|
+
fn load_u32(r: u32) -> u32 { return arena[(r + 16u) >> 2u]; }
|
|
174
|
+
fn load_i32(r: u32) -> i32 { return bitcast<i32>(arena[(r + 16u) >> 2u]); }
|
|
175
|
+
fn load_vec2f(r: u32) -> vec2<f32> { let i = (r + 16u) >> 2u; return vec2<f32>(bitcast<f32>(arena[i]), bitcast<f32>(arena[i + 1u])); }
|
|
176
|
+
fn load_vec3f(r: u32) -> vec3<f32> { let i = (r + 16u) >> 2u; return vec3<f32>(bitcast<f32>(arena[i]), bitcast<f32>(arena[i + 1u]), bitcast<f32>(arena[i + 2u])); }
|
|
177
|
+
fn load_vec4f(r: u32) -> vec4<f32> { let i = (r + 16u) >> 2u; return vec4<f32>(bitcast<f32>(arena[i]), bitcast<f32>(arena[i + 1u]), bitcast<f32>(arena[i + 2u]), bitcast<f32>(arena[i + 3u])); }
|
|
178
|
+
fn load_vec2u(r: u32) -> vec2<u32> { let i = (r + 16u) >> 2u; return vec2<u32>(arena[i], arena[i + 1u]); }
|
|
179
|
+
fn load_vec3u(r: u32) -> vec3<u32> { let i = (r + 16u) >> 2u; return vec3<u32>(arena[i], arena[i + 1u], arena[i + 2u]); }
|
|
180
|
+
fn load_vec4u(r: u32) -> vec4<u32> { let i = (r + 16u) >> 2u; return vec4<u32>(arena[i], arena[i + 1u], arena[i + 2u], arena[i + 3u]); }
|
|
181
|
+
fn load_vec2i(r: u32) -> vec2<i32> { let i = (r + 16u) >> 2u; return vec2<i32>(bitcast<i32>(arena[i]), bitcast<i32>(arena[i + 1u])); }
|
|
182
|
+
fn load_vec3i(r: u32) -> vec3<i32> { let i = (r + 16u) >> 2u; return vec3<i32>(bitcast<i32>(arena[i]), bitcast<i32>(arena[i + 1u]), bitcast<i32>(arena[i + 2u])); }
|
|
183
|
+
fn load_vec4i(r: u32) -> vec4<i32> { let i = (r + 16u) >> 2u; return vec4<i32>(bitcast<i32>(arena[i]), bitcast<i32>(arena[i + 1u]), bitcast<i32>(arena[i + 2u]), bitcast<i32>(arena[i + 3u])); }
|
|
184
|
+
fn load_mat3_upper(r: u32) -> mat3x3<f32> {
|
|
185
|
+
let b = (r + 16u) >> 2u;
|
|
186
|
+
return mat3x3<f32>(
|
|
187
|
+
vec3<f32>(bitcast<f32>(arena[b + 0u]), bitcast<f32>(arena[b + 4u]), bitcast<f32>(arena[b + 8u])),
|
|
188
|
+
vec3<f32>(bitcast<f32>(arena[b + 1u]), bitcast<f32>(arena[b + 5u]), bitcast<f32>(arena[b + 9u])),
|
|
189
|
+
vec3<f32>(bitcast<f32>(arena[b + 2u]), bitcast<f32>(arena[b + 6u]), bitcast<f32>(arena[b + 10u])),
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
fn load_mat4(r: u32) -> mat4x4<f32> {
|
|
193
|
+
let b = (r + 16u) >> 2u;
|
|
194
|
+
return mat4x4<f32>(
|
|
195
|
+
vec4<f32>(bitcast<f32>(arena[b + 0u]), bitcast<f32>(arena[b + 4u]), bitcast<f32>(arena[b + 8u]), bitcast<f32>(arena[b + 12u])),
|
|
196
|
+
vec4<f32>(bitcast<f32>(arena[b + 1u]), bitcast<f32>(arena[b + 5u]), bitcast<f32>(arena[b + 9u]), bitcast<f32>(arena[b + 13u])),
|
|
197
|
+
vec4<f32>(bitcast<f32>(arena[b + 2u]), bitcast<f32>(arena[b + 6u]), bitcast<f32>(arena[b + 10u]), bitcast<f32>(arena[b + 14u])),
|
|
198
|
+
vec4<f32>(bitcast<f32>(arena[b + 3u]), bitcast<f32>(arena[b + 7u]), bitcast<f32>(arena[b + 11u]), bitcast<f32>(arena[b + 15u])),
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
`;
|
|
202
|
+
// ─── Stmt + Expr → WGSL emitter (covers the shader-IR subset rule
|
|
203
|
+
// bodies can express: ReturnValue / If / Sequential / Declare /
|
|
204
|
+
// Write / Expression / For / While, plus the full Expr lattice). ──
|
|
205
|
+
function emitStmtAsWgslFn(rule, uniformIdx) {
|
|
206
|
+
const ctx = {
|
|
207
|
+
axis: rule.axis,
|
|
208
|
+
inputUniforms: rule.inputUniforms,
|
|
209
|
+
uniformIdx,
|
|
210
|
+
localCounter: 0,
|
|
211
|
+
};
|
|
212
|
+
const bodyWgsl = emitStmt(rule.body, ctx, " ");
|
|
213
|
+
return `fn rule_${rule.axis}_${rule.axisRuleId}(r: Record) -> u32 {\n${bodyWgsl}\n return 0u;\n}\n`;
|
|
214
|
+
}
|
|
215
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
216
|
+
// IR rewrite helpers (heap scene calls these before emitPartitionKernel)
|
|
217
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
218
|
+
/**
|
|
219
|
+
* Replace every `ReadInput("<scope>", "<name>")` leaf in `e` with
|
|
220
|
+
* the supplied `replacement` Expr. Used to bake the rule's
|
|
221
|
+
* `declared` ReadInput as a `Const u32` of the current declared
|
|
222
|
+
* value before codegen — the resulting body has no `declared`
|
|
223
|
+
* references, so the kernel doesn't need a per-dispatch uniform.
|
|
224
|
+
*/
|
|
225
|
+
export function substituteReadInput(e, scope, name, replacement) {
|
|
226
|
+
return mapExpr(e, (n) => {
|
|
227
|
+
const r = n;
|
|
228
|
+
if (r.kind === "ReadInput" && r.scope === scope && r.name === name) {
|
|
229
|
+
return replacement;
|
|
230
|
+
}
|
|
231
|
+
return n;
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
export function substituteReadInputInStmt(s, scope, name, replacement) {
|
|
235
|
+
return mapStmtExprs(s, (e) => substituteReadInput(e, scope, name, replacement));
|
|
236
|
+
}
|
|
237
|
+
/** Walk `s` and collect the names of every `ReadInput("Uniform", name)`
|
|
238
|
+
* it contains (in DFS order, deduped). heapScene uses this to size
|
|
239
|
+
* the bucket's `uniformOrder` + master-record uniform-ref tail. */
|
|
240
|
+
export function collectUniformReadsInStmt(s) {
|
|
241
|
+
const seen = new Set();
|
|
242
|
+
const out = [];
|
|
243
|
+
walkExprs(s, (e) => {
|
|
244
|
+
const r = e;
|
|
245
|
+
if (r.kind === "ReadInput" && r.scope === "Uniform" && typeof r.name === "string") {
|
|
246
|
+
if (!seen.has(r.name)) {
|
|
247
|
+
seen.add(r.name);
|
|
248
|
+
out.push(r.name);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
return out;
|
|
253
|
+
}
|
|
254
|
+
function walkExprs(s, fn) {
|
|
255
|
+
const obj = s;
|
|
256
|
+
for (const k of Object.keys(obj)) {
|
|
257
|
+
const v = obj[k];
|
|
258
|
+
if (v !== null && typeof v === "object") {
|
|
259
|
+
if ("kind" in v && !Array.isArray(v)) {
|
|
260
|
+
const kind = v.kind;
|
|
261
|
+
const isStmt = /^(Nop|Expression|Declare|Write|Sequential|Isolated|Return|ReturnValue|Break|Continue|If|For|While|DoWhile|Loop|Switch|Discard|Barrier|WriteOutput|Increment|Decrement)$/.test(kind);
|
|
262
|
+
if (isStmt)
|
|
263
|
+
walkExprs(v, fn);
|
|
264
|
+
else
|
|
265
|
+
walkExprInner(v, fn);
|
|
266
|
+
}
|
|
267
|
+
else if (Array.isArray(v)) {
|
|
268
|
+
for (const c of v) {
|
|
269
|
+
if (c !== null && typeof c === "object" && "kind" in c) {
|
|
270
|
+
const kind = c.kind;
|
|
271
|
+
const isStmt = /^(Nop|Expression|Declare|Write|Sequential|Isolated|Return|ReturnValue|Break|Continue|If|For|While|DoWhile|Loop|Switch|Discard|Barrier|WriteOutput|Increment|Decrement)$/.test(kind);
|
|
272
|
+
if (isStmt)
|
|
273
|
+
walkExprs(c, fn);
|
|
274
|
+
else
|
|
275
|
+
walkExprInner(c, fn);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
function walkExprInner(e, fn) {
|
|
283
|
+
fn(e);
|
|
284
|
+
const obj = e;
|
|
285
|
+
for (const k of Object.keys(obj)) {
|
|
286
|
+
const v = obj[k];
|
|
287
|
+
if (v !== null && typeof v === "object") {
|
|
288
|
+
if ("kind" in v && !Array.isArray(v))
|
|
289
|
+
walkExprInner(v, fn);
|
|
290
|
+
else if (Array.isArray(v)) {
|
|
291
|
+
for (const c of v)
|
|
292
|
+
if (c !== null && typeof c === "object" && "kind" in c)
|
|
293
|
+
walkExprInner(c, fn);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Rewrite the body so every `ReturnValue` returns a `Const u32` slot
|
|
300
|
+
* index (resolved by `exprToSlot`). `Conditional` expressions are
|
|
301
|
+
* recursed into — each branch is rewritten independently. Other
|
|
302
|
+
* non-Conditional return expressions are matched as a whole against
|
|
303
|
+
* `exprToSlot` (using stableStringify-content equality upstream).
|
|
304
|
+
*
|
|
305
|
+
* After this pass the kernel emits a u32 directly from
|
|
306
|
+
* `rule_<axis>(r)`; the partition entry switches on it as a slot
|
|
307
|
+
* index, no SLOT_LOOKUP table needed.
|
|
308
|
+
*/
|
|
309
|
+
export function rewriteOutputsToSlotIndices(body, exprToSlot) {
|
|
310
|
+
const Tu32 = { kind: "Int", signed: false, width: 32 };
|
|
311
|
+
const constU32 = (v) => ({ kind: "Const", type: Tu32, value: { kind: "Int", value: v >>> 0, signed: false } });
|
|
312
|
+
const rewriteOutput = (e) => {
|
|
313
|
+
const k = e.kind;
|
|
314
|
+
// Try the whole expression first — `exprToSlot` deals in
|
|
315
|
+
// stableStringify-content matches, so a leaf Expr that
|
|
316
|
+
// appeared in the symbolic output set gets replaced as a
|
|
317
|
+
// unit.
|
|
318
|
+
const direct = exprToSlot(e);
|
|
319
|
+
if (direct !== undefined)
|
|
320
|
+
return constU32(direct);
|
|
321
|
+
// Conditional: rewrite each branch independently. The
|
|
322
|
+
// condition stays as-is (it's a per-record routing predicate).
|
|
323
|
+
if (k === "Conditional") {
|
|
324
|
+
const c = e;
|
|
325
|
+
return {
|
|
326
|
+
kind: "Conditional",
|
|
327
|
+
cond: c.cond,
|
|
328
|
+
ifTrue: rewriteOutput(c.ifTrue),
|
|
329
|
+
ifFalse: rewriteOutput(c.ifFalse),
|
|
330
|
+
type: Tu32,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
return e;
|
|
334
|
+
};
|
|
335
|
+
const rewriteStmt = (s) => {
|
|
336
|
+
const k = s.kind;
|
|
337
|
+
if (k === "ReturnValue") {
|
|
338
|
+
const r = s;
|
|
339
|
+
return { kind: "ReturnValue", value: rewriteOutput(r.value) };
|
|
340
|
+
}
|
|
341
|
+
// Recurse into structured statements.
|
|
342
|
+
if (k === "Sequential" || k === "Isolated") {
|
|
343
|
+
const b = s.body;
|
|
344
|
+
return { kind: k, body: b.map(rewriteStmt) };
|
|
345
|
+
}
|
|
346
|
+
if (k === "If") {
|
|
347
|
+
const i = s;
|
|
348
|
+
return {
|
|
349
|
+
kind: "If",
|
|
350
|
+
cond: i.cond,
|
|
351
|
+
then: rewriteStmt(i.then),
|
|
352
|
+
...(i.else !== undefined ? { else: rewriteStmt(i.else) } : {}),
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
if (k === "For" || k === "While" || k === "DoWhile" || k === "Loop") {
|
|
356
|
+
const w = s;
|
|
357
|
+
return { ...s, body: rewriteStmt(w.body) };
|
|
358
|
+
}
|
|
359
|
+
return s;
|
|
360
|
+
};
|
|
361
|
+
return rewriteStmt(body);
|
|
362
|
+
}
|
|
363
|
+
// Generic Expr/Stmt mapper used by the substitution helpers above.
|
|
364
|
+
function mapExpr(e, fn) {
|
|
365
|
+
const mapped = fn(e);
|
|
366
|
+
if (mapped !== e)
|
|
367
|
+
return mapped;
|
|
368
|
+
const obj = e;
|
|
369
|
+
let changed = false;
|
|
370
|
+
const out = { ...obj };
|
|
371
|
+
for (const k of Object.keys(out)) {
|
|
372
|
+
const v = out[k];
|
|
373
|
+
if (v !== null && typeof v === "object") {
|
|
374
|
+
if ("kind" in v && !Array.isArray(v)) {
|
|
375
|
+
const sub = mapExpr(v, fn);
|
|
376
|
+
if (sub !== v) {
|
|
377
|
+
out[k] = sub;
|
|
378
|
+
changed = true;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
else if (Array.isArray(v)) {
|
|
382
|
+
let ac = false;
|
|
383
|
+
const m = v.map((c) => {
|
|
384
|
+
if (c !== null && typeof c === "object" && "kind" in c) {
|
|
385
|
+
const sub = mapExpr(c, fn);
|
|
386
|
+
if (sub !== c)
|
|
387
|
+
ac = true;
|
|
388
|
+
return sub;
|
|
389
|
+
}
|
|
390
|
+
return c;
|
|
391
|
+
});
|
|
392
|
+
if (ac) {
|
|
393
|
+
out[k] = m;
|
|
394
|
+
changed = true;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return changed ? out : e;
|
|
400
|
+
}
|
|
401
|
+
function mapStmtExprs(s, fn) {
|
|
402
|
+
const obj = s;
|
|
403
|
+
let changed = false;
|
|
404
|
+
const out = { ...obj };
|
|
405
|
+
for (const k of Object.keys(out)) {
|
|
406
|
+
const v = out[k];
|
|
407
|
+
if (v !== null && typeof v === "object") {
|
|
408
|
+
if ("kind" in v && !Array.isArray(v)) {
|
|
409
|
+
const isStmt = /^(Nop|Expression|Declare|Write|Sequential|Isolated|Return|ReturnValue|Break|Continue|If|For|While|DoWhile|Loop|Switch|Discard|Barrier|WriteOutput|Increment|Decrement)$/.test(v.kind);
|
|
410
|
+
const sub = isStmt ? mapStmtExprs(v, fn) : mapExpr(v, fn);
|
|
411
|
+
if (sub !== v) {
|
|
412
|
+
out[k] = sub;
|
|
413
|
+
changed = true;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
else if (Array.isArray(v)) {
|
|
417
|
+
let ac = false;
|
|
418
|
+
const m = v.map((c) => {
|
|
419
|
+
if (c !== null && typeof c === "object" && "kind" in c) {
|
|
420
|
+
const kind = c.kind;
|
|
421
|
+
const isStmt = /^(Nop|Expression|Declare|Write|Sequential|Isolated|Return|ReturnValue|Break|Continue|If|For|While|DoWhile|Loop|Switch|Discard|Barrier|WriteOutput|Increment|Decrement)$/.test(kind);
|
|
422
|
+
const sub = isStmt ? mapStmtExprs(c, fn) : mapExpr(c, fn);
|
|
423
|
+
if (sub !== c)
|
|
424
|
+
ac = true;
|
|
425
|
+
return sub;
|
|
426
|
+
}
|
|
427
|
+
return c;
|
|
428
|
+
});
|
|
429
|
+
if (ac) {
|
|
430
|
+
out[k] = m;
|
|
431
|
+
changed = true;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return changed ? out : s;
|
|
437
|
+
}
|
|
438
|
+
function emitStmt(s, ctx, indent) {
|
|
439
|
+
const k = s.kind;
|
|
440
|
+
switch (k) {
|
|
441
|
+
case "ReturnValue": {
|
|
442
|
+
const v = s.value;
|
|
443
|
+
return `${indent}return ${emitExpr(v, ctx)};`;
|
|
444
|
+
}
|
|
445
|
+
case "Return":
|
|
446
|
+
return `${indent}return 0u;`;
|
|
447
|
+
case "Sequential":
|
|
448
|
+
case "Isolated": {
|
|
449
|
+
const body = s.body;
|
|
450
|
+
return body.map(c => emitStmt(c, ctx, indent)).join("\n");
|
|
451
|
+
}
|
|
452
|
+
case "Declare": {
|
|
453
|
+
const d = s;
|
|
454
|
+
const kw = d.var.mutable ? "var" : "let";
|
|
455
|
+
const ty = wgslTypeName(d.var.type);
|
|
456
|
+
if (d.init === undefined)
|
|
457
|
+
return `${indent}${kw} ${d.var.name}: ${ty};`;
|
|
458
|
+
return `${indent}${kw} ${d.var.name}: ${ty} = ${emitExpr(d.init, ctx)};`;
|
|
459
|
+
}
|
|
460
|
+
case "Write": {
|
|
461
|
+
const w = s;
|
|
462
|
+
return `${indent}${emitExpr(w.target, ctx)} = ${emitExpr(w.value, ctx)};`;
|
|
463
|
+
}
|
|
464
|
+
case "Expression": {
|
|
465
|
+
const e = s;
|
|
466
|
+
return `${indent}${emitExpr(e.value, ctx)};`;
|
|
467
|
+
}
|
|
468
|
+
case "If": {
|
|
469
|
+
const i = s;
|
|
470
|
+
const thenWgsl = emitStmt(i.then, ctx, indent + " ");
|
|
471
|
+
const elseWgsl = i.else !== undefined ? emitStmt(i.else, ctx, indent + " ") : undefined;
|
|
472
|
+
return elseWgsl !== undefined
|
|
473
|
+
? `${indent}if (${emitExpr(i.cond, ctx)}) {\n${thenWgsl}\n${indent}} else {\n${elseWgsl}\n${indent}}`
|
|
474
|
+
: `${indent}if (${emitExpr(i.cond, ctx)}) {\n${thenWgsl}\n${indent}}`;
|
|
475
|
+
}
|
|
476
|
+
case "For": {
|
|
477
|
+
const f = s;
|
|
478
|
+
const init = emitStmt(f.init, ctx, "").trim().replace(/;$/, "");
|
|
479
|
+
const cond = emitExpr(f.cond, ctx);
|
|
480
|
+
const step = emitStmt(f.step, ctx, "").trim().replace(/;$/, "");
|
|
481
|
+
const body = emitStmt(f.body, ctx, indent + " ");
|
|
482
|
+
return `${indent}for (${init}; ${cond}; ${step}) {\n${body}\n${indent}}`;
|
|
483
|
+
}
|
|
484
|
+
case "While": {
|
|
485
|
+
const w = s;
|
|
486
|
+
return `${indent}while (${emitExpr(w.cond, ctx)}) {\n${emitStmt(w.body, ctx, indent + " ")}\n${indent}}`;
|
|
487
|
+
}
|
|
488
|
+
case "Break": return `${indent}break;`;
|
|
489
|
+
case "Continue": return `${indent}continue;`;
|
|
490
|
+
case "Nop": return "";
|
|
491
|
+
default:
|
|
492
|
+
throw new Error(`kernelCodegen: unsupported Stmt kind '${k}' in rule body`);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
function emitExpr(e, ctx) {
|
|
496
|
+
const k = e.kind;
|
|
497
|
+
switch (k) {
|
|
498
|
+
case "Expr": return emitExpr(e.value, ctx); // RExpr wrapper from Declare/Write
|
|
499
|
+
case "Const": return wgslLiteral(e.value);
|
|
500
|
+
case "Var": return e.var.name;
|
|
501
|
+
case "ReadInput": {
|
|
502
|
+
const r = e;
|
|
503
|
+
// `declared` is pre-substituted by heapScene before codegen,
|
|
504
|
+
// so any surviving ReadInput at this point is a `u.<X>` read
|
|
505
|
+
// from arena via this record's per-uniform ref tail slot.
|
|
506
|
+
const idx = ctx.uniformIdx.get(r.name);
|
|
507
|
+
if (idx === undefined) {
|
|
508
|
+
throw new Error(`kernelCodegen: rule body reads uniform '${r.name}' but it isn't in the bucket's uniformOrder ` +
|
|
509
|
+
`(heapScene must collect every ReadInput before codegen)`);
|
|
510
|
+
}
|
|
511
|
+
const refExpr = `r.ref${idx}`;
|
|
512
|
+
const t = r.type;
|
|
513
|
+
if (t.kind === "Float")
|
|
514
|
+
return `load_f32(${refExpr})`;
|
|
515
|
+
if (t.kind === "Int")
|
|
516
|
+
return t.signed ? `load_i32(${refExpr})` : `load_u32(${refExpr})`;
|
|
517
|
+
if (t.kind === "Vector") {
|
|
518
|
+
const dim = t.dim;
|
|
519
|
+
if (dim < 2 || dim > 4)
|
|
520
|
+
throw new Error(`kernelCodegen: unsupported vector dim ${dim} for uniform '${r.name}'`);
|
|
521
|
+
const elt = t.element;
|
|
522
|
+
if (elt.kind === "Float")
|
|
523
|
+
return `load_vec${dim}f(${refExpr})`;
|
|
524
|
+
if (elt.kind === "Int")
|
|
525
|
+
return elt.signed ? `load_vec${dim}i(${refExpr})` : `load_vec${dim}u(${refExpr})`;
|
|
526
|
+
throw new Error(`kernelCodegen: unsupported vector element type ${elt.kind} for uniform '${r.name}'`);
|
|
527
|
+
}
|
|
528
|
+
if (t.kind === "Matrix") {
|
|
529
|
+
if (t.rows === 3 && t.cols === 3)
|
|
530
|
+
return `load_mat3_upper(${refExpr})`;
|
|
531
|
+
if (t.rows === 4 && t.cols === 4)
|
|
532
|
+
return `load_mat4(${refExpr})`;
|
|
533
|
+
throw new Error(`kernelCodegen: matrix ${t.cols}x${t.rows} not yet supported for uniform '${r.name}'`);
|
|
534
|
+
}
|
|
535
|
+
throw new Error(`kernelCodegen: rule body reads uniform '${r.name}' of unsupported arena type ${JSON.stringify(r.type)}`);
|
|
536
|
+
}
|
|
537
|
+
case "Neg": return `(-${emitExpr(e.value, ctx)})`;
|
|
538
|
+
case "Not": return `(!${emitExpr(e.value, ctx)})`;
|
|
539
|
+
case "Add":
|
|
540
|
+
case "Sub":
|
|
541
|
+
case "Mul":
|
|
542
|
+
case "Div":
|
|
543
|
+
case "Mod":
|
|
544
|
+
case "MulMatMat":
|
|
545
|
+
case "MulMatVec":
|
|
546
|
+
case "MulVecMat":
|
|
547
|
+
case "And":
|
|
548
|
+
case "Or":
|
|
549
|
+
case "BitAnd":
|
|
550
|
+
case "BitOr":
|
|
551
|
+
case "BitXor":
|
|
552
|
+
case "Eq":
|
|
553
|
+
case "Neq":
|
|
554
|
+
case "Lt":
|
|
555
|
+
case "Le":
|
|
556
|
+
case "Gt":
|
|
557
|
+
case "Ge": {
|
|
558
|
+
const b = e;
|
|
559
|
+
return `(${emitExpr(b.lhs, ctx)} ${BIN[k]} ${emitExpr(b.rhs, ctx)})`;
|
|
560
|
+
}
|
|
561
|
+
case "Transpose": return `transpose(${emitExpr(e.value, ctx)})`;
|
|
562
|
+
case "Determinant": return `determinant(${emitExpr(e.value, ctx)})`;
|
|
563
|
+
case "Conditional": {
|
|
564
|
+
const c = e;
|
|
565
|
+
return `select(${emitExpr(c.ifFalse, ctx)}, ${emitExpr(c.ifTrue, ctx)}, ${emitExpr(c.cond, ctx)})`;
|
|
566
|
+
}
|
|
567
|
+
case "Convert":
|
|
568
|
+
case "ConvertMatrix":
|
|
569
|
+
return `${wgslTypeName(e.type)}(${emitExpr(e.value, ctx)})`;
|
|
570
|
+
case "CallIntrinsic": {
|
|
571
|
+
const ci = e;
|
|
572
|
+
const fnName = ci.op.emit.wgsl ?? ci.op.name;
|
|
573
|
+
return `${fnName}(${ci.args.map(a => emitExpr(a, ctx)).join(", ")})`;
|
|
574
|
+
}
|
|
575
|
+
case "VecSwizzle": {
|
|
576
|
+
const v = e;
|
|
577
|
+
return `${emitExpr(v.value, ctx)}.${v.comps.join("")}`;
|
|
578
|
+
}
|
|
579
|
+
case "VecItem": return `${emitExpr(e.value, ctx)}[${emitExpr(e.index, ctx)}]`;
|
|
580
|
+
case "MatrixCol": return `${emitExpr(e.matrix, ctx)}[${emitExpr(e.col, ctx)}]`;
|
|
581
|
+
case "MatrixElement":
|
|
582
|
+
return `${emitExpr(e.matrix, ctx)}[${emitExpr(e.col, ctx)}][${emitExpr(e.row, ctx)}]`;
|
|
583
|
+
case "NewVector":
|
|
584
|
+
return `${wgslTypeName(e.type)}(${e.components.map(a => emitExpr(a, ctx)).join(", ")})`;
|
|
585
|
+
default:
|
|
586
|
+
throw new Error(`kernelCodegen: unsupported Expr kind '${k}'`);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
const BIN = {
|
|
590
|
+
Add: "+", Sub: "-", Mul: "*", Div: "/", Mod: "%",
|
|
591
|
+
MulMatMat: "*", MulMatVec: "*", MulVecMat: "*",
|
|
592
|
+
And: "&&", Or: "||", BitAnd: "&", BitOr: "|", BitXor: "^",
|
|
593
|
+
Eq: "==", Neq: "!=", Lt: "<", Le: "<=", Gt: ">", Ge: ">=",
|
|
594
|
+
};
|
|
595
|
+
function wgslLiteral(l) {
|
|
596
|
+
switch (l.kind) {
|
|
597
|
+
case "Bool": return l.value ? "true" : "false";
|
|
598
|
+
case "Int": return l.signed ? `${l.value}i` : `${l.value >>> 0}u`;
|
|
599
|
+
case "Float": return Number.isFinite(l.value)
|
|
600
|
+
? (Number.isInteger(l.value) ? `${l.value}.0` : `${l.value}`)
|
|
601
|
+
: "0.0";
|
|
602
|
+
case "Null": return "0";
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
function wgslScalar(t) {
|
|
606
|
+
switch (t.kind) {
|
|
607
|
+
case "Float": return "f32";
|
|
608
|
+
case "Bool": return "bool";
|
|
609
|
+
case "Int": return t.signed ? "i32" : "u32";
|
|
610
|
+
default: throw new Error("kernelCodegen: non-scalar type where scalar expected");
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
function wgslTypeName(t) {
|
|
614
|
+
switch (t.kind) {
|
|
615
|
+
case "Float": return "f32";
|
|
616
|
+
case "Bool": return "bool";
|
|
617
|
+
case "Int": return t.signed ? "i32" : "u32";
|
|
618
|
+
case "Vector": return `vec${t.dim}<${wgslScalar(t.element)}>`;
|
|
619
|
+
case "Matrix": return `mat${t.cols}x${t.rows}<${wgslScalar(t.element)}>`;
|
|
620
|
+
default: throw new Error(`kernelCodegen: unsupported type '${t.kind}'`);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
//# sourceMappingURL=kernelCodegen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernelCodegen.js","sourceRoot":"","sources":["../../../src/runtime/derivedModes/kernelCodegen.ts"],"names":[],"mappings":"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"}
|