@aardworx/wombat.rendering 0.1.0 → 0.2.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.
Files changed (185) 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 +21 -0
  50. package/dist/core/index.d.ts.map +1 -0
  51. package/dist/core/index.js +14 -0
  52. package/dist/core/index.js.map +1 -0
  53. package/dist/core/pipelineState.d.ts +126 -0
  54. package/dist/core/pipelineState.d.ts.map +1 -0
  55. package/dist/core/pipelineState.js +88 -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 +93 -0
  122. package/dist/resources/preparedRenderObject.d.ts.map +1 -0
  123. package/dist/resources/preparedRenderObject.js +541 -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 +255 -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
  182. package/src/core/index.ts +10 -1
  183. package/src/core/pipelineState.ts +178 -24
  184. package/src/resources/preparedRenderObject.ts +271 -85
  185. package/src/runtime/scenePass.ts +6 -1
@@ -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":"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"}
@@ -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"}
@@ -0,0 +1,40 @@
1
+ // Shader-compile error reporting. WebGPU's `createShaderModule`
2
+ // is synchronous and never throws on parse errors; the errors
3
+ // surface only via `module.getCompilationInfo()`, which is async.
4
+ // We fire-and-forget that call after creation and log structured
5
+ // messages including the originating TS source location decoded
6
+ // from the supplied source map.
7
+ import { decodeLine } from "./sourceMapDecoder.js";
8
+ export function installShaderDiagnostics(module, source, opts = {}) {
9
+ // getCompilationInfo is part of the WebGPU spec; some test mocks
10
+ // may not implement it. Detect and skip silently.
11
+ const info = module.getCompilationInfo;
12
+ if (typeof info !== "function")
13
+ return;
14
+ const log = opts.logger ?? console;
15
+ const tag = opts.label ?? "shader";
16
+ info.call(module).then((compInfo) => {
17
+ if (compInfo.messages.length === 0)
18
+ return;
19
+ const map = opts.sourceMap ?? null;
20
+ for (const m of compInfo.messages) {
21
+ const lineText = source.split("\n")[Math.max(0, m.lineNum - 1)] ?? "";
22
+ const head = `[${tag}] ${m.type} ${m.lineNum}:${m.linePos}: ${m.message}`;
23
+ const body = lineText.length > 0 ? `\n ${lineText.trim()}` : "";
24
+ const decoded = map ? decodeLine(map, m.lineNum) : null;
25
+ const origin = decoded
26
+ ? `\n → ${decoded.file}:${decoded.line}:${decoded.column}`
27
+ : (map && map.sources.length > 0
28
+ ? `\n (originated in ${map.sources.join(", ")})`
29
+ : "");
30
+ const line = `${head}${body}${origin}`;
31
+ if (m.type === "error")
32
+ log.error(line);
33
+ else
34
+ log.warn(line);
35
+ }
36
+ }).catch(() => {
37
+ // Mock environments / older browsers may reject; silent swallow.
38
+ });
39
+ }
40
+ //# sourceMappingURL=shaderDiagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shaderDiagnostics.js","sourceRoot":"","sources":["../../src/resources/shaderDiagnostics.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,8DAA8D;AAC9D,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,gCAAgC;AAGhC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAWnD,MAAM,UAAU,wBAAwB,CACtC,MAAuB,EACvB,MAAc,EACd,OAAiC,EAAE;IAEnC,iEAAiE;IACjE,kDAAkD;IAClD,MAAM,IAAI,GAAI,MAAqE,CAAC,kBAAkB,CAAC;IACvG,IAAI,OAAO,IAAI,KAAK,UAAU;QAAE,OAAO;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;IAEnC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QAClC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1E,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACxD,MAAM,MAAM,GAAG,OAAO;gBACpB,CAAC,CAAC,SAAS,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE;gBAC3D,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;oBAC9B,CAAC,CAAC,sBAAsB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBACjD,CAAC,CAAC,EAAE,CAAC,CAAC;YACV,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;YACvC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;gBAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;gBACnC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACZ,iEAAiE;IACnE,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { SourceMap } from "@aardworx/wombat.shader/ir";
2
+ export interface DecodedPosition {
3
+ /** Source file as listed in `SourceMap.sources`. */
4
+ readonly file: string;
5
+ /** 1-based line in the original source. */
6
+ readonly line: number;
7
+ /** 1-based column in the original source. */
8
+ readonly column: number;
9
+ }
10
+ /**
11
+ * Closest-preceding-segment lookup. Given a 1-based generated
12
+ * `line` + 0-based generated `col`, returns the originating source
13
+ * position. Falls back to the last segment on a previous mapped
14
+ * line if `line` itself has no segments.
15
+ */
16
+ export declare function decodePosition(map: SourceMap, generatedLine: number, generatedCol?: number): DecodedPosition | null;
17
+ /**
18
+ * Backwards-compatible line-only decoder: returns the *first*
19
+ * segment of `generatedLine`, or the most recent mapped line for
20
+ * unmapped lines. Equivalent to `decodePosition(map, line, 0)`.
21
+ */
22
+ export declare function decodeLine(map: SourceMap, generatedLine: number): DecodedPosition | null;
23
+ //# sourceMappingURL=sourceMapDecoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceMapDecoder.d.ts","sourceRoot":"","sources":["../../src/resources/sourceMapDecoder.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AA+B5D,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAyCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,SAAS,EACd,aAAa,EAAE,MAAM,EACrB,YAAY,SAAI,GACf,eAAe,GAAG,IAAI,CAqBxB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAExF"}
@@ -0,0 +1,116 @@
1
+ // Decoder for v3 source maps. Supports both line-granular maps
2
+ // (one segment per generated line at col 0) and multi-segment
3
+ // lines (per-Expr granularity). Segments encode
4
+ // (genColDelta, sourceIdxDelta, sourceLineDelta, sourceColDelta)
5
+ // as base64-VLQ, with deltas accumulating across the whole map
6
+ // except for genCol which resets at every `;` line boundary.
7
+ //
8
+ // `decodeLine(map, line)` returns the position for the *first*
9
+ // segment on the line; `decodePosition(map, line, col)` picks the
10
+ // closest preceding segment. Both fall back to the most recent
11
+ // mapped line if the queried line is unmapped, which is what
12
+ // `installShaderDiagnostics` wants for "go to source" navigation.
13
+ const VLQ_INDEX = new Map();
14
+ {
15
+ const a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
16
+ for (let i = 0; i < a.length; i++)
17
+ VLQ_INDEX.set(a.charAt(i), i);
18
+ }
19
+ function vlqDecode(s) {
20
+ const out = [];
21
+ let value = 0;
22
+ let shift = 0;
23
+ for (let i = 0; i < s.length; i++) {
24
+ const ch = s.charAt(i);
25
+ const digit = VLQ_INDEX.get(ch);
26
+ if (digit === undefined)
27
+ throw new Error(`bad VLQ char: ${ch}`);
28
+ const cont = (digit & 0b100000) !== 0;
29
+ value |= (digit & 0b11111) << shift;
30
+ if (cont) {
31
+ shift += 5;
32
+ }
33
+ else {
34
+ const negative = (value & 1) === 1;
35
+ const magnitude = value >>> 1;
36
+ out.push(negative ? -magnitude : magnitude);
37
+ value = 0;
38
+ shift = 0;
39
+ }
40
+ }
41
+ return out;
42
+ }
43
+ /** Walk the map up to (and including) `targetLine`, returning each line's segments. */
44
+ function segmentsUpTo(map, targetLine) {
45
+ const lines = map.mappings.split(";");
46
+ const out = [];
47
+ let srcIdx = 0;
48
+ let srcLine = 0;
49
+ let srcCol = 0;
50
+ for (let i = 0; i <= targetLine && i < lines.length; i++) {
51
+ const segs = (lines[i] ?? "").split(",").filter(s => s.length > 0);
52
+ let prevGenCol = 0;
53
+ const lineOut = [];
54
+ for (const sStr of segs) {
55
+ const fields = vlqDecode(sStr);
56
+ if (fields.length < 4)
57
+ continue;
58
+ const genCol = prevGenCol + fields[0];
59
+ srcIdx += fields[1];
60
+ srcLine += fields[2];
61
+ srcCol += fields[3];
62
+ lineOut.push({ genCol, idx: srcIdx, line: srcLine, col: srcCol });
63
+ prevGenCol = genCol;
64
+ }
65
+ out.push(lineOut);
66
+ }
67
+ return out;
68
+ }
69
+ function makePosition(map, s) {
70
+ const file = map.sources[s.idx];
71
+ if (file === undefined)
72
+ return null;
73
+ return { file, line: s.line + 1, column: s.col + 1 };
74
+ }
75
+ /**
76
+ * Closest-preceding-segment lookup. Given a 1-based generated
77
+ * `line` + 0-based generated `col`, returns the originating source
78
+ * position. Falls back to the last segment on a previous mapped
79
+ * line if `line` itself has no segments.
80
+ */
81
+ export function decodePosition(map, generatedLine, generatedCol = 0) {
82
+ const target = generatedLine - 1;
83
+ if (target < 0)
84
+ return null;
85
+ const allLines = segmentsUpTo(map, target);
86
+ // Prefer a segment on the target line at or before generatedCol.
87
+ const onTarget = allLines[target];
88
+ if (onTarget && onTarget.length > 0) {
89
+ let pick;
90
+ for (const s of onTarget) {
91
+ if (s.genCol <= generatedCol)
92
+ pick = s;
93
+ else
94
+ break;
95
+ }
96
+ if (pick)
97
+ return makePosition(map, pick);
98
+ return makePosition(map, onTarget[0]);
99
+ }
100
+ // Fallback: last segment on the most recent mapped line.
101
+ for (let i = target - 1; i >= 0; i--) {
102
+ const segs = allLines[i];
103
+ if (segs && segs.length > 0)
104
+ return makePosition(map, segs[segs.length - 1]);
105
+ }
106
+ return null;
107
+ }
108
+ /**
109
+ * Backwards-compatible line-only decoder: returns the *first*
110
+ * segment of `generatedLine`, or the most recent mapped line for
111
+ * unmapped lines. Equivalent to `decodePosition(map, line, 0)`.
112
+ */
113
+ export function decodeLine(map, generatedLine) {
114
+ return decodePosition(map, generatedLine, 0);
115
+ }
116
+ //# sourceMappingURL=sourceMapDecoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceMapDecoder.js","sourceRoot":"","sources":["../../src/resources/sourceMapDecoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { AdaptiveResource, type UniformBlockInfo } from "../core/index.js";
2
+ import { type aval, type HashMap } from "@aardworx/wombat.adaptive";
3
+ export interface PackedView {
4
+ readonly bytes: ArrayBuffer;
5
+ readonly f32: Float32Array;
6
+ readonly i32: Int32Array;
7
+ readonly u32: Uint32Array;
8
+ }
9
+ export declare function makePackedView(byteSize: number): PackedView;
10
+ /**
11
+ * Write a value into a UBO scratch buffer at the given byte offset.
12
+ * `fieldType`, when supplied, disambiguates a bare `number`:
13
+ * - Int (signed) → i32
14
+ * - Int (unsigned) → u32
15
+ * - Float (default) → f32
16
+ * Without it, numbers are assumed to be f32.
17
+ */
18
+ export declare function writeField(view: PackedView, offset: number, value: unknown, fieldType?: import("../core/index.js").UniformFieldInfo["type"]): void;
19
+ export interface PrepareUniformBufferOptions {
20
+ readonly label?: string;
21
+ }
22
+ export declare function prepareUniformBuffer(device: GPUDevice, layout: UniformBlockInfo, inputs: HashMap<string, aval<unknown>>, opts?: PrepareUniformBufferOptions): AdaptiveResource<GPUBuffer>;
23
+ //# sourceMappingURL=uniformBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniformBuffer.d.ts","sourceRoot":"","sources":["../../src/resources/uniformBuffer.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,gBAAgB,EAGhB,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,IAAI,EACT,KAAK,OAAO,EACb,MAAM,2BAA2B,CAAC;AAGnC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAQ3D;AA6DD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,SAAS,CAAC,EAAE,OAAO,kBAAkB,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAC9D,IAAI,CA6BN;AAMD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EACtC,IAAI,GAAE,2BAAgC,GACrC,gBAAgB,CAAC,SAAS,CAAC,CAE7B"}
@@ -0,0 +1,149 @@
1
+ // prepareUniformBuffer — pack a name-keyed bag of `aval<unknown>`
2
+ // uniforms into a single UBO described by a `UniformBlockInfo`
3
+ // (from wombat.shader's ProgramInterface).
4
+ //
5
+ // The layout dictates byte offsets + sizes per field; this packer
6
+ // trusts those numbers and just encodes values into a Float32-
7
+ // addressable scratch buffer, then uploads via `queue.writeBuffer`
8
+ // on each change.
9
+ //
10
+ // Value encoding by type:
11
+ // - `number` → 1 × f32 at offset
12
+ // - `Float32Array` → memcpy floats
13
+ // - `Int32Array`/`Uint32Array` → memcpy as-is (also valid for f32 storage)
14
+ // - any object with `_data: Float32Array | Int32Array | Uint32Array`
15
+ // (V2f/V3f/V4f/M44f/M33f/M22f, etc. from wombat.base) → memcpy `_data`
16
+ //
17
+ // Missing inputs (a layout field with no corresponding entry in
18
+ // the bag) are left zero-initialised. Extras in the bag are
19
+ // silently ignored — same "pull, don't push" semantics as the
20
+ // rest of the renderer.
21
+ import { AdaptiveResource, tryAcquire, tryRelease, } from "../core/index.js";
22
+ import {} from "@aardworx/wombat.adaptive";
23
+ import { BufferUsage } from "./webgpuFlags.js";
24
+ export function makePackedView(byteSize) {
25
+ const bytes = new ArrayBuffer(roundUp4(byteSize));
26
+ return {
27
+ bytes,
28
+ f32: new Float32Array(bytes),
29
+ i32: new Int32Array(bytes),
30
+ u32: new Uint32Array(bytes),
31
+ };
32
+ }
33
+ class UniformBufferResource extends AdaptiveResource {
34
+ device;
35
+ layout;
36
+ inputs;
37
+ label;
38
+ _gpu;
39
+ _scratch;
40
+ constructor(device, layout, inputs, label) {
41
+ super();
42
+ this.device = device;
43
+ this.layout = layout;
44
+ this.inputs = inputs;
45
+ this.label = label;
46
+ const bytes = new ArrayBuffer(roundUp4(layout.size));
47
+ this._scratch = {
48
+ bytes,
49
+ f32: new Float32Array(bytes),
50
+ i32: new Int32Array(bytes),
51
+ u32: new Uint32Array(bytes),
52
+ };
53
+ }
54
+ create() {
55
+ for (const f of this.layout.fields) {
56
+ const av = this.inputs.tryFind(f.name);
57
+ if (av !== undefined)
58
+ tryAcquire(av);
59
+ }
60
+ }
61
+ destroy() {
62
+ if (this._gpu !== undefined) {
63
+ this._gpu.destroy();
64
+ this._gpu = undefined;
65
+ }
66
+ for (const f of this.layout.fields) {
67
+ const av = this.inputs.tryFind(f.name);
68
+ if (av !== undefined)
69
+ tryRelease(av);
70
+ }
71
+ }
72
+ compute(token) {
73
+ // Pack scratch.
74
+ new Uint8Array(this._scratch.bytes).fill(0);
75
+ for (const field of this.layout.fields) {
76
+ const av = this.inputs.tryFind(field.name);
77
+ if (av === undefined)
78
+ continue;
79
+ writeField(this._scratch, field.offset, av.getValue(token));
80
+ }
81
+ if (this._gpu === undefined) {
82
+ const desc = {
83
+ size: this._scratch.bytes.byteLength,
84
+ usage: BufferUsage.UNIFORM | BufferUsage.COPY_DST,
85
+ ...(this.label !== undefined ? { label: this.label } : {}),
86
+ };
87
+ this._gpu = this.device.createBuffer(desc);
88
+ }
89
+ this.device.queue.writeBuffer(this._gpu, 0, this._scratch.bytes);
90
+ return this._gpu;
91
+ }
92
+ }
93
+ /**
94
+ * Write a value into a UBO scratch buffer at the given byte offset.
95
+ * `fieldType`, when supplied, disambiguates a bare `number`:
96
+ * - Int (signed) → i32
97
+ * - Int (unsigned) → u32
98
+ * - Float (default) → f32
99
+ * Without it, numbers are assumed to be f32.
100
+ */
101
+ export function writeField(view, offset, value, fieldType) {
102
+ if (typeof value === "number") {
103
+ if (fieldType?.kind === "Int") {
104
+ if (fieldType.signed)
105
+ view.i32[offset >> 2] = value;
106
+ else
107
+ view.u32[offset >> 2] = value;
108
+ }
109
+ else {
110
+ view.f32[offset >> 2] = value;
111
+ }
112
+ return;
113
+ }
114
+ if (value instanceof Float32Array) {
115
+ view.f32.set(value, offset >> 2);
116
+ return;
117
+ }
118
+ if (value instanceof Int32Array) {
119
+ view.i32.set(value, offset >> 2);
120
+ return;
121
+ }
122
+ if (value instanceof Uint32Array) {
123
+ view.u32.set(value, offset >> 2);
124
+ return;
125
+ }
126
+ if (value !== null && typeof value === "object" && "_data" in value) {
127
+ const data = value._data;
128
+ if (data instanceof Float32Array) {
129
+ view.f32.set(data, offset >> 2);
130
+ return;
131
+ }
132
+ if (data instanceof Int32Array) {
133
+ view.i32.set(data, offset >> 2);
134
+ return;
135
+ }
136
+ if (data instanceof Uint32Array) {
137
+ view.u32.set(data, offset >> 2);
138
+ return;
139
+ }
140
+ }
141
+ throw new Error(`prepareUniformBuffer: unsupported uniform value at offset ${offset}: ${String(value)}`);
142
+ }
143
+ function roundUp4(n) {
144
+ return (n + 3) & ~3;
145
+ }
146
+ export function prepareUniformBuffer(device, layout, inputs, opts = {}) {
147
+ return new UniformBufferResource(device, layout, inputs, opts.label);
148
+ }
149
+ //# sourceMappingURL=uniformBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniformBuffer.js","sourceRoot":"","sources":["../../src/resources/uniformBuffer.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,+DAA+D;AAC/D,2CAA2C;AAC3C,EAAE;AACF,kEAAkE;AAClE,+DAA+D;AAC/D,mEAAmE;AACnE,kBAAkB;AAClB,EAAE;AACF,0BAA0B;AAC1B,+CAA+C;AAC/C,2CAA2C;AAC3C,6EAA6E;AAC7E,uEAAuE;AACvE,2EAA2E;AAC3E,EAAE;AACF,gEAAgE;AAChE,4DAA4D;AAC5D,8DAA8D;AAC9D,wBAAwB;AAExB,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,UAAU,GAEX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIN,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAS/C,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClD,OAAO;QACL,KAAK;QACL,GAAG,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC;QAC5B,GAAG,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC;QAC1B,GAAG,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,qBAAsB,SAAQ,gBAA2B;IAK1C;IACA;IACA;IACA;IAPX,IAAI,CAAwB;IACnB,QAAQ,CAAa;IAEtC,YACmB,MAAiB,EACjB,MAAwB,EACxB,MAAsC,EACtC,KAAyB;QAE1C,KAAK,EAAE,CAAC;QALS,WAAM,GAAN,MAAM,CAAW;QACjB,WAAM,GAAN,MAAM,CAAkB;QACxB,WAAM,GAAN,MAAM,CAAgC;QACtC,UAAK,GAAL,KAAK,CAAoB;QAG1C,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG;YACd,KAAK;YACL,GAAG,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC;YAC5B,GAAG,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC;YAC1B,GAAG,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC;SAC5B,CAAC;IACJ,CAAC;IAES,MAAM;QACd,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,EAAE,KAAK,SAAS;gBAAE,UAAU,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAES,OAAO;QACf,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACxB,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,EAAE,KAAK,SAAS;gBAAE,UAAU,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEQ,OAAO,CAAC,KAAoB;QACnC,gBAAgB;QAChB,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,EAAE,KAAK,SAAS;gBAAE,SAAS;YAC/B,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAwB;gBAChC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU;gBACpC,KAAK,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,QAAQ;gBACjD,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D,CAAC;YACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CACxB,IAAgB,EAChB,MAAc,EACd,KAAc,EACd,SAA+D;IAE/D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,SAAS,EAAE,IAAI,KAAK,KAAK,EAAE,CAAC;YAC9B,IAAI,SAAS,CAAC,MAAM;gBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;;gBAC/C,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;QAChC,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAK,KAAgB,EAAE,CAAC;QAChF,MAAM,IAAI,GAAI,KAA4B,CAAC,KAAK,CAAC;QACjD,IAAI,IAAI,YAAY,YAAY,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9E,IAAI,IAAI,YAAY,UAAU,EAAI,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9E,IAAI,IAAI,YAAY,WAAW,EAAG,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;IAChF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,6DAA6D,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC3G,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACtB,CAAC;AAMD,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,MAAwB,EACxB,MAAsC,EACtC,OAAoC,EAAE;IAEtC,OAAO,IAAI,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,32 @@
1
+ export declare const BufferUsage: {
2
+ readonly MAP_READ: 1;
3
+ readonly MAP_WRITE: 2;
4
+ readonly COPY_SRC: 4;
5
+ readonly COPY_DST: 8;
6
+ readonly INDEX: 16;
7
+ readonly VERTEX: 32;
8
+ readonly UNIFORM: 64;
9
+ readonly STORAGE: 128;
10
+ readonly INDIRECT: 256;
11
+ readonly QUERY_RESOLVE: 512;
12
+ };
13
+ export declare const TextureUsage: {
14
+ readonly COPY_SRC: 1;
15
+ readonly COPY_DST: 2;
16
+ readonly TEXTURE_BINDING: 4;
17
+ readonly STORAGE_BINDING: 8;
18
+ readonly RENDER_ATTACHMENT: 16;
19
+ };
20
+ export declare const ShaderStage: {
21
+ readonly VERTEX: 1;
22
+ readonly FRAGMENT: 2;
23
+ readonly COMPUTE: 4;
24
+ };
25
+ export declare const ColorWrite: {
26
+ readonly RED: 1;
27
+ readonly GREEN: 2;
28
+ readonly BLUE: 4;
29
+ readonly ALPHA: 8;
30
+ readonly ALL: 15;
31
+ };
32
+ //# sourceMappingURL=webgpuFlags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgpuFlags.d.ts","sourceRoot":"","sources":["../../src/resources/webgpuFlags.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,WAAW;;;;;;;;;;;CAWd,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;CAMf,CAAC;AAEX,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;CAMb,CAAC"}
@@ -0,0 +1,40 @@
1
+ // `GPUBufferUsage` / `GPUTextureUsage` / `GPUMapMode` etc. are
2
+ // runtime-provided in the browser and Dawn-Node, but `@webgpu/types`
3
+ // is a types-only package — the constants don't exist when running
4
+ // under plain Node (vitest). Vendor the flag values here so the
5
+ // resource layer can compose usage flags portably.
6
+ //
7
+ // Numbers are taken from the WebGPU spec. They are part of the
8
+ // stable API surface.
9
+ export const BufferUsage = {
10
+ MAP_READ: 0x0001,
11
+ MAP_WRITE: 0x0002,
12
+ COPY_SRC: 0x0004,
13
+ COPY_DST: 0x0008,
14
+ INDEX: 0x0010,
15
+ VERTEX: 0x0020,
16
+ UNIFORM: 0x0040,
17
+ STORAGE: 0x0080,
18
+ INDIRECT: 0x0100,
19
+ QUERY_RESOLVE: 0x0200,
20
+ };
21
+ export const TextureUsage = {
22
+ COPY_SRC: 0x01,
23
+ COPY_DST: 0x02,
24
+ TEXTURE_BINDING: 0x04,
25
+ STORAGE_BINDING: 0x08,
26
+ RENDER_ATTACHMENT: 0x10,
27
+ };
28
+ export const ShaderStage = {
29
+ VERTEX: 0x1,
30
+ FRAGMENT: 0x2,
31
+ COMPUTE: 0x4,
32
+ };
33
+ export const ColorWrite = {
34
+ RED: 0x1,
35
+ GREEN: 0x2,
36
+ BLUE: 0x4,
37
+ ALPHA: 0x8,
38
+ ALL: 0xf,
39
+ };
40
+ //# sourceMappingURL=webgpuFlags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgpuFlags.js","sourceRoot":"","sources":["../../src/resources/webgpuFlags.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,qEAAqE;AACrE,mEAAmE;AACnE,gEAAgE;AAChE,mDAAmD;AACnD,EAAE;AACF,+DAA+D;AAC/D,sBAAsB;AAEtB,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,MAAM;IACjB,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,MAAM;IAChB,aAAa,EAAE,MAAM;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,IAAI;IACrB,iBAAiB,EAAE,IAAI;CACf,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,GAAG;IACX,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,GAAG,EAAE,GAAG;IACR,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,GAAG;IACV,GAAG,EAAE,GAAG;CACA,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CopySpec } from "../core/index.js";
2
+ export declare function copy(cmd: GPUCommandEncoder, spec: CopySpec): void;
3
+ //# sourceMappingURL=copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/runtime/copy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,wBAAgB,IAAI,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAOjE"}
@@ -0,0 +1,12 @@
1
+ // copy(cmd, spec) — encode a buffer↔buffer or texture↔texture
2
+ // transfer described by a `CopySpec`.
3
+ export function copy(cmd, spec) {
4
+ if (spec.kind === "buffer") {
5
+ const range = spec.range ?? { srcOffset: 0, dstOffset: 0, size: spec.src.size };
6
+ cmd.copyBufferToBuffer(spec.src, range.srcOffset, spec.dst, range.dstOffset, range.size);
7
+ }
8
+ else {
9
+ cmd.copyTextureToTexture(spec.src, spec.dst, spec.size);
10
+ }
11
+ }
12
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/runtime/copy.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,sCAAsC;AAItC,MAAM,UAAU,IAAI,CAAC,GAAsB,EAAE,IAAc;IACzD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChF,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3F,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { Runtime, type RuntimeOptions, } from "./runtime.js";
2
+ export { compileRenderTask, type RuntimeContext, } from "./renderTask.js";
3
+ export { copy } from "./copy.js";
4
+ export { renderTo, type RenderToOptions, type RenderToResult, } from "./renderTo.js";
5
+ export { ScenePass, type WalkerStats, } from "./scenePass.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,OAAO,EACP,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,QAAQ,EACR,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,EACT,KAAK,WAAW,GACjB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // Public API of @aardworx/wombat.rendering-runtime.
2
+ export { Runtime, } from "./runtime.js";
3
+ export { compileRenderTask, } from "./renderTask.js";
4
+ export { copy } from "./copy.js";
5
+ export { renderTo, } from "./renderTo.js";
6
+ export { ScenePass, } from "./scenePass.js";
7
+ //# sourceMappingURL=index.js.map