@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,99 @@
1
+ // prepareAdaptiveBuffer — lift `aval<IBuffer>` to
2
+ // `AdaptiveResource<GPUBuffer>`.
3
+ //
4
+ // Behaviour:
5
+ // - On `acquire` (refCount 0→1): subscribes, allocates nothing yet.
6
+ // - On `compute(token)`:
7
+ // - reads the source `aval<IBuffer>`;
8
+ // - if it's `gpu`: returns the user's handle directly. We
9
+ // don't own it; `destroy()` will not free it.
10
+ // - if it's `host`: ensures we own a `GPUBuffer` of sufficient
11
+ // size + correct usage flags, encodes a `writeBuffer` (via
12
+ // device.queue) to upload the bytes, returns the owned
13
+ // buffer. Reuses the existing buffer when capacity allows;
14
+ // reallocates on growth.
15
+ // - On `destroy`: frees the owned buffer (if any).
16
+ //
17
+ // `writeBuffer` does not require a GPUCommandEncoder — it goes via
18
+ // `GPUQueue.writeBuffer`, scheduled at the next submit. That keeps
19
+ // the upload path simple and avoids needing `RenderContext.encoder`
20
+ // for plain CPU→GPU buffer flow. (Compute-produced buffers will
21
+ // need the encoder; that's a different code path.)
22
+ import { AdaptiveResource, tryAcquire, tryRelease, } from "../core/index.js";
23
+ import {} from "@aardworx/wombat.adaptive";
24
+ import { BufferUsage } from "./webgpuFlags.js";
25
+ class AdaptiveBuffer extends AdaptiveResource {
26
+ device;
27
+ source;
28
+ opts;
29
+ _owned = undefined;
30
+ _ownedCapacity = 0;
31
+ constructor(device, source, opts) {
32
+ super();
33
+ this.device = device;
34
+ this.source = source;
35
+ this.opts = opts;
36
+ }
37
+ create() {
38
+ tryAcquire(this.source);
39
+ }
40
+ destroy() {
41
+ if (this._owned !== undefined) {
42
+ this._owned.destroy();
43
+ this._owned = undefined;
44
+ this._ownedCapacity = 0;
45
+ }
46
+ tryRelease(this.source);
47
+ }
48
+ compute(token) {
49
+ const src = this.source.getValue(token);
50
+ if (src.kind === "gpu") {
51
+ // Caller-owned buffer; drop any owned allocation we still hold.
52
+ if (this._owned !== undefined) {
53
+ this._owned.destroy();
54
+ this._owned = undefined;
55
+ this._ownedCapacity = 0;
56
+ }
57
+ return src.buffer;
58
+ }
59
+ // host — upload via queue.writeBuffer.
60
+ const usage = this.opts.usage | BufferUsage.COPY_DST;
61
+ const reuseOnFit = this.opts.reuseOnFit ?? true;
62
+ const requiredSize = roundUp4(src.sizeBytes);
63
+ if (this._owned === undefined
64
+ || !reuseOnFit
65
+ || requiredSize > this._ownedCapacity) {
66
+ if (this._owned !== undefined)
67
+ this._owned.destroy();
68
+ const desc = {
69
+ size: requiredSize,
70
+ usage,
71
+ ...(this.opts.label !== undefined ? { label: this.opts.label } : {}),
72
+ };
73
+ this._owned = this.device.createBuffer(desc);
74
+ this._ownedCapacity = requiredSize;
75
+ }
76
+ // writeBuffer accepts ArrayBuffer or any ArrayBufferView.
77
+ const data = src.data;
78
+ if (data instanceof ArrayBuffer) {
79
+ this.device.queue.writeBuffer(this._owned, 0, data, 0, src.sizeBytes);
80
+ }
81
+ else {
82
+ this.device.queue.writeBuffer(this._owned, 0, data.buffer, data.byteOffset, src.sizeBytes);
83
+ }
84
+ return this._owned;
85
+ }
86
+ }
87
+ function roundUp4(n) {
88
+ return (n + 3) & ~3;
89
+ }
90
+ /**
91
+ * Wrap an `aval<IBuffer>` as a ref-counted, adaptively-uploaded
92
+ * `AdaptiveResource<GPUBuffer>`. The resource is itself an
93
+ * `aval<GPUBuffer>` — downstream consumers can `getValue(token)`
94
+ * inside their own adaptive evaluation.
95
+ */
96
+ export function prepareAdaptiveBuffer(device, source, opts) {
97
+ return new AdaptiveBuffer(device, source, opts);
98
+ }
99
+ //# sourceMappingURL=adaptiveBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptiveBuffer.js","sourceRoot":"","sources":["../../src/resources/adaptiveBuffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { AdaptiveResource, type ISampler } from "../core/index.js";
2
+ import { type aval } from "@aardworx/wombat.adaptive";
3
+ export declare function prepareAdaptiveSampler(device: GPUDevice, source: aval<ISampler>): AdaptiveResource<GPUSampler>;
4
+ //# sourceMappingURL=adaptiveSampler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptiveSampler.d.ts","sourceRoot":"","sources":["../../src/resources/adaptiveSampler.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,gBAAgB,EAGhB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,IAAI,EACV,MAAM,2BAA2B,CAAC;AA2DnC,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,GACrB,gBAAgB,CAAC,UAAU,CAAC,CAE9B"}
@@ -0,0 +1,73 @@
1
+ // prepareAdaptiveSampler — lift `aval<ISampler>` to
2
+ // `AdaptiveResource<GPUSampler>`.
3
+ //
4
+ // Samplers are cheap and structurally-identifiable — the device
5
+ // dedupes them via a descriptor cache. Per AdaptiveResource we
6
+ // just track the most recent handle; on descriptor change we
7
+ // fetch a fresh one from the cache.
8
+ import { AdaptiveResource, tryAcquire, tryRelease, } from "../core/index.js";
9
+ import {} from "@aardworx/wombat.adaptive";
10
+ class SamplerCache {
11
+ device;
12
+ map = new Map();
13
+ constructor(device) {
14
+ this.device = device;
15
+ }
16
+ get(desc) {
17
+ const k = key(desc);
18
+ let s = this.map.get(k);
19
+ if (s === undefined) {
20
+ s = this.device.createSampler(desc);
21
+ this.map.set(k, s);
22
+ }
23
+ return s;
24
+ }
25
+ }
26
+ function key(d) {
27
+ return [
28
+ d.addressModeU ?? "clamp-to-edge",
29
+ d.addressModeV ?? "clamp-to-edge",
30
+ d.addressModeW ?? "clamp-to-edge",
31
+ d.magFilter ?? "nearest",
32
+ d.minFilter ?? "nearest",
33
+ d.mipmapFilter ?? "nearest",
34
+ d.lodMinClamp ?? 0,
35
+ d.lodMaxClamp ?? 32,
36
+ d.compare ?? "",
37
+ d.maxAnisotropy ?? 1,
38
+ ].join("|");
39
+ }
40
+ const caches = new WeakMap();
41
+ function cacheFor(device) {
42
+ let c = caches.get(device);
43
+ if (c === undefined) {
44
+ c = new SamplerCache(device);
45
+ caches.set(device, c);
46
+ }
47
+ return c;
48
+ }
49
+ class AdaptiveSampler extends AdaptiveResource {
50
+ device;
51
+ source;
52
+ constructor(device, source) {
53
+ super();
54
+ this.device = device;
55
+ this.source = source;
56
+ }
57
+ create() { tryAcquire(this.source); }
58
+ destroy() {
59
+ // We never own the GPUSampler — the cache does. Just propagate
60
+ // release to the source aval (in case it's an AdaptiveResource).
61
+ tryRelease(this.source);
62
+ }
63
+ compute(token) {
64
+ const s = this.source.getValue(token);
65
+ if (s.kind === "gpu")
66
+ return s.sampler;
67
+ return cacheFor(this.device).get(s.descriptor);
68
+ }
69
+ }
70
+ export function prepareAdaptiveSampler(device, source) {
71
+ return new AdaptiveSampler(device, source);
72
+ }
73
+ //# sourceMappingURL=adaptiveSampler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptiveSampler.js","sourceRoot":"","sources":["../../src/resources/adaptiveSampler.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,kCAAkC;AAClC,EAAE;AACF,gEAAgE;AAChE,+DAA+D;AAC/D,6DAA6D;AAC7D,oCAAoC;AAEpC,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,UAAU,GAEX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGN,MAAM,2BAA2B,CAAC;AAEnC,MAAM,YAAY;IAEa;IADZ,GAAG,GAAG,IAAI,GAAG,EAAsB,CAAC;IACrD,YAA6B,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;IAAG,CAAC;IAClD,GAAG,CAAC,IAA0B;QAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAED,SAAS,GAAG,CAAC,CAAuB;IAClC,OAAO;QACL,CAAC,CAAC,YAAY,IAAI,eAAe;QACjC,CAAC,CAAC,YAAY,IAAI,eAAe;QACjC,CAAC,CAAC,YAAY,IAAI,eAAe;QACjC,CAAC,CAAC,SAAS,IAAI,SAAS;QACxB,CAAC,CAAC,SAAS,IAAI,SAAS;QACxB,CAAC,CAAC,YAAY,IAAI,SAAS;QAC3B,CAAC,CAAC,WAAW,IAAI,CAAC;QAClB,CAAC,CAAC,WAAW,IAAI,EAAE;QACnB,CAAC,CAAC,OAAO,IAAI,EAAE;QACf,CAAC,CAAC,aAAa,IAAI,CAAC;KACrB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,OAAO,EAA2B,CAAC;AACtD,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,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,eAAgB,SAAQ,gBAA4B;IAErC;IACA;IAFnB,YACmB,MAAiB,EACjB,MAAsB;QACrC,KAAK,EAAE,CAAC;QAFO,WAAM,GAAN,MAAM,CAAW;QACjB,WAAM,GAAN,MAAM,CAAgB;IAC5B,CAAC;IACJ,MAAM,KAAW,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO;QACf,+DAA+D;QAC/D,iEAAiE;QACjE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IACQ,OAAO,CAAC,KAAoB;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,CAAC,CAAC,OAAO,CAAC;QACvC,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,MAAsB;IAEtB,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { AdaptiveResource, type ITexture } from "../core/index.js";
2
+ import { type aval } from "@aardworx/wombat.adaptive";
3
+ export interface PrepareAdaptiveTextureOptions {
4
+ /** Extra usage flags. `COPY_DST` and `TEXTURE_BINDING` are added automatically. */
5
+ readonly usage?: GPUTextureUsageFlags;
6
+ /** Optional debug label. */
7
+ readonly label?: string;
8
+ }
9
+ /**
10
+ * Wrap an `aval<ITexture>` as a ref-counted, adaptively-uploaded
11
+ * `AdaptiveResource<GPUTexture>`.
12
+ */
13
+ export declare function prepareAdaptiveTexture(device: GPUDevice, source: aval<ITexture>, opts?: PrepareAdaptiveTextureOptions): AdaptiveResource<GPUTexture>;
14
+ //# sourceMappingURL=adaptiveTexture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptiveTexture.d.ts","sourceRoot":"","sources":["../../src/resources/adaptiveTexture.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,gBAAgB,EAGhB,KAAK,QAAQ,EAGd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,IAAI,EACV,MAAM,2BAA2B,CAAC;AAGnC,MAAM,WAAW,6BAA6B;IAC5C,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC;IACtC,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AA8ND;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EACtB,IAAI,GAAE,6BAAkC,GACvC,gBAAgB,CAAC,UAAU,CAAC,CAE9B"}
@@ -0,0 +1,265 @@
1
+ // prepareAdaptiveTexture — lift `aval<ITexture>` to
2
+ // `AdaptiveResource<GPUTexture>`.
3
+ //
4
+ // Behaviour matches `prepareAdaptiveBuffer`: on `compute`, if the
5
+ // source is `gpu` return the user's handle; if `host`, ensure we
6
+ // own a GPUTexture of the right size/format and upload via the
7
+ // queue (writeTexture for raw, copyExternalImageToTexture for
8
+ // external sources).
9
+ //
10
+ // Reuse: a host source with the same dimensions + format reuses
11
+ // the existing texture; mismatch triggers a fresh allocation.
12
+ //
13
+ // Mip-map generation is not implemented in this first cut —
14
+ // `generateMips: true` on an external source allocates the mip
15
+ // levels but only mip 0 is uploaded. (Mip generation requires a
16
+ // compute pass; that lands in a follow-up.)
17
+ import { AdaptiveResource, tryAcquire, tryRelease, } from "../core/index.js";
18
+ import {} from "@aardworx/wombat.adaptive";
19
+ import { TextureUsage } from "./webgpuFlags.js";
20
+ function descsEqual(a, b) {
21
+ return (a.width === b.width
22
+ && a.height === b.height
23
+ && a.depthOrArrayLayers === b.depthOrArrayLayers
24
+ && a.format === b.format
25
+ && a.mipLevelCount === b.mipLevelCount);
26
+ }
27
+ function descFor(src) {
28
+ if (src.kind === "raw") {
29
+ return {
30
+ width: src.width,
31
+ height: src.height,
32
+ depthOrArrayLayers: src.depthOrArrayLayers ?? 1,
33
+ format: src.format,
34
+ mipLevelCount: src.mipLevelCount ?? 1,
35
+ };
36
+ }
37
+ // external
38
+ const s = src.source;
39
+ let width = 0;
40
+ let height = 0;
41
+ if (s instanceof ImageData) {
42
+ width = s.width;
43
+ height = s.height;
44
+ }
45
+ else if ("naturalWidth" in s && typeof s.naturalWidth === "number") {
46
+ // HTMLImageElement
47
+ width = s.naturalWidth || s.width;
48
+ height = s.naturalHeight || s.height;
49
+ }
50
+ else if ("videoWidth" in s && typeof s.videoWidth === "number") {
51
+ // HTMLVideoElement
52
+ width = s.videoWidth;
53
+ height = s.videoHeight;
54
+ }
55
+ else {
56
+ // ImageBitmap, HTMLCanvasElement, OffscreenCanvas — all have width/height
57
+ width = s.width;
58
+ height = s.height;
59
+ }
60
+ const generateMips = src.generateMips === true;
61
+ return {
62
+ width, height, depthOrArrayLayers: 1,
63
+ format: src.format ?? "rgba8unorm",
64
+ mipLevelCount: generateMips ? mipCount(width, height) : 1,
65
+ };
66
+ }
67
+ function mipCount(w, h) {
68
+ return Math.floor(Math.log2(Math.max(w, h))) + 1;
69
+ }
70
+ class AdaptiveTexture extends AdaptiveResource {
71
+ device;
72
+ source;
73
+ opts;
74
+ _owned = undefined;
75
+ _ownedDesc = undefined;
76
+ constructor(device, source, opts) {
77
+ super();
78
+ this.device = device;
79
+ this.source = source;
80
+ this.opts = opts;
81
+ }
82
+ create() { tryAcquire(this.source); }
83
+ destroy() {
84
+ if (this._owned !== undefined) {
85
+ this._owned.destroy();
86
+ this._owned = undefined;
87
+ this._ownedDesc = undefined;
88
+ }
89
+ tryRelease(this.source);
90
+ }
91
+ compute(token) {
92
+ const src = this.source.getValue(token);
93
+ if (src.kind === "gpu") {
94
+ if (this._owned !== undefined) {
95
+ this._owned.destroy();
96
+ this._owned = undefined;
97
+ this._ownedDesc = undefined;
98
+ }
99
+ return src.texture;
100
+ }
101
+ const desc = descFor(src.source);
102
+ const usage = (this.opts.usage ?? 0)
103
+ | TextureUsage.COPY_DST
104
+ | TextureUsage.TEXTURE_BINDING
105
+ | (src.source.kind === "external" ? TextureUsage.RENDER_ATTACHMENT : 0);
106
+ if (this._owned === undefined || this._ownedDesc === undefined || !descsEqual(this._ownedDesc, desc)) {
107
+ if (this._owned !== undefined)
108
+ this._owned.destroy();
109
+ const tdesc = {
110
+ size: { width: desc.width, height: desc.height, depthOrArrayLayers: desc.depthOrArrayLayers },
111
+ format: desc.format,
112
+ mipLevelCount: desc.mipLevelCount,
113
+ usage,
114
+ ...(this.opts.label !== undefined ? { label: this.opts.label } : {}),
115
+ };
116
+ this._owned = this.device.createTexture(tdesc);
117
+ this._ownedDesc = desc;
118
+ }
119
+ if (src.source.kind === "raw") {
120
+ uploadRaw(this.device, this._owned, src.source);
121
+ }
122
+ else {
123
+ uploadExternal(this.device, this._owned, src.source);
124
+ }
125
+ return this._owned;
126
+ }
127
+ }
128
+ function uploadRaw(device, tex, src) {
129
+ const bytes = src.data instanceof ArrayBuffer ? new Uint8Array(src.data) : new Uint8Array(src.data.buffer, src.data.byteOffset, src.data.byteLength);
130
+ const block = blockInfoFor(src.format);
131
+ const blocksPerRow = Math.ceil(src.width / block.width);
132
+ const rowsOfBlocks = Math.ceil(src.height / block.height);
133
+ device.queue.writeTexture({ texture: tex }, bytes, { bytesPerRow: blocksPerRow * block.bytesPerBlock, rowsPerImage: rowsOfBlocks }, { width: src.width, height: src.height, depthOrArrayLayers: src.depthOrArrayLayers ?? 1 });
134
+ }
135
+ function uploadExternal(device, tex, src) {
136
+ device.queue.copyExternalImageToTexture({ source: src.source }, { texture: tex }, { width: src.source.width, height: src.source.height, depthOrArrayLayers: 1 });
137
+ }
138
+ /**
139
+ * Block dimensions + size for a WebGPU texture format. Linear
140
+ * (uncompressed) formats report 1×1 blocks. Block-compressed
141
+ * formats (BC*, ETC*, ASTC*, EAC) use their native block size so
142
+ * `writeTexture`'s bytesPerRow / rowsPerImage land on the right
143
+ * block grid.
144
+ */
145
+ function blockInfoFor(format) {
146
+ switch (format) {
147
+ // 8-bit
148
+ case "r8unorm":
149
+ case "r8snorm":
150
+ case "r8uint":
151
+ case "r8sint":
152
+ return { width: 1, height: 1, bytesPerBlock: 1 };
153
+ // 16-bit
154
+ case "rg8unorm":
155
+ case "rg8snorm":
156
+ case "rg8uint":
157
+ case "rg8sint":
158
+ case "r16uint":
159
+ case "r16sint":
160
+ case "r16float":
161
+ return { width: 1, height: 1, bytesPerBlock: 2 };
162
+ // 32-bit
163
+ case "rgba8unorm":
164
+ case "rgba8unorm-srgb":
165
+ case "rgba8snorm":
166
+ case "rgba8uint":
167
+ case "rgba8sint":
168
+ case "bgra8unorm":
169
+ case "bgra8unorm-srgb":
170
+ case "rgb10a2unorm":
171
+ case "rgb10a2uint":
172
+ case "rg11b10ufloat":
173
+ case "rgb9e5ufloat":
174
+ case "rg16uint":
175
+ case "rg16sint":
176
+ case "rg16float":
177
+ case "r32uint":
178
+ case "r32sint":
179
+ case "r32float":
180
+ return { width: 1, height: 1, bytesPerBlock: 4 };
181
+ // 64-bit
182
+ case "rgba16uint":
183
+ case "rgba16sint":
184
+ case "rgba16float":
185
+ case "rg32uint":
186
+ case "rg32sint":
187
+ case "rg32float":
188
+ return { width: 1, height: 1, bytesPerBlock: 8 };
189
+ // 128-bit
190
+ case "rgba32uint":
191
+ case "rgba32sint":
192
+ case "rgba32float":
193
+ return { width: 1, height: 1, bytesPerBlock: 16 };
194
+ // ---- Block-compressed formats ----
195
+ // BC1/2/3/4/5 (DXT/RGTC) — 4×4 blocks
196
+ case "bc1-rgba-unorm":
197
+ case "bc1-rgba-unorm-srgb":
198
+ case "bc4-r-unorm":
199
+ case "bc4-r-snorm":
200
+ return { width: 4, height: 4, bytesPerBlock: 8 };
201
+ case "bc2-rgba-unorm":
202
+ case "bc2-rgba-unorm-srgb":
203
+ case "bc3-rgba-unorm":
204
+ case "bc3-rgba-unorm-srgb":
205
+ case "bc5-rg-unorm":
206
+ case "bc5-rg-snorm":
207
+ case "bc6h-rgb-ufloat":
208
+ case "bc6h-rgb-float":
209
+ case "bc7-rgba-unorm":
210
+ case "bc7-rgba-unorm-srgb":
211
+ return { width: 4, height: 4, bytesPerBlock: 16 };
212
+ // ETC2 — 4×4 blocks
213
+ case "etc2-rgb8unorm":
214
+ case "etc2-rgb8unorm-srgb":
215
+ case "etc2-rgb8a1unorm":
216
+ case "etc2-rgb8a1unorm-srgb":
217
+ case "eac-r11unorm":
218
+ case "eac-r11snorm":
219
+ return { width: 4, height: 4, bytesPerBlock: 8 };
220
+ case "etc2-rgba8unorm":
221
+ case "etc2-rgba8unorm-srgb":
222
+ case "eac-rg11unorm":
223
+ case "eac-rg11snorm":
224
+ return { width: 4, height: 4, bytesPerBlock: 16 };
225
+ // ASTC — variable block size, all 16 bytes/block.
226
+ case "astc-4x4-unorm":
227
+ case "astc-4x4-unorm-srgb": return { width: 4, height: 4, bytesPerBlock: 16 };
228
+ case "astc-5x4-unorm":
229
+ case "astc-5x4-unorm-srgb": return { width: 5, height: 4, bytesPerBlock: 16 };
230
+ case "astc-5x5-unorm":
231
+ case "astc-5x5-unorm-srgb": return { width: 5, height: 5, bytesPerBlock: 16 };
232
+ case "astc-6x5-unorm":
233
+ case "astc-6x5-unorm-srgb": return { width: 6, height: 5, bytesPerBlock: 16 };
234
+ case "astc-6x6-unorm":
235
+ case "astc-6x6-unorm-srgb": return { width: 6, height: 6, bytesPerBlock: 16 };
236
+ case "astc-8x5-unorm":
237
+ case "astc-8x5-unorm-srgb": return { width: 8, height: 5, bytesPerBlock: 16 };
238
+ case "astc-8x6-unorm":
239
+ case "astc-8x6-unorm-srgb": return { width: 8, height: 6, bytesPerBlock: 16 };
240
+ case "astc-8x8-unorm":
241
+ case "astc-8x8-unorm-srgb": return { width: 8, height: 8, bytesPerBlock: 16 };
242
+ case "astc-10x5-unorm":
243
+ case "astc-10x5-unorm-srgb": return { width: 10, height: 5, bytesPerBlock: 16 };
244
+ case "astc-10x6-unorm":
245
+ case "astc-10x6-unorm-srgb": return { width: 10, height: 6, bytesPerBlock: 16 };
246
+ case "astc-10x8-unorm":
247
+ case "astc-10x8-unorm-srgb": return { width: 10, height: 8, bytesPerBlock: 16 };
248
+ case "astc-10x10-unorm":
249
+ case "astc-10x10-unorm-srgb": return { width: 10, height: 10, bytesPerBlock: 16 };
250
+ case "astc-12x10-unorm":
251
+ case "astc-12x10-unorm-srgb": return { width: 12, height: 10, bytesPerBlock: 16 };
252
+ case "astc-12x12-unorm":
253
+ case "astc-12x12-unorm-srgb": return { width: 12, height: 12, bytesPerBlock: 16 };
254
+ default:
255
+ throw new Error(`blockInfoFor: unsupported format ${format}`);
256
+ }
257
+ }
258
+ /**
259
+ * Wrap an `aval<ITexture>` as a ref-counted, adaptively-uploaded
260
+ * `AdaptiveResource<GPUTexture>`.
261
+ */
262
+ export function prepareAdaptiveTexture(device, source, opts = {}) {
263
+ return new AdaptiveTexture(device, source, opts);
264
+ }
265
+ //# sourceMappingURL=adaptiveTexture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptiveTexture.js","sourceRoot":"","sources":["../../src/resources/adaptiveTexture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { AdaptiveResource, type IFramebuffer } from "../core/index.js";
2
+ import { type aval } from "@aardworx/wombat.adaptive";
3
+ export interface FramebufferSize {
4
+ readonly width: number;
5
+ readonly height: number;
6
+ }
7
+ export interface AllocateFramebufferOptions {
8
+ /** Extra usage flags ORed into every attachment. `RENDER_ATTACHMENT` is added automatically. */
9
+ readonly extraUsage?: GPUTextureUsageFlags;
10
+ /** Optional debug-label prefix; attachment name is appended. */
11
+ readonly labelPrefix?: string;
12
+ }
13
+ export declare function allocateFramebuffer(device: GPUDevice, signature: import("../core/index.js").FramebufferSignature, size: aval<FramebufferSize>, opts?: AllocateFramebufferOptions): AdaptiveResource<IFramebuffer>;
14
+ //# sourceMappingURL=framebuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framebuffer.d.ts","sourceRoot":"","sources":["../../src/resources/framebuffer.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAA+B,KAAK,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAGnF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,gGAAgG;IAChG,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAC3C,gEAAgE;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA8HD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,OAAO,kBAAkB,EAAE,oBAAoB,EAC1D,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,EAC3B,IAAI,GAAE,0BAA+B,GACpC,gBAAgB,CAAC,YAAY,CAAC,CAEhC"}
@@ -0,0 +1,144 @@
1
+ // allocateFramebuffer — `aval<{width,height}>` → `AdaptiveResource<IFramebuffer>`.
2
+ //
3
+ // The signature defines names + formats; the size aval drives
4
+ // allocation. Each color attachment gets its own GPUTexture sized
5
+ // to the current `width × height`; depth/stencil similarly. On
6
+ // size change, all textures are torn down and reallocated.
7
+ //
8
+ // This is the building block for `runtime.renderTo(scene, size)`:
9
+ // - The render task acquires the framebuffer's resource;
10
+ // - Each frame, evaluates the FBO via its own AdaptiveResource
11
+ // pipeline, getting current views;
12
+ // - Encodes a render pass into those views;
13
+ // - Exposes the chosen color attachment as an
14
+ // `aval<ITexture>` so downstream samplers see live data.
15
+ import { AdaptiveResource } from "../core/index.js";
16
+ import { HashMap } from "@aardworx/wombat.adaptive";
17
+ import { TextureUsage } from "./webgpuFlags.js";
18
+ class AdaptiveFramebuffer extends AdaptiveResource {
19
+ device;
20
+ signature;
21
+ size;
22
+ opts;
23
+ _ownedColors = new Map();
24
+ _ownedResolves = new Map();
25
+ _ownedDepth;
26
+ _lastSize;
27
+ constructor(device, signature, size, opts) {
28
+ super();
29
+ this.device = device;
30
+ this.signature = signature;
31
+ this.size = size;
32
+ this.opts = opts;
33
+ }
34
+ create() { }
35
+ destroy() {
36
+ for (const t of this._ownedColors.values())
37
+ t.destroy();
38
+ this._ownedColors.clear();
39
+ for (const t of this._ownedResolves.values())
40
+ t.destroy();
41
+ this._ownedResolves.clear();
42
+ if (this._ownedDepth !== undefined) {
43
+ this._ownedDepth.destroy();
44
+ this._ownedDepth = undefined;
45
+ }
46
+ this._lastSize = undefined;
47
+ }
48
+ compute(token) {
49
+ const size = this.size.getValue(token);
50
+ if (this._lastSize === undefined
51
+ || this._lastSize.width !== size.width
52
+ || this._lastSize.height !== size.height) {
53
+ this.reallocate(size);
54
+ this._lastSize = size;
55
+ }
56
+ const msaa = this.signature.sampleCount > 1;
57
+ let colorViews = HashMap.empty();
58
+ let colorTextures = HashMap.empty();
59
+ let resolveViews = HashMap.empty();
60
+ for (const [name, tex] of this._ownedColors.entries()) {
61
+ colorViews = colorViews.add(name, tex.createView());
62
+ if (msaa) {
63
+ const resolve = this._ownedResolves.get(name);
64
+ if (resolve === undefined) {
65
+ throw new Error(`framebuffer: missing resolve target for "${name}"`);
66
+ }
67
+ resolveViews = resolveViews.add(name, resolve.createView());
68
+ colorTextures = colorTextures.add(name, resolve);
69
+ }
70
+ else {
71
+ colorTextures = colorTextures.add(name, tex);
72
+ }
73
+ }
74
+ return {
75
+ signature: this.signature,
76
+ colors: colorViews,
77
+ colorTextures,
78
+ ...(msaa ? { resolveColors: resolveViews } : {}),
79
+ ...(this._ownedDepth ? { depthStencil: this._ownedDepth.createView(), depthStencilTexture: this._ownedDepth } : {}),
80
+ width: size.width,
81
+ height: size.height,
82
+ };
83
+ }
84
+ reallocate(size) {
85
+ // Destroy old.
86
+ for (const t of this._ownedColors.values())
87
+ t.destroy();
88
+ this._ownedColors.clear();
89
+ for (const t of this._ownedResolves.values())
90
+ t.destroy();
91
+ this._ownedResolves.clear();
92
+ if (this._ownedDepth !== undefined) {
93
+ this._ownedDepth.destroy();
94
+ this._ownedDepth = undefined;
95
+ }
96
+ const sampleCount = this.signature.sampleCount;
97
+ const msaa = sampleCount > 1;
98
+ // Multisample textures are not directly sampleable; they only
99
+ // serve as render attachments, with a separate single-sample
100
+ // resolve target carrying TEXTURE_BINDING.
101
+ const colorUsage = msaa
102
+ ? TextureUsage.RENDER_ATTACHMENT
103
+ : TextureUsage.RENDER_ATTACHMENT
104
+ | TextureUsage.TEXTURE_BINDING
105
+ | (this.opts.extraUsage ?? 0);
106
+ const resolveUsage = TextureUsage.RENDER_ATTACHMENT
107
+ | TextureUsage.TEXTURE_BINDING
108
+ | (this.opts.extraUsage ?? 0);
109
+ const labelPrefix = this.opts.labelPrefix ?? "fbo";
110
+ for (const [name, format] of this.signature.colors) {
111
+ const tex = this.device.createTexture({
112
+ size: { width: size.width, height: size.height, depthOrArrayLayers: 1 },
113
+ format,
114
+ usage: colorUsage,
115
+ sampleCount,
116
+ label: msaa ? `${labelPrefix}.${name}.msaa` : `${labelPrefix}.${name}`,
117
+ });
118
+ this._ownedColors.set(name, tex);
119
+ if (msaa) {
120
+ const resolve = this.device.createTexture({
121
+ size: { width: size.width, height: size.height, depthOrArrayLayers: 1 },
122
+ format,
123
+ usage: resolveUsage,
124
+ sampleCount: 1,
125
+ label: `${labelPrefix}.${name}.resolve`,
126
+ });
127
+ this._ownedResolves.set(name, resolve);
128
+ }
129
+ }
130
+ if (this.signature.depthStencil !== undefined) {
131
+ this._ownedDepth = this.device.createTexture({
132
+ size: { width: size.width, height: size.height, depthOrArrayLayers: 1 },
133
+ format: this.signature.depthStencil.format,
134
+ usage: TextureUsage.RENDER_ATTACHMENT,
135
+ sampleCount,
136
+ label: `${labelPrefix}.depthStencil`,
137
+ });
138
+ }
139
+ }
140
+ }
141
+ export function allocateFramebuffer(device, signature, size, opts = {}) {
142
+ return new AdaptiveFramebuffer(device, signature, size, opts);
143
+ }
144
+ //# sourceMappingURL=framebuffer.js.map