@asciiz/atoolkit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/ReadMe.md +198 -0
- package/dist/acircuit/chip.d.ts +46 -0
- package/dist/acircuit/chip.d.ts.map +1 -0
- package/dist/acircuit/chip.js +104 -0
- package/dist/acircuit/chip.js.map +1 -0
- package/dist/acircuit/circuit.d.ts +86 -0
- package/dist/acircuit/circuit.d.ts.map +1 -0
- package/dist/acircuit/circuit.js +606 -0
- package/dist/acircuit/circuit.js.map +1 -0
- package/dist/acircuit/composite.d.ts +32 -0
- package/dist/acircuit/composite.d.ts.map +1 -0
- package/dist/acircuit/composite.js +88 -0
- package/dist/acircuit/composite.js.map +1 -0
- package/dist/acircuit/index.d.ts +7 -0
- package/dist/acircuit/index.d.ts.map +1 -0
- package/dist/acircuit/index.js +6 -0
- package/dist/acircuit/index.js.map +1 -0
- package/dist/acircuit/socket.d.ts +20 -0
- package/dist/acircuit/socket.d.ts.map +1 -0
- package/dist/acircuit/socket.js +23 -0
- package/dist/acircuit/socket.js.map +1 -0
- package/dist/acircuit/types.d.ts +94 -0
- package/dist/acircuit/types.d.ts.map +1 -0
- package/dist/acircuit/types.js +2 -0
- package/dist/acircuit/types.js.map +1 -0
- package/dist/acircuit/wire.d.ts +26 -0
- package/dist/acircuit/wire.d.ts.map +1 -0
- package/dist/acircuit/wire.js +23 -0
- package/dist/acircuit/wire.js.map +1 -0
- package/dist/adiag/bus.d.ts +65 -0
- package/dist/adiag/bus.d.ts.map +1 -0
- package/dist/adiag/bus.js +225 -0
- package/dist/adiag/bus.js.map +1 -0
- package/dist/adiag/index.d.ts +3 -0
- package/dist/adiag/index.d.ts.map +1 -0
- package/dist/adiag/index.js +2 -0
- package/dist/adiag/index.js.map +1 -0
- package/dist/aecs/ComponentSet.d.ts +33 -0
- package/dist/aecs/ComponentSet.d.ts.map +1 -0
- package/dist/aecs/ComponentSet.js +127 -0
- package/dist/aecs/ComponentSet.js.map +1 -0
- package/dist/aecs/Entity.d.ts +43 -0
- package/dist/aecs/Entity.d.ts.map +1 -0
- package/dist/aecs/Entity.js +82 -0
- package/dist/aecs/Entity.js.map +1 -0
- package/dist/aecs/FloatSet.d.ts +34 -0
- package/dist/aecs/FloatSet.d.ts.map +1 -0
- package/dist/aecs/FloatSet.js +147 -0
- package/dist/aecs/FloatSet.js.map +1 -0
- package/dist/aecs/Query.d.ts +90 -0
- package/dist/aecs/Query.d.ts.map +1 -0
- package/dist/aecs/Query.js +304 -0
- package/dist/aecs/Query.js.map +1 -0
- package/dist/aecs/index.d.ts +6 -0
- package/dist/aecs/index.d.ts.map +1 -0
- package/dist/aecs/index.js +6 -0
- package/dist/aecs/index.js.map +1 -0
- package/dist/aecs/join.d.ts +2 -0
- package/dist/aecs/join.d.ts.map +1 -0
- package/dist/aecs/join.js +2 -0
- package/dist/aecs/join.js.map +1 -0
- package/dist/alm/constants.d.ts +11 -0
- package/dist/alm/constants.d.ts.map +1 -0
- package/dist/alm/constants.js +17 -0
- package/dist/alm/constants.js.map +1 -0
- package/dist/alm/index.d.ts +9 -0
- package/dist/alm/index.d.ts.map +1 -0
- package/dist/alm/index.js +12 -0
- package/dist/alm/index.js.map +1 -0
- package/dist/alm/mat3.d.ts +63 -0
- package/dist/alm/mat3.d.ts.map +1 -0
- package/dist/alm/mat3.js +393 -0
- package/dist/alm/mat3.js.map +1 -0
- package/dist/alm/mat4.d.ts +157 -0
- package/dist/alm/mat4.d.ts.map +1 -0
- package/dist/alm/mat4.js +1448 -0
- package/dist/alm/mat4.js.map +1 -0
- package/dist/alm/quat.d.ts +89 -0
- package/dist/alm/quat.d.ts.map +1 -0
- package/dist/alm/quat.js +543 -0
- package/dist/alm/quat.js.map +1 -0
- package/dist/alm/spatial.d.ts +102 -0
- package/dist/alm/spatial.d.ts.map +1 -0
- package/dist/alm/spatial.js +389 -0
- package/dist/alm/spatial.js.map +1 -0
- package/dist/alm/vec2.d.ts +97 -0
- package/dist/alm/vec2.d.ts.map +1 -0
- package/dist/alm/vec2.js +369 -0
- package/dist/alm/vec2.js.map +1 -0
- package/dist/alm/vec3.d.ts +117 -0
- package/dist/alm/vec3.d.ts.map +1 -0
- package/dist/alm/vec3.js +547 -0
- package/dist/alm/vec3.js.map +1 -0
- package/dist/alm/vec4.d.ts +95 -0
- package/dist/alm/vec4.d.ts.map +1 -0
- package/dist/alm/vec4.js +452 -0
- package/dist/alm/vec4.js.map +1 -0
- package/dist/atempo/cadence.d.ts +58 -0
- package/dist/atempo/cadence.d.ts.map +1 -0
- package/dist/atempo/cadence.js +110 -0
- package/dist/atempo/cadence.js.map +1 -0
- package/dist/atempo/clip.d.ts +37 -0
- package/dist/atempo/clip.d.ts.map +1 -0
- package/dist/atempo/clip.js +92 -0
- package/dist/atempo/clip.js.map +1 -0
- package/dist/atempo/curve.d.ts +6 -0
- package/dist/atempo/curve.d.ts.map +1 -0
- package/dist/atempo/curve.js +2 -0
- package/dist/atempo/curve.js.map +1 -0
- package/dist/atempo/curves/bezier.d.ts +7 -0
- package/dist/atempo/curves/bezier.d.ts.map +1 -0
- package/dist/atempo/curves/bezier.js +46 -0
- package/dist/atempo/curves/bezier.js.map +1 -0
- package/dist/atempo/curves/bounce.d.ts +6 -0
- package/dist/atempo/curves/bounce.d.ts.map +1 -0
- package/dist/atempo/curves/bounce.js +22 -0
- package/dist/atempo/curves/bounce.js.map +1 -0
- package/dist/atempo/curves/cubic.d.ts +14 -0
- package/dist/atempo/curves/cubic.d.ts.map +1 -0
- package/dist/atempo/curves/cubic.js +22 -0
- package/dist/atempo/curves/cubic.js.map +1 -0
- package/dist/atempo/curves/elastic.d.ts +6 -0
- package/dist/atempo/curves/elastic.d.ts.map +1 -0
- package/dist/atempo/curves/elastic.js +12 -0
- package/dist/atempo/curves/elastic.js.map +1 -0
- package/dist/atempo/curves/expo.d.ts +14 -0
- package/dist/atempo/curves/expo.d.ts.map +1 -0
- package/dist/atempo/curves/expo.js +26 -0
- package/dist/atempo/curves/expo.js.map +1 -0
- package/dist/atempo/curves/holdSnap.d.ts +6 -0
- package/dist/atempo/curves/holdSnap.d.ts.map +1 -0
- package/dist/atempo/curves/holdSnap.js +15 -0
- package/dist/atempo/curves/holdSnap.js.map +1 -0
- package/dist/atempo/curves/index.d.ts +14 -0
- package/dist/atempo/curves/index.d.ts.map +1 -0
- package/dist/atempo/curves/index.js +14 -0
- package/dist/atempo/curves/index.js.map +1 -0
- package/dist/atempo/curves/linear.d.ts +6 -0
- package/dist/atempo/curves/linear.d.ts.map +1 -0
- package/dist/atempo/curves/linear.js +5 -0
- package/dist/atempo/curves/linear.js.map +1 -0
- package/dist/atempo/curves/overshoot.d.ts +6 -0
- package/dist/atempo/curves/overshoot.d.ts.map +1 -0
- package/dist/atempo/curves/overshoot.js +16 -0
- package/dist/atempo/curves/overshoot.js.map +1 -0
- package/dist/atempo/curves/quad.d.ts +14 -0
- package/dist/atempo/curves/quad.d.ts.map +1 -0
- package/dist/atempo/curves/quad.js +22 -0
- package/dist/atempo/curves/quad.js.map +1 -0
- package/dist/atempo/curves/step.d.ts +6 -0
- package/dist/atempo/curves/step.d.ts.map +1 -0
- package/dist/atempo/curves/step.js +11 -0
- package/dist/atempo/curves/step.js.map +1 -0
- package/dist/atempo/index.d.ts +17 -0
- package/dist/atempo/index.d.ts.map +1 -0
- package/dist/atempo/index.js +18 -0
- package/dist/atempo/index.js.map +1 -0
- package/dist/atempo/phase.d.ts +66 -0
- package/dist/atempo/phase.d.ts.map +1 -0
- package/dist/atempo/phase.js +121 -0
- package/dist/atempo/phase.js.map +1 -0
- package/dist/atempo/spring.d.ts +20 -0
- package/dist/atempo/spring.d.ts.map +1 -0
- package/dist/atempo/spring.js +71 -0
- package/dist/atempo/spring.js.map +1 -0
- package/dist/atempo/track.d.ts +69 -0
- package/dist/atempo/track.d.ts.map +1 -0
- package/dist/atempo/track.js +184 -0
- package/dist/atempo/track.js.map +1 -0
- package/dist/atempo/tracks/color.d.ts +20 -0
- package/dist/atempo/tracks/color.d.ts.map +1 -0
- package/dist/atempo/tracks/color.js +52 -0
- package/dist/atempo/tracks/color.js.map +1 -0
- package/dist/atempo/tracks/float.d.ts +9 -0
- package/dist/atempo/tracks/float.d.ts.map +1 -0
- package/dist/atempo/tracks/float.js +13 -0
- package/dist/atempo/tracks/float.js.map +1 -0
- package/dist/atempo/tracks/index.d.ts +8 -0
- package/dist/atempo/tracks/index.d.ts.map +1 -0
- package/dist/atempo/tracks/index.js +8 -0
- package/dist/atempo/tracks/index.js.map +1 -0
- package/dist/atempo/tracks/quat.d.ts +16 -0
- package/dist/atempo/tracks/quat.d.ts.map +1 -0
- package/dist/atempo/tracks/quat.js +72 -0
- package/dist/atempo/tracks/quat.js.map +1 -0
- package/dist/atempo/tracks/vec.d.ts +11 -0
- package/dist/atempo/tracks/vec.d.ts.map +1 -0
- package/dist/atempo/tracks/vec.js +27 -0
- package/dist/atempo/tracks/vec.js.map +1 -0
- package/dist/awasm/abi/index.d.ts +4 -0
- package/dist/awasm/abi/index.d.ts.map +1 -0
- package/dist/awasm/abi/index.js +4 -0
- package/dist/awasm/abi/index.js.map +1 -0
- package/dist/awasm/abi/layout.d.ts +40 -0
- package/dist/awasm/abi/layout.d.ts.map +1 -0
- package/dist/awasm/abi/layout.js +100 -0
- package/dist/awasm/abi/layout.js.map +1 -0
- package/dist/awasm/abi/slice.d.ts +28 -0
- package/dist/awasm/abi/slice.d.ts.map +1 -0
- package/dist/awasm/abi/slice.js +68 -0
- package/dist/awasm/abi/slice.js.map +1 -0
- package/dist/awasm/abi/string-buffer.d.ts +23 -0
- package/dist/awasm/abi/string-buffer.d.ts.map +1 -0
- package/dist/awasm/abi/string-buffer.js +52 -0
- package/dist/awasm/abi/string-buffer.js.map +1 -0
- package/dist/awasm/index.d.ts +5 -0
- package/dist/awasm/index.d.ts.map +1 -0
- package/dist/awasm/index.js +8 -0
- package/dist/awasm/index.js.map +1 -0
- package/dist/awasm/memory/block-pool.d.ts +31 -0
- package/dist/awasm/memory/block-pool.d.ts.map +1 -0
- package/dist/awasm/memory/block-pool.js +98 -0
- package/dist/awasm/memory/block-pool.js.map +1 -0
- package/dist/awasm/memory/index.d.ts +5 -0
- package/dist/awasm/memory/index.d.ts.map +1 -0
- package/dist/awasm/memory/index.js +5 -0
- package/dist/awasm/memory/index.js.map +1 -0
- package/dist/awasm/memory/linear-arena.d.ts +36 -0
- package/dist/awasm/memory/linear-arena.d.ts.map +1 -0
- package/dist/awasm/memory/linear-arena.js +94 -0
- package/dist/awasm/memory/linear-arena.js.map +1 -0
- package/dist/awasm/memory/memory-view.d.ts +51 -0
- package/dist/awasm/memory/memory-view.d.ts.map +1 -0
- package/dist/awasm/memory/memory-view.js +110 -0
- package/dist/awasm/memory/memory-view.js.map +1 -0
- package/dist/awasm/memory/wasm-memory.d.ts +40 -0
- package/dist/awasm/memory/wasm-memory.d.ts.map +1 -0
- package/dist/awasm/memory/wasm-memory.js +88 -0
- package/dist/awasm/memory/wasm-memory.js.map +1 -0
- package/dist/awasm/runtime/host-bridge.d.ts +30 -0
- package/dist/awasm/runtime/host-bridge.d.ts.map +1 -0
- package/dist/awasm/runtime/host-bridge.js +57 -0
- package/dist/awasm/runtime/host-bridge.js.map +1 -0
- package/dist/awasm/runtime/index.d.ts +5 -0
- package/dist/awasm/runtime/index.d.ts.map +1 -0
- package/dist/awasm/runtime/index.js +5 -0
- package/dist/awasm/runtime/index.js.map +1 -0
- package/dist/awasm/runtime/module-inspector.d.ts +32 -0
- package/dist/awasm/runtime/module-inspector.d.ts.map +1 -0
- package/dist/awasm/runtime/module-inspector.js +43 -0
- package/dist/awasm/runtime/module-inspector.js.map +1 -0
- package/dist/awasm/runtime/module-loader.d.ts +17 -0
- package/dist/awasm/runtime/module-loader.d.ts.map +1 -0
- package/dist/awasm/runtime/module-loader.js +99 -0
- package/dist/awasm/runtime/module-loader.js.map +1 -0
- package/dist/awasm/runtime/wasm-instance.d.ts +25 -0
- package/dist/awasm/runtime/wasm-instance.d.ts.map +1 -0
- package/dist/awasm/runtime/wasm-instance.js +60 -0
- package/dist/awasm/runtime/wasm-instance.js.map +1 -0
- package/dist/awasm/thread/atomic-queue.d.ts +33 -0
- package/dist/awasm/thread/atomic-queue.d.ts.map +1 -0
- package/dist/awasm/thread/atomic-queue.js +78 -0
- package/dist/awasm/thread/atomic-queue.js.map +1 -0
- package/dist/awasm/thread/index.d.ts +4 -0
- package/dist/awasm/thread/index.d.ts.map +1 -0
- package/dist/awasm/thread/index.js +4 -0
- package/dist/awasm/thread/index.js.map +1 -0
- package/dist/awasm/thread/shared-memory.d.ts +38 -0
- package/dist/awasm/thread/shared-memory.d.ts.map +1 -0
- package/dist/awasm/thread/shared-memory.js +74 -0
- package/dist/awasm/thread/shared-memory.js.map +1 -0
- package/dist/awasm/thread/worker-pool.d.ts +43 -0
- package/dist/awasm/thread/worker-pool.d.ts.map +1 -0
- package/dist/awasm/thread/worker-pool.js +118 -0
- package/dist/awasm/thread/worker-pool.js.map +1 -0
- package/dist/awgpu/binding.d.ts +108 -0
- package/dist/awgpu/binding.d.ts.map +1 -0
- package/dist/awgpu/binding.js +251 -0
- package/dist/awgpu/binding.js.map +1 -0
- package/dist/awgpu/device.d.ts +68 -0
- package/dist/awgpu/device.d.ts.map +1 -0
- package/dist/awgpu/device.js +150 -0
- package/dist/awgpu/device.js.map +1 -0
- package/dist/awgpu/graph.d.ts +77 -0
- package/dist/awgpu/graph.d.ts.map +1 -0
- package/dist/awgpu/graph.js +288 -0
- package/dist/awgpu/graph.js.map +1 -0
- package/dist/awgpu/index.d.ts +10 -0
- package/dist/awgpu/index.d.ts.map +1 -0
- package/dist/awgpu/index.js +19 -0
- package/dist/awgpu/index.js.map +1 -0
- package/dist/awgpu/memory.d.ts +231 -0
- package/dist/awgpu/memory.d.ts.map +1 -0
- package/dist/awgpu/memory.js +547 -0
- package/dist/awgpu/memory.js.map +1 -0
- package/dist/awgpu/pipeline.d.ts +114 -0
- package/dist/awgpu/pipeline.d.ts.map +1 -0
- package/dist/awgpu/pipeline.js +335 -0
- package/dist/awgpu/pipeline.js.map +1 -0
- package/dist/awgpu/sequence.d.ts +83 -0
- package/dist/awgpu/sequence.d.ts.map +1 -0
- package/dist/awgpu/sequence.js +273 -0
- package/dist/awgpu/sequence.js.map +1 -0
- package/dist/awgpu/state.d.ts +27 -0
- package/dist/awgpu/state.d.ts.map +1 -0
- package/dist/awgpu/state.js +43 -0
- package/dist/awgpu/state.js.map +1 -0
- package/dist/awgpu/stream.d.ts +57 -0
- package/dist/awgpu/stream.d.ts.map +1 -0
- package/dist/awgpu/stream.js +139 -0
- package/dist/awgpu/stream.js.map +1 -0
- package/dist/awgpu/target.d.ts +98 -0
- package/dist/awgpu/target.d.ts.map +1 -0
- package/dist/awgpu/target.js +357 -0
- package/dist/awgpu/target.js.map +1 -0
- package/dist/awgpu_old/buffer.d.ts +78 -0
- package/dist/awgpu_old/buffer.d.ts.map +1 -0
- package/dist/awgpu_old/buffer.js +220 -0
- package/dist/awgpu_old/buffer.js.map +1 -0
- package/dist/awgpu_old/device.d.ts +69 -0
- package/dist/awgpu_old/device.d.ts.map +1 -0
- package/dist/awgpu_old/device.js +121 -0
- package/dist/awgpu_old/device.js.map +1 -0
- package/dist/awgpu_old/frame.d.ts +17 -0
- package/dist/awgpu_old/frame.d.ts.map +1 -0
- package/dist/awgpu_old/frame.js +29 -0
- package/dist/awgpu_old/frame.js.map +1 -0
- package/dist/awgpu_old/index.d.ts +8 -0
- package/dist/awgpu_old/index.d.ts.map +1 -0
- package/dist/awgpu_old/index.js +18 -0
- package/dist/awgpu_old/index.js.map +1 -0
- package/dist/awgpu_old/layout.d.ts +70 -0
- package/dist/awgpu_old/layout.d.ts.map +1 -0
- package/dist/awgpu_old/layout.js +137 -0
- package/dist/awgpu_old/layout.js.map +1 -0
- package/dist/awgpu_old/pass.d.ts +97 -0
- package/dist/awgpu_old/pass.d.ts.map +1 -0
- package/dist/awgpu_old/pass.js +302 -0
- package/dist/awgpu_old/pass.js.map +1 -0
- package/dist/awgpu_old/pipeline.d.ts +73 -0
- package/dist/awgpu_old/pipeline.d.ts.map +1 -0
- package/dist/awgpu_old/pipeline.js +226 -0
- package/dist/awgpu_old/pipeline.js.map +1 -0
- package/dist/awgpu_old/target.d.ts +186 -0
- package/dist/awgpu_old/target.d.ts.map +1 -0
- package/dist/awgpu_old/target.js +428 -0
- package/dist/awgpu_old/target.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// ================================================================
|
|
2
|
+
// Awasm - Runtime: WasmInstance
|
|
3
|
+
// ================================================================
|
|
4
|
+
import { WasmMemory } from "../memory/wasm-memory.js";
|
|
5
|
+
/**
|
|
6
|
+
* Managed WebAssembly instance binding runtime exports and linear memory.
|
|
7
|
+
* Exposes native instance handles alongside managed invocations and memory references.
|
|
8
|
+
*/
|
|
9
|
+
export class WasmInstance {
|
|
10
|
+
_module;
|
|
11
|
+
_instance;
|
|
12
|
+
_memory;
|
|
13
|
+
_exports;
|
|
14
|
+
constructor(module, instance, memory) {
|
|
15
|
+
this._module = module;
|
|
16
|
+
this._instance = instance;
|
|
17
|
+
this._memory = memory;
|
|
18
|
+
this._exports = instance.exports;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Asynchronously instantiates a WebAssembly module with imports, automatically discovering exported memory.
|
|
22
|
+
*/
|
|
23
|
+
static async instantiate(module, imports, providedMemory) {
|
|
24
|
+
const instance = await WebAssembly.instantiate(module, imports);
|
|
25
|
+
let memory = providedMemory;
|
|
26
|
+
if (!memory) {
|
|
27
|
+
const rawMemory = instance.exports.memory;
|
|
28
|
+
if (rawMemory instanceof WebAssembly.Memory) {
|
|
29
|
+
memory = WasmMemory.fromNative(rawMemory);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
memory = new WasmMemory({ initial: 1 });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return new WasmInstance(module, instance, memory);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Invokes an exported guest function by name.
|
|
39
|
+
*/
|
|
40
|
+
call(name, ...args) {
|
|
41
|
+
const fn = this._exports[name];
|
|
42
|
+
if (typeof fn !== "function") {
|
|
43
|
+
throw new Error(`Exported function '${name}' not found on WebAssembly instance`);
|
|
44
|
+
}
|
|
45
|
+
return fn(...args);
|
|
46
|
+
}
|
|
47
|
+
get exports() {
|
|
48
|
+
return this._exports;
|
|
49
|
+
}
|
|
50
|
+
get handle() {
|
|
51
|
+
return this._instance;
|
|
52
|
+
}
|
|
53
|
+
get memory() {
|
|
54
|
+
return this._memory;
|
|
55
|
+
}
|
|
56
|
+
get module() {
|
|
57
|
+
return this._module;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=wasm-instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-instance.js","sourceRoot":"","sources":["../../../awasm/runtime/wasm-instance.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,iCAAiC;AACjC,mEAAmE;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD;;;GAGG;AACH,MAAM,OAAO,YAAY;IACJ,OAAO,CAAqB;IAC5B,SAAS,CAAuB;IAChC,OAAO,CAAa;IACpB,QAAQ,CAAW;IAEpC,YAAY,MAA0B,EAAE,QAA8B,EAAE,MAAkB;QACtF,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAmB,CAAC;IACjD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,WAAW,CAC3B,MAA0B,EAC1B,OAA6B,EAC7B,cAA2B;QAE3B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEhE,IAAI,MAAM,GAAG,cAAc,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,SAAS,GAAI,QAAQ,CAAC,OAAe,CAAC,MAAM,CAAC;YACnD,IAAI,SAAS,YAAY,WAAW,CAAC,MAAM,EAAE,CAAC;gBAC1C,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5C,CAAC;QACL,CAAC;QAED,OAAO,IAAI,YAAY,CAAI,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACI,IAAI,CAAmB,IAAY,EAAE,GAAG,IAAc;QACzD,MAAM,EAAE,GAAI,IAAI,CAAC,QAAgB,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,qCAAqC,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;CACJ"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lock-free circular ring buffer residing in shared linear memory.
|
|
3
|
+
* Coordinates message passing between worker threads via atomic load and store operations.
|
|
4
|
+
*
|
|
5
|
+
* Memory layout:
|
|
6
|
+
* - offset + 0: Atomic Head Index (4 bytes)
|
|
7
|
+
* - offset + 4: Atomic Tail Index (4 bytes)
|
|
8
|
+
* - offset + 8: Ring buffer slots (capacity * 4 bytes)
|
|
9
|
+
*/
|
|
10
|
+
export declare class AtomicQueue {
|
|
11
|
+
private readonly _view;
|
|
12
|
+
private readonly _headIndex;
|
|
13
|
+
private readonly _tailIndex;
|
|
14
|
+
private readonly _dataBaseIndex;
|
|
15
|
+
private readonly _capacity;
|
|
16
|
+
private readonly _mask;
|
|
17
|
+
constructor(buffer: SharedArrayBuffer, byteOffset: number, capacityPowerOfTwo?: number);
|
|
18
|
+
/**
|
|
19
|
+
* Appends a 32-bit integer to the ring buffer. Returns false when full.
|
|
20
|
+
*/
|
|
21
|
+
enqueue(value: number): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Reads and removes the next 32-bit integer from the ring buffer. Returns null when empty.
|
|
24
|
+
*/
|
|
25
|
+
dequeue(): number | null;
|
|
26
|
+
get length(): number;
|
|
27
|
+
get capacity(): number;
|
|
28
|
+
/**
|
|
29
|
+
* Calculates the total byte size required to host ring buffer metadata and slots.
|
|
30
|
+
*/
|
|
31
|
+
static requiredBytes(capacityPowerOfTwo: number): number;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=atomic-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-queue.d.ts","sourceRoot":"","sources":["../../../awasm/thread/atomic-queue.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,GAAE,MAAY;IAiB3F;;OAEG;IACI,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAetC;;OAEG;IACI,OAAO,IAAI,MAAM,GAAG,IAAI;IAe/B,IAAW,MAAM,IAAI,MAAM,CAI1B;IAED,IAAW,QAAQ,IAAI,MAAM,CAE5B;IAED;;OAEG;WACW,aAAa,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM;CAGlE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// ================================================================
|
|
2
|
+
// Awasm - Threading: AtomicQueue
|
|
3
|
+
// ================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Lock-free circular ring buffer residing in shared linear memory.
|
|
6
|
+
* Coordinates message passing between worker threads via atomic load and store operations.
|
|
7
|
+
*
|
|
8
|
+
* Memory layout:
|
|
9
|
+
* - offset + 0: Atomic Head Index (4 bytes)
|
|
10
|
+
* - offset + 4: Atomic Tail Index (4 bytes)
|
|
11
|
+
* - offset + 8: Ring buffer slots (capacity * 4 bytes)
|
|
12
|
+
*/
|
|
13
|
+
export class AtomicQueue {
|
|
14
|
+
_view;
|
|
15
|
+
_headIndex;
|
|
16
|
+
_tailIndex;
|
|
17
|
+
_dataBaseIndex;
|
|
18
|
+
_capacity;
|
|
19
|
+
_mask;
|
|
20
|
+
constructor(buffer, byteOffset, capacityPowerOfTwo = 256) {
|
|
21
|
+
if ((byteOffset & 3) !== 0) {
|
|
22
|
+
throw new Error(`Byte offset must be 4-byte aligned, received ${byteOffset}`);
|
|
23
|
+
}
|
|
24
|
+
if ((capacityPowerOfTwo & (capacityPowerOfTwo - 1)) !== 0 || capacityPowerOfTwo <= 0) {
|
|
25
|
+
throw new Error(`Capacity must be a positive power of two, received ${capacityPowerOfTwo}`);
|
|
26
|
+
}
|
|
27
|
+
this._view = new Int32Array(buffer);
|
|
28
|
+
const base = byteOffset >> 2;
|
|
29
|
+
this._headIndex = base;
|
|
30
|
+
this._tailIndex = base + 1;
|
|
31
|
+
this._dataBaseIndex = base + 2;
|
|
32
|
+
this._capacity = capacityPowerOfTwo;
|
|
33
|
+
this._mask = capacityPowerOfTwo - 1;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Appends a 32-bit integer to the ring buffer. Returns false when full.
|
|
37
|
+
*/
|
|
38
|
+
enqueue(value) {
|
|
39
|
+
const head = Atomics.load(this._view, this._headIndex);
|
|
40
|
+
const tail = Atomics.load(this._view, this._tailIndex);
|
|
41
|
+
if (tail - head >= this._capacity) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const slotIndex = this._dataBaseIndex + (tail & this._mask);
|
|
45
|
+
Atomics.store(this._view, slotIndex, value);
|
|
46
|
+
Atomics.store(this._view, this._tailIndex, tail + 1);
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Reads and removes the next 32-bit integer from the ring buffer. Returns null when empty.
|
|
51
|
+
*/
|
|
52
|
+
dequeue() {
|
|
53
|
+
const head = Atomics.load(this._view, this._headIndex);
|
|
54
|
+
const tail = Atomics.load(this._view, this._tailIndex);
|
|
55
|
+
if (head >= tail) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const slotIndex = this._dataBaseIndex + (head & this._mask);
|
|
59
|
+
const value = Atomics.load(this._view, slotIndex);
|
|
60
|
+
Atomics.store(this._view, this._headIndex, head + 1);
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
get length() {
|
|
64
|
+
const head = Atomics.load(this._view, this._headIndex);
|
|
65
|
+
const tail = Atomics.load(this._view, this._tailIndex);
|
|
66
|
+
return Math.max(0, tail - head);
|
|
67
|
+
}
|
|
68
|
+
get capacity() {
|
|
69
|
+
return this._capacity;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Calculates the total byte size required to host ring buffer metadata and slots.
|
|
73
|
+
*/
|
|
74
|
+
static requiredBytes(capacityPowerOfTwo) {
|
|
75
|
+
return (2 + capacityPowerOfTwo) * 4;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=atomic-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-queue.js","sourceRoot":"","sources":["../../../awasm/thread/atomic-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { SharedMemory, type SharedMemoryDescriptor, type WaitResult } from "./shared-memory.js";
|
|
2
|
+
export { AtomicQueue } from "./atomic-queue.js";
|
|
3
|
+
export { WorkerPool, type WorkerTaskMessage, type WorkerResultMessage, } from "./worker-pool.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../awasm/thread/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,sBAAsB,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACH,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GAC3B,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../awasm/thread/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgD,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACH,UAAU,GAGb,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface SharedMemoryDescriptor {
|
|
2
|
+
initial: number;
|
|
3
|
+
maximum: number;
|
|
4
|
+
}
|
|
5
|
+
export type WaitResult = "ok" | "not-equal" | "timed-out";
|
|
6
|
+
/**
|
|
7
|
+
* Shared linear memory coordinator backed by SharedArrayBuffer and Atomics.
|
|
8
|
+
* Provides thread-safe WebAssembly memory accessible across Web Workers.
|
|
9
|
+
*/
|
|
10
|
+
export declare class SharedMemory {
|
|
11
|
+
private readonly _memory;
|
|
12
|
+
private readonly _int32View;
|
|
13
|
+
private readonly _initialPages;
|
|
14
|
+
private readonly _maximumPages;
|
|
15
|
+
constructor(descriptor: SharedMemoryDescriptor);
|
|
16
|
+
/**
|
|
17
|
+
* Executes Atomics.wait on the 32-bit integer location at the specified byte offset.
|
|
18
|
+
* Note: Cannot execute on browser main UI thread.
|
|
19
|
+
*/
|
|
20
|
+
wait(byteOffset: number, expectedValue: number, timeoutMs?: number): WaitResult;
|
|
21
|
+
/**
|
|
22
|
+
* Executes Atomics.notify on the 32-bit integer location at the specified byte offset.
|
|
23
|
+
*/
|
|
24
|
+
notify(byteOffset: number, count?: number): number;
|
|
25
|
+
/**
|
|
26
|
+
* Performs an atomic 32-bit integer read at the specified byte offset.
|
|
27
|
+
*/
|
|
28
|
+
load(byteOffset: number): number;
|
|
29
|
+
/**
|
|
30
|
+
* Performs an atomic 32-bit integer write at the specified byte offset.
|
|
31
|
+
*/
|
|
32
|
+
store(byteOffset: number, value: number): number;
|
|
33
|
+
get handle(): WebAssembly.Memory;
|
|
34
|
+
get buffer(): SharedArrayBuffer;
|
|
35
|
+
get initialPages(): number;
|
|
36
|
+
get maximumPages(): number;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=shared-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-memory.d.ts","sourceRoot":"","sources":["../../../awasm/thread/shared-memory.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1D;;;GAGG;AACH,qBAAa,YAAY;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,UAAU,EAAE,sBAAsB;IAmB9C;;;OAGG;IACI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU;IAQtF;;OAEG;IACI,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,MAAM;IAQ5D;;OAEG;IACI,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAKvC;;OAEG;IACI,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAKvD,IAAW,MAAM,IAAI,WAAW,CAAC,MAAM,CAEtC;IAED,IAAW,MAAM,IAAI,iBAAiB,CAErC;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;CACJ"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// ================================================================
|
|
2
|
+
// Awasm - Threading: SharedMemory
|
|
3
|
+
// ================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Shared linear memory coordinator backed by SharedArrayBuffer and Atomics.
|
|
6
|
+
* Provides thread-safe WebAssembly memory accessible across Web Workers.
|
|
7
|
+
*/
|
|
8
|
+
export class SharedMemory {
|
|
9
|
+
_memory;
|
|
10
|
+
_int32View;
|
|
11
|
+
_initialPages;
|
|
12
|
+
_maximumPages;
|
|
13
|
+
constructor(descriptor) {
|
|
14
|
+
if (descriptor.maximum < descriptor.initial) {
|
|
15
|
+
throw new Error(`Maximum pages (${descriptor.maximum}) must be greater than or equal to initial (${descriptor.initial})`);
|
|
16
|
+
}
|
|
17
|
+
this._initialPages = descriptor.initial;
|
|
18
|
+
this._maximumPages = descriptor.maximum;
|
|
19
|
+
this._memory = new WebAssembly.Memory({
|
|
20
|
+
initial: descriptor.initial,
|
|
21
|
+
maximum: descriptor.maximum,
|
|
22
|
+
shared: true,
|
|
23
|
+
});
|
|
24
|
+
this._int32View = new Int32Array(this._memory.buffer);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Executes Atomics.wait on the 32-bit integer location at the specified byte offset.
|
|
28
|
+
* Note: Cannot execute on browser main UI thread.
|
|
29
|
+
*/
|
|
30
|
+
wait(byteOffset, expectedValue, timeoutMs) {
|
|
31
|
+
if ((byteOffset & 3) !== 0) {
|
|
32
|
+
throw new Error(`Byte offset must be 4-byte aligned for 32-bit atomics, received ${byteOffset}`);
|
|
33
|
+
}
|
|
34
|
+
const index = byteOffset >> 2;
|
|
35
|
+
return Atomics.wait(this._int32View, index, expectedValue, timeoutMs);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Executes Atomics.notify on the 32-bit integer location at the specified byte offset.
|
|
39
|
+
*/
|
|
40
|
+
notify(byteOffset, count = 1) {
|
|
41
|
+
if ((byteOffset & 3) !== 0) {
|
|
42
|
+
throw new Error(`Byte offset must be 4-byte aligned for 32-bit atomics, received ${byteOffset}`);
|
|
43
|
+
}
|
|
44
|
+
const index = byteOffset >> 2;
|
|
45
|
+
return Atomics.notify(this._int32View, index, count);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Performs an atomic 32-bit integer read at the specified byte offset.
|
|
49
|
+
*/
|
|
50
|
+
load(byteOffset) {
|
|
51
|
+
const index = byteOffset >> 2;
|
|
52
|
+
return Atomics.load(this._int32View, index);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Performs an atomic 32-bit integer write at the specified byte offset.
|
|
56
|
+
*/
|
|
57
|
+
store(byteOffset, value) {
|
|
58
|
+
const index = byteOffset >> 2;
|
|
59
|
+
return Atomics.store(this._int32View, index, value);
|
|
60
|
+
}
|
|
61
|
+
get handle() {
|
|
62
|
+
return this._memory;
|
|
63
|
+
}
|
|
64
|
+
get buffer() {
|
|
65
|
+
return this._memory.buffer;
|
|
66
|
+
}
|
|
67
|
+
get initialPages() {
|
|
68
|
+
return this._initialPages;
|
|
69
|
+
}
|
|
70
|
+
get maximumPages() {
|
|
71
|
+
return this._maximumPages;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=shared-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-memory.js","sourceRoot":"","sources":["../../../awasm/thread/shared-memory.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,mCAAmC;AACnC,mEAAmE;AASnE;;;GAGG;AACH,MAAM,OAAO,YAAY;IACJ,OAAO,CAAqB;IAC5B,UAAU,CAAa;IACvB,aAAa,CAAS;IACtB,aAAa,CAAS;IAEvC,YAAY,UAAkC;QAC1C,IAAI,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACX,kBAAkB,UAAU,CAAC,OAAO,+CAA+C,UAAU,CAAC,OAAO,GAAG,CAC3G,CAAC;QACN,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;QAExC,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC;YAClC,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,MAAM,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACI,IAAI,CAAC,UAAkB,EAAE,aAAqB,EAAE,SAAkB;QACrE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,mEAAmE,UAAU,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,CAAC;QAC9B,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,UAAkB,EAAE,QAAgB,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,mEAAmE,UAAU,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,CAAC;QAC9B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,UAAkB;QAC1B,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,CAAC;QAC9B,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,UAAkB,EAAE,KAAa;QAC1C,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,CAAC;QAC9B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,MAAsC,CAAC;IAC/D,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;CACJ"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { SharedMemory } from "./shared-memory.js";
|
|
2
|
+
export interface WorkerTaskMessage {
|
|
3
|
+
type: "init" | "task" | "terminate";
|
|
4
|
+
taskId?: number;
|
|
5
|
+
module?: WebAssembly.Module;
|
|
6
|
+
memory?: WebAssembly.Memory;
|
|
7
|
+
arg0?: number;
|
|
8
|
+
arg1?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface WorkerResultMessage {
|
|
11
|
+
taskId: number;
|
|
12
|
+
result: unknown;
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Multi-threaded worker pool coordinating compute tasks on shared WebAssembly instances.
|
|
17
|
+
* Broadcasts compiled modules and SharedMemory handles to Web Workers via structured cloning.
|
|
18
|
+
*/
|
|
19
|
+
export declare class WorkerPool {
|
|
20
|
+
private readonly _workers;
|
|
21
|
+
private readonly _concurrency;
|
|
22
|
+
private _roundRobinIndex;
|
|
23
|
+
private _isInitialized;
|
|
24
|
+
private _pendingTasks;
|
|
25
|
+
private _nextTaskId;
|
|
26
|
+
constructor(workerScriptUrl: string | URL, concurrency?: number);
|
|
27
|
+
/**
|
|
28
|
+
* Broadcasts the compiled WebAssembly.Module and SharedMemory to all workers in the pool.
|
|
29
|
+
*/
|
|
30
|
+
initialize(module: WebAssembly.Module, memory: SharedMemory): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Dispatches a computational task to the next available worker in round-robin order.
|
|
33
|
+
*/
|
|
34
|
+
dispatch<T = unknown>(taskIndex: number, arg0?: number, arg1?: number): Promise<T>;
|
|
35
|
+
/**
|
|
36
|
+
* Terminates all active worker threads and clears pending tasks.
|
|
37
|
+
*/
|
|
38
|
+
terminate(): void;
|
|
39
|
+
private handleWorkerMessage;
|
|
40
|
+
get concurrency(): number;
|
|
41
|
+
get isInitialized(): boolean;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=worker-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../../awasm/thread/worker-pool.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,aAAa,CAA2E;IAChG,OAAO,CAAC,WAAW,CAAS;gBAEhB,eAAe,EAAE,MAAM,GAAG,GAAG,EAAE,WAAW,CAAC,EAAE,MAAM;IAsB/D;;OAEG;IACU,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BxF;;OAEG;IACI,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,EAAE,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IAyB/F;;OAEG;IACI,SAAS,IAAI,IAAI;IASxB,OAAO,CAAC,mBAAmB;IAmB3B,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,aAAa,IAAI,OAAO,CAElC;CACJ"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// ================================================================
|
|
2
|
+
// Awasm - Threading: WorkerPool
|
|
3
|
+
// ================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Multi-threaded worker pool coordinating compute tasks on shared WebAssembly instances.
|
|
6
|
+
* Broadcasts compiled modules and SharedMemory handles to Web Workers via structured cloning.
|
|
7
|
+
*/
|
|
8
|
+
export class WorkerPool {
|
|
9
|
+
_workers;
|
|
10
|
+
_concurrency;
|
|
11
|
+
_roundRobinIndex;
|
|
12
|
+
_isInitialized;
|
|
13
|
+
_pendingTasks;
|
|
14
|
+
_nextTaskId;
|
|
15
|
+
constructor(workerScriptUrl, concurrency) {
|
|
16
|
+
const detectedConcurrency = typeof navigator !== "undefined" && navigator.hardwareConcurrency
|
|
17
|
+
? navigator.hardwareConcurrency
|
|
18
|
+
: 4;
|
|
19
|
+
this._concurrency = concurrency ?? detectedConcurrency;
|
|
20
|
+
this._workers = [];
|
|
21
|
+
this._roundRobinIndex = 0;
|
|
22
|
+
this._isInitialized = false;
|
|
23
|
+
this._pendingTasks = new Map();
|
|
24
|
+
this._nextTaskId = 1;
|
|
25
|
+
if (typeof Worker !== "undefined") {
|
|
26
|
+
for (let i = 0; i < this._concurrency; i++) {
|
|
27
|
+
const worker = new Worker(workerScriptUrl, { type: "module" });
|
|
28
|
+
worker.onmessage = this.handleWorkerMessage.bind(this);
|
|
29
|
+
this._workers.push(worker);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Broadcasts the compiled WebAssembly.Module and SharedMemory to all workers in the pool.
|
|
35
|
+
*/
|
|
36
|
+
async initialize(module, memory) {
|
|
37
|
+
if (this._isInitialized) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const promises = [];
|
|
41
|
+
for (let i = 0; i < this._workers.length; i++) {
|
|
42
|
+
const worker = this._workers[i];
|
|
43
|
+
const p = new Promise((resolve, reject) => {
|
|
44
|
+
const initId = this._nextTaskId++;
|
|
45
|
+
this._pendingTasks.set(initId, { resolve, reject });
|
|
46
|
+
const msg = {
|
|
47
|
+
type: "init",
|
|
48
|
+
taskId: initId,
|
|
49
|
+
module,
|
|
50
|
+
memory: memory.handle,
|
|
51
|
+
};
|
|
52
|
+
worker.postMessage(msg);
|
|
53
|
+
});
|
|
54
|
+
promises.push(p);
|
|
55
|
+
}
|
|
56
|
+
await Promise.all(promises);
|
|
57
|
+
this._isInitialized = true;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Dispatches a computational task to the next available worker in round-robin order.
|
|
61
|
+
*/
|
|
62
|
+
dispatch(taskIndex, arg0 = 0, arg1 = 0) {
|
|
63
|
+
if (!this._isInitialized) {
|
|
64
|
+
throw new Error("WorkerPool must be initialized with module and shared memory before dispatching tasks");
|
|
65
|
+
}
|
|
66
|
+
if (this._workers.length === 0) {
|
|
67
|
+
throw new Error("No active workers available in pool");
|
|
68
|
+
}
|
|
69
|
+
const worker = this._workers[this._roundRobinIndex];
|
|
70
|
+
this._roundRobinIndex = (this._roundRobinIndex + 1) % this._workers.length;
|
|
71
|
+
const taskId = this._nextTaskId++;
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
this._pendingTasks.set(taskId, { resolve, reject });
|
|
74
|
+
const msg = {
|
|
75
|
+
type: "task",
|
|
76
|
+
taskId,
|
|
77
|
+
arg0: taskIndex,
|
|
78
|
+
arg1,
|
|
79
|
+
};
|
|
80
|
+
worker.postMessage(msg);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Terminates all active worker threads and clears pending tasks.
|
|
85
|
+
*/
|
|
86
|
+
terminate() {
|
|
87
|
+
for (let i = 0; i < this._workers.length; i++) {
|
|
88
|
+
this._workers[i].terminate();
|
|
89
|
+
}
|
|
90
|
+
this._workers.length = 0;
|
|
91
|
+
this._pendingTasks.clear();
|
|
92
|
+
this._isInitialized = false;
|
|
93
|
+
}
|
|
94
|
+
handleWorkerMessage(event) {
|
|
95
|
+
const data = event.data;
|
|
96
|
+
if (!data || typeof data.taskId !== "number") {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const pending = this._pendingTasks.get(data.taskId);
|
|
100
|
+
if (!pending) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this._pendingTasks.delete(data.taskId);
|
|
104
|
+
if (data.error) {
|
|
105
|
+
pending.reject(new Error(data.error));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
pending.resolve(data.result);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
get concurrency() {
|
|
112
|
+
return this._concurrency;
|
|
113
|
+
}
|
|
114
|
+
get isInitialized() {
|
|
115
|
+
return this._isInitialized;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=worker-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../../../awasm/thread/worker-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { type Device } from "./device.js";
|
|
2
|
+
import { type Buffer, type Texture, type Sampler, type BufferSlice } from "./memory.js";
|
|
3
|
+
/**
|
|
4
|
+
* Standardized 4-tier WebGPU update frequency slots.
|
|
5
|
+
*/
|
|
6
|
+
export declare enum SlotFrequency {
|
|
7
|
+
PerFrame = 0,// ViewProj, Viewport, Time, Globals
|
|
8
|
+
PerPhase = 1,// Environment maps, shadow atlases, phase buffers
|
|
9
|
+
PerBatch = 2,// Surface properties, data textures, samplers, storage buffers
|
|
10
|
+
PerInstance = 3
|
|
11
|
+
}
|
|
12
|
+
export type ResourceBinding = GPUBufferBinding | GPUTextureView | GPUSampler | Buffer | Texture | Sampler | BufferSlice | GPUBuffer | GPUTexture;
|
|
13
|
+
/**
|
|
14
|
+
* Resolves a high-level or raw resource into a native GPUBindingResource descriptor.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveBindingResource(res: ResourceBinding): GPUBindingResource;
|
|
17
|
+
/**
|
|
18
|
+
* Fluent builder for creating GPUBindGroupLayout descriptors.
|
|
19
|
+
*/
|
|
20
|
+
export declare class BindLayout {
|
|
21
|
+
readonly native: GPUBindGroupLayout;
|
|
22
|
+
readonly label: string;
|
|
23
|
+
constructor(native: GPUBindGroupLayout, label?: string);
|
|
24
|
+
/**
|
|
25
|
+
* Builder factory for fluent layout construction.
|
|
26
|
+
*/
|
|
27
|
+
static builder(): BindLayoutBuilder;
|
|
28
|
+
/**
|
|
29
|
+
* Creates BindLayout from raw GPUBindGroupLayoutEntry array.
|
|
30
|
+
*/
|
|
31
|
+
static create(device: Device | GPUDevice, entries: GPUBindGroupLayoutEntry[], label?: string): BindLayout;
|
|
32
|
+
}
|
|
33
|
+
export declare class BindLayoutBuilder {
|
|
34
|
+
private entries;
|
|
35
|
+
addUniform(binding: number, visibility?: GPUShaderStageFlags, options?: {
|
|
36
|
+
hasDynamicOffset?: boolean;
|
|
37
|
+
minBindingSize?: number;
|
|
38
|
+
}): this;
|
|
39
|
+
addStorage(binding: number, visibility?: GPUShaderStageFlags, options?: {
|
|
40
|
+
readOnly?: boolean;
|
|
41
|
+
hasDynamicOffset?: boolean;
|
|
42
|
+
minBindingSize?: number;
|
|
43
|
+
}): this;
|
|
44
|
+
addTexture(binding: number, visibility?: GPUShaderStageFlags, options?: {
|
|
45
|
+
sampleType?: GPUTextureSampleType;
|
|
46
|
+
viewDimension?: GPUTextureViewDimension;
|
|
47
|
+
multisampled?: boolean;
|
|
48
|
+
}): this;
|
|
49
|
+
addStorageTexture(binding: number, format: GPUTextureFormat, visibility?: GPUShaderStageFlags, options?: {
|
|
50
|
+
access?: GPUStorageTextureAccess;
|
|
51
|
+
viewDimension?: GPUTextureViewDimension;
|
|
52
|
+
}): this;
|
|
53
|
+
addSampler(binding: number, visibility?: GPUShaderStageFlags, options?: {
|
|
54
|
+
comparison?: boolean;
|
|
55
|
+
}): this;
|
|
56
|
+
build(device: Device | GPUDevice, label?: string): BindLayout;
|
|
57
|
+
}
|
|
58
|
+
export interface BindingEntry {
|
|
59
|
+
binding: number;
|
|
60
|
+
resource: ResourceBinding;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* GPU bind group wrapper tracking slot index and native GPUBindGroup.
|
|
64
|
+
*/
|
|
65
|
+
export declare class BindTable {
|
|
66
|
+
readonly native: GPUBindGroup;
|
|
67
|
+
readonly layout: GPUBindGroupLayout;
|
|
68
|
+
readonly slot: number;
|
|
69
|
+
readonly label: string;
|
|
70
|
+
constructor(native: GPUBindGroup, layout: GPUBindGroupLayout, slot?: number, label?: string);
|
|
71
|
+
/**
|
|
72
|
+
* Factory: Instantiates GPUBindGroup with automated resource resolution.
|
|
73
|
+
*/
|
|
74
|
+
static create(device: Device | GPUDevice, layout: GPUBindGroupLayout | BindLayout, entries: BindingEntry[], options?: {
|
|
75
|
+
slot?: number;
|
|
76
|
+
label?: string;
|
|
77
|
+
}): BindTable;
|
|
78
|
+
private static _defaultCache?;
|
|
79
|
+
/**
|
|
80
|
+
* Retrieves existing cached BindTable or creates new instance if not present.
|
|
81
|
+
*/
|
|
82
|
+
static getOrCreate(device: Device | GPUDevice, layout: GPUBindGroupLayout | BindLayout, entries: BindingEntry[], options?: {
|
|
83
|
+
slot?: number;
|
|
84
|
+
label?: string;
|
|
85
|
+
}): BindTable;
|
|
86
|
+
/**
|
|
87
|
+
* Clears default BindTable deduplication cache.
|
|
88
|
+
*/
|
|
89
|
+
static clearCache(): void;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Computes deterministic lookup key for GPUBindGroupLayout and resource entries.
|
|
93
|
+
*/
|
|
94
|
+
export declare function hashBindingEntries(layout: GPUBindGroupLayout, entries: BindingEntry[]): string;
|
|
95
|
+
/**
|
|
96
|
+
* Cache preventing redundant allocation of identical GPUBindGroup instances.
|
|
97
|
+
*/
|
|
98
|
+
export declare class BindTableCache {
|
|
99
|
+
private _cache;
|
|
100
|
+
get(key: string): BindTable | undefined;
|
|
101
|
+
set(key: string, table: BindTable): void;
|
|
102
|
+
getOrCreate(device: Device | GPUDevice, layout: GPUBindGroupLayout | BindLayout, entries: BindingEntry[], options?: {
|
|
103
|
+
slot?: number;
|
|
104
|
+
label?: string;
|
|
105
|
+
}): BindTable;
|
|
106
|
+
clear(): void;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../awgpu/binding.ts"],"names":[],"mappings":"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"}
|