@aardworx/wombat.rendering 0.1.0 → 0.1.1

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 (181) hide show
  1. package/dist/commands/clear.d.ts +3 -0
  2. package/dist/commands/clear.d.ts.map +1 -0
  3. package/dist/commands/clear.js +69 -0
  4. package/dist/commands/clear.js.map +1 -0
  5. package/dist/commands/index.d.ts +3 -0
  6. package/dist/commands/index.d.ts.map +1 -0
  7. package/dist/commands/index.js +5 -0
  8. package/dist/commands/index.js.map +1 -0
  9. package/dist/commands/render.d.ts +16 -0
  10. package/dist/commands/render.d.ts.map +1 -0
  11. package/dist/commands/render.js +93 -0
  12. package/dist/commands/render.js.map +1 -0
  13. package/dist/core/acquire.d.ts +3 -0
  14. package/dist/core/acquire.d.ts.map +1 -0
  15. package/dist/core/acquire.js +22 -0
  16. package/dist/core/acquire.js.map +1 -0
  17. package/dist/core/adaptiveResource.d.ts +29 -0
  18. package/dist/core/adaptiveResource.d.ts.map +1 -0
  19. package/dist/core/adaptiveResource.js +73 -0
  20. package/dist/core/adaptiveResource.js.map +1 -0
  21. package/dist/core/buffer.d.ts +20 -0
  22. package/dist/core/buffer.d.ts.map +1 -0
  23. package/dist/core/buffer.js +30 -0
  24. package/dist/core/buffer.js.map +1 -0
  25. package/dist/core/bufferView.d.ts +15 -0
  26. package/dist/core/bufferView.d.ts.map +1 -0
  27. package/dist/core/bufferView.js +12 -0
  28. package/dist/core/bufferView.js.map +1 -0
  29. package/dist/core/clear.d.ts +9 -0
  30. package/dist/core/clear.d.ts.map +1 -0
  31. package/dist/core/clear.js +7 -0
  32. package/dist/core/clear.js.map +1 -0
  33. package/dist/core/command.d.ts +45 -0
  34. package/dist/core/command.d.ts.map +1 -0
  35. package/dist/core/command.js +12 -0
  36. package/dist/core/command.js.map +1 -0
  37. package/dist/core/drawCall.d.ts +17 -0
  38. package/dist/core/drawCall.d.ts.map +1 -0
  39. package/dist/core/drawCall.js +5 -0
  40. package/dist/core/drawCall.js.map +1 -0
  41. package/dist/core/framebuffer.d.ts +32 -0
  42. package/dist/core/framebuffer.d.ts.map +1 -0
  43. package/dist/core/framebuffer.js +6 -0
  44. package/dist/core/framebuffer.js.map +1 -0
  45. package/dist/core/framebufferSignature.d.ts +12 -0
  46. package/dist/core/framebufferSignature.d.ts.map +1 -0
  47. package/dist/core/framebufferSignature.js +7 -0
  48. package/dist/core/framebufferSignature.js.map +1 -0
  49. package/dist/core/index.d.ts +20 -0
  50. package/dist/core/index.d.ts.map +1 -0
  51. package/dist/core/index.js +13 -0
  52. package/dist/core/index.js.map +1 -0
  53. package/dist/core/pipelineState.d.ts +56 -0
  54. package/dist/core/pipelineState.d.ts.map +1 -0
  55. package/dist/core/pipelineState.js +6 -0
  56. package/dist/core/pipelineState.js.map +1 -0
  57. package/dist/core/renderContext.d.ts +8 -0
  58. package/dist/core/renderContext.d.ts.map +1 -0
  59. package/dist/core/renderContext.js +39 -0
  60. package/dist/core/renderContext.js.map +1 -0
  61. package/dist/core/renderObject.d.ts +45 -0
  62. package/dist/core/renderObject.d.ts.map +1 -0
  63. package/dist/core/renderObject.js +11 -0
  64. package/dist/core/renderObject.js.map +1 -0
  65. package/dist/core/renderTask.d.ts +12 -0
  66. package/dist/core/renderTask.d.ts.map +1 -0
  67. package/dist/core/renderTask.js +5 -0
  68. package/dist/core/renderTask.js.map +1 -0
  69. package/dist/core/renderTree.d.ts +35 -0
  70. package/dist/core/renderTree.d.ts.map +1 -0
  71. package/dist/core/renderTree.js +17 -0
  72. package/dist/core/renderTree.js.map +1 -0
  73. package/dist/core/sampler.d.ts +12 -0
  74. package/dist/core/sampler.d.ts.map +1 -0
  75. package/dist/core/sampler.js +8 -0
  76. package/dist/core/sampler.js.map +1 -0
  77. package/dist/core/shader.d.ts +3 -0
  78. package/dist/core/shader.d.ts.map +1 -0
  79. package/dist/core/shader.js +6 -0
  80. package/dist/core/shader.js.map +1 -0
  81. package/dist/core/texture.d.ts +34 -0
  82. package/dist/core/texture.d.ts.map +1 -0
  83. package/dist/core/texture.js +29 -0
  84. package/dist/core/texture.js.map +1 -0
  85. package/dist/index.d.ts +6 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +18 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/resources/adaptiveBuffer.d.ts +22 -0
  90. package/dist/resources/adaptiveBuffer.d.ts.map +1 -0
  91. package/dist/resources/adaptiveBuffer.js +99 -0
  92. package/dist/resources/adaptiveBuffer.js.map +1 -0
  93. package/dist/resources/adaptiveSampler.d.ts +4 -0
  94. package/dist/resources/adaptiveSampler.d.ts.map +1 -0
  95. package/dist/resources/adaptiveSampler.js +73 -0
  96. package/dist/resources/adaptiveSampler.js.map +1 -0
  97. package/dist/resources/adaptiveTexture.d.ts +14 -0
  98. package/dist/resources/adaptiveTexture.d.ts.map +1 -0
  99. package/dist/resources/adaptiveTexture.js +265 -0
  100. package/dist/resources/adaptiveTexture.js.map +1 -0
  101. package/dist/resources/framebuffer.d.ts +14 -0
  102. package/dist/resources/framebuffer.d.ts.map +1 -0
  103. package/dist/resources/framebuffer.js +144 -0
  104. package/dist/resources/framebuffer.js.map +1 -0
  105. package/dist/resources/framebufferSignature.d.ts +10 -0
  106. package/dist/resources/framebufferSignature.d.ts.map +1 -0
  107. package/dist/resources/framebufferSignature.js +22 -0
  108. package/dist/resources/framebufferSignature.js.map +1 -0
  109. package/dist/resources/index.d.ts +14 -0
  110. package/dist/resources/index.d.ts.map +1 -0
  111. package/dist/resources/index.js +24 -0
  112. package/dist/resources/index.js.map +1 -0
  113. package/dist/resources/mipGen.d.ts +17 -0
  114. package/dist/resources/mipGen.d.ts.map +1 -0
  115. package/dist/resources/mipGen.js +125 -0
  116. package/dist/resources/mipGen.js.map +1 -0
  117. package/dist/resources/preparedComputeShader.d.ts +104 -0
  118. package/dist/resources/preparedComputeShader.d.ts.map +1 -0
  119. package/dist/resources/preparedComputeShader.js +341 -0
  120. package/dist/resources/preparedComputeShader.js.map +1 -0
  121. package/dist/resources/preparedRenderObject.d.ts +61 -0
  122. package/dist/resources/preparedRenderObject.d.ts.map +1 -0
  123. package/dist/resources/preparedRenderObject.js +430 -0
  124. package/dist/resources/preparedRenderObject.js.map +1 -0
  125. package/dist/resources/renderPipeline.d.ts +27 -0
  126. package/dist/resources/renderPipeline.d.ts.map +1 -0
  127. package/dist/resources/renderPipeline.js +102 -0
  128. package/dist/resources/renderPipeline.js.map +1 -0
  129. package/dist/resources/shaderDiagnostics.d.ts +14 -0
  130. package/dist/resources/shaderDiagnostics.d.ts.map +1 -0
  131. package/dist/resources/shaderDiagnostics.js +40 -0
  132. package/dist/resources/shaderDiagnostics.js.map +1 -0
  133. package/dist/resources/sourceMapDecoder.d.ts +23 -0
  134. package/dist/resources/sourceMapDecoder.d.ts.map +1 -0
  135. package/dist/resources/sourceMapDecoder.js +116 -0
  136. package/dist/resources/sourceMapDecoder.js.map +1 -0
  137. package/dist/resources/uniformBuffer.d.ts +23 -0
  138. package/dist/resources/uniformBuffer.d.ts.map +1 -0
  139. package/dist/resources/uniformBuffer.js +149 -0
  140. package/dist/resources/uniformBuffer.js.map +1 -0
  141. package/dist/resources/webgpuFlags.d.ts +32 -0
  142. package/dist/resources/webgpuFlags.d.ts.map +1 -0
  143. package/dist/resources/webgpuFlags.js +40 -0
  144. package/dist/resources/webgpuFlags.js.map +1 -0
  145. package/dist/runtime/copy.d.ts +3 -0
  146. package/dist/runtime/copy.d.ts.map +1 -0
  147. package/dist/runtime/copy.js +12 -0
  148. package/dist/runtime/copy.js.map +1 -0
  149. package/dist/runtime/index.d.ts +6 -0
  150. package/dist/runtime/index.d.ts.map +1 -0
  151. package/dist/runtime/index.js +7 -0
  152. package/dist/runtime/index.js.map +1 -0
  153. package/dist/runtime/renderTask.d.ts +10 -0
  154. package/dist/runtime/renderTask.d.ts.map +1 -0
  155. package/dist/runtime/renderTask.js +119 -0
  156. package/dist/runtime/renderTask.js.map +1 -0
  157. package/dist/runtime/renderTo.d.ts +40 -0
  158. package/dist/runtime/renderTo.d.ts.map +1 -0
  159. package/dist/runtime/renderTo.js +97 -0
  160. package/dist/runtime/renderTo.js.map +1 -0
  161. package/dist/runtime/runtime.d.ts +48 -0
  162. package/dist/runtime/runtime.d.ts.map +1 -0
  163. package/dist/runtime/runtime.js +100 -0
  164. package/dist/runtime/runtime.js.map +1 -0
  165. package/dist/runtime/scenePass.d.ts +25 -0
  166. package/dist/runtime/scenePass.d.ts.map +1 -0
  167. package/dist/runtime/scenePass.js +250 -0
  168. package/dist/runtime/scenePass.js.map +1 -0
  169. package/dist/window/canvas.d.ts +38 -0
  170. package/dist/window/canvas.d.ts.map +1 -0
  171. package/dist/window/canvas.js +194 -0
  172. package/dist/window/canvas.js.map +1 -0
  173. package/dist/window/index.d.ts +3 -0
  174. package/dist/window/index.d.ts.map +1 -0
  175. package/dist/window/index.js +4 -0
  176. package/dist/window/index.js.map +1 -0
  177. package/dist/window/loop.d.ts +16 -0
  178. package/dist/window/loop.d.ts.map +1 -0
  179. package/dist/window/loop.js +43 -0
  180. package/dist/window/loop.js.map +1 -0
  181. package/package.json +1 -1
@@ -0,0 +1,430 @@
1
+ // prepareRenderObject — turn a `RenderObject` + `CompiledEffect`
2
+ // + `FramebufferSignature` into a runnable `PreparedRenderObject`.
3
+ //
4
+ // Reads the wombat.shader `ProgramInterface` for everything needed
5
+ // to lay out vertex buffers, bind groups, color targets, and draw
6
+ // state.
7
+ import { AdaptiveResource, } from "../core/index.js";
8
+ import { cval, } from "@aardworx/wombat.adaptive";
9
+ import { prepareAdaptiveBuffer } from "./adaptiveBuffer.js";
10
+ import { prepareAdaptiveTexture } from "./adaptiveTexture.js";
11
+ import { prepareAdaptiveSampler } from "./adaptiveSampler.js";
12
+ import { prepareUniformBuffer } from "./uniformBuffer.js";
13
+ import { compileRenderPipeline } from "./renderPipeline.js";
14
+ import { BufferUsage, ShaderStage } from "./webgpuFlags.js";
15
+ // ---------------------------------------------------------------------------
16
+ // Helpers
17
+ // ---------------------------------------------------------------------------
18
+ function vertexFormatStride(fmt) {
19
+ switch (fmt) {
20
+ case "float32": return 4;
21
+ case "float32x2": return 8;
22
+ case "float32x3": return 12;
23
+ case "float32x4": return 16;
24
+ case "uint32":
25
+ case "sint32": return 4;
26
+ case "uint32x2":
27
+ case "sint32x2": return 8;
28
+ case "uint32x3":
29
+ case "sint32x3": return 12;
30
+ case "uint32x4":
31
+ case "sint32x4": return 16;
32
+ case "uint16x2":
33
+ case "sint16x2":
34
+ case "float16x2": return 4;
35
+ case "uint16x4":
36
+ case "sint16x4":
37
+ case "float16x4": return 8;
38
+ case "uint8x2":
39
+ case "sint8x2":
40
+ case "unorm8x2":
41
+ case "snorm8x2": return 2;
42
+ case "uint8x4":
43
+ case "sint8x4":
44
+ case "unorm8x4":
45
+ case "snorm8x4": return 4;
46
+ default: throw new Error(`vertexFormatStride: unsupported format ${fmt}`);
47
+ }
48
+ }
49
+ function vertexBindingsFor(iface) {
50
+ // `iface.attributes` is already filtered to non-builtin vertex inputs
51
+ // by wombat.shader's interface builder.
52
+ return iface.attributes.map(a => ({
53
+ name: a.name,
54
+ slot: a.location,
55
+ format: a.format,
56
+ byteSize: a.byteSize,
57
+ }));
58
+ }
59
+ function colorTargetsFor(iface, sig, blends) {
60
+ const out = [];
61
+ for (const o of iface.fragmentOutputs) {
62
+ const fmt = sig.colors.tryFind(o.name);
63
+ if (fmt === undefined) {
64
+ throw new Error(`prepareRenderObject: fragment output "${o.name}" has no matching signature attachment`);
65
+ }
66
+ const target = { format: fmt };
67
+ const blend = blends?.tryFind(o.name);
68
+ if (blend !== undefined) {
69
+ target.blend = {
70
+ color: { operation: blend.color.operation, srcFactor: blend.color.srcFactor, dstFactor: blend.color.dstFactor },
71
+ alpha: { operation: blend.alpha.operation, srcFactor: blend.alpha.srcFactor, dstFactor: blend.alpha.dstFactor },
72
+ };
73
+ target.writeMask = blend.writeMask;
74
+ }
75
+ out[o.location] = target;
76
+ }
77
+ return out;
78
+ }
79
+ function depthStencilStateFor(sig, ps) {
80
+ if (sig.depthStencil === undefined)
81
+ return undefined;
82
+ if (ps.depth === undefined && ps.stencil === undefined)
83
+ return undefined;
84
+ const out = {
85
+ format: sig.depthStencil.format,
86
+ depthWriteEnabled: ps.depth?.write ?? false,
87
+ depthCompare: ps.depth?.compare ?? "always",
88
+ };
89
+ if (ps.stencil !== undefined) {
90
+ out.stencilFront = ps.stencil.front;
91
+ out.stencilBack = ps.stencil.back;
92
+ out.stencilReadMask = ps.stencil.readMask;
93
+ out.stencilWriteMask = ps.stencil.writeMask;
94
+ }
95
+ if (ps.rasterizer.depthBias !== undefined) {
96
+ out.depthBias = ps.rasterizer.depthBias.constant;
97
+ out.depthBiasSlopeScale = ps.rasterizer.depthBias.slopeScale;
98
+ out.depthBiasClamp = ps.rasterizer.depthBias.clamp;
99
+ }
100
+ return out;
101
+ }
102
+ /** Map a wombat.shader IR Type for a sampled texture to WebGPU's GPUTextureSampleType. */
103
+ function sampleTypeFor(type) {
104
+ if (type.kind === "Texture") {
105
+ if (type.comparison === true)
106
+ return "depth";
107
+ const s = type.sampled;
108
+ if (s.kind === "Int")
109
+ return s.signed ? "sint" : "uint";
110
+ return "float";
111
+ }
112
+ // Storage textures don't have a sampleType in the binding-layout
113
+ // sense; this code path is only for sampled textures. If we see
114
+ // anything else default to filterable float.
115
+ return "float";
116
+ }
117
+ function buildGroups(device, descs) {
118
+ const out = [];
119
+ for (let g = 0; g < descs.length; g++) {
120
+ const entries = (descs[g] ?? []).slice().sort((a, b) => a.binding - b.binding);
121
+ const layoutEntries = entries.map(e => {
122
+ const visibility = ShaderStage.VERTEX | ShaderStage.FRAGMENT;
123
+ switch (e.kind) {
124
+ case "ubuf": return { binding: e.binding, visibility, buffer: { type: "uniform" } };
125
+ case "sbuf": return {
126
+ binding: e.binding, visibility,
127
+ buffer: { type: e.access === "read_write" ? "storage" : "read-only-storage" },
128
+ };
129
+ case "tex": return { binding: e.binding, visibility, texture: { sampleType: e.sampleType } };
130
+ case "sampler": return { binding: e.binding, visibility, sampler: { type: "filtering" } };
131
+ }
132
+ });
133
+ const layout = device.createBindGroupLayout({ entries: layoutEntries });
134
+ out.push({ group: g, layout, entries });
135
+ }
136
+ return out;
137
+ }
138
+ // Per-handle identity counter for the bind-group cache key. WebGPU
139
+ // handles have no built-in id; we attach one via a WeakMap.
140
+ const handleIds = new WeakMap();
141
+ let nextHandleId = 1;
142
+ function handleId(h) {
143
+ let id = handleIds.get(h);
144
+ if (id === undefined) {
145
+ id = nextHandleId++;
146
+ handleIds.set(h, id);
147
+ }
148
+ return id;
149
+ }
150
+ // ---------------------------------------------------------------------------
151
+ // PreparedRenderObject
152
+ // ---------------------------------------------------------------------------
153
+ export class PreparedRenderObject {
154
+ device;
155
+ vertexBindings;
156
+ vertexBuffers;
157
+ indexBuffer;
158
+ indexFormat;
159
+ indices;
160
+ drawCall;
161
+ pipeline;
162
+ groups;
163
+ // Per-group bind group cache. Keyed on the concatenated identity
164
+ // of the underlying GPU handles (`buffer:N`, `tex:N`, etc.); a
165
+ // cache hit means none of the resources reallocated since the
166
+ // last record(), so the GPUBindGroup is reusable.
167
+ _bindGroupCache;
168
+ constructor(device, vertexBindings, vertexBuffers, indexBuffer, indexFormat, indices, groups, drawCall, pipeline) {
169
+ this.device = device;
170
+ this.vertexBindings = vertexBindings;
171
+ this.vertexBuffers = vertexBuffers;
172
+ this.indexBuffer = indexBuffer;
173
+ this.indexFormat = indexFormat;
174
+ this.indices = indices;
175
+ this.drawCall = drawCall;
176
+ this.pipeline = pipeline;
177
+ this.groups = groups;
178
+ this._bindGroupCache = groups.map(() => ({ key: null, group: null }));
179
+ }
180
+ acquire() {
181
+ for (const r of this.vertexBuffers.values())
182
+ r.acquire();
183
+ if (this.indexBuffer !== undefined)
184
+ this.indexBuffer.acquire();
185
+ for (const g of this.groups)
186
+ for (const e of g.entries)
187
+ e.resource.acquire();
188
+ }
189
+ release() {
190
+ for (const r of this.vertexBuffers.values())
191
+ r.release();
192
+ if (this.indexBuffer !== undefined)
193
+ this.indexBuffer.release();
194
+ for (const g of this.groups)
195
+ for (const e of g.entries)
196
+ e.resource.release();
197
+ }
198
+ record(pass, token) {
199
+ pass.setPipeline(this.pipeline);
200
+ for (let gi = 0; gi < this.groups.length; gi++) {
201
+ const g = this.groups[gi];
202
+ // Build a cache key from the resolved GPU handle identities;
203
+ // resources may be re-allocated by their AdaptiveResource on
204
+ // capacity growth or shape change, so we need to key on the
205
+ // CURRENT handles, not on the AdaptiveResource references.
206
+ let cacheKey = "";
207
+ const resolved = [];
208
+ for (const e of g.entries) {
209
+ switch (e.kind) {
210
+ case "ubuf":
211
+ case "sbuf": {
212
+ const buf = e.resource.getValue(token);
213
+ cacheKey += `${e.binding}:b${handleId(buf)};`;
214
+ resolved.push({ binding: e.binding, resource: { buffer: buf } });
215
+ break;
216
+ }
217
+ case "tex": {
218
+ const tex = e.resource.getValue(token);
219
+ cacheKey += `${e.binding}:t${handleId(tex)};`;
220
+ // We create a new view per record because views are cheap
221
+ // and texture identity already keys the cache. (A
222
+ // real-perf-tuned implementation would also cache the
223
+ // view per texture.)
224
+ resolved.push({ binding: e.binding, resource: tex.createView() });
225
+ break;
226
+ }
227
+ case "sampler": {
228
+ const samp = e.resource.getValue(token);
229
+ cacheKey += `${e.binding}:s${handleId(samp)};`;
230
+ resolved.push({ binding: e.binding, resource: samp });
231
+ break;
232
+ }
233
+ }
234
+ }
235
+ const slot = this._bindGroupCache[gi];
236
+ let bg;
237
+ if (slot.key === cacheKey && slot.group !== null) {
238
+ bg = slot.group;
239
+ }
240
+ else {
241
+ bg = this.device.createBindGroup({ layout: g.layout, entries: resolved });
242
+ slot.key = cacheKey;
243
+ slot.group = bg;
244
+ }
245
+ pass.setBindGroup(g.group, bg);
246
+ }
247
+ for (const vb of this.vertexBindings) {
248
+ const res = this.vertexBuffers.get(vb.name);
249
+ if (res === undefined)
250
+ throw new Error(`PreparedRenderObject.record: missing vertex buffer for "${vb.name}"`);
251
+ pass.setVertexBuffer(vb.slot, res.getValue(token));
252
+ }
253
+ if (this.indexBuffer !== undefined && this.indices !== undefined && this.indexFormat !== undefined) {
254
+ const buf = this.indexBuffer.getValue(token);
255
+ const view = this.indices.getValue(token);
256
+ pass.setIndexBuffer(buf, this.indexFormat, view.offset, view.count * (this.indexFormat === "uint16" ? 2 : 4));
257
+ }
258
+ const dc = this.drawCall.getValue(token);
259
+ if (dc.kind === "indexed") {
260
+ pass.drawIndexed(dc.indexCount, dc.instanceCount, dc.firstIndex, dc.baseVertex, dc.firstInstance);
261
+ }
262
+ else {
263
+ pass.draw(dc.vertexCount, dc.instanceCount, dc.firstVertex, dc.firstInstance);
264
+ }
265
+ }
266
+ }
267
+ export function prepareRenderObject(device, obj, effect, signature, opts = {}) {
268
+ const iface = effect.interface;
269
+ const vertexBindings = vertexBindingsFor(iface);
270
+ // Vertex + instance buffers — same shape; only stepMode differs.
271
+ // Each shader-required attribute is looked up in obj.vertexAttributes
272
+ // first (per-vertex) then obj.instanceAttributes (per-instance).
273
+ const vertexBuffers = new Map();
274
+ const vertexLayouts = [];
275
+ for (const vb of vertexBindings) {
276
+ const perVertex = obj.vertexAttributes.tryFind(vb.name);
277
+ const perInstance = obj.instanceAttributes?.tryFind(vb.name);
278
+ const av = perVertex ?? perInstance;
279
+ if (av === undefined)
280
+ throw new Error(`prepareRenderObject: missing vertex attribute "${vb.name}"`);
281
+ const stepMode = perInstance !== undefined ? "instance" : "vertex";
282
+ const stride = vb.byteSize !== undefined && vb.byteSize > 0
283
+ ? vb.byteSize
284
+ : vertexFormatStride(vb.format);
285
+ const bufAval = av.map(view => view.buffer);
286
+ const res = prepareAdaptiveBuffer(device, bufAval, {
287
+ usage: BufferUsage.VERTEX,
288
+ ...(opts.label !== undefined ? { label: `${opts.label}.${vb.name}` } : {}),
289
+ });
290
+ vertexBuffers.set(vb.name, res);
291
+ vertexLayouts[vb.slot] = {
292
+ arrayStride: stride,
293
+ stepMode,
294
+ attributes: [{ shaderLocation: vb.slot, offset: 0, format: vb.format }],
295
+ };
296
+ }
297
+ // Index buffer — `indexFormat` from BufferView wins; defaults to uint32.
298
+ let indexBuffer;
299
+ let indexFormat;
300
+ if (obj.indices !== undefined) {
301
+ const bufAval = obj.indices.map(v => v.buffer);
302
+ indexBuffer = prepareAdaptiveBuffer(device, bufAval, {
303
+ usage: BufferUsage.INDEX,
304
+ ...(opts.label !== undefined ? { label: `${opts.label}.indices` } : {}),
305
+ });
306
+ const initial = obj.indices.force();
307
+ indexFormat = initial.indexFormat
308
+ ?? (initial.format === "uint16" ? "uint16" : "uint32");
309
+ }
310
+ // Per-group entry collection. Use `slot` (real shape) instead of `binding`.
311
+ const slotOf = (e) => e.slot;
312
+ const groupOf = (e) => e.group;
313
+ const maxGroup = Math.max(-1, ...iface.uniformBlocks.map(groupOf), ...iface.samplers.map(groupOf), ...iface.textures.map(groupOf), ...iface.storageBuffers.map(groupOf));
314
+ const perGroup = [];
315
+ for (let g = 0; g <= maxGroup; g++)
316
+ perGroup.push([]);
317
+ for (const ub of iface.uniformBlocks) {
318
+ // Merge user-supplied uniforms (`obj.uniforms`) with effect-bound
319
+ // avals (`compiledEffect.avalBindings`). User entries win on name
320
+ // conflict — the rendering caller is the source of truth.
321
+ const merged = mergeUniformInputs(obj.uniforms, effect.avalBindings, ub);
322
+ const block = ubAsBlock(ub);
323
+ const res = prepareUniformBuffer(device, block, merged, {
324
+ ...(opts.label !== undefined ? { label: `${opts.label}.${ub.name}` } : {}),
325
+ });
326
+ perGroup[ub.group].push({ kind: "ubuf", binding: slotOf(ub), resource: res });
327
+ }
328
+ for (const t of iface.textures) {
329
+ const av = obj.textures.tryFind(t.name);
330
+ if (av === undefined)
331
+ throw new Error(`prepareRenderObject: missing texture "${t.name}"`);
332
+ const res = prepareAdaptiveTexture(device, av, {
333
+ ...(opts.label !== undefined ? { label: `${opts.label}.${t.name}` } : {}),
334
+ });
335
+ perGroup[t.group].push({ kind: "tex", binding: slotOf(t), resource: res, sampleType: sampleTypeFor(t.type) });
336
+ }
337
+ for (const s of iface.samplers) {
338
+ const av = obj.samplers.tryFind(s.name);
339
+ if (av === undefined)
340
+ throw new Error(`prepareRenderObject: missing sampler "${s.name}"`);
341
+ const res = prepareAdaptiveSampler(device, av);
342
+ perGroup[s.group].push({ kind: "sampler", binding: slotOf(s), resource: res });
343
+ }
344
+ for (const sb of iface.storageBuffers) {
345
+ const av = obj.storageBuffers?.tryFind(sb.name);
346
+ if (av === undefined)
347
+ throw new Error(`prepareRenderObject: missing storage buffer "${sb.name}"`);
348
+ const usage = BufferUsage.STORAGE
349
+ | (sb.access === "read_write" ? BufferUsage.COPY_DST : 0);
350
+ const res = prepareAdaptiveBuffer(device, av, {
351
+ usage,
352
+ ...(opts.label !== undefined ? { label: `${opts.label}.${sb.name}` } : {}),
353
+ });
354
+ perGroup[sb.group].push({ kind: "sbuf", binding: slotOf(sb), resource: res, access: sb.access });
355
+ }
356
+ const groups = buildGroups(device, perGroup);
357
+ // Pipeline.
358
+ const colorTargets = colorTargetsFor(iface, signature, obj.pipelineState.blends);
359
+ const vsStage = effect.stages.find(s => s.stage === "vertex");
360
+ const fsStage = effect.stages.find(s => s.stage === "fragment");
361
+ if (vsStage === undefined)
362
+ throw new Error("prepareRenderObject: CompiledEffect has no vertex stage");
363
+ if (fsStage === undefined)
364
+ throw new Error("prepareRenderObject: CompiledEffect has no fragment stage");
365
+ const ds = depthStencilStateFor(signature, obj.pipelineState);
366
+ const multisample = signature.sampleCount > 1 || obj.pipelineState.alphaToCoverage === true
367
+ ? {
368
+ count: signature.sampleCount,
369
+ ...(obj.pipelineState.alphaToCoverage === true ? { alphaToCoverageEnabled: true } : {}),
370
+ }
371
+ : undefined;
372
+ const pipelineDesc = {
373
+ ...(opts.label !== undefined ? { label: opts.label } : {}),
374
+ ...(opts.effectId !== undefined ? { effectId: opts.effectId } : {}),
375
+ vertexShaderSource: vsStage.source,
376
+ fragmentShaderSource: fsStage.source,
377
+ ...(vsStage.sourceMap ? { vertexSourceMap: vsStage.sourceMap } : {}),
378
+ ...(fsStage.sourceMap ? { fragmentSourceMap: fsStage.sourceMap } : {}),
379
+ vertexEntryPoint: vsStage.entryName,
380
+ fragmentEntryPoint: fsStage.entryName,
381
+ vertexBufferLayouts: vertexLayouts,
382
+ bindGroupLayouts: groups.map(g => g.layout),
383
+ colorTargets,
384
+ primitive: {
385
+ topology: obj.pipelineState.rasterizer.topology,
386
+ ...(obj.pipelineState.rasterizer.cullMode !== "none" ? { cullMode: obj.pipelineState.rasterizer.cullMode } : {}),
387
+ frontFace: obj.pipelineState.rasterizer.frontFace,
388
+ },
389
+ ...(ds !== undefined ? { depthStencil: ds } : {}),
390
+ ...(multisample !== undefined ? { multisample } : {}),
391
+ };
392
+ const pipeline = compileRenderPipeline(device, pipelineDesc);
393
+ return new PreparedRenderObject(device, vertexBindings, vertexBuffers, indexBuffer, indexFormat, obj.indices, groups, obj.drawCall, pipeline);
394
+ }
395
+ // ---------------------------------------------------------------------------
396
+ // Uniform input merging — `obj.uniforms` wins; `avalBindings` is fallback.
397
+ // ---------------------------------------------------------------------------
398
+ function mergeUniformInputs(user, bindings, block) {
399
+ let merged = user;
400
+ if (bindings === undefined)
401
+ return merged;
402
+ for (const f of block.fields) {
403
+ if (merged.tryFind(f.name) !== undefined)
404
+ continue;
405
+ const getter = bindings[f.name];
406
+ if (getter === undefined)
407
+ continue;
408
+ const v = getter();
409
+ // wombat.shader's avalBindings store either an `aval<T>` or a
410
+ // raw value; wrap the raw case as a constant aval.
411
+ if (isAval(v))
412
+ merged = merged.add(f.name, v);
413
+ else
414
+ merged = merged.add(f.name, cval(v));
415
+ }
416
+ return merged;
417
+ }
418
+ function isAval(v) {
419
+ return typeof v === "object" && v !== null && typeof v.getValue === "function";
420
+ }
421
+ /**
422
+ * Adapter — wombat.shader's `UniformBlockInfo` and our internal
423
+ * UBO packer expect the same field shape (`offset`, `size`, etc.),
424
+ * so this is just a structural pass-through. Keeps the call sites
425
+ * type-clean.
426
+ */
427
+ function ubAsBlock(ub) {
428
+ return ub;
429
+ }
430
+ //# sourceMappingURL=preparedRenderObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preparedRenderObject.js","sourceRoot":"","sources":["../../src/resources/preparedRenderObject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface CompileRenderPipelineDescription {
2
+ readonly label?: string;
3
+ /**
4
+ * Stable identity of the source effect (wombat.shader's
5
+ * build-time `Effect.id`). Used as the strong key for the
6
+ * pipeline cache — two `compileRenderPipeline` calls with the
7
+ * same `effectId` + the rest of the descriptor share a
8
+ * `GPURenderPipeline`. Falls back to FNV-hashing the shader
9
+ * source when omitted (only useful for hand-built sources).
10
+ */
11
+ readonly effectId?: string;
12
+ readonly vertexShaderSource: string;
13
+ readonly fragmentShaderSource: string;
14
+ /** Optional source map for the vertex stage. Used to enrich compile-error logs. */
15
+ readonly vertexSourceMap?: import("@aardworx/wombat.shader/ir").SourceMap | null;
16
+ readonly fragmentSourceMap?: import("@aardworx/wombat.shader/ir").SourceMap | null;
17
+ readonly vertexEntryPoint: string;
18
+ readonly fragmentEntryPoint: string;
19
+ readonly vertexBufferLayouts: readonly GPUVertexBufferLayout[];
20
+ readonly bindGroupLayouts: readonly GPUBindGroupLayout[];
21
+ readonly colorTargets: readonly GPUColorTargetState[];
22
+ readonly depthStencil?: GPUDepthStencilState;
23
+ readonly primitive: GPUPrimitiveState;
24
+ readonly multisample?: GPUMultisampleState;
25
+ }
26
+ export declare function compileRenderPipeline(device: GPUDevice, desc: CompileRenderPipelineDescription): GPURenderPipeline;
27
+ //# sourceMappingURL=renderPipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderPipeline.d.ts","sourceRoot":"","sources":["../../src/resources/renderPipeline.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,mFAAmF;IACnF,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,4BAA4B,EAAE,SAAS,GAAG,IAAI,CAAC;IACjF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,4BAA4B,EAAE,SAAS,GAAG,IAAI,CAAC;IACnF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC/D,QAAQ,CAAC,gBAAgB,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACzD,QAAQ,CAAC,YAAY,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACtD,QAAQ,CAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC;CAC5C;AAsCD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,gCAAgC,GACrC,iBAAiB,CAoCnB"}
@@ -0,0 +1,102 @@
1
+ // compileRenderPipeline — produce a `GPURenderPipeline` from a
2
+ // description and memoize per-device. Pipeline state is treated
3
+ // as static (not adaptive); when the user wants pipeline switching
4
+ // at runtime they should construct multiple PreparedRenderObjects
5
+ // and pick between them at the RenderTree level.
6
+ //
7
+ // The descriptor is intentionally low-level: all the hard work of
8
+ // turning a `CompiledEffect` + `ProgramInterface` + `PipelineState`
9
+ // + `FramebufferSignature` into a GPUVertexBufferLayout[] /
10
+ // GPUBindGroupLayout[] / GPUColorTargetState[] etc. lives in
11
+ // `prepareRenderObject`. This function is just the caching layer
12
+ // over `device.createRenderPipeline`.
13
+ import { installShaderDiagnostics } from "./shaderDiagnostics.js";
14
+ const caches = new WeakMap();
15
+ function cacheFor(device) {
16
+ let c = caches.get(device);
17
+ if (c === undefined) {
18
+ c = { modules: new Map(), pipelines: new Map() };
19
+ caches.set(device, c);
20
+ }
21
+ return c;
22
+ }
23
+ function moduleFor(device, source, label, sourceMap) {
24
+ const cache = cacheFor(device);
25
+ let m = cache.modules.get(source);
26
+ if (m === undefined) {
27
+ m = device.createShaderModule({ code: source, ...(label !== undefined ? { label } : {}) });
28
+ cache.modules.set(source, m);
29
+ installShaderDiagnostics(m, source, {
30
+ ...(label !== undefined ? { label } : {}),
31
+ ...(sourceMap !== undefined && sourceMap !== null ? { sourceMap } : {}),
32
+ });
33
+ }
34
+ return m;
35
+ }
36
+ export function compileRenderPipeline(device, desc) {
37
+ const cache = cacheFor(device);
38
+ const k = pipelineKey(desc);
39
+ let p = cache.pipelines.get(k);
40
+ if (p !== undefined)
41
+ return p;
42
+ const vsModule = moduleFor(device, desc.vertexShaderSource, desc.label ? `${desc.label}.vs` : undefined, desc.vertexSourceMap);
43
+ const fsModule = desc.vertexShaderSource === desc.fragmentShaderSource
44
+ ? vsModule
45
+ : moduleFor(device, desc.fragmentShaderSource, desc.label ? `${desc.label}.fs` : undefined, desc.fragmentSourceMap);
46
+ const layout = device.createPipelineLayout({
47
+ bindGroupLayouts: desc.bindGroupLayouts,
48
+ ...(desc.label !== undefined ? { label: `${desc.label}.layout` } : {}),
49
+ });
50
+ const pdesc = {
51
+ layout,
52
+ vertex: {
53
+ module: vsModule,
54
+ entryPoint: desc.vertexEntryPoint,
55
+ buffers: desc.vertexBufferLayouts,
56
+ },
57
+ fragment: {
58
+ module: fsModule,
59
+ entryPoint: desc.fragmentEntryPoint,
60
+ targets: desc.colorTargets,
61
+ },
62
+ primitive: desc.primitive,
63
+ ...(desc.depthStencil !== undefined ? { depthStencil: desc.depthStencil } : {}),
64
+ ...(desc.multisample !== undefined ? { multisample: desc.multisample } : {}),
65
+ ...(desc.label !== undefined ? { label: desc.label } : {}),
66
+ };
67
+ p = device.createRenderPipeline(pdesc);
68
+ cache.pipelines.set(k, p);
69
+ return p;
70
+ }
71
+ function pipelineKey(d) {
72
+ // Strong identity component: prefer `effectId` (wombat.shader's
73
+ // build-time stable hash); fall back to FNV-hashing the shader
74
+ // source for hand-built effects. The rest of the descriptor is
75
+ // small enough to JSON-stringify.
76
+ const ident = d.effectId !== undefined
77
+ ? d.effectId
78
+ : `${hashString(d.vertexShaderSource)}/${hashString(d.fragmentShaderSource)}`;
79
+ const slim = {
80
+ id: ident,
81
+ vEntry: d.vertexEntryPoint,
82
+ fEntry: d.fragmentEntryPoint,
83
+ vb: d.vertexBufferLayouts,
84
+ bgl: d.bindGroupLayouts.length,
85
+ ct: d.colorTargets,
86
+ ds: d.depthStencil,
87
+ pr: d.primitive,
88
+ ms: d.multisample,
89
+ };
90
+ return JSON.stringify(slim);
91
+ }
92
+ function hashString(s) {
93
+ // FNV-1a 32-bit; collision risk is negligible for our purposes
94
+ // and the cost is one call per uncached pipeline.
95
+ let h = 0x811c9dc5;
96
+ for (let i = 0; i < s.length; i++) {
97
+ h ^= s.charCodeAt(i);
98
+ h = Math.imul(h, 0x01000193);
99
+ }
100
+ return h >>> 0;
101
+ }
102
+ //# sourceMappingURL=renderPipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderPipeline.js","sourceRoot":"","sources":["../../src/resources/renderPipeline.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,gEAAgE;AAChE,mEAAmE;AACnE,kEAAkE;AAClE,iDAAiD;AACjD,EAAE;AACF,kEAAkE;AAClE,oEAAoE;AACpE,4DAA4D;AAC5D,6DAA6D;AAC7D,iEAAiE;AACjE,sCAAsC;AA4BtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAOlE,MAAM,MAAM,GAAG,IAAI,OAAO,EAA0B,CAAC;AACrD,SAAS,QAAQ,CAAC,MAAiB;IACjC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAChB,MAAiB,EACjB,MAAc,EACd,KAAc,EACd,SAAiE;IAEjE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,CAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3F,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7B,wBAAwB,CAAC,CAAC,EAAE,MAAM,EAAE;YAClC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,IAAsC;IAEtC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAE9B,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/H,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,oBAAoB;QACpE,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAEtH,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC;QACzC,gBAAgB,EAAE,IAAI,CAAC,gBAAwC;QAC/D,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC,CAAC;IAEH,MAAM,KAAK,GAAgC;QACzC,MAAM;QACN,MAAM,EAAE;YACN,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,IAAI,CAAC,gBAAgB;YACjC,OAAO,EAAE,IAAI,CAAC,mBAA8C;SAC7D;QACD,QAAQ,EAAE;YACR,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,IAAI,CAAC,kBAAkB;YACnC,OAAO,EAAE,IAAI,CAAC,YAAqC;SACpD;QACD,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC;IACF,CAAC,GAAG,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACvC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,WAAW,CAAC,CAAmC;IACtD,gEAAgE;IAChE,+DAA+D;IAC/D,+DAA+D;IAC/D,kCAAkC;IAClC,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,KAAK,SAAS;QACpC,CAAC,CAAC,CAAC,CAAC,QAAQ;QACZ,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC;IAChF,MAAM,IAAI,GAAG;QACX,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,CAAC,CAAC,gBAAgB;QAC1B,MAAM,EAAE,CAAC,CAAC,kBAAkB;QAC5B,EAAE,EAAE,CAAC,CAAC,mBAAmB;QACzB,GAAG,EAAE,CAAC,CAAC,gBAAgB,CAAC,MAAM;QAC9B,EAAE,EAAE,CAAC,CAAC,YAAY;QAClB,EAAE,EAAE,CAAC,CAAC,YAAY;QAClB,EAAE,EAAE,CAAC,CAAC,SAAS;QACf,EAAE,EAAE,CAAC,CAAC,WAAW;KAClB,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,+DAA+D;IAC/D,kDAAkD;IAClD,IAAI,CAAC,GAAG,UAAU,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { SourceMap } from "@aardworx/wombat.shader/ir";
2
+ export interface ShaderDiagnosticsOptions {
3
+ /** Human-friendly tag prefixed to log messages. */
4
+ readonly label?: string;
5
+ /** Source map produced by wombat.shader for this stage. */
6
+ readonly sourceMap?: SourceMap | null;
7
+ /** Optional override for the logger. Default: console. */
8
+ readonly logger?: {
9
+ error(...args: unknown[]): void;
10
+ warn(...args: unknown[]): void;
11
+ };
12
+ }
13
+ export declare function installShaderDiagnostics(module: GPUShaderModule, source: string, opts?: ShaderDiagnosticsOptions): void;
14
+ //# sourceMappingURL=shaderDiagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shaderDiagnostics.d.ts","sourceRoot":"","sources":["../../src/resources/shaderDiagnostics.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,MAAM,WAAW,wBAAwB;IACvC,mDAAmD;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACtC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;KAAE,CAAC;CACvF;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,wBAA6B,GAClC,IAAI,CA4BN"}