@aura3d/rendering 4.0.3 → 4.0.5
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/dist/EnvironmentPlatform.d.ts.map +1 -1
- package/dist/EnvironmentPlatform.js +6 -2
- package/dist/EnvironmentPlatform.js.map +1 -1
- package/dist/ForwardPass.d.ts +2 -0
- package/dist/ForwardPass.d.ts.map +1 -1
- package/dist/ForwardPass.js +70 -5
- package/dist/ForwardPass.js.map +1 -1
- package/dist/Geometry.d.ts +40 -0
- package/dist/Geometry.d.ts.map +1 -1
- package/dist/Geometry.js +39 -2
- package/dist/Geometry.js.map +1 -1
- package/dist/IndexBuffer.d.ts +16 -1
- package/dist/IndexBuffer.d.ts.map +1 -1
- package/dist/IndexBuffer.js +46 -1
- package/dist/IndexBuffer.js.map +1 -1
- package/dist/InstancedPBRMaterial.d.ts +2 -0
- package/dist/InstancedPBRMaterial.d.ts.map +1 -1
- package/dist/InstancedPBRMaterial.js +1 -0
- package/dist/InstancedPBRMaterial.js.map +1 -1
- package/dist/Material.d.ts +9 -0
- package/dist/Material.d.ts.map +1 -1
- package/dist/Material.js +3 -0
- package/dist/Material.js.map +1 -1
- package/dist/PBRMaterial.d.ts +2 -0
- package/dist/PBRMaterial.d.ts.map +1 -1
- package/dist/PBRMaterial.js +1 -0
- package/dist/PBRMaterial.js.map +1 -1
- package/dist/PortableShaderMaterial.d.ts +13 -3
- package/dist/PortableShaderMaterial.d.ts.map +1 -1
- package/dist/PortableShaderMaterial.js +24 -12
- package/dist/PortableShaderMaterial.js.map +1 -1
- package/dist/RenderDevice.d.ts +98 -0
- package/dist/RenderDevice.d.ts.map +1 -1
- package/dist/RenderDevice.js +129 -0
- package/dist/RenderDevice.js.map +1 -1
- package/dist/Renderer.d.ts +94 -0
- package/dist/Renderer.d.ts.map +1 -1
- package/dist/Renderer.js +321 -26
- package/dist/Renderer.js.map +1 -1
- package/dist/Sampler.d.ts +35 -0
- package/dist/Sampler.d.ts.map +1 -1
- package/dist/Sampler.js +96 -0
- package/dist/Sampler.js.map +1 -1
- package/dist/ShaderLibraryCore.d.ts +14 -0
- package/dist/ShaderLibraryCore.d.ts.map +1 -1
- package/dist/ShaderLibraryCore.js +94 -4
- package/dist/ShaderLibraryCore.js.map +1 -1
- package/dist/Texture.d.ts +53 -1
- package/dist/Texture.d.ts.map +1 -1
- package/dist/Texture.js +53 -2
- package/dist/Texture.js.map +1 -1
- package/dist/UnlitMaterial.d.ts +46 -0
- package/dist/UnlitMaterial.d.ts.map +1 -1
- package/dist/UnlitMaterial.js +32 -3
- package/dist/UnlitMaterial.js.map +1 -1
- package/dist/VertexFormat.d.ts +19 -1
- package/dist/VertexFormat.d.ts.map +1 -1
- package/dist/VertexFormat.js +40 -1
- package/dist/VertexFormat.js.map +1 -1
- package/dist/WebGL2Device.d.ts +16 -0
- package/dist/WebGL2Device.d.ts.map +1 -1
- package/dist/WebGL2Device.js +31 -6
- package/dist/WebGL2Device.js.map +1 -1
- package/dist/WebGPUDevice.d.ts +92 -1
- package/dist/WebGPUDevice.d.ts.map +1 -1
- package/dist/WebGPUDevice.js +417 -44
- package/dist/WebGPUDevice.js.map +1 -1
- package/dist/batching/BatchedGeometryPool.d.ts +22 -1
- package/dist/batching/BatchedGeometryPool.d.ts.map +1 -1
- package/dist/batching/BatchedGeometryPool.js +50 -2
- package/dist/batching/BatchedGeometryPool.js.map +1 -1
- package/dist/batching/DrawDataTexture.d.ts +21 -1
- package/dist/batching/DrawDataTexture.d.ts.map +1 -1
- package/dist/batching/DrawDataTexture.js +30 -4
- package/dist/batching/DrawDataTexture.js.map +1 -1
- package/dist/batching/MultiDrawBatch.d.ts +26 -0
- package/dist/batching/MultiDrawBatch.d.ts.map +1 -1
- package/dist/batching/MultiDrawBatch.js +64 -2
- package/dist/batching/MultiDrawBatch.js.map +1 -1
- package/dist/batching/index.d.ts +2 -2
- package/dist/batching/index.d.ts.map +1 -1
- package/dist/batching/index.js +2 -2
- package/dist/batching/index.js.map +1 -1
- package/dist/compute/ComputeContext.d.ts +84 -0
- package/dist/compute/ComputeContext.d.ts.map +1 -0
- package/dist/compute/ComputeContext.js +371 -0
- package/dist/compute/ComputeContext.js.map +1 -0
- package/dist/compute/index.d.ts +4 -0
- package/dist/compute/index.d.ts.map +1 -0
- package/dist/compute/index.js +3 -0
- package/dist/compute/index.js.map +1 -0
- package/dist/compute/types.d.ts +108 -0
- package/dist/compute/types.d.ts.map +1 -0
- package/dist/compute/types.js +25 -0
- package/dist/compute/types.js.map +1 -0
- package/dist/contracts/core.d.ts +1 -1
- package/dist/contracts/core.d.ts.map +1 -1
- package/dist/contracts/core.js.map +1 -1
- package/dist/contracts/flags.state.d.ts.map +1 -1
- package/dist/contracts/flags.state.js +20 -1
- package/dist/contracts/flags.state.js.map +1 -1
- package/dist/contracts/output.d.ts +1 -1
- package/dist/contracts/output.d.ts.map +1 -1
- package/dist/contracts/output.js.map +1 -1
- package/dist/contracts/post.d.ts +7 -0
- package/dist/contracts/post.d.ts.map +1 -1
- package/dist/contracts/post.js.map +1 -1
- package/dist/contracts/renderItem.d.ts +15 -0
- package/dist/contracts/renderItem.d.ts.map +1 -1
- package/dist/contracts/renderSource.d.ts +3 -1
- package/dist/contracts/renderSource.d.ts.map +1 -1
- package/dist/contracts/sampling.d.ts +23 -0
- package/dist/contracts/sampling.d.ts.map +1 -1
- package/dist/contracts/sampling.js.map +1 -1
- package/dist/environment/EnvironmentCache.d.ts.map +1 -1
- package/dist/environment/EnvironmentCache.js +7 -3
- package/dist/environment/EnvironmentCache.js.map +1 -1
- package/dist/environment/RoomEnvironmentScene.d.ts +2 -2
- package/dist/environment/RoomEnvironmentScene.d.ts.map +1 -1
- package/dist/environment/RoomEnvironmentScene.js.map +1 -1
- package/dist/geometry/Circle.d.ts +14 -0
- package/dist/geometry/Circle.d.ts.map +1 -0
- package/dist/geometry/Circle.js +31 -0
- package/dist/geometry/Circle.js.map +1 -0
- package/dist/geometry/Cone.d.ts +37 -0
- package/dist/geometry/Cone.d.ts.map +1 -0
- package/dist/geometry/Cone.js +129 -0
- package/dist/geometry/Cone.js.map +1 -0
- package/dist/geometry/Convex.d.ts +19 -0
- package/dist/geometry/Convex.d.ts.map +1 -0
- package/dist/geometry/Convex.js +27 -0
- package/dist/geometry/Convex.js.map +1 -0
- package/dist/geometry/Edges.d.ts +15 -0
- package/dist/geometry/Edges.d.ts.map +1 -0
- package/dist/geometry/Edges.js +98 -0
- package/dist/geometry/Edges.js.map +1 -0
- package/dist/geometry/Extrude.d.ts +29 -0
- package/dist/geometry/Extrude.d.ts.map +1 -0
- package/dist/geometry/Extrude.js +403 -0
- package/dist/geometry/Extrude.js.map +1 -0
- package/dist/geometry/Lathe.d.ts +20 -0
- package/dist/geometry/Lathe.d.ts.map +1 -0
- package/dist/geometry/Lathe.js +94 -0
- package/dist/geometry/Lathe.js.map +1 -0
- package/dist/geometry/Polyhedron.d.ts +21 -0
- package/dist/geometry/Polyhedron.d.ts.map +1 -0
- package/dist/geometry/Polyhedron.js +201 -0
- package/dist/geometry/Polyhedron.js.map +1 -0
- package/dist/geometry/Primitives.d.ts +38 -2
- package/dist/geometry/Primitives.d.ts.map +1 -1
- package/dist/geometry/Primitives.js +114 -0
- package/dist/geometry/Primitives.js.map +1 -1
- package/dist/geometry/Ring.d.ts +16 -0
- package/dist/geometry/Ring.d.ts.map +1 -0
- package/dist/geometry/Ring.js +44 -0
- package/dist/geometry/Ring.js.map +1 -0
- package/dist/geometry/RoundedBox.d.ts +22 -0
- package/dist/geometry/RoundedBox.d.ts.map +1 -0
- package/dist/geometry/RoundedBox.js +191 -0
- package/dist/geometry/RoundedBox.js.map +1 -0
- package/dist/geometry/Shape.d.ts +15 -0
- package/dist/geometry/Shape.d.ts.map +1 -0
- package/dist/geometry/Shape.js +44 -0
- package/dist/geometry/Shape.js.map +1 -0
- package/dist/geometry/Support.d.ts +137 -0
- package/dist/geometry/Support.d.ts.map +1 -0
- package/dist/geometry/Support.js +1066 -0
- package/dist/geometry/Support.js.map +1 -0
- package/dist/geometry/TorusKnot.d.ts +18 -0
- package/dist/geometry/TorusKnot.d.ts.map +1 -0
- package/dist/geometry/TorusKnot.js +83 -0
- package/dist/geometry/TorusKnot.js.map +1 -0
- package/dist/geometry/Tube.d.ts +19 -0
- package/dist/geometry/Tube.d.ts.map +1 -0
- package/dist/geometry/Tube.js +70 -0
- package/dist/geometry/Tube.js.map +1 -0
- package/dist/geometry/Wireframe.d.ts +19 -0
- package/dist/geometry/Wireframe.d.ts.map +1 -0
- package/dist/geometry/Wireframe.js +63 -0
- package/dist/geometry/Wireframe.js.map +1 -0
- package/dist/index.d.ts +38 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -3
- package/dist/index.js.map +1 -1
- package/dist/lanes/prd11.js +1 -1
- package/dist/lanes/prd11.js.map +1 -1
- package/dist/output/ToneMappingOperators.glsl.d.ts +1 -1
- package/dist/output/ToneMappingOperators.glsl.d.ts.map +1 -1
- package/dist/output/ToneMappingOperators.glsl.js +9 -1
- package/dist/output/ToneMappingOperators.glsl.js.map +1 -1
- package/dist/post/v2Entry.d.ts +1 -0
- package/dist/post/v2Entry.d.ts.map +1 -1
- package/dist/post/v2Entry.js.map +1 -1
- package/dist/post/v2Stages.d.ts +30 -1
- package/dist/post/v2Stages.d.ts.map +1 -1
- package/dist/post/v2Stages.js +87 -21
- package/dist/post/v2Stages.js.map +1 -1
- package/dist/program/ProgramCache.d.ts.map +1 -1
- package/dist/program/ProgramCache.js +12 -0
- package/dist/program/ProgramCache.js.map +1 -1
- package/dist/program/ProgramGenerator.d.ts.map +1 -1
- package/dist/program/ProgramGenerator.js +3 -0
- package/dist/program/ProgramGenerator.js.map +1 -1
- package/dist/reference/PostProcessPass.d.ts +1 -1
- package/dist/reference/PostProcessPass.d.ts.map +1 -1
- package/dist/reference/PostProcessPass.js +8 -1
- package/dist/reference/PostProcessPass.js.map +1 -1
- package/dist/renderer/CullingBatching.d.ts +44 -2
- package/dist/renderer/CullingBatching.d.ts.map +1 -1
- package/dist/renderer/CullingBatching.js +66 -11
- package/dist/renderer/CullingBatching.js.map +1 -1
- package/dist/shaders/chunks/lighting_mirrors.d.ts +2 -2
- package/dist/shaders/chunks/lighting_mirrors.d.ts.map +1 -1
- package/dist/shaders/chunks/lighting_mirrors.js.map +1 -1
- package/dist/shadows/DirectionalCascadeFitter.d.ts +8 -8
- package/dist/shadows/DirectionalCascadeFitter.d.ts.map +1 -1
- package/dist/shadows/DirectionalCascadeFitter.js.map +1 -1
- package/dist/shadows/ShadowAtlas.d.ts +5 -5
- package/dist/shadows/ShadowAtlas.d.ts.map +1 -1
- package/dist/shadows/ShadowAtlas.js.map +1 -1
- package/dist/vfx/ProceduralVolumeEmitter.d.ts +11 -0
- package/dist/vfx/ProceduralVolumeEmitter.d.ts.map +1 -1
- package/dist/vfx/ProceduralVolumeEmitter.js +20 -6
- package/dist/vfx/ProceduralVolumeEmitter.js.map +1 -1
- package/dist/webgl2/ContextLifecycle.d.ts +36 -0
- package/dist/webgl2/ContextLifecycle.d.ts.map +1 -1
- package/dist/webgl2/ContextLifecycle.js +110 -2
- package/dist/webgl2/ContextLifecycle.js.map +1 -1
- package/dist/webgl2/LegacyPost.d.ts +16 -1
- package/dist/webgl2/LegacyPost.d.ts.map +1 -1
- package/dist/webgl2/LegacyPost.js +49 -16
- package/dist/webgl2/LegacyPost.js.map +1 -1
- package/dist/webgl2/MultiDraw.d.ts.map +1 -1
- package/dist/webgl2/MultiDraw.js +42 -2
- package/dist/webgl2/MultiDraw.js.map +1 -1
- package/dist/webgl2/TextureUpload.d.ts +7 -0
- package/dist/webgl2/TextureUpload.d.ts.map +1 -1
- package/dist/webgl2/TextureUpload.js +54 -10
- package/dist/webgl2/TextureUpload.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { COMPUTE_BUFFER_USAGE, COMPUTE_MAP_MODE_READ, ComputeError } from "./types.js";
|
|
2
|
+
const DEFAULT_LIMITS = {
|
|
3
|
+
maxComputeWorkgroupSizeX: 256,
|
|
4
|
+
maxComputeWorkgroupSizeY: 256,
|
|
5
|
+
maxComputeWorkgroupSizeZ: 64,
|
|
6
|
+
maxComputeInvocationsPerWorkgroup: 256,
|
|
7
|
+
maxComputeWorkgroupsPerDimension: 65535,
|
|
8
|
+
maxStorageBuffersPerShaderStage: 8,
|
|
9
|
+
maxUniformBuffersPerShaderStage: 12,
|
|
10
|
+
maxUniformBufferBindingSize: 65536,
|
|
11
|
+
maxStorageBufferBindingSize: 134217728,
|
|
12
|
+
maxBufferSize: 268435456
|
|
13
|
+
};
|
|
14
|
+
const GLSL_MARKERS = /#version\b|\bvoid\s+main\s*\(|\bgl_FragColor\b|\bprecision\s+(?:highp|mediump|lowp)\b/;
|
|
15
|
+
const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
16
|
+
const BINDING_TYPES = ["storage", "read-only-storage", "uniform"];
|
|
17
|
+
const invalid = (message) => new ComputeError("compute-invalid-spec", message);
|
|
18
|
+
const isPositiveInt = (value) => typeof value === "number" && Number.isInteger(value) && value >= 1;
|
|
19
|
+
function normalizeTriple(value, what) {
|
|
20
|
+
if (!Array.isArray(value) || value.length < 1 || value.length > 3)
|
|
21
|
+
throw invalid(`${what} must be [x], [x, y] or [x, y, z]`);
|
|
22
|
+
const [x, y = 1, z = 1] = value;
|
|
23
|
+
for (const [axis, n] of [["x", x], ["y", y], ["z", z]]) {
|
|
24
|
+
if (!isPositiveInt(n))
|
|
25
|
+
throw invalid(`${what} ${axis} must be a positive integer, got ${String(n)}`);
|
|
26
|
+
}
|
|
27
|
+
return [x, y, z];
|
|
28
|
+
}
|
|
29
|
+
/** Parse `@compute @workgroup_size(a, b, c) fn <entry>` in either attribute order; null when sizes are not literals. */
|
|
30
|
+
function parseWorkgroupSize(wgsl, entryPoint) {
|
|
31
|
+
const patterns = [
|
|
32
|
+
/@compute\s*@workgroup_size\s*\(([^)]*)\)\s*fn\s+([A-Za-z_][A-Za-z0-9_]*)/g,
|
|
33
|
+
/@workgroup_size\s*\(([^)]*)\)\s*@compute\s*fn\s+([A-Za-z_][A-Za-z0-9_]*)/g
|
|
34
|
+
];
|
|
35
|
+
for (const pattern of patterns) {
|
|
36
|
+
for (const match of wgsl.matchAll(pattern)) {
|
|
37
|
+
if (match[2] !== entryPoint)
|
|
38
|
+
continue;
|
|
39
|
+
const parts = match[1].split(",").map((part) => part.trim()).filter((part) => part.length > 0);
|
|
40
|
+
if (parts.length < 1 || parts.length > 3 || !parts.every((part) => /^\d+u?$/.test(part)))
|
|
41
|
+
return null;
|
|
42
|
+
const [x, y = "1", z = "1"] = parts.map((part) => part.replace(/u$/, ""));
|
|
43
|
+
return [Number(x), Number(y), Number(z)];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
export class ComputeLimits {
|
|
49
|
+
raw;
|
|
50
|
+
constructor(raw) {
|
|
51
|
+
this.raw = raw;
|
|
52
|
+
}
|
|
53
|
+
get(name) {
|
|
54
|
+
const value = this.raw?.[name];
|
|
55
|
+
return typeof value === "number" && Number.isFinite(value) ? value : DEFAULT_LIMITS[name];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class ComputePipeline {
|
|
59
|
+
owner;
|
|
60
|
+
native;
|
|
61
|
+
id;
|
|
62
|
+
entryPoint;
|
|
63
|
+
workgroupSize;
|
|
64
|
+
bindings;
|
|
65
|
+
label;
|
|
66
|
+
isDisposed = false;
|
|
67
|
+
/** @internal */
|
|
68
|
+
constructor(owner, id, native, spec) {
|
|
69
|
+
this.owner = owner;
|
|
70
|
+
this.native = native;
|
|
71
|
+
this.id = id;
|
|
72
|
+
this.entryPoint = spec.entryPoint;
|
|
73
|
+
this.workgroupSize = spec.workgroupSize;
|
|
74
|
+
this.bindings = spec.bindings;
|
|
75
|
+
this.label = spec.label;
|
|
76
|
+
}
|
|
77
|
+
get disposed() {
|
|
78
|
+
return this.isDisposed;
|
|
79
|
+
}
|
|
80
|
+
/** Idempotent. WebGPU pipelines have no explicit destroy; this retires the handle. */
|
|
81
|
+
dispose() {
|
|
82
|
+
this.isDisposed = true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export class ComputeBuffer {
|
|
86
|
+
owner;
|
|
87
|
+
native;
|
|
88
|
+
size;
|
|
89
|
+
usage;
|
|
90
|
+
label;
|
|
91
|
+
isDisposed = false;
|
|
92
|
+
/** @internal */
|
|
93
|
+
constructor(owner, native, size, usage, label) {
|
|
94
|
+
this.owner = owner;
|
|
95
|
+
this.native = native;
|
|
96
|
+
this.size = size;
|
|
97
|
+
this.usage = usage;
|
|
98
|
+
this.label = label;
|
|
99
|
+
}
|
|
100
|
+
get disposed() {
|
|
101
|
+
return this.isDisposed;
|
|
102
|
+
}
|
|
103
|
+
/** Upload bytes at a 4-byte-aligned offset. */
|
|
104
|
+
write(data, byteOffset = 0) {
|
|
105
|
+
this.assertLive("write");
|
|
106
|
+
const byteLength = data.byteLength;
|
|
107
|
+
if (!Number.isInteger(byteOffset) || byteOffset < 0 || byteOffset % 4 !== 0)
|
|
108
|
+
throw invalid(`write offset must be a non-negative multiple of 4, got ${String(byteOffset)}`);
|
|
109
|
+
if (byteLength % 4 !== 0)
|
|
110
|
+
throw invalid(`write length must be a multiple of 4 bytes, got ${byteLength}`);
|
|
111
|
+
if (byteOffset + byteLength > this.size)
|
|
112
|
+
throw invalid(`write of ${byteLength} bytes at offset ${byteOffset} exceeds the ${this.size}-byte buffer`);
|
|
113
|
+
this.owner.device.queue.writeBuffer(this.native, byteOffset, data);
|
|
114
|
+
}
|
|
115
|
+
/** Copy the buffer to a staging buffer, map it and return the bytes. Rejects with `compute-read-failed`. */
|
|
116
|
+
async read() {
|
|
117
|
+
this.assertLive("read");
|
|
118
|
+
const device = this.owner.device;
|
|
119
|
+
const staging = device.createBuffer({
|
|
120
|
+
label: `${this.label ?? "compute-buffer"}-readback`,
|
|
121
|
+
size: this.size,
|
|
122
|
+
usage: COMPUTE_BUFFER_USAGE.MAP_READ | COMPUTE_BUFFER_USAGE.COPY_DST
|
|
123
|
+
});
|
|
124
|
+
try {
|
|
125
|
+
const encoder = device.createCommandEncoder({ label: "aura3d-compute-readback" });
|
|
126
|
+
encoder.copyBufferToBuffer(this.native, 0, staging, 0, this.size);
|
|
127
|
+
device.queue.submit([encoder.finish()]);
|
|
128
|
+
await staging.mapAsync(COMPUTE_MAP_MODE_READ);
|
|
129
|
+
const copy = staging.getMappedRange().slice(0);
|
|
130
|
+
staging.unmap();
|
|
131
|
+
return copy;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
throw new ComputeError("compute-read-failed", `compute buffer read failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
staging.destroy();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Idempotent. */
|
|
141
|
+
dispose() {
|
|
142
|
+
if (this.isDisposed)
|
|
143
|
+
return;
|
|
144
|
+
this.isDisposed = true;
|
|
145
|
+
this.native.destroy();
|
|
146
|
+
}
|
|
147
|
+
assertLive(operation) {
|
|
148
|
+
if (this.isDisposed)
|
|
149
|
+
throw new ComputeError("compute-disposed", `compute buffer "${this.label ?? "unnamed"}" is disposed; cannot ${operation}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
export class ComputeContext {
|
|
153
|
+
device;
|
|
154
|
+
limits;
|
|
155
|
+
buffers = new Set();
|
|
156
|
+
pipelines = new Set();
|
|
157
|
+
nextPipelineId = 1;
|
|
158
|
+
isDisposed = false;
|
|
159
|
+
constructor(device) {
|
|
160
|
+
this.device = device;
|
|
161
|
+
for (const method of ["createShaderModule", "createComputePipeline", "createBuffer", "createBindGroup", "createCommandEncoder"]) {
|
|
162
|
+
if (typeof device?.[method] !== "function") {
|
|
163
|
+
throw invalid(`createComputeContext needs a WebGPU GPUDevice; \`${method}\` is missing`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (typeof device.queue?.submit !== "function" || typeof device.queue?.writeBuffer !== "function") {
|
|
167
|
+
throw invalid("createComputeContext needs a WebGPU GPUDevice with a queue that supports submit and writeBuffer");
|
|
168
|
+
}
|
|
169
|
+
this.limits = new ComputeLimits(device.limits);
|
|
170
|
+
}
|
|
171
|
+
get disposed() {
|
|
172
|
+
return this.isDisposed;
|
|
173
|
+
}
|
|
174
|
+
createPipeline(spec) {
|
|
175
|
+
this.assertLive();
|
|
176
|
+
if (typeof spec !== "object" || spec === null)
|
|
177
|
+
throw invalid("createComputePipeline needs a spec object");
|
|
178
|
+
const { wgsl } = spec;
|
|
179
|
+
if (typeof wgsl !== "string" || wgsl.trim().length === 0) {
|
|
180
|
+
throw new ComputeError("compute-wgsl-required", "compute pipelines require WGSL source in `wgsl`; there is no GLSL compute path");
|
|
181
|
+
}
|
|
182
|
+
if (GLSL_MARKERS.test(wgsl)) {
|
|
183
|
+
throw new ComputeError("compute-wgsl-required", "`wgsl` looks like GLSL (#version / void main / precision). Compute pipelines require WGSL with a `@compute` entry point");
|
|
184
|
+
}
|
|
185
|
+
const entryPoint = spec.entryPoint ?? "main";
|
|
186
|
+
if (!IDENTIFIER.test(entryPoint))
|
|
187
|
+
throw invalid(`entryPoint "${entryPoint}" is not a valid WGSL identifier`);
|
|
188
|
+
if (!/@compute\b/.test(wgsl))
|
|
189
|
+
throw invalid("WGSL has no `@compute` entry point");
|
|
190
|
+
if (!new RegExp(`\\bfn\\s+${entryPoint}\\b`).test(wgsl))
|
|
191
|
+
throw invalid(`WGSL has no \`fn ${entryPoint}\`; set \`entryPoint\` to the name of your @compute function`);
|
|
192
|
+
const declared = parseWorkgroupSize(wgsl, entryPoint);
|
|
193
|
+
const requested = spec.workgroupSize === undefined ? undefined : normalizeTriple(spec.workgroupSize, "workgroupSize");
|
|
194
|
+
if (declared && requested && (declared[0] !== requested[0] || declared[1] !== requested[1] || declared[2] !== requested[2])) {
|
|
195
|
+
throw invalid(`workgroupSize [${requested.join(", ")}] does not match the shader's @workgroup_size(${declared.join(", ")})`);
|
|
196
|
+
}
|
|
197
|
+
const workgroupSize = declared ?? requested ?? [64, 1, 1];
|
|
198
|
+
const [wx, wy, wz] = workgroupSize;
|
|
199
|
+
if (wx > this.limits.get("maxComputeWorkgroupSizeX") || wy > this.limits.get("maxComputeWorkgroupSizeY") || wz > this.limits.get("maxComputeWorkgroupSizeZ")) {
|
|
200
|
+
throw invalid(`workgroup size [${workgroupSize.join(", ")}] exceeds the device limits [${this.limits.get("maxComputeWorkgroupSizeX")}, ${this.limits.get("maxComputeWorkgroupSizeY")}, ${this.limits.get("maxComputeWorkgroupSizeZ")}]`);
|
|
201
|
+
}
|
|
202
|
+
if (wx * wy * wz > this.limits.get("maxComputeInvocationsPerWorkgroup")) {
|
|
203
|
+
throw invalid(`workgroup size ${wx * wy * wz} invocations exceeds maxComputeInvocationsPerWorkgroup ${this.limits.get("maxComputeInvocationsPerWorkgroup")}`);
|
|
204
|
+
}
|
|
205
|
+
const bindings = this.validateBindings(spec.bindings ?? []);
|
|
206
|
+
const module = this.device.createShaderModule({ label: spec.label ?? "aura3d-compute", code: wgsl });
|
|
207
|
+
const native = this.device.createComputePipeline({
|
|
208
|
+
label: spec.label ?? "aura3d-compute",
|
|
209
|
+
layout: "auto",
|
|
210
|
+
compute: { module, entryPoint }
|
|
211
|
+
});
|
|
212
|
+
const pipeline = new ComputePipeline(this, this.nextPipelineId++, native, { entryPoint, workgroupSize, bindings, label: spec.label });
|
|
213
|
+
this.pipelines.add(pipeline);
|
|
214
|
+
return pipeline;
|
|
215
|
+
}
|
|
216
|
+
createBuffer(spec) {
|
|
217
|
+
this.assertLive();
|
|
218
|
+
if (typeof spec !== "object" || spec === null)
|
|
219
|
+
throw invalid("computeBuffer needs a spec object");
|
|
220
|
+
const usage = spec.usage ?? "storage";
|
|
221
|
+
if (usage !== "storage" && usage !== "uniform")
|
|
222
|
+
throw invalid(`buffer usage must be "storage" or "uniform", got ${String(usage)}`);
|
|
223
|
+
const hasData = spec.data !== undefined;
|
|
224
|
+
if (!hasData && spec.size === undefined)
|
|
225
|
+
throw invalid("computeBuffer needs `size` or `data`");
|
|
226
|
+
const raw = hasData ? spec.data.byteLength : spec.size;
|
|
227
|
+
if (typeof raw !== "number" || !Number.isInteger(raw) || raw < 1)
|
|
228
|
+
throw invalid(`buffer size must be a positive integer number of bytes, got ${String(raw)}`);
|
|
229
|
+
if (hasData && spec.size !== undefined && spec.size < raw)
|
|
230
|
+
throw invalid(`size ${spec.size} is smaller than the ${raw}-byte data`);
|
|
231
|
+
const size = Math.ceil(Math.max(raw, spec.size ?? 0) / 4) * 4;
|
|
232
|
+
const bindingLimit = usage === "uniform" ? this.limits.get("maxUniformBufferBindingSize") : this.limits.get("maxStorageBufferBindingSize");
|
|
233
|
+
if (size > bindingLimit)
|
|
234
|
+
throw invalid(`${usage} buffer of ${size} bytes exceeds the device binding limit ${bindingLimit}`);
|
|
235
|
+
if (size > this.limits.get("maxBufferSize"))
|
|
236
|
+
throw invalid(`buffer of ${size} bytes exceeds maxBufferSize ${this.limits.get("maxBufferSize")}`);
|
|
237
|
+
const gpuUsage = (usage === "uniform" ? COMPUTE_BUFFER_USAGE.UNIFORM : COMPUTE_BUFFER_USAGE.STORAGE) | COMPUTE_BUFFER_USAGE.COPY_SRC | COMPUTE_BUFFER_USAGE.COPY_DST;
|
|
238
|
+
const native = this.device.createBuffer({ label: spec.label ?? "aura3d-compute-buffer", size, usage: gpuUsage });
|
|
239
|
+
const buffer = new ComputeBuffer(this, native, size, usage, spec.label);
|
|
240
|
+
this.buffers.add(buffer);
|
|
241
|
+
if (hasData) {
|
|
242
|
+
const bytes = spec.data instanceof ArrayBuffer
|
|
243
|
+
? new Uint8Array(spec.data)
|
|
244
|
+
: new Uint8Array(spec.data.buffer, spec.data.byteOffset, spec.data.byteLength);
|
|
245
|
+
const padded = bytes.byteLength === size ? bytes : (() => { const out = new Uint8Array(size); out.set(bytes); return out; })();
|
|
246
|
+
this.device.queue.writeBuffer(native, 0, padded);
|
|
247
|
+
}
|
|
248
|
+
return buffer;
|
|
249
|
+
}
|
|
250
|
+
/** Encode and submit one compute pass. Resolves nothing: the GPU runs asynchronously; use `read()` or `onIdle()` to wait. */
|
|
251
|
+
dispatch(input) {
|
|
252
|
+
this.assertLive();
|
|
253
|
+
if (typeof input !== "object" || input === null)
|
|
254
|
+
throw invalid("dispatch needs an input object");
|
|
255
|
+
const pipeline = input.pipeline;
|
|
256
|
+
if (!(pipeline instanceof ComputePipeline) || pipeline.owner !== this)
|
|
257
|
+
throw invalid("dispatch `pipeline` must come from this compute context");
|
|
258
|
+
if (pipeline.disposed)
|
|
259
|
+
throw new ComputeError("compute-disposed", "compute pipeline is disposed; cannot dispatch");
|
|
260
|
+
const supplied = new Map();
|
|
261
|
+
const entries = Array.isArray(input.bindings)
|
|
262
|
+
? input.bindings
|
|
263
|
+
: Object.entries(input.bindings).map(([key, buffer]) => ({ binding: Number(key), buffer }));
|
|
264
|
+
for (const entry of entries) {
|
|
265
|
+
if (!Number.isInteger(entry.binding) || entry.binding < 0)
|
|
266
|
+
throw invalid(`dispatch binding index must be a non-negative integer, got ${String(entry.binding)}`);
|
|
267
|
+
if (supplied.has(entry.binding))
|
|
268
|
+
throw invalid(`dispatch binding ${entry.binding} supplied twice`);
|
|
269
|
+
if (!(entry.buffer instanceof ComputeBuffer) || entry.buffer.owner !== this)
|
|
270
|
+
throw invalid(`dispatch binding ${entry.binding} must be a computeBuffer from this compute context`);
|
|
271
|
+
if (entry.buffer.disposed)
|
|
272
|
+
throw new ComputeError("compute-disposed", `compute buffer bound at ${entry.binding} is disposed; cannot dispatch`);
|
|
273
|
+
supplied.set(entry.binding, entry.buffer);
|
|
274
|
+
}
|
|
275
|
+
for (const declared of pipeline.bindings) {
|
|
276
|
+
const buffer = supplied.get(declared.binding);
|
|
277
|
+
if (!buffer)
|
|
278
|
+
throw invalid(`dispatch is missing a buffer for binding ${declared.binding} (${declared.type})`);
|
|
279
|
+
const wantsUniform = declared.type === "uniform";
|
|
280
|
+
if (wantsUniform !== (buffer.usage === "uniform")) {
|
|
281
|
+
throw invalid(`binding ${declared.binding} is declared "${declared.type}" but the buffer was created with usage "${buffer.usage}"`);
|
|
282
|
+
}
|
|
283
|
+
supplied.delete(declared.binding);
|
|
284
|
+
}
|
|
285
|
+
if (supplied.size > 0)
|
|
286
|
+
throw invalid(`dispatch supplied undeclared binding(s) ${[...supplied.keys()].join(", ")}; declare them in the pipeline's \`bindings\``);
|
|
287
|
+
const [wx, wy, wz] = pipeline.workgroupSize;
|
|
288
|
+
let groups;
|
|
289
|
+
if (input.workgroups !== undefined && input.items !== undefined)
|
|
290
|
+
throw invalid("dispatch takes `workgroups` or `items`, not both");
|
|
291
|
+
if (input.workgroups !== undefined) {
|
|
292
|
+
groups = normalizeTriple(input.workgroups, "workgroups");
|
|
293
|
+
}
|
|
294
|
+
else if (input.items !== undefined) {
|
|
295
|
+
const [ix, iy, iz] = normalizeTriple(input.items, "items");
|
|
296
|
+
groups = [Math.ceil(ix / wx), Math.ceil(iy / wy), Math.ceil(iz / wz)];
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
throw invalid("dispatch needs `workgroups` or `items`");
|
|
300
|
+
}
|
|
301
|
+
const maxPerDimension = this.limits.get("maxComputeWorkgroupsPerDimension");
|
|
302
|
+
if (groups.some((count) => count > maxPerDimension)) {
|
|
303
|
+
throw invalid(`workgroup counts [${groups.join(", ")}] exceed maxComputeWorkgroupsPerDimension ${maxPerDimension}`);
|
|
304
|
+
}
|
|
305
|
+
const bindGroup = this.device.createBindGroup({
|
|
306
|
+
label: pipeline.label ?? "aura3d-compute",
|
|
307
|
+
layout: pipeline.native.getBindGroupLayout(0),
|
|
308
|
+
entries: entries.map((entry) => ({ binding: entry.binding, resource: { buffer: entry.buffer.native } }))
|
|
309
|
+
});
|
|
310
|
+
const encoder = this.device.createCommandEncoder({ label: "aura3d-compute-dispatch" });
|
|
311
|
+
const pass = encoder.beginComputePass({ label: pipeline.label ?? "aura3d-compute" });
|
|
312
|
+
pass.setPipeline(pipeline.native);
|
|
313
|
+
pass.setBindGroup(0, bindGroup);
|
|
314
|
+
pass.dispatchWorkgroups(groups[0], groups[1], groups[2]);
|
|
315
|
+
pass.end();
|
|
316
|
+
this.device.queue.submit([encoder.finish()]);
|
|
317
|
+
return { workgroups: groups, invocations: groups[0] * groups[1] * groups[2] * wx * wy * wz };
|
|
318
|
+
}
|
|
319
|
+
/** Resolves when every submitted compute command has finished (no-op where the device cannot report it). */
|
|
320
|
+
async onIdle() {
|
|
321
|
+
await this.device.queue.onSubmittedWorkDone?.();
|
|
322
|
+
}
|
|
323
|
+
/** Destroys every buffer this context created. Idempotent. */
|
|
324
|
+
dispose() {
|
|
325
|
+
if (this.isDisposed)
|
|
326
|
+
return;
|
|
327
|
+
this.isDisposed = true;
|
|
328
|
+
for (const buffer of this.buffers)
|
|
329
|
+
buffer.dispose();
|
|
330
|
+
for (const pipeline of this.pipelines)
|
|
331
|
+
pipeline.dispose();
|
|
332
|
+
this.buffers.clear();
|
|
333
|
+
this.pipelines.clear();
|
|
334
|
+
}
|
|
335
|
+
validateBindings(bindings) {
|
|
336
|
+
if (!Array.isArray(bindings))
|
|
337
|
+
throw invalid("`bindings` must be an array of { binding, type }");
|
|
338
|
+
const seen = new Set();
|
|
339
|
+
let storage = 0;
|
|
340
|
+
let uniform = 0;
|
|
341
|
+
for (const entry of bindings) {
|
|
342
|
+
if (typeof entry !== "object" || entry === null || !Number.isInteger(entry.binding) || entry.binding < 0) {
|
|
343
|
+
throw invalid(`each binding needs a non-negative integer \`binding\` index, got ${JSON.stringify(entry)}`);
|
|
344
|
+
}
|
|
345
|
+
if (!BINDING_TYPES.includes(entry.type))
|
|
346
|
+
throw invalid(`binding ${entry.binding} type must be one of ${BINDING_TYPES.join(", ")}, got ${String(entry.type)}`);
|
|
347
|
+
if (seen.has(entry.binding))
|
|
348
|
+
throw invalid(`binding ${entry.binding} declared twice`);
|
|
349
|
+
seen.add(entry.binding);
|
|
350
|
+
if (entry.type === "uniform")
|
|
351
|
+
uniform += 1;
|
|
352
|
+
else
|
|
353
|
+
storage += 1;
|
|
354
|
+
}
|
|
355
|
+
if (storage > this.limits.get("maxStorageBuffersPerShaderStage")) {
|
|
356
|
+
throw invalid(`${storage} storage bindings exceed maxStorageBuffersPerShaderStage ${this.limits.get("maxStorageBuffersPerShaderStage")}`);
|
|
357
|
+
}
|
|
358
|
+
if (uniform > this.limits.get("maxUniformBuffersPerShaderStage")) {
|
|
359
|
+
throw invalid(`${uniform} uniform bindings exceed maxUniformBuffersPerShaderStage ${this.limits.get("maxUniformBuffersPerShaderStage")}`);
|
|
360
|
+
}
|
|
361
|
+
return bindings.map((entry) => ({ binding: entry.binding, type: entry.type }));
|
|
362
|
+
}
|
|
363
|
+
assertLive() {
|
|
364
|
+
if (this.isDisposed)
|
|
365
|
+
throw new ComputeError("compute-disposed", "compute context is disposed");
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
export function createComputeContext(device) {
|
|
369
|
+
return new ComputeContext(device);
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=ComputeContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComputeContext.js","sourceRoot":"","sources":["../../../../../packages/rendering/src/compute/ComputeContext.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EAUb,MAAM,YAAY,CAAC;AAEpB,MAAM,cAAc,GAAG;IACrB,wBAAwB,EAAE,GAAG;IAC7B,wBAAwB,EAAE,GAAG;IAC7B,wBAAwB,EAAE,EAAE;IAC5B,iCAAiC,EAAE,GAAG;IACtC,gCAAgC,EAAE,KAAK;IACvC,+BAA+B,EAAE,CAAC;IAClC,+BAA+B,EAAE,EAAE;IACnC,2BAA2B,EAAE,KAAK;IAClC,2BAA2B,EAAE,SAAS;IACtC,aAAa,EAAE,SAAS;CAChB,CAAC;AAEX,MAAM,YAAY,GAAG,uFAAuF,CAAC;AAC7G,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC9C,MAAM,aAAa,GAAkC,CAAC,SAAS,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;AAIjG,MAAM,OAAO,GAAG,CAAC,OAAe,EAAgB,EAAE,CAAC,IAAI,YAAY,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;AAErG,MAAM,aAAa,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAE9H,SAAS,eAAe,CAAC,KAAsC,EAAE,IAAY;IAC3E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,OAAO,CAAC,GAAG,IAAI,mCAAmC,CAAC,CAAC;IAC7H,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAA0B,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAU,EAAE,CAAC;QAChE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAAE,MAAM,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,oCAAoC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,wHAAwH;AACxH,SAAS,kBAAkB,CAAC,IAAY,EAAE,UAAkB;IAC1D,MAAM,QAAQ,GAAG;QACf,2EAA2E;QAC3E,2EAA2E;KAC5E,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU;gBAAE,SAAS;YACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAChG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACtG,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,GAAiD;QAAjD,QAAG,GAAH,GAAG,CAA8C;IAAG,CAAC;IAClF,GAAG,CAAC,IAAiC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5F,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IAUf;IAEA;IAXF,EAAE,CAAS;IACX,UAAU,CAAS;IACnB,aAAa,CAAS;IACtB,QAAQ,CAAgC;IACxC,KAAK,CAAqB;IAC3B,UAAU,GAAG,KAAK,CAAC;IAE3B,gBAAgB;IAChB,YACW,KAAqB,EAC9B,EAAU,EACD,MAAsD,EAC/D,IAAuH;QAH9G,UAAK,GAAL,KAAK,CAAgB;QAErB,WAAM,GAAN,MAAM,CAAgD;QAG/D,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,sFAAsF;IACtF,OAAO;QACL,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,aAAa;IAQb;IACA;IARF,IAAI,CAAS;IACb,KAAK,CAAqB;IAC1B,KAAK,CAAqB;IAC3B,UAAU,GAAG,KAAK,CAAC;IAE3B,gBAAgB;IAChB,YACW,KAAqB,EACrB,MAA4B,EACrC,IAAY,EACZ,KAAyB,EACzB,KAAyB;QAJhB,UAAK,GAAL,KAAK,CAAgB;QACrB,WAAM,GAAN,MAAM,CAAsB;QAKrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,IAAmC,EAAE,UAAU,GAAG,CAAC;QACvD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,KAAK,CAAC;YAAE,MAAM,OAAO,CAAC,0DAA0D,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC3K,IAAI,UAAU,GAAG,CAAC,KAAK,CAAC;YAAE,MAAM,OAAO,CAAC,mDAAmD,UAAU,EAAE,CAAC,CAAC;QACzG,IAAI,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,IAAI;YAAE,MAAM,OAAO,CAAC,YAAY,UAAU,oBAAoB,UAAU,gBAAgB,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC;QACpJ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,4GAA4G;IAC5G,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC;YAClC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,gBAAgB,WAAW;YACnD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,oBAAoB,CAAC,QAAQ,GAAG,oBAAoB,CAAC,QAAQ;SACrE,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;YAClF,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,YAAY,CAAC,qBAAqB,EAAE,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3J,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,OAAO;QACL,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAEO,UAAU,CAAC,SAAiB;QAClC,IAAI,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,mBAAmB,IAAI,CAAC,KAAK,IAAI,SAAS,yBAAyB,SAAS,EAAE,CAAC,CAAC;IAClJ,CAAC;CACF;AAED,MAAM,OAAO,cAAc;IAOJ;IANZ,MAAM,CAAgB;IACd,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IACnC,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAChD,cAAc,GAAG,CAAC,CAAC;IACnB,UAAU,GAAG,KAAK,CAAC;IAE3B,YAAqB,MAA4B;QAA5B,WAAM,GAAN,MAAM,CAAsB;QAC/C,KAAK,MAAM,MAAM,IAAI,CAAC,oBAAoB,EAAE,uBAAuB,EAAE,cAAc,EAAE,iBAAiB,EAAE,sBAAsB,CAAU,EAAE,CAAC;YACzI,IAAI,OAAQ,MAA6C,EAAE,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;gBACnF,MAAM,OAAO,CAAC,oDAAoD,MAAM,eAAe,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,KAAK,EAAE,WAAW,KAAK,UAAU,EAAE,CAAC;YAClG,MAAM,OAAO,CAAC,iGAAiG,CAAC,CAAC;QACnH,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,cAAc,CAAC,IAAyB;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,OAAO,CAAC,2CAA2C,CAAC,CAAC;QAC1G,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QACtB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,YAAY,CAAC,uBAAuB,EAAE,gFAAgF,CAAC,CAAC;QACpI,CAAC;QACD,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,YAAY,CAAC,uBAAuB,EAAE,yHAAyH,CAAC,CAAC;QAC7K,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,MAAM,OAAO,CAAC,eAAe,UAAU,kCAAkC,CAAC,CAAC;QAC7G,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,OAAO,CAAC,oCAAoC,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,MAAM,CAAC,YAAY,UAAU,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,OAAO,CAAC,oBAAoB,UAAU,8DAA8D,CAAC,CAAC;QAErK,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QACtH,IAAI,QAAQ,IAAI,SAAS,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5H,MAAM,OAAO,CAAC,kBAAkB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,iDAAiD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/H,CAAC;QACD,MAAM,aAAa,GAAW,QAAQ,IAAI,SAAS,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,aAAa,CAAC;QACnC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAC7J,MAAM,OAAO,CAAC,mBAAmB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAC3O,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,EAAE,CAAC;YACxE,MAAM,OAAO,CAAC,kBAAkB,EAAE,GAAG,EAAE,GAAG,EAAE,0DAA0D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;QAChK,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACrG,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;YAC/C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,gBAAgB;YACrC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;SAChC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACtI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,YAAY,CAAC,IAAuB;QAClC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAClG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;QACtC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,OAAO,CAAC,oDAAoD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnI,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;QACxC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,OAAO,CAAC,sCAAsC,CAAC,CAAC;QAC/F,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAK,CAAC;QACzD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;YAAE,MAAM,OAAO,CAAC,+DAA+D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9J,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG;YAAE,MAAM,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,wBAAwB,GAAG,YAAY,CAAC,CAAC;QACnI,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3I,IAAI,IAAI,GAAG,YAAY;YAAE,MAAM,OAAO,CAAC,GAAG,KAAK,cAAc,IAAI,2CAA2C,YAAY,EAAE,CAAC,CAAC;QAC5H,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;YAAE,MAAM,OAAO,CAAC,aAAa,IAAI,gCAAgC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAChJ,MAAM,QAAQ,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,oBAAoB,CAAC,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC;QACrK,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,uBAAuB,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjH,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,YAAY,WAAW;gBAC5C,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC3B,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAK,CAAC,UAAU,EAAE,IAAI,CAAC,IAAK,CAAC,UAAU,CAAC,CAAC;YACpF,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/H,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,6HAA6H;IAC7H,QAAQ,CAAC,KAA2B;QAClC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM,OAAO,CAAC,gCAAgC,CAAC,CAAC;QACjG,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,CAAC,QAAQ,YAAY,eAAe,CAAC,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI;YAAE,MAAM,OAAO,CAAC,yDAAyD,CAAC,CAAC;QAChJ,IAAI,QAAQ,CAAC,QAAQ;YAAE,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,+CAA+C,CAAC,CAAC;QAEnH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;QAClD,MAAM,OAAO,GAAsE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC9G,CAAC,CAAE,KAAK,CAAC,QAA4D;YACrE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAmC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACzH,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC;gBAAE,MAAM,OAAO,CAAC,8DAA8D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChK,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,MAAM,OAAO,CAAC,oBAAoB,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;YACnG,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;gBAAE,MAAM,OAAO,CAAC,oBAAoB,KAAK,CAAC,OAAO,oDAAoD,CAAC,CAAC;YAClL,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ;gBAAE,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,2BAA2B,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;YAC/I,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM;gBAAE,MAAM,OAAO,CAAC,4CAA4C,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;YAC9G,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC;YACjD,IAAI,YAAY,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;gBAClD,MAAM,OAAO,CAAC,WAAW,QAAQ,CAAC,OAAO,iBAAiB,QAAQ,CAAC,IAAI,4CAA4C,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YACtI,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC;YAAE,MAAM,OAAO,CAAC,2CAA2C,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAEhK,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC;QAC5C,IAAI,MAAc,CAAC;QACnB,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,MAAM,OAAO,CAAC,kDAAkD,CAAC,CAAC;QACnI,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,CAAC,wCAAwC,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAC5E,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,eAAe,CAAC,EAAE,CAAC;YACpD,MAAM,OAAO,CAAC,qBAAqB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,6CAA6C,eAAe,EAAE,CAAC,CAAC;QACtH,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;YAC5C,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,gBAAgB;YACzC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC7C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAG,KAAK,CAAC,MAAwB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAC5H,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACvF,MAAM,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,gBAAgB,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IAC/F,CAAC;IAED,4GAA4G;IAC5G,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC;IAClD,CAAC;IAED,8DAA8D;IAC9D,OAAO;QACL,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAEO,gBAAgB,CAAC,QAAuC;QAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,MAAM,OAAO,CAAC,kDAAkD,CAAC,CAAC;QAChG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBACzG,MAAM,OAAO,CAAC,oEAAoE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7G,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,MAAM,OAAO,CAAC,WAAW,KAAK,CAAC,OAAO,wBAAwB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9J,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,MAAM,OAAO,CAAC,WAAW,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;YACtF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC,CAAC;;gBACtC,OAAO,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,EAAE,CAAC;YACjE,MAAM,OAAO,CAAC,GAAG,OAAO,4DAA4D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;QAC5I,CAAC;QACD,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,EAAE,CAAC;YACjE,MAAM,OAAO,CAAC,GAAG,OAAO,4DAA4D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;QAC5I,CAAC;QACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,6BAA6B,CAAC,CAAC;IACjG,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,MAA4B;IAC/D,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { ComputeBuffer, ComputeContext, ComputeLimits, ComputePipeline, createComputeContext } from "./ComputeContext.js";
|
|
2
|
+
export { COMPUTE_BUFFER_USAGE, ComputeError } from "./types.js";
|
|
3
|
+
export type { ComputeBindingSpec, ComputeBindingType, ComputeBufferSpec, ComputeBufferUsage, ComputeDispatchInput, ComputeDispatchResult, ComputeErrorCode, ComputeGPUBufferLike, ComputeGPUDeviceLike, ComputePipelineSpec, ComputeWorkgroups, ComputeWorkgroupSize } from "./types.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/rendering/src/compute/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/rendering/src/compute/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SH-04 / L1-12 — public WebGPU compute surface. Structural GPU types: the
|
|
3
|
+
* compute context only needs this slice of `GPUDevice`, so it can be driven by
|
|
4
|
+
* a real device or by a fake in unit tests.
|
|
5
|
+
*/
|
|
6
|
+
export interface ComputeGPUBufferLike {
|
|
7
|
+
readonly size?: number;
|
|
8
|
+
destroy(): void;
|
|
9
|
+
mapAsync(mode: number, offset?: number, size?: number): Promise<void>;
|
|
10
|
+
getMappedRange(offset?: number, size?: number): ArrayBuffer;
|
|
11
|
+
unmap(): void;
|
|
12
|
+
}
|
|
13
|
+
export interface ComputeGPUPassLike {
|
|
14
|
+
setPipeline(pipeline: unknown): void;
|
|
15
|
+
setBindGroup(index: number, group: unknown): void;
|
|
16
|
+
dispatchWorkgroups(x: number, y?: number, z?: number): void;
|
|
17
|
+
end(): void;
|
|
18
|
+
}
|
|
19
|
+
export interface ComputeGPUEncoderLike {
|
|
20
|
+
beginComputePass(options?: object): ComputeGPUPassLike;
|
|
21
|
+
copyBufferToBuffer(source: unknown, sourceOffset: number, destination: unknown, destinationOffset: number, size: number): void;
|
|
22
|
+
finish(): unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface ComputeGPUDeviceLike {
|
|
25
|
+
readonly limits?: Readonly<Record<string, number>>;
|
|
26
|
+
readonly queue: {
|
|
27
|
+
submit(commands: unknown[]): void;
|
|
28
|
+
writeBuffer(buffer: unknown, offset: number, data: ArrayBufferView | ArrayBuffer): void;
|
|
29
|
+
onSubmittedWorkDone?(): Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
createShaderModule(descriptor: {
|
|
32
|
+
label?: string;
|
|
33
|
+
code: string;
|
|
34
|
+
}): unknown;
|
|
35
|
+
createComputePipeline(descriptor: object): {
|
|
36
|
+
getBindGroupLayout(index: number): unknown;
|
|
37
|
+
};
|
|
38
|
+
createBuffer(descriptor: {
|
|
39
|
+
label?: string;
|
|
40
|
+
size: number;
|
|
41
|
+
usage: number;
|
|
42
|
+
}): ComputeGPUBufferLike;
|
|
43
|
+
createBindGroup(descriptor: object): unknown;
|
|
44
|
+
createCommandEncoder(descriptor?: object): ComputeGPUEncoderLike;
|
|
45
|
+
}
|
|
46
|
+
/** `GPUBufferUsage` bit values (the global is absent outside browsers). */
|
|
47
|
+
export declare const COMPUTE_BUFFER_USAGE: {
|
|
48
|
+
readonly MAP_READ: 1;
|
|
49
|
+
readonly COPY_SRC: 4;
|
|
50
|
+
readonly COPY_DST: 8;
|
|
51
|
+
readonly UNIFORM: 64;
|
|
52
|
+
readonly STORAGE: 128;
|
|
53
|
+
};
|
|
54
|
+
export declare const COMPUTE_MAP_MODE_READ = 1;
|
|
55
|
+
export type ComputeBindingType = "storage" | "read-only-storage" | "uniform";
|
|
56
|
+
export interface ComputeBindingSpec {
|
|
57
|
+
/** `@group(0) @binding(n)` index declared in the WGSL. */
|
|
58
|
+
readonly binding: number;
|
|
59
|
+
readonly type: ComputeBindingType;
|
|
60
|
+
}
|
|
61
|
+
export type ComputeWorkgroupSize = readonly [number, number?, number?];
|
|
62
|
+
export interface ComputePipelineSpec {
|
|
63
|
+
/** WGSL source. Required: compute has no GLSL path. */
|
|
64
|
+
readonly wgsl: string;
|
|
65
|
+
/** Name of the `@compute` entry point (default `"main"`). */
|
|
66
|
+
readonly entryPoint?: string;
|
|
67
|
+
/** Group-0 bindings the shader reads. Every one must be supplied at dispatch. */
|
|
68
|
+
readonly bindings?: readonly ComputeBindingSpec[];
|
|
69
|
+
/** Must equal the shader's `@workgroup_size(...)`; used to turn `items` into workgroup counts. Defaults to `[64]`. */
|
|
70
|
+
readonly workgroupSize?: ComputeWorkgroupSize;
|
|
71
|
+
readonly label?: string;
|
|
72
|
+
}
|
|
73
|
+
export type ComputeBufferUsage = "storage" | "uniform";
|
|
74
|
+
export interface ComputeBufferSpec {
|
|
75
|
+
/** Byte size (rounded up to a multiple of 4). Required unless `data` is given. */
|
|
76
|
+
readonly size?: number;
|
|
77
|
+
/** Initial contents, uploaded at creation. */
|
|
78
|
+
readonly data?: ArrayBufferView | ArrayBuffer;
|
|
79
|
+
/** Default `"storage"`. */
|
|
80
|
+
readonly usage?: ComputeBufferUsage;
|
|
81
|
+
readonly label?: string;
|
|
82
|
+
}
|
|
83
|
+
export type ComputeWorkgroups = readonly [number, number?, number?];
|
|
84
|
+
export interface ComputeDispatchInput {
|
|
85
|
+
readonly pipeline: unknown;
|
|
86
|
+
/** Buffers by binding index, or `{ binding, buffer }` pairs. */
|
|
87
|
+
readonly bindings: Readonly<Record<number, unknown>> | readonly {
|
|
88
|
+
readonly binding: number;
|
|
89
|
+
readonly buffer: unknown;
|
|
90
|
+
}[];
|
|
91
|
+
/** Explicit workgroup counts. Give this or `items`. */
|
|
92
|
+
readonly workgroups?: ComputeWorkgroups;
|
|
93
|
+
/** Invocation counts per axis; converted with `ceil(items / workgroupSize)`. */
|
|
94
|
+
readonly items?: readonly [number, number?, number?];
|
|
95
|
+
}
|
|
96
|
+
export interface ComputeDispatchResult {
|
|
97
|
+
readonly workgroups: readonly [number, number, number];
|
|
98
|
+
/** Total invocations: workgroups x workgroup size. */
|
|
99
|
+
readonly invocations: number;
|
|
100
|
+
}
|
|
101
|
+
export type ComputeErrorCode = "compute-invalid-spec" | "compute-wgsl-required" | "compute-disposed" | "compute-read-failed";
|
|
102
|
+
export declare class ComputeError extends Error {
|
|
103
|
+
readonly code: ComputeErrorCode;
|
|
104
|
+
constructor(code: ComputeErrorCode, message: string, options?: {
|
|
105
|
+
readonly cause?: unknown;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../packages/rendering/src/compute/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SH-04 / L1-12 — public WebGPU compute surface. Structural GPU types: the
|
|
3
|
+
* compute context only needs this slice of `GPUDevice`, so it can be driven by
|
|
4
|
+
* a real device or by a fake in unit tests.
|
|
5
|
+
*/
|
|
6
|
+
/** `GPUBufferUsage` bit values (the global is absent outside browsers). */
|
|
7
|
+
export const COMPUTE_BUFFER_USAGE = {
|
|
8
|
+
MAP_READ: 0x0001,
|
|
9
|
+
COPY_SRC: 0x0004,
|
|
10
|
+
COPY_DST: 0x0008,
|
|
11
|
+
UNIFORM: 0x0040,
|
|
12
|
+
STORAGE: 0x0080
|
|
13
|
+
};
|
|
14
|
+
export const COMPUTE_MAP_MODE_READ = 1;
|
|
15
|
+
export class ComputeError extends Error {
|
|
16
|
+
code;
|
|
17
|
+
constructor(code, message, options) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "ComputeError";
|
|
20
|
+
this.code = code;
|
|
21
|
+
if (options && "cause" in options)
|
|
22
|
+
this.cause = options.cause;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../packages/rendering/src/compute/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqCH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM;CACP,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AA4DvC,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IAEhC,YAAY,IAAsB,EAAE,OAAe,EAAE,OAAsC;QACzF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAChE,CAAC;CACF"}
|
package/dist/contracts/core.d.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
export type PrdId = "prd01" | "prd02" | "prd03" | "prd04" | "prd05" | "prd06" | "prd07" | "prd08" | "prd09" | "prd10" | "prd11" | "prd12" | "prd13" | "prd14" | "prd15";
|
|
11
11
|
export type ContractId = `C-${string}`;
|
|
12
12
|
/** Full flag names; see CONTRACTS.md §5. */
|
|
13
|
-
export type QrFlagName = "A3D_QR_CORE" | "A3D_QR_LIGHTING" | "A3D_QR_POST" | "A3D_QR_MATERIALS" | "A3D_QR_ASSETS" | "A3D_QR_ANIMATION" | "A3D_QR_VFX" | "A3D_QR_CAMERA" | "A3D_QR_GAME" | "A3D_QR_WORLD" | "A3D_QR_TIERS" | "A3D_QR_WEBGPU" | "A3D_QR_LOOKS" | "A3D_QR_COMPILER" | "A3D_QR_STRICT" | `A3D_QR_${string}_${string}`;
|
|
13
|
+
export type QrFlagName = "A3D_QR_CORE" | "A3D_QR_LIGHTING" | "A3D_QR_POST" | "A3D_QR_MATERIALS" | "A3D_QR_ASSETS" | "A3D_QR_ANIMATION" | "A3D_QR_VFX" | "A3D_QR_CAMERA" | "A3D_QR_GAME" | "A3D_QR_WORLD" | "A3D_QR_TIERS" | "A3D_QR_WEBGPU" | "A3D_QR_LOOKS" | "A3D_QR_COMPILER" | "A3D_QR_STRICT" | "A3D_PARITY_SHADING" | "A3D_PARITY_GEOMETRY" | "A3D_PARITY_TEXTURES" | "A3D_PARITY_BATCHING" | "A3D_PARITY_LINES" | "A3D_PARITY_RUNTIME" | `A3D_QR_${string}_${string}`;
|
|
14
14
|
export type QrFlagValue = boolean | string;
|
|
15
15
|
export interface QrFlags {
|
|
16
16
|
readonly values: Readonly<Partial<Record<QrFlagName, QrFlagValue>>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../../packages/rendering/src/contracts/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,KAAK,GACb,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAC7E,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAExE,MAAM,MAAM,UAAU,GAAG,KAAK,MAAM,EAAE,CAAC;AAEvC,4CAA4C;AAC5C,MAAM,MAAM,UAAU,GAClB,aAAa,GAAG,iBAAiB,GAAG,aAAa,GAAG,kBAAkB,GAAG,eAAe,GACxF,kBAAkB,GAAG,YAAY,GAAG,eAAe,GAAG,aAAa,GAAG,cAAc,GACpF,cAAc,GAAG,eAAe,GAAG,cAAc,GAAG,iBAAiB,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../../packages/rendering/src/contracts/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,KAAK,GACb,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAC7E,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAExE,MAAM,MAAM,UAAU,GAAG,KAAK,MAAM,EAAE,CAAC;AAEvC,4CAA4C;AAC5C,MAAM,MAAM,UAAU,GAClB,aAAa,GAAG,iBAAiB,GAAG,aAAa,GAAG,kBAAkB,GAAG,eAAe,GACxF,kBAAkB,GAAG,YAAY,GAAG,eAAe,GAAG,aAAa,GAAG,cAAc,GACpF,cAAc,GAAG,eAAe,GAAG,cAAc,GAAG,iBAAiB,GAAG,eAAe,GAIvF,oBAAoB,GAAG,qBAAqB,GAAG,qBAAqB,GACpE,qBAAqB,GAAG,kBAAkB,GAAG,oBAAoB,GACjE,UAAU,MAAM,IAAI,MAAM,EAAE,CAAC;AAEjC,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3C,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACpE,EAAE,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,mHAAmH;IACnH,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACvB,4GAA4G;IAC5G,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC;CACxB;AA8BD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAE9G;AAED,uGAAuG;AACvG,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,aAAa;IAC/C,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC;IAC/B,2DAA2D;IAC3D,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC;IACrC,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC;CACrB;AA6BD,wBAAgB,cAAc,CAAC,CAAC,SAAS,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAEjF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../packages/rendering/src/contracts/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../../packages/rendering/src/contracts/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flags.state.d.ts","sourceRoot":"","sources":["../../../../../packages/rendering/src/contracts/flags.state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,qBAAqB,GAAG,qBAAqB,GAAG,YAAY,GAAG,SAAS,CAAC;AAE3G,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"flags.state.d.ts","sourceRoot":"","sources":["../../../../../packages/rendering/src/contracts/flags.state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,qBAAqB,GAAG,qBAAqB,GAAG,YAAY,GAAG,SAAS,CAAC;AAE3G,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAmD7E,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,EAAE,SAAS,UAAU,EAAO,CAAC"}
|