@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 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,OAAO,EACL,OAAO,GAER,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,GAElB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,QAAQ,GAGT,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,GAEV,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type Command, type CompiledEffect, type Effect, type IRenderTask } from "../core/index.js";
2
+ import { AdaptiveToken, type alist } from "@aardworx/wombat.adaptive";
3
+ export interface RuntimeContext {
4
+ readonly device: GPUDevice;
5
+ readonly compileEffect: (effect: Effect) => CompiledEffect;
6
+ }
7
+ export declare function compileRenderTask(ctx: RuntimeContext, commands: alist<Command>): IRenderTask & {
8
+ encode(enc: GPUCommandEncoder, token: AdaptiveToken): void;
9
+ };
10
+ //# sourceMappingURL=renderTask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderTask.d.ts","sourceRoot":"","sources":["../../src/runtime/renderTask.ts"],"names":[],"mappings":"AAcA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,MAAM,EAEX,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,KAAK,KAAK,EAAa,MAAM,2BAA2B,CAAC;AAIjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC;CAC5D;AA+FD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG;IAC9F,MAAM,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CAC5D,CAEA"}
@@ -0,0 +1,119 @@
1
+ // RenderTask — compile an `alist<Command>` into a runnable
2
+ // IRenderTask.
3
+ //
4
+ // Per `Render` command we lazily build a `ScenePass` that holds a
5
+ // stateful tree-walker subscribed to the dynamic subtrees
6
+ // (`Adaptive` / `OrderedFromList` / `UnorderedFromSet`). Each frame:
7
+ // - The walker pulls deltas from its readers (O(deltas) work).
8
+ // - It produces the ordered list of `PreparedRenderObject`s.
9
+ // - We open the render pass and call `record(pass, token)` per leaf.
10
+ //
11
+ // The previous per-frame `collectLeaves` recursion through the tree
12
+ // is gone. Static subtrees prep their leaves once at construction;
13
+ // dynamic subtrees splice on delta — see scenePass.ts.
14
+ import { RenderContext, } from "../core/index.js";
15
+ import { beginPassDescriptor, clear } from "../commands/index.js";
16
+ import { AdaptiveToken } from "@aardworx/wombat.adaptive";
17
+ import { copy } from "./copy.js";
18
+ import { ScenePass } from "./scenePass.js";
19
+ class RenderTask {
20
+ ctx;
21
+ commands;
22
+ /**
23
+ * Cache of `ScenePass`es keyed on the `Render` command itself.
24
+ * Holding ScenePass per command means the same `RenderTree`
25
+ * reused across frames keeps its incrementally-maintained
26
+ * walker state.
27
+ */
28
+ _scenes = new Map();
29
+ _disposed = false;
30
+ constructor(ctx, commands) {
31
+ this.ctx = ctx;
32
+ this.commands = commands;
33
+ }
34
+ run(token) {
35
+ if (this._disposed)
36
+ throw new Error("RenderTask: run after dispose");
37
+ const enc = this.ctx.device.createCommandEncoder();
38
+ this.encode(enc, token);
39
+ this.ctx.device.queue.submit([enc.finish()]);
40
+ }
41
+ encode(enc, token) {
42
+ if (this._disposed)
43
+ throw new Error("RenderTask: encode after dispose");
44
+ RenderContext.withEncoder(enc, () => {
45
+ const arr = [];
46
+ for (const c of this.commands.content.getValue(token))
47
+ arr.push(c);
48
+ for (let i = 0; i < arr.length; i++) {
49
+ const c = arr[i];
50
+ if (c.kind === "Clear") {
51
+ const next = arr[i + 1];
52
+ if (next !== undefined && next.kind === "Render" && next.output === c.output) {
53
+ this.encodeRenderCommand(enc, next, token, c.values);
54
+ i++;
55
+ continue;
56
+ }
57
+ }
58
+ this.encodeCommand(enc, c, token);
59
+ }
60
+ });
61
+ }
62
+ dispose() {
63
+ if (this._disposed)
64
+ return;
65
+ for (const s of this._scenes.values())
66
+ s.dispose();
67
+ this._scenes.clear();
68
+ this._disposed = true;
69
+ }
70
+ encodeCommand(enc, c, token) {
71
+ switch (c.kind) {
72
+ case "Clear":
73
+ clear(enc, c.output.getValue(token), c.values);
74
+ return;
75
+ case "Copy":
76
+ copy(enc, c.copy);
77
+ return;
78
+ case "Custom":
79
+ c.encode(enc);
80
+ return;
81
+ case "Render":
82
+ this.encodeRenderCommand(enc, c, token);
83
+ return;
84
+ }
85
+ }
86
+ encodeRenderCommand(enc, cmd, token, clearValues) {
87
+ const output = cmd.output.getValue(token);
88
+ const scene = this.sceneFor(cmd, output, cmd.tree);
89
+ const leaves = scene.resolve(token);
90
+ if (leaves.length === 0 && clearValues === undefined)
91
+ return;
92
+ // Either we have draws or we need to clear — open a single pass.
93
+ const pass = enc.beginRenderPass(beginPassDescriptor(output, clearValues));
94
+ for (const leaf of leaves)
95
+ leaf.record(pass, token);
96
+ pass.end();
97
+ }
98
+ sceneFor(cmd, output, tree) {
99
+ let s = this._scenes.get(cmd);
100
+ if (s === undefined) {
101
+ s = new ScenePass(this.ctx.device, output.signature, tree, this.ctx.compileEffect);
102
+ this._scenes.set(cmd, s);
103
+ }
104
+ return s;
105
+ // Note: `output.signature` is read here only to seed the
106
+ // ScenePass; subsequent frames continue to use this signature
107
+ // even if the framebuffer aval emits a different sig. That
108
+ // matches the `(RenderObject, signature)` cache invariant —
109
+ // changing signature requires a fresh Render command.
110
+ }
111
+ }
112
+ export function compileRenderTask(ctx, commands) {
113
+ return new RenderTask(ctx, commands);
114
+ }
115
+ // `RenderTree` carries an `aval<RenderTree>` inside its `Adaptive`
116
+ // variant; this `void` reference keeps the `aval` import live.
117
+ const _avalGuard = undefined;
118
+ void _avalGuard;
119
+ //# sourceMappingURL=renderTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderTask.js","sourceRoot":"","sources":["../../src/runtime/renderTask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { AdaptiveResource, ITexture, type ClearValues, type FramebufferSignature, type IFramebuffer, type RenderTree } from "../core/index.js";
2
+ import { type FramebufferSize } from "../resources/index.js";
3
+ import { HashMap, type aval } from "@aardworx/wombat.adaptive";
4
+ import type { RuntimeContext } from "./renderTask.js";
5
+ export interface RenderToOptions {
6
+ readonly size: aval<FramebufferSize>;
7
+ readonly signature: FramebufferSignature;
8
+ /** What to clear the FBO with each frame. Omit to skip the clear pass. */
9
+ readonly clear?: ClearValues;
10
+ readonly label?: string;
11
+ /**
12
+ * Extra GPU texture usage flags for every color attachment.
13
+ * `RENDER_ATTACHMENT | TEXTURE_BINDING` are always set; pass
14
+ * `COPY_SRC` here to enable readback, `STORAGE_BINDING` for
15
+ * compute writes, etc.
16
+ */
17
+ readonly extraUsage?: GPUTextureUsageFlags;
18
+ }
19
+ export interface RenderToResult {
20
+ /** The full framebuffer resource. Acquire/release for explicit lifetime control. */
21
+ readonly framebuffer: AdaptiveResource<IFramebuffer>;
22
+ /**
23
+ * Returns an `aval<ITexture>` for the named color attachment.
24
+ * The aval is itself an AdaptiveResource — acquiring it
25
+ * activates the render-to pipeline.
26
+ */
27
+ color(name: string): AdaptiveResource<ITexture>;
28
+ /**
29
+ * Convenience for multi-target render passes: returns a
30
+ * `HashMap<string, aval<ITexture>>` covering every color
31
+ * attachment in the signature. Each entry shares the underlying
32
+ * lifetime — acquiring any (or the whole map's entries) activates
33
+ * the render-to pipeline.
34
+ */
35
+ colors(): HashMap<string, AdaptiveResource<ITexture>>;
36
+ /** Returns the depth-stencil attachment as an `ITexture` (if the signature has one). */
37
+ depthStencil(): AdaptiveResource<ITexture>;
38
+ }
39
+ export declare function renderTo(ctx: RuntimeContext, scene: RenderTree, opts: RenderToOptions): RenderToResult;
40
+ //# sourceMappingURL=renderTo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderTo.d.ts","sourceRoot":"","sources":["../../src/runtime/renderTo.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,gBAAgB,EAChB,QAAQ,EAER,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,OAAO,EAAsB,KAAK,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAEnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC;CAC5C;AAED,MAAM,WAAW,cAAc;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACrD;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAChD;;;;;;OAMG;IACH,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,wFAAwF;IACxF,YAAY,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;CAC5C;AAyCD,wBAAgB,QAAQ,CACtB,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,eAAe,GACpB,cAAc,CAqChB"}
@@ -0,0 +1,97 @@
1
+ // renderTo — Aardvark `RenderTask.renderTo` ported.
2
+ //
3
+ // Usage:
4
+ // const result = renderTo(ctx, scene, { size, signature, clear });
5
+ // const colorAval: aval<ITexture> = result.color("color");
6
+ // // bind colorAval as a texture on a downstream RenderObject
7
+ //
8
+ // `result.framebuffer` is an `AdaptiveResource<IFramebuffer>` that:
9
+ // - Allocates the FBO on first acquire.
10
+ // - On `compute(token)`: reads `size`, encodes a clear pass +
11
+ // scene render into the active `RenderContext.encoder`, returns
12
+ // the FBO. Encoding only runs when an outer encoder is active;
13
+ // when read outside a frame the FBO is returned untouched.
14
+ // - On last release: disposes the inner cache and frees the FBO.
15
+ //
16
+ // Each `result.color(name)` is a derived `aval<ITexture>` whose
17
+ // lifetime forwards to `framebuffer`, so consuming any attachment
18
+ // keeps the whole pipeline alive.
19
+ import { AdaptiveResource, ITexture, RenderContext, } from "../core/index.js";
20
+ import { allocateFramebuffer, } from "../resources/index.js";
21
+ import { beginPassDescriptor } from "../commands/index.js";
22
+ import { HashMap } from "@aardworx/wombat.adaptive";
23
+ import { ScenePass } from "./scenePass.js";
24
+ class RenderToFramebuffer extends AdaptiveResource {
25
+ ctx;
26
+ fbo;
27
+ scene;
28
+ clearValues;
29
+ signature;
30
+ scenePass;
31
+ constructor(ctx, fbo, scene, clearValues, signature) {
32
+ super();
33
+ this.ctx = ctx;
34
+ this.fbo = fbo;
35
+ this.scene = scene;
36
+ this.clearValues = clearValues;
37
+ this.signature = signature;
38
+ }
39
+ create() {
40
+ this.fbo.acquire();
41
+ this.scenePass = new ScenePass(this.ctx.device, this.signature, this.scene, this.ctx.compileEffect);
42
+ }
43
+ destroy() {
44
+ this.scenePass?.dispose();
45
+ this.scenePass = undefined;
46
+ this.fbo.release();
47
+ }
48
+ compute(token) {
49
+ const fb = this.fbo.getValue(token);
50
+ const enc = RenderContext.encoder;
51
+ if (enc !== null && this.scenePass !== undefined) {
52
+ const leaves = this.scenePass.resolve(token);
53
+ if (leaves.length > 0 || this.clearValues !== undefined) {
54
+ const pass = enc.beginRenderPass(beginPassDescriptor(fb, this.clearValues));
55
+ for (const leaf of leaves)
56
+ leaf.record(pass, token);
57
+ pass.end();
58
+ }
59
+ }
60
+ return fb;
61
+ }
62
+ }
63
+ export function renderTo(ctx, scene, opts) {
64
+ const fbo = allocateFramebuffer(ctx.device, opts.signature, opts.size, {
65
+ ...(opts.label !== undefined ? { labelPrefix: opts.label } : {}),
66
+ ...(opts.extraUsage !== undefined ? { extraUsage: opts.extraUsage } : {}),
67
+ });
68
+ const renderToFbo = new RenderToFramebuffer(ctx, fbo, scene, opts.clear, opts.signature);
69
+ return {
70
+ framebuffer: renderToFbo,
71
+ color(name) {
72
+ return renderToFbo.derive(fb => {
73
+ const tex = fb.colorTextures?.tryFind(name);
74
+ if (tex === undefined) {
75
+ throw new Error(`renderTo.color: framebuffer has no color attachment "${name}"`);
76
+ }
77
+ return ITexture.fromGPU(tex);
78
+ });
79
+ },
80
+ colors() {
81
+ let out = HashMap.empty();
82
+ for (const [name] of opts.signature.colors) {
83
+ out = out.add(name, this.color(name));
84
+ }
85
+ return out;
86
+ },
87
+ depthStencil() {
88
+ return renderToFbo.derive(fb => {
89
+ if (fb.depthStencilTexture === undefined) {
90
+ throw new Error("renderTo.depthStencil: framebuffer has no depth-stencil attachment");
91
+ }
92
+ return ITexture.fromGPU(fb.depthStencilTexture);
93
+ });
94
+ },
95
+ };
96
+ }
97
+ //# sourceMappingURL=renderTo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderTo.js","sourceRoot":"","sources":["../../src/runtime/renderTo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { Command, CompiledEffect, Effect, IRenderTask, RenderTree } from "../core/index.js";
2
+ import type { alist } from "@aardworx/wombat.adaptive";
3
+ import { type RenderToOptions, type RenderToResult } from "./renderTo.js";
4
+ export interface RuntimeOptions {
5
+ readonly device: GPUDevice;
6
+ /**
7
+ * Optional override for `Effect → CompiledEffect`. Defaults to
8
+ * `effect.compile({ target: "wgsl" })`. Override when tests want
9
+ * a hand-built CompiledEffect or when the caller needs custom
10
+ * `CompileOptions` (`skipMatrixReversal`, source-file labelling,
11
+ * …).
12
+ */
13
+ readonly compileEffect?: (effect: Effect) => CompiledEffect;
14
+ }
15
+ export declare class Runtime {
16
+ private readonly ctx;
17
+ private readonly _tasks;
18
+ private _disposed;
19
+ private _deviceLost;
20
+ /**
21
+ * Resolves to the lost-info when the device is reported lost.
22
+ * Stays pending while the device is alive.
23
+ */
24
+ readonly deviceLost: Promise<GPUDeviceLostInfo>;
25
+ constructor(opts: RuntimeOptions);
26
+ get device(): GPUDevice;
27
+ get isDeviceLost(): boolean;
28
+ /** Compile an `alist<Command>` into a runnable `IRenderTask`. */
29
+ compile(commands: alist<Command>): IRenderTask;
30
+ /**
31
+ * Render `scene` into a freshly-allocated framebuffer, returning
32
+ * lazy `aval<ITexture>` handles for each color/depth attachment.
33
+ * The framebuffer + inner render task come live when any
34
+ * returned aval is acquired (transitively, e.g. by binding it
35
+ * to a downstream RenderObject), and shut down on last release.
36
+ */
37
+ renderTo(scene: RenderTree, opts: RenderToOptions): RenderToResult;
38
+ /**
39
+ * Tear down every IRenderTask compiled through this Runtime.
40
+ * After calling this, `compile()` and `renderTo()` throw.
41
+ * Idempotent. Intended for page-unload + fatal error paths.
42
+ *
43
+ * Note: doesn't destroy the GPUDevice itself — the user still
44
+ * owns its lifecycle.
45
+ */
46
+ disposeAll(): void;
47
+ }
48
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EAAY,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC;CAC7D;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiB;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;gBAEpC,IAAI,EAAE,cAAc;IAoBhC,IAAI,MAAM,IAAI,SAAS,CAA4B;IACnD,IAAI,YAAY,IAAI,OAAO,CAA6B;IAqBxD,iEAAiE;IACjE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW;IAS9C;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,GAAG,cAAc;IAKlE;;;;;;;OAOG;IACH,UAAU,IAAI,IAAI;CAQnB"}
@@ -0,0 +1,100 @@
1
+ // Runtime — the user-facing entry point. Holds the device +
2
+ // effect-compilation hook, exposes `compile(commands)` and
3
+ // (eventually) `renderTo(...)`.
4
+ import { compileRenderTask } from "./renderTask.js";
5
+ import { renderTo } from "./renderTo.js";
6
+ export class Runtime {
7
+ ctx;
8
+ _tasks = new Set();
9
+ _disposed = false;
10
+ _deviceLost = false;
11
+ /**
12
+ * Resolves to the lost-info when the device is reported lost.
13
+ * Stays pending while the device is alive.
14
+ */
15
+ deviceLost;
16
+ constructor(opts) {
17
+ this.ctx = {
18
+ device: opts.device,
19
+ compileEffect: opts.compileEffect ?? ((e) => e.compile({ target: "wgsl" })),
20
+ };
21
+ // `device.lost` is a real-WebGPU promise; mock devices may not
22
+ // expose it. Treat as "never lost" in that case.
23
+ const lost = opts.device.lost;
24
+ this.deviceLost = lost !== undefined
25
+ ? lost.then((info) => {
26
+ this._deviceLost = true;
27
+ // Best-effort: dispose all outstanding tasks so user code
28
+ // that still holds them stops trying to encode against a
29
+ // dead device.
30
+ this.disposeAll();
31
+ return info;
32
+ })
33
+ : new Promise(() => { });
34
+ }
35
+ get device() { return this.ctx.device; }
36
+ get isDeviceLost() { return this._deviceLost; }
37
+ // Recovery story (after `device.lost`):
38
+ //
39
+ // 1. The `lost`-handler above fires `disposeAll()`, releasing all
40
+ // `IRenderTask`s and the `PreparedRenderObject`s they hold.
41
+ // User-level avals (`cval`, `clist`, `cset`) survive — they're
42
+ // device-agnostic.
43
+ // 2. Caller re-requests an adapter + device, constructs a new
44
+ // `Runtime` from it, and re-`compile()`s their original
45
+ // `alist<Command>`. The new Runtime builds fresh
46
+ // PreparedRenderObjects + a fresh ScenePass tree from the same
47
+ // user data; the per-device caches inside compile-pipeline /
48
+ // sampler / mip-gen are keyed on `WeakMap<GPUDevice, ...>` so
49
+ // they re-populate naturally for the new device.
50
+ //
51
+ // We don't expose a single-call `replaceDevice()` because every
52
+ // prepared object's GPU handles are baked in at construction; the
53
+ // cleanest path is to discard the old Runtime and construct a new
54
+ // one from the same source `alist<Command>`.
55
+ /** Compile an `alist<Command>` into a runnable `IRenderTask`. */
56
+ compile(commands) {
57
+ if (this._disposed)
58
+ throw new Error("Runtime: compile after disposeAll");
59
+ const task = compileRenderTask(this.ctx, commands);
60
+ this._tasks.add(task);
61
+ const origDispose = task.dispose.bind(task);
62
+ task.dispose = () => { origDispose(); this._tasks.delete(task); };
63
+ return task;
64
+ }
65
+ /**
66
+ * Render `scene` into a freshly-allocated framebuffer, returning
67
+ * lazy `aval<ITexture>` handles for each color/depth attachment.
68
+ * The framebuffer + inner render task come live when any
69
+ * returned aval is acquired (transitively, e.g. by binding it
70
+ * to a downstream RenderObject), and shut down on last release.
71
+ */
72
+ renderTo(scene, opts) {
73
+ if (this._disposed)
74
+ throw new Error("Runtime: renderTo after disposeAll");
75
+ return renderTo(this.ctx, scene, opts);
76
+ }
77
+ /**
78
+ * Tear down every IRenderTask compiled through this Runtime.
79
+ * After calling this, `compile()` and `renderTo()` throw.
80
+ * Idempotent. Intended for page-unload + fatal error paths.
81
+ *
82
+ * Note: doesn't destroy the GPUDevice itself — the user still
83
+ * owns its lifecycle.
84
+ */
85
+ disposeAll() {
86
+ if (this._disposed)
87
+ return;
88
+ this._disposed = true;
89
+ for (const t of [...this._tasks]) {
90
+ try {
91
+ t.dispose();
92
+ }
93
+ catch (e) {
94
+ console.error("Runtime.disposeAll: task.dispose threw", e);
95
+ }
96
+ }
97
+ this._tasks.clear();
98
+ }
99
+ }
100
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type AdaptiveToken } from "@aardworx/wombat.adaptive";
2
+ import { type CompiledEffect, type Effect, type FramebufferSignature, type RenderTree } from "../core/index.js";
3
+ import { type PreparedRenderObject } from "../resources/index.js";
4
+ /**
5
+ * Counters surfaced for tests. `prepareCount` only goes up when
6
+ * `prepareRenderObject` is called for a fresh RenderObject; it
7
+ * does not increment per frame on an unchanged scene.
8
+ */
9
+ export interface WalkerStats {
10
+ prepareCount: number;
11
+ }
12
+ export declare class ScenePass {
13
+ private readonly root;
14
+ /** Bumped on `prepareRenderObject`. Tests use this to confirm O(deltas) prep cost. */
15
+ readonly stats: WalkerStats;
16
+ constructor(device: GPUDevice, signature: FramebufferSignature, tree: RenderTree, compileEffect: (e: Effect) => CompiledEffect);
17
+ /**
18
+ * Pull deltas from every dynamic subtree, splice the affected
19
+ * walkers, and produce the current ordered list of leaves.
20
+ * Idempotent on a clean adaptive graph (no readers fire).
21
+ */
22
+ resolve(token: AdaptiveToken): PreparedRenderObject[];
23
+ dispose(): void;
24
+ }
25
+ //# sourceMappingURL=scenePass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenePass.d.ts","sourceRoot":"","sources":["../../src/runtime/scenePass.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,KAAK,aAAa,EAQnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,MAAM,EACX,KAAK,oBAAoB,EAEzB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAS/B;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAkMD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAuB;gBAGhD,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,oBAAoB,EAC/B,IAAI,EAAE,UAAU,EAChB,aAAa,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,cAAc;IAM9C;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,oBAAoB,EAAE;IAOrD,OAAO,IAAI,IAAI;CAGhB"}