typegpu 0.0.0-alpha.2 → 0.0.0-alpha.4
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +29 -0
- package/chunk-7HTWRNOH.cjs +12 -0
- package/chunk-7HTWRNOH.cjs.map +1 -0
- package/chunk-K2GYQABQ.js +12 -0
- package/chunk-K2GYQABQ.js.map +1 -0
- package/data/index.cjs +2 -0
- package/data/index.cjs.map +1 -0
- package/data/index.d.cts +38 -0
- package/data/index.d.ts +38 -0
- package/data/index.js +2 -0
- package/data/index.js.map +1 -0
- package/index.cjs +49 -0
- package/index.cjs.map +1 -0
- package/{dist/index.d.cts → index.d.cts} +129 -30
- package/{dist/index.d.ts → index.d.ts} +129 -30
- package/index.js +49 -0
- package/index.js.map +1 -0
- package/macro/index.cjs +8 -0
- package/{dist/macro → macro}/index.d.cts +1 -1
- package/{dist/macro → macro}/index.d.ts +1 -1
- package/{dist/macro → macro}/index.js +1 -1
- package/package.json +30 -37
- package/std140-Cv7GDE9w.d.ts +26 -0
- package/std140-DRitCcmc.d.cts +26 -0
- package/types-ENDwr_p9.d.cts +243 -0
- package/types-ENDwr_p9.d.ts +243 -0
- package/dist/chunk-3VCFA6WZ.cjs +0 -2
- package/dist/chunk-3VCFA6WZ.cjs.map +0 -1
- package/dist/chunk-G3U6RTMF.cjs +0 -2
- package/dist/chunk-G3U6RTMF.cjs.map +0 -1
- package/dist/chunk-GHP25GEO.js +0 -2
- package/dist/chunk-GHP25GEO.js.map +0 -1
- package/dist/chunk-XGSMOADT.js +0 -2
- package/dist/chunk-XGSMOADT.js.map +0 -1
- package/dist/data/index.cjs +0 -10
- package/dist/data/index.cjs.map +0 -1
- package/dist/data/index.d.cts +0 -84
- package/dist/data/index.d.ts +0 -84
- package/dist/data/index.js +0 -10
- package/dist/data/index.js.map +0 -1
- package/dist/index.cjs +0 -29
- package/dist/index.cjs.map +0 -1
- package/dist/index.js +0 -29
- package/dist/index.js.map +0 -1
- package/dist/macro/index.cjs +0 -8
- package/dist/struct-CpjQEnf9.d.cts +0 -9
- package/dist/struct-HAlb4aG-.d.ts +0 -9
- package/dist/types-gpN_64mT.d.cts +0 -148
- package/dist/types-gpN_64mT.d.ts +0 -148
- /package/{dist/macro → macro}/index.cjs.map +0 -0
- /package/{dist/macro → macro}/index.js.map +0 -0
@@ -1,8 +1,21 @@
|
|
1
|
-
import { W as
|
2
|
-
export {
|
3
|
-
import { Parsed } from 'typed-binary';
|
4
|
-
import {
|
1
|
+
import { W as WgslResolvable, a as WgslSlot, E as Eventual, b as Wgsl, I as InlineResolve, c as WgslRenderResource, T as TextureUsage, S as StorageTextureParams, A as AnyWgslTexelFormat, d as SampledTextureParams, e as AnyWgslPrimitive, f as WgslRenderResourceType, g as StorageTextureAccess, R as ResolutionCtx, h as WgslPlum, i as ExtractPlumValue, j as WgslSettable, U as Unsubscribe, k as AnyWgslData, l as WgslAllocatable, B as BufferUsage, m as WgslBindable, n as WgslFnArgument, o as WgslValue, p as WgslIdentifier, q as WgslResolvableSlot, r as plum, s as plumFromEvent } from './types-ENDwr_p9.js';
|
2
|
+
export { O as AnyWgslPointer, Q as BuiltInPossibleTypes, X as Builtin, w as EventualGetter, x as SlotValuePair, M as WgslData, C as WgslDepthTextureType, F as WgslExternalTextureType, N as WgslPointer, y as WgslSamplerType, D as WgslStorageTextureType, z as WgslTypedTextureType, V as builtin, Y as getBuiltinInfo, Z as getUsedBuiltinsNamed, J as isDepthTextureType, L as isExternalTextureType, P as isPointer, t as isResolvable, G as isSamplerType, v as isSlot, K as isStorageTextureType, H as isTypedTextureType, u as isWgsl } from './types-ENDwr_p9.js';
|
3
|
+
import { Parsed, AnySchema } from 'typed-binary';
|
4
|
+
import { S as SimpleWgslData } from './std140-Cv7GDE9w.js';
|
5
5
|
|
6
|
+
/**
|
7
|
+
* An error that happens during resolution of WGSL code.
|
8
|
+
* Contains a trace of all ancestor resolvables in
|
9
|
+
* which this error originated.
|
10
|
+
*
|
11
|
+
* @category Errors
|
12
|
+
*/
|
13
|
+
declare class ResolutionError extends Error {
|
14
|
+
readonly cause: unknown;
|
15
|
+
readonly trace: WgslResolvable[];
|
16
|
+
constructor(cause: unknown, trace: WgslResolvable[]);
|
17
|
+
appendToTrace(ancestor: WgslResolvable): ResolutionError;
|
18
|
+
}
|
6
19
|
/**
|
7
20
|
* @category Errors
|
8
21
|
*/
|
@@ -25,11 +38,65 @@ declare abstract class Callable<TArgs extends [...any[]], TReturn> extends Funct
|
|
25
38
|
type ICallable<TArgs extends [...any[]], TReturn> = (...args: TArgs) => TReturn;
|
26
39
|
type AsCallable<T, TArgs extends [...any[]], TReturn> = T & ICallable<TArgs, TReturn>;
|
27
40
|
|
41
|
+
type PlumListener<T> = (newValue: T) => unknown;
|
42
|
+
|
28
43
|
interface WgslCode extends WgslResolvable {
|
29
44
|
$name(label?: string | undefined): WgslCode;
|
45
|
+
with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslCode;
|
30
46
|
}
|
47
|
+
type BoundWgslCode = Omit<WgslCode, '$name'>;
|
31
48
|
declare function code(strings: TemplateStringsArray, ...params: (Wgsl | Wgsl[] | InlineResolve)[]): WgslCode;
|
32
49
|
|
50
|
+
interface WgslSampler extends WgslRenderResource {
|
51
|
+
readonly descriptor: GPUSamplerDescriptor;
|
52
|
+
$name(label: string): WgslSampler;
|
53
|
+
}
|
54
|
+
declare function sampler(descriptor: GPUSamplerDescriptor): WgslSampler;
|
55
|
+
|
56
|
+
interface WgslAnyTextureView extends WgslRenderResource {
|
57
|
+
readonly descriptor: GPUTextureViewDescriptor;
|
58
|
+
readonly texture: WgslAnyTexture;
|
59
|
+
readonly dataType: AnyWgslPrimitive | AnyWgslTexelFormat;
|
60
|
+
readonly access: StorageTextureAccess | undefined;
|
61
|
+
}
|
62
|
+
interface WgslAnyTexture {
|
63
|
+
readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;
|
64
|
+
get flags(): GPUTextureUsageFlags;
|
65
|
+
}
|
66
|
+
interface WgslTexture<TAllows extends TextureUsage = never> {
|
67
|
+
readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;
|
68
|
+
get label(): string | undefined;
|
69
|
+
get flags(): GPUTextureUsageFlags;
|
70
|
+
$name(label: string): WgslTexture<TAllows>;
|
71
|
+
$allowSampled(): WgslTexture<TAllows | 'sampled'>;
|
72
|
+
$allowStorage(): WgslTexture<TAllows | 'storage'>;
|
73
|
+
asStorage(params: StorageTextureParams): 'storage' extends TAllows ? WgslTextureView<AnyWgslTexelFormat, 'storage'> : null;
|
74
|
+
asSampled(params: SampledTextureParams): 'sampled' extends TAllows ? WgslTextureView<typeof params.dataType, 'sampled'> : null;
|
75
|
+
}
|
76
|
+
interface WgslTextureView<TData extends AnyWgslPrimitive | AnyWgslTexelFormat, TUsage extends TextureUsage> extends WgslRenderResource {
|
77
|
+
readonly texture: WgslTexture<TUsage>;
|
78
|
+
readonly descriptor: Omit<GPUTextureViewDescriptor, 'usage'>;
|
79
|
+
readonly type: WgslRenderResourceType;
|
80
|
+
readonly dataType: TData;
|
81
|
+
readonly access: StorageTextureAccess | undefined;
|
82
|
+
$name(label: string): WgslTextureView<TData, TUsage>;
|
83
|
+
}
|
84
|
+
interface WgslTextureExternal extends WgslRenderResource {
|
85
|
+
readonly descriptor: GPUExternalTextureDescriptor;
|
86
|
+
}
|
87
|
+
declare function texture<TUsage extends TextureUsage = never>(descriptor: Omit<GPUTextureDescriptor, 'usage'>): WgslTexture<TUsage>;
|
88
|
+
declare function textureExternal(descriptor: GPUExternalTextureDescriptor): WgslTextureExternalImpl;
|
89
|
+
declare class WgslTextureExternalImpl implements WgslTextureExternal {
|
90
|
+
readonly descriptor: GPUExternalTextureDescriptor;
|
91
|
+
private _label;
|
92
|
+
readonly type = "texture_external";
|
93
|
+
constructor(descriptor: GPUExternalTextureDescriptor);
|
94
|
+
get label(): string | undefined;
|
95
|
+
$name(label: string | undefined): this;
|
96
|
+
resolve(ctx: ResolutionCtx): string;
|
97
|
+
}
|
98
|
+
|
99
|
+
type SetPlumAction<T> = T | ((prev: T) => T);
|
33
100
|
interface TypeGpuRuntime {
|
34
101
|
readonly device: GPUDevice;
|
35
102
|
/**
|
@@ -38,11 +105,15 @@ interface TypeGpuRuntime {
|
|
38
105
|
*/
|
39
106
|
readonly commandEncoder: GPUCommandEncoder;
|
40
107
|
readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum>;
|
41
|
-
setPlum<TPlum extends WgslPlum & WgslSettable>(plum: TPlum, value: ExtractPlumValue<TPlum
|
42
|
-
onPlumChange<TValue>(plum: WgslPlum<TValue>, listener:
|
108
|
+
setPlum<TPlum extends WgslPlum & WgslSettable>(plum: TPlum, value: SetPlumAction<ExtractPlumValue<TPlum>>): void;
|
109
|
+
onPlumChange<TValue>(plum: WgslPlum<TValue>, listener: PlumListener<TValue>): Unsubscribe;
|
43
110
|
writeBuffer<TValue extends AnyWgslData>(allocatable: WgslAllocatable<TValue>, data: Parsed<TValue>): void;
|
44
111
|
readBuffer<TData extends AnyWgslData>(allocatable: WgslAllocatable<TData>): Promise<Parsed<TData>>;
|
45
112
|
bufferFor(allocatable: WgslAllocatable): GPUBuffer;
|
113
|
+
textureFor(view: WgslAnyTexture | WgslAnyTextureView): GPUTexture;
|
114
|
+
viewFor(view: WgslAnyTextureView): GPUTextureView;
|
115
|
+
externalTextureFor(texture: WgslTextureExternal): GPUExternalTexture;
|
116
|
+
samplerFor(sampler: WgslSampler): GPUSampler;
|
46
117
|
dispose(): void;
|
47
118
|
/**
|
48
119
|
* Causes all commands enqueued by pipelines to be
|
@@ -54,28 +125,25 @@ interface TypeGpuRuntime {
|
|
54
125
|
}
|
55
126
|
interface RenderPipelineOptions {
|
56
127
|
vertex: {
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
128
|
+
code: WgslCode | BoundWgslCode;
|
129
|
+
output: {
|
130
|
+
[K in symbol]: string;
|
131
|
+
} & {
|
132
|
+
[K in string]: AnyWgslData;
|
133
|
+
};
|
61
134
|
};
|
62
135
|
fragment: {
|
63
|
-
|
64
|
-
code: WgslCode;
|
65
|
-
output: Wgsl;
|
136
|
+
code: WgslCode | BoundWgslCode;
|
66
137
|
target: Iterable<GPUColorTargetState | null>;
|
67
138
|
};
|
68
139
|
primitive: GPUPrimitiveState;
|
69
140
|
externalLayouts?: GPUBindGroupLayout[];
|
70
|
-
externalDeclarations?: Wgsl[];
|
71
141
|
label?: string;
|
72
142
|
}
|
73
143
|
interface ComputePipelineOptions {
|
74
|
-
|
75
|
-
|
76
|
-
code: WgslCode;
|
144
|
+
code: WgslCode | BoundWgslCode;
|
145
|
+
workgroupSize?: readonly [number, number?, number?];
|
77
146
|
externalLayouts?: GPUBindGroupLayout[];
|
78
|
-
externalDeclarations?: Wgsl[];
|
79
147
|
label?: string;
|
80
148
|
}
|
81
149
|
type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {
|
@@ -84,18 +152,18 @@ type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {
|
|
84
152
|
firstVertex?: number;
|
85
153
|
firstInstance?: number;
|
86
154
|
externalBindGroups?: GPUBindGroup[];
|
87
|
-
externalVertexBuffers?: GPUBuffer[];
|
88
155
|
};
|
89
156
|
interface RenderPipelineExecutor {
|
90
157
|
execute(options: RenderPipelineExecutorOptions): void;
|
91
158
|
}
|
92
159
|
type ComputePipelineExecutorOptions = {
|
93
|
-
workgroups?: [number, number?, number?];
|
160
|
+
workgroups?: readonly [number, number?, number?];
|
94
161
|
externalBindGroups?: GPUBindGroup[];
|
95
162
|
};
|
96
163
|
interface ComputePipelineExecutor {
|
97
164
|
execute(options?: ComputePipelineExecutorOptions): void;
|
98
165
|
}
|
166
|
+
declare function deriveVertexFormat<TData extends SimpleWgslData<AnySchema>>(typeSchema: TData): GPUVertexFormat;
|
99
167
|
|
100
168
|
interface NameRegistry {
|
101
169
|
nameFor(item: WgslResolvable): string;
|
@@ -132,23 +200,27 @@ declare class ProgramBuilder {
|
|
132
200
|
build(options: BuildOptions): Program;
|
133
201
|
}
|
134
202
|
|
203
|
+
type VariableScope = 'private' | 'workgroup';
|
135
204
|
interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {
|
136
205
|
$name(label: string): WgslVar<TDataType>;
|
137
206
|
}
|
138
207
|
|
139
|
-
interface WgslBufferUsage<TData extends AnyWgslData, TUsage extends BufferUsage> extends WgslBindable<TData, TUsage> {
|
208
|
+
interface WgslBufferUsage<TData extends AnyWgslData, TUsage extends BufferUsage = BufferUsage> extends WgslBindable<TData, TUsage> {
|
140
209
|
$name(label: string): WgslBufferUsage<TData, TUsage>;
|
141
210
|
}
|
142
211
|
|
212
|
+
type UsageGuard<TUsage extends BufferUsage, TData extends AnyWgslData, TAllows> = TUsage extends TAllows ? WgslBufferUsage<TData, TUsage> : null;
|
143
213
|
interface WgslBuffer<TData extends AnyWgslData, TAllows extends BufferUsage = never> extends WgslAllocatable<TData> {
|
144
214
|
$name(label: string): WgslBuffer<TData, TAllows>;
|
145
215
|
$allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;
|
146
|
-
$
|
147
|
-
$
|
216
|
+
$allowReadonly(): WgslBuffer<TData, TAllows | 'readonly'>;
|
217
|
+
$allowMutable(): WgslBuffer<TData, TAllows | 'mutable'>;
|
218
|
+
$allowVertex(stepMode: 'vertex' | 'instance'): WgslBuffer<TData, TAllows | 'vertex'>;
|
148
219
|
$addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;
|
149
|
-
asUniform(): 'uniform'
|
150
|
-
|
151
|
-
|
220
|
+
asUniform(): UsageGuard<'uniform', TData, TAllows>;
|
221
|
+
asMutable(): UsageGuard<'mutable', TData, TAllows>;
|
222
|
+
asReadonly(): UsageGuard<'readonly', TData, TAllows>;
|
223
|
+
asVertex(): UsageGuard<'vertex', TData, TAllows>;
|
152
224
|
}
|
153
225
|
declare function buffer<TData extends AnyWgslData, TUsage extends BufferUsage = never>(typeSchema: TData, initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined): WgslBuffer<TData, TUsage>;
|
154
226
|
|
@@ -161,12 +233,16 @@ interface WgslConst extends WgslResolvable {
|
|
161
233
|
*/
|
162
234
|
declare function constant(expr: Wgsl): WgslConst;
|
163
235
|
|
236
|
+
interface WgslDeclare extends WgslResolvable {
|
237
|
+
}
|
238
|
+
declare function declare(strings: TemplateStringsArray, ...params: (Wgsl | Wgsl[] | InlineResolve)[]): WgslDeclare;
|
239
|
+
|
164
240
|
interface WgslFn$1 extends WgslResolvable {
|
165
241
|
$name(label: string): WgslFn$1;
|
166
242
|
with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;
|
167
243
|
}
|
168
244
|
type BoundWgslFn = Omit<WgslFn$1, '$name'>;
|
169
|
-
declare function fn$1(
|
245
|
+
declare function fn$1(strings: TemplateStringsArray, ...params: (Wgsl | InlineResolve)[]): WgslFn$1;
|
170
246
|
|
171
247
|
interface WgslFn<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends WgslResolvable, Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> {
|
172
248
|
}
|
@@ -185,16 +261,19 @@ declare class WgslFunctionCall<TArgTypes extends [WgslFnArgument, ...WgslFnArgum
|
|
185
261
|
private readonly args;
|
186
262
|
constructor(usedFn: WgslFn<TArgTypes, TReturn>, args: SegmentsFromTypes<TArgTypes>);
|
187
263
|
resolve(ctx: ResolutionCtx): string;
|
264
|
+
toString(): string;
|
188
265
|
}
|
189
266
|
declare class WgslFnImpl<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> implements WgslFn<TArgTypes, TReturn> {
|
190
267
|
private argPairs;
|
191
268
|
private returnType;
|
192
269
|
private readonly body;
|
193
|
-
private
|
270
|
+
private _label;
|
194
271
|
constructor(argPairs: PairsFromTypes<TArgTypes>, returnType: TReturn | undefined, body: Wgsl);
|
272
|
+
get label(): string | undefined;
|
195
273
|
$name(label: string): this;
|
196
274
|
resolve(ctx: ResolutionCtx): string;
|
197
275
|
_call(...args: SegmentsFromTypes<TArgTypes>): WgslFunctionCall<TArgTypes, TReturn>;
|
276
|
+
toString(): string;
|
198
277
|
}
|
199
278
|
|
200
279
|
declare function slot<T extends Wgsl>(defaultValue?: T): WgslResolvableSlot<T>;
|
@@ -209,7 +288,27 @@ declare const _default: typeof code & {
|
|
209
288
|
plumFromEvent: typeof plumFromEvent;
|
210
289
|
slot: typeof slot;
|
211
290
|
constant: typeof constant;
|
212
|
-
|
291
|
+
declare: typeof declare;
|
292
|
+
var: <TDataType extends AnyWgslData>(dataType: TDataType, initialValue?: Wgsl, scope?: VariableScope) => WgslVar<TDataType>;
|
293
|
+
sampler: typeof sampler;
|
294
|
+
texture: typeof texture;
|
295
|
+
textureExternal: typeof textureExternal;
|
296
|
+
builtin: {
|
297
|
+
readonly vertexIndex: symbol;
|
298
|
+
readonly instanceIndex: symbol;
|
299
|
+
readonly position: symbol;
|
300
|
+
readonly clipDistances: symbol;
|
301
|
+
readonly frontFacing: symbol;
|
302
|
+
readonly fragDepth: symbol;
|
303
|
+
readonly sampleIndex: symbol;
|
304
|
+
readonly sampleMask: symbol;
|
305
|
+
readonly fragment: symbol;
|
306
|
+
readonly localInvocationId: symbol;
|
307
|
+
readonly localInvocationIndex: symbol;
|
308
|
+
readonly globalInvocationId: symbol;
|
309
|
+
readonly workgroupId: symbol;
|
310
|
+
readonly numWorkgroups: symbol;
|
311
|
+
};
|
213
312
|
};
|
214
313
|
|
215
314
|
/**
|
@@ -246,4 +345,4 @@ type CreateRuntimeOptions = {
|
|
246
345
|
*/
|
247
346
|
declare function createRuntime(options?: CreateRuntimeOptions | GPUDevice): Promise<TypeGpuRuntime>;
|
248
347
|
|
249
|
-
export { AnyWgslData, type AsCallable, BufferUsage, type ComputePipelineExecutor, type ComputePipelineExecutorOptions, type ComputePipelineOptions, type CreateRuntimeOptions, Eventual, type ICallable, InlineResolve, MissingSlotValueError, type Program, ProgramBuilder, RandomNameRegistry, RecursiveDataTypeError, type RenderPipelineExecutor, type RenderPipelineExecutorOptions, type RenderPipelineOptions, ResolutionCtx, StrictNameRegistry, type TypeGpuRuntime, Wgsl, WgslAllocatable, WgslBindable, type WgslBuffer, type WgslCode, type WgslConst, type WgslFn$1 as WgslFn, WgslFnArgument, type WgslFn as WgslFnExperimental, WgslPlum, WgslResolvable, WgslResolvableSlot, WgslSettable, WgslSlot, WgslValue, type WgslVar, createRuntime, _default as wgsl };
|
348
|
+
export { AnyWgslData, AnyWgslPrimitive, AnyWgslTexelFormat, type AsCallable, BufferUsage, type ComputePipelineExecutor, type ComputePipelineExecutorOptions, type ComputePipelineOptions, type CreateRuntimeOptions, Eventual, type ICallable, InlineResolve, MissingSlotValueError, type Program, ProgramBuilder, RandomNameRegistry, RecursiveDataTypeError, type RenderPipelineExecutor, type RenderPipelineExecutorOptions, type RenderPipelineOptions, ResolutionCtx, ResolutionError, SampledTextureParams, type SetPlumAction, StorageTextureAccess, StorageTextureParams, StrictNameRegistry, TextureUsage, type TypeGpuRuntime, Wgsl, WgslAllocatable, WgslBindable, type WgslBuffer, type WgslBufferUsage, type WgslCode, type WgslConst, type WgslFn$1 as WgslFn, WgslFnArgument, type WgslFn as WgslFnExperimental, WgslPlum, WgslRenderResource, WgslRenderResourceType, WgslResolvable, WgslResolvableSlot, type WgslSampler, WgslSettable, WgslSlot, type WgslTexture, type WgslTextureView, WgslValue, type WgslVar, createRuntime, deriveVertexFormat, _default as wgsl };
|
package/index.js
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
import{B as S,C as U,D as w,F as T,L as $e,M as mt,N as De,O as o,a as G,b as E,c as ve,d as a,e as K,f as we,g as dt,h as Y,i as Pe,j as _e,k as Re,l as gt,m as Se,n as pt,o as Ue,p as Ae,q as Be}from"./chunk-K2GYQABQ.js";var Q=class extends Function{constructor(){super("...args","return this._bound._call(...args)");a(this,"_bound");return this._bound=this.bind(this),this._bound}},Ve=Q;var rt={f32:"float32",vec2f:"float32x2",vec3f:"float32x3",vec4f:"float32x4",u32:"uint32",vec2u:"uint32x2",vec3u:"uint32x3",vec4u:"uint32x4",i32:"sint32",vec2i:"sint32x2",vec3i:"sint32x3",vec4i:"sint32x4"};function Ge(n){if(!("expressionCode"in n))throw new Error("Type schema must contain a 'code' field");let e=n.getUnderlyingTypeString(),t=rt[e];if(!t)throw new Error(`Unknown vertex format for type code: ${e}`);return t}var b=class{constructor(){a(this,"lastUniqueId",0);a(this,"names",new WeakMap)}nameFor(e){let t=this.names.get(e);if(t===void 0){let r;e.label?(r=e.label.replaceAll(/\s/g,"_"),r=r.replaceAll(/[^\w\d]/g,"")):r="item",t=`${r}_${this.lastUniqueId++}`,this.names.set(e,t)}return t}},X=class{constructor(){a(this,"_usedNames",new Set);a(this,"_assignedNames",new WeakMap)}nameFor(e){let t=this._assignedNames.get(e);if(t!==void 0)return t;if(e.label===void 0)throw new Error("Unnamed item found when using a strict NameRegistry");let r=0,s=e.label;for(;this._usedNames.has(s);)r++,s=`${e.label}_${r}`;return this._usedNames.add(s),this._assignedNames.set(e,s),s}};function Ee(n){return new H(n)}var H=class{constructor(e){this.descriptor=e;a(this,"_label");a(this,"_type");e.compare===void 0?this._type="sampler":this._type="sampler_comparison"}get label(){return this._label}get type(){return this._type}$name(e){return this._label=e,this}resolve(e){let t=new T().$name(this._label);return e.addRenderResource(this,t),e.resolve(t)}};function F(n){return n.type==="sampler"||n.type==="sampler_comparison"}function Oe(n){return new J(n)}function Me(n){return new Z(n)}var J=class{constructor(e){this.descriptor=e;a(this,"_flags",GPUTextureUsage.COPY_DST|GPUTextureUsage.COPY_SRC|GPUTextureUsage.RENDER_ATTACHMENT);a(this,"_allowedUsages",{sampled:null,storage:null});a(this,"_label")}get label(){return this._label}get flags(){return this._flags}$name(e){return this._label=e,this}$addFlags(e){return this._flags|=e,this}$allowSampled(){let e=this;return this._allowedUsages.sampled||(this._allowedUsages.sampled=new Map),this.$addFlags(GPUTextureUsage.TEXTURE_BINDING),e}$allowStorage(){let e=this;return this._allowedUsages.storage||(this._allowedUsages.storage=new Map),this.$addFlags(GPUTextureUsage.STORAGE_BINDING),e}getStorageIfAllowed(e){if(!this._allowedUsages.storage)return null;let t=Ce(e),r=this._allowedUsages.storage.get(t);if(r)return r;let s=Fe[this.descriptor.format];if(!s)throw new Error(`Unsupported texture format ${this.descriptor.format}`);let l=new C(e.type,this,s,e.descriptor,e.access);return this._allowedUsages.storage.set(t,l),l}getSampledIfAllowed(e){if(!this._allowedUsages.sampled)return null;let t=Ce(e),r=this._allowedUsages.sampled.get(t);if(r)return r;let s=new C(e.type,this,e.dataType,e.descriptor);return this._allowedUsages.sampled.set(t,s),s}asStorage(e){let t=this.getStorageIfAllowed(e);if(!Fe[this.descriptor.format])throw new Error(`Unsupported texture format ${this.descriptor.format}`);return t}asSampled(e){return this.getSampledIfAllowed(e)}},C=class{constructor(e,t,r,s={},l=void 0){this.type=e;this.texture=t;this.dataType=r;this.descriptor=s;this.access=l;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new T().$name(this._label);return e.addRenderResource(this,t),e.resolve(t)}},Z=class{constructor(e){this.descriptor=e;a(this,"_label");a(this,"type","texture_external")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new T().$name(this._label);return e.addRenderResource(this,t),e.resolve(t)}};function ke(n){return!("texture"in n)&&!F(n)}function O(n){return"texture"in n}var Fe={rgba8unorm:w,rgba8snorm:w,rgba8uint:S,rgba8sint:U,rgba16uint:S,rgba16sint:U,rgba16float:w,r32uint:S,r32sint:U,r32float:w,rg32uint:S,rg32sint:U,rg32float:w,rgba32uint:S,rgba32sint:U,rgba32float:w,bgra8unorm:w};function Ce(n){let e=Object.fromEntries(Object.entries(n).sort(([t],[r])=>t.localeCompare(r)));return JSON.stringify(e)}var st={uniform:"uniform",mutable:"storage, read_write",readonly:"storage, read"},ee=class{constructor(e,t){this.names=e;this._bindingGroup=t;a(this,"_memoizedResolves",new WeakMap);a(this,"_nextFreeBindingIdx",0);a(this,"_usedBindables",new Set);a(this,"_usedRenderResources",new Set);a(this,"_resourceToIndexMap",new WeakMap);a(this,"_usedBuiltins",new Set);a(this,"_declarations",[])}get usedBindables(){return this._usedBindables}get usedRenderResources(){return this._usedRenderResources}get declarations(){return this._declarations}get usedBuiltins(){return this._usedBuiltins}getOrInstantiate(e,t){var g;let r=(g=this._memoizedResolves.get(e))!=null?g:[];for(let i of r)if([...i.slotToValueMap.entries()].every(([p,c])=>t.readSlot(p)===c))return i.result;let s;try{s=e.resolve(t)}catch(i){throw i instanceof K?i.appendToTrace(e):new K(i,[e])}let l=new Map;for(let i of t.usedSlots)l.set(i,t.readSlot(i));return r.push({slotToValueMap:l,result:s}),this._memoizedResolves.set(e,r),s}reserveBindingEntry(e){this._usedBindables.add(e);let t=this._nextFreeBindingIdx++;return this._resourceToIndexMap.set(e,t),{group:this._bindingGroup,idx:t}}registerBindingNoEntry(e){this._usedBindables.add(e)}reserveRenderResourceEntry(e){this._usedRenderResources.add(e);let t=this._nextFreeBindingIdx++;return this._resourceToIndexMap.set(e,t),{group:this._bindingGroup,idx:t}}getBindingIndex(e){return this._resourceToIndexMap.get(e)}addDeclaration(e){this._declarations.push(e)}addBuiltin(e){this._usedBuiltins.add(e)}},P=class{constructor({names:e,bindingGroup:t}){a(this,"_shared");a(this,"usedSlots",new Set);this._shared=new ee(e,t!=null?t:0)}get usedBindables(){return this._shared.usedBindables}get usedRenderResources(){return this._shared.usedRenderResources}get usedBuiltins(){return this._shared.usedBuiltins}addDeclaration(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addBinding(e,t){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addRenderResource(e,t){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addBuiltin(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){if(e.defaultValue===void 0)throw new we(e);return e.defaultValue}unwrap(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}resolve(e,t=[]){if(!Y(e))return String(e);let r=new te(this,this._shared,t),s=this._shared.getOrInstantiate(e,r);return`${[...this._shared.declarations].join(`
|
2
|
+
|
3
|
+
`)}${s}`}getIndexFor(e){let t=this._shared.getBindingIndex(e);if(t===void 0)throw new Error("No index found for item");return t}},te=class n{constructor(e,t,r){this._parent=e;this._shared=t;this._slotValuePairs=r;a(this,"usedSlots",new Set)}addDeclaration(e){this._shared.addDeclaration(this.resolve(e))}addBinding(e,t){if(e.usage==="vertex"){this._shared.registerBindingNoEntry(e);return}let{group:r,idx:s}=this._shared.reserveBindingEntry(e);this.addDeclaration(o`@group(${r}) @binding(${s}) var<${st[e.usage]}> ${t}: ${e.allocatable.dataType};`)}addRenderResource(e,t){let{group:r,idx:s}=this._shared.reserveRenderResourceEntry(e);if(Re(e.type)||Ue(e.type)||Se(e.type)){this.addDeclaration(o`@group(${r}) @binding(${s}) var ${t}: ${e.type};`);return}if(O(e)){if(e.access!==void 0){this.addDeclaration(o`@group(${r}) @binding(${s}) var ${t}: ${e.type}<${e.texture.descriptor.format}, ${e.access}>;`);return}this.addDeclaration(o`@group(${r}) @binding(${s}) var ${t}: ${e.type}<${e.dataType}>;`);return}throw new Error(`Unsupported resource type: ${e.type}`)}addBuiltin(e){this._shared.addBuiltin(e)}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){let t=this._slotValuePairs.find(([r])=>r===e);return t?(this.usedSlots.add(e),t[1]):(this.usedSlots.add(e),this._parent.readSlot(e))}unwrap(e){let t=e;for(;_e(t);)t=this.readSlot(t);return t}resolve(e,t=[]){if(!Y(e))return String(e);let r=new n(this,this._shared,t);return this._shared.getOrInstantiate(e,r)}};var nt={uniform:"uniform",mutable:"storage",readonly:"read-only-storage"},_=class{constructor(e,t){this.runtime=e;this.root=t}build(e){var x;let t=new P({names:(x=e.nameRegistry)!=null?x:new b,bindingGroup:e.bindingGroup}),r=t.resolve(this.root),s=Array.from(t.usedBindables),l=Array.from(t.usedRenderResources),g=l.filter(F),i=l.filter(O),m=l.filter(ke),p=[];for(let d of i)d.access===void 0?p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,texture:{}}):p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,storageTexture:{format:d.texture.descriptor.format}});for(let d of m)p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,externalTexture:{}});for(let d of g)p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,sampler:{}});for(let d of s)d.usage!=="vertex"&&p.push({binding:t.getIndexFor(d),visibility:e.shaderStage,buffer:{type:nt[d.usage]}});let c=[];for(let d of i)c.push({binding:t.getIndexFor(d),resource:this.runtime.viewFor(d)});for(let d of m)c.push({binding:t.getIndexFor(d),resource:this.runtime.externalTextureFor(d)});for(let d of g)c.push({binding:t.getIndexFor(d),resource:this.runtime.samplerFor(d)});for(let d of s)d.usage!=="vertex"&&c.push({binding:t.getIndexFor(d),resource:{buffer:this.runtime.bufferFor(d.allocatable)}});let f=this.runtime.device.createBindGroupLayout({entries:p}),y=this.runtime.device.createBindGroup({layout:f,entries:c});return{bindGroupLayout:f,bindGroup:y,code:r}}},M=class{constructor(e,t,r,s){this.runtime=e;this.vertexRoot=t;this.fragmentRoot=r;this.vertexOutputFormat=s}build(e){var xe,he,be,We;let t=Object.getOwnPropertySymbols(this.vertexOutputFormat).map(u=>{let h=this.vertexOutputFormat[u];if(typeof h!="string")throw new Error("Output names must be strings.");return{symbol:u,name:h}}),r=Object.fromEntries(t.map(({symbol:u,name:h})=>[u,h])),s=De(r),g=Object.keys(this.vertexOutputFormat).map((u,h)=>{let R=this.vertexOutputFormat[u];if(!R)throw new Error("Output names must be strings.");return{name:u,varInfo:R,index:h}}),i=[...s.map(u=>o`
|
4
|
+
@builtin(${u.builtin.name}) ${u.name}: ${u.builtin.type},
|
5
|
+
`),...g.map(({name:u,varInfo:h,index:R})=>o`
|
6
|
+
@location(${R}) ${u}: ${h},
|
7
|
+
`)],m=new P({names:(xe=e.nameRegistry)!=null?xe:new b,bindingGroup:e.bindingGroup});m.resolve(this.vertexRoot);let p=Array.from(m.usedBindables).filter(u=>u.usage==="vertex"),f=p.map(u=>({bindable:u,underlyingType:u.allocatable.dataType})).map((u,h)=>o`
|
8
|
+
@location(${h}) ${u.bindable} : ${u.underlyingType.getUnderlyingTypeString()},
|
9
|
+
`),d=[...Array.from(m.usedBuiltins).map(u=>o`
|
10
|
+
@builtin(${u.name}) ${u.identifier}: ${u.type},
|
11
|
+
`),...f],W=o`
|
12
|
+
struct VertexOutput {
|
13
|
+
${i}
|
14
|
+
};
|
15
|
+
|
16
|
+
@vertex
|
17
|
+
fn main(${d}) -> VertexOutput {
|
18
|
+
${this.vertexRoot}
|
19
|
+
var output: VertexOutput;
|
20
|
+
${s.map(u=>o`
|
21
|
+
output.${u.name} = ${u.name};
|
22
|
+
`)}
|
23
|
+
${g.map(({name:u})=>o`
|
24
|
+
output.${u} = ${u};
|
25
|
+
`)}
|
26
|
+
return output;
|
27
|
+
}
|
28
|
+
`,A=new P({names:(he=e.nameRegistry)!=null?he:new b,bindingGroup:e.bindingGroup});A.resolve(this.fragmentRoot);let D=Array.from(A.usedBuiltins).map(u=>o`
|
29
|
+
@builtin(${u.name}) ${u.identifier}: ${u.type},
|
30
|
+
`),V=g.map(({name:u,varInfo:h},R)=>o`
|
31
|
+
@location(${R}) ${u}: ${h},
|
32
|
+
`),v=[...D,...V],B=o`
|
33
|
+
@fragment
|
34
|
+
fn main(${v}) -> @location(0) vec4f {
|
35
|
+
${this.fragmentRoot}
|
36
|
+
}
|
37
|
+
`,et=new _(this.runtime,W).build({bindingGroup:e.bindingGroup,shaderStage:GPUShaderStage.VERTEX,nameRegistry:(be=e.nameRegistry)!=null?be:new b}),tt=new _(this.runtime,B).build({bindingGroup:e.bindingGroup+1,shaderStage:GPUShaderStage.FRAGMENT,nameRegistry:(We=e.nameRegistry)!=null?We:new b});return[et,tt,p]}},k=class{constructor(e,t,r){this.runtime=e;this.computeRoot=t;this.workgroupSize=r}build(e){var m,p,c,f;let t=new P({names:(m=e.nameRegistry)!=null?m:new b,bindingGroup:e.bindingGroup});t.resolve(this.computeRoot);let s=Array.from(t.usedBuiltins).map(y=>o`
|
38
|
+
@builtin(${y.name}) ${y.identifier}: ${y.type},
|
39
|
+
`),l=`@workgroup_size(${this.workgroupSize[0]}, ${(p=this.workgroupSize[1])!=null?p:1}, ${(c=this.workgroupSize[2])!=null?c:1})`,g=o`
|
40
|
+
@compute ${l}
|
41
|
+
fn main(${s}) {
|
42
|
+
${this.computeRoot}
|
43
|
+
}
|
44
|
+
`;return new _(this.runtime,g).build({bindingGroup:e.bindingGroup,shaderStage:GPUShaderStage.COMPUTE,nameRegistry:(f=e.nameRegistry)!=null?f:new b})}};function $(n,e){return new re(n,e)}var re=class{constructor(e,t){this.buffer=e;this.usage=t;a(this,"_label")}get label(){return this._label}get allocatable(){return this.buffer}$name(e){return this._label=e,this}resolve(e){let t=new T;return e.addBinding(this,t),e.resolve(t)}toString(){var e;return`${this.usage}:${(e=this._label)!=null?e:"<unnamed>"}`}};function Ie(n,e){return new se(n,e)}var se=class{constructor(e,t){this.dataType=e;this.initial=t;a(this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);a(this,"vertexLayout",null);a(this,"_allowedUsages",{uniform:null,mutable:null,readonly:null,vertex:null});a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}$allowUniform(){this.$addFlags(GPUBufferUsage.UNIFORM);let e=this;return this._allowedUsages.uniform||(this._allowedUsages.uniform=$(e,"uniform")),e}$allowReadonly(){this.$addFlags(GPUBufferUsage.STORAGE);let e=this;return this._allowedUsages.readonly||(this._allowedUsages.readonly=$(e,"readonly")),e}$allowMutable(){this.$addFlags(GPUBufferUsage.STORAGE);let e=this;return this._allowedUsages.mutable||(this._allowedUsages.mutable=$(e,"mutable")),e}$allowVertex(e="vertex"){this.$addFlags(GPUBufferUsage.VERTEX);let t=this;if(!this.vertexLayout){if(!(this.dataType instanceof Be))throw new Error("Only simple data types can be used as vertex buffers");let r=this.dataType;r=r.getUnderlyingType(),this.vertexLayout={arrayStride:r.size,stepMode:e},this._allowedUsages.vertex=$(t,"vertex")}if(this.vertexLayout.stepMode!==e)throw new Error("Cannot change step mode of a vertex buffer");return t}$addFlags(e){return this.flags|=e,this}asUniform(){return this._allowedUsages.uniform}asMutable(){return this._allowedUsages.mutable}asReadonly(){return this._allowedUsages.readonly}asVertex(){return this._allowedUsages.vertex}toString(){var e;return`buffer:${(e=this._label)!=null?e:"<unnamed>"}`}};function Le(n){return new ne(n)}var ne=class{constructor(e){this.expr=e;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new T().$name(this._label);return e.addDeclaration(o`const ${t} = ${this.expr};`),e.resolve(t)}};function Ne(n,...e){return new ae(o(n,...e))}var ae=class{constructor(e){this._declaration=e}resolve(e){return e.addDeclaration(o`${this._declaration}`),""}};function ze(n,...e){return new le(o(n,...e))}var le=class{constructor(e){this.body=e;a(this,"_label")}get label(){return this._label}$name(e){return this._label=e,this}resolve(e){let t=new T().$name(this._label);return e.addDeclaration(o`fn ${t}${this.body}`.$name(this._label)),e.resolve(t)}with(e,t){return new ie(this,[e,t])}toString(){var e;return`fn:${(e=this.label)!=null?e:"<unnamed>"}`}},ie=class n{constructor(e,t){this._innerFn=e;this._slotValuePair=t}get label(){return this._innerFn.label}with(e,t){return new n(this,[e,t])}resolve(e){return e.resolve(this._innerFn,[this._slotValuePair])}toString(){var r,s;let[e,t]=this._slotValuePair;return`fn:${(r=this.label)!=null?r:"<unnamed>"}[${(s=e.label)!=null?s:"<unnamed>"}=${t}]`}};function qe(n,e){let t=n.map(s=>[new T,s]),r=t.map(([s,l])=>s);return s=>{let l=s(...r);return new ue(t,e,l)}}var oe=class{constructor(e,t){this.usedFn=e;this.args=t}resolve(e){let t=this.args.map((r,s)=>{let l=s<this.args.length-1?", ":"";return o`${r}${l}`});return e.resolve(o`${this.usedFn}(${t})`.$name("internal"))}toString(){var e;return`fun:${(e=this.usedFn.label)!=null?e:"<unnamed>"}()`}},ue=class extends Ve{constructor(t,r,s){super();this.argPairs=t;this.returnType=r;this.body=s;a(this,"_label")}get label(){return this._label}$name(t){return this._label=t,this}resolve(t){let r=new T().$name(this._label),s=this.argPairs.map(([l,g],i)=>{let m=i<this.argPairs.length-1?", ":"";return Ae(g)?o`${l}: ptr<${g.scope}, ${g.pointsTo}>${m}`:o`${l}: ${g}${m}`});return this.returnType!==void 0?t.addDeclaration(o`fn ${r}(${s}) -> ${this.returnType} {
|
45
|
+
${this.body}
|
46
|
+
}`):t.addDeclaration(o`fn ${r}(${s}) {
|
47
|
+
${this.body}
|
48
|
+
}`),t.resolve(r)}_call(...t){return new oe(this,t)}toString(){var t;return`fun:${(t=this._label)!=null?t:"<unnamed>"}`}};var je=Symbol("This item can be set, owns its value (does not get value from an external source)");var Ke=Symbol("This plum's value is sourced from outside the runtime.");function I(n){return n[Ke]===!0}function Ye(n){return typeof n=="function"?new ge(n):new de(n)}function Qe(n,e){return new pe(n,e)}function Xe(n){return n.__brand==="WgslPlum"}var at,de=class{constructor(e){this._initial=e;a(this,"__brand","WgslPlum");a(this,at,!0);a(this,"_label")}compute(e){return this._initial}$name(e){return this._label=e,this}get label(){return this._label}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};at=je;var ge=class{constructor(e){this._compute=e;a(this,"__brand","WgslPlum");a(this,"_label")}$name(e){return this._label=e,this}get label(){return this._label}compute(e){return this._compute(e)}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}},lt,pe=class{constructor(e,t){this._subscribe=e;this._getLatest=t;a(this,"__brand","WgslPlum");a(this,lt,!0);a(this,"_label");a(this,"_prev");a(this,"_version",0);this._prev=t()}$name(e){return this._label=e,this}get label(){return this._label}get version(){return this._version}subscribe(e){return this._subscribe(e)}compute(){let e=this._getLatest();return Object.is(e,this._prev)||(this._version++,this._prev=e),this._prev}toString(){var e;return`plum:${(e=this._label)!=null?e:"<unnamed>"}`}};lt=Ke;function He(n){return new me(n)}var me=class{constructor(e=void 0){this.defaultValue=e;a(this,"__brand","WgslSlot");a(this,"label")}$name(e){return this.label=e,this}areEqual(e,t){return Object.is(e,t)}resolve(e){var r;let t=e.unwrap(this);if(!Pe(t))throw new Error(`Cannot inject value of type ${typeof t} of slot '${(r=this.label)!=null?r:"<unnamed>"}' in code.`);return e.resolve(t)}toString(){var e;return`slot:${(e=this.label)!=null?e:"<unnamed>"}`}};var Je=(n,e,t="private")=>new ce(n,e,t),ce=class{constructor(e,t,r){this._dataType=e;this._initialValue=t;this.scope=r;a(this,"identifier",new T)}$name(e){return this.identifier.$name(e),this}resolve(e){return this._initialValue?e.addDeclaration(o`var<${this.scope}> ${this.identifier}: ${this._dataType} = ${this._initialValue};`):e.addDeclaration(o`var<${this.scope}> ${this.identifier}: ${this._dataType};`),e.resolve(this.identifier)}};var it=Object.assign(o,{code:o,fn:ze,fun:qe,buffer:Ie,plum:Ye,plumFromEvent:Qe,slot:He,constant:Le,declare:Ne,var:Je,sampler:Ee,texture:Oe,textureExternal:Me,builtin:$e});import{BufferReader as ot,BufferWriter as Ze}from"typed-binary";var fe=(n,e)=>{let t=e-1,r=~t;return n&t?(n&r)+e:n};var L=class{constructor(){a(this,"_stateMap",new WeakMap)}inspect(e){return this._stateMap.get(e)}_getState(e){let t=this._stateMap.get(e);if(!t){let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);t={value:r,dependencies:s,version:0},this._stateMap.set(e,t)}return t}_notifyListeners(e){let t=this._getState(e);if(!t.active)return;let r=[...t.active.listeners];for(let s of r)s(t.value)}_computeAndGatherDependencies(e){let t=new Map,r=s=>{if(!t.has(s)){let l=this._getState(s);t.set(s,l.version)}return this.get(s)};return{value:e.compute(r),dependencies:t}}_recompute(e){let t=this._getState(e);if(t.active)for(let l of t.active.unsubs)l();let{value:r,dependencies:s}=this._computeAndGatherDependencies(e);if(t.dependencies=s,t.active)for(let[l]of t.dependencies)t.active.unsubs.add(this.subscribe(l,()=>{this._recompute(e)}));return Object.is(t.value,r)||(t.value=r,t.version=I(e)?e.version:t.version+1,this._notifyListeners(e)),t.value}get(e){let t=this._getState(e);if(t.active)return t.value;let r=!1;return I(e)?(e.compute(null),r=t.version!==e.version):t.dependencies.size>0&&(r=[...t.dependencies.entries()].some(([s,l])=>(this.get(s),this._getState(s).version!==l))),r?this._recompute(e):t.value}set(e,t){let r=this._getState(e);Object.is(r.value,t)||(r.value=t,r.version++,this._notifyListeners(e))}subscribe(e,t){let r=this._getState(e),s;if(!r.active){let l=new Set;r.active={listeners:new Set,unsubs:l};for(let[g]of r.dependencies)l.add(this.subscribe(g,()=>{this._recompute(e)}));I(e)&&(s=e.subscribe(()=>{this._recompute(e)}))}return r.active.listeners.add(t),()=>{if(r.active&&(r.active.listeners.delete(t),r.active.listeners.size===0)){for(let l of r.active.unsubs)l();s==null||s(),r.active=void 0}}}};var N=class{constructor(){a(this,"_queue",[]);a(this,"_pending",!1)}enqueue(e){return new Promise((t,r)=>{this._queue.push(async()=>{try{t(await e())}catch(s){r(s)}}),this._processQueue()})}async _processQueue(){if(!this._pending){for(this._pending=!0;this._queue.length>0;){let e=this._queue.shift();e&&await e()}this._pending=!1}}};var z=class{constructor(e){this.device=e;a(this,"_entryToBufferMap",new Map);a(this,"_samplers",new WeakMap);a(this,"_textures",new WeakMap);a(this,"_textureViews",new WeakMap);a(this,"_pipelineExecutors",[]);a(this,"_commandEncoder",null);a(this,"_readBuffer",null);a(this,"_taskQueue",new N);a(this,"_plumStore",new L);a(this,"_allocSubscriptions",new Map)}get commandEncoder(){return this._commandEncoder||(this._commandEncoder=this.device.createCommandEncoder()),this._commandEncoder}dispose(){var e;for(let t of this._allocSubscriptions.values())t();this._allocSubscriptions.clear();for(let t of this._entryToBufferMap.values())t.destroy();this._entryToBufferMap.clear(),(e=this._readBuffer)==null||e.destroy()}bufferFor(e){let t=this._entryToBufferMap.get(e);if(!t){if(t=this.device.createBuffer({usage:e.flags,size:fe(e.dataType.size,e.dataType.byteAlignment),mappedAtCreation:e.initial!==void 0}),!t)throw new Error(`Failed to create buffer for ${e}`);if(e.initial!==void 0){let r=new Ze(t.getMappedRange());if(Xe(e.initial)){let s=e.initial;e.dataType.write(r,this._plumStore.get(s)),this._allocSubscriptions.set(e,this._plumStore.subscribe(s,()=>{this.writeBuffer(e,this._plumStore.get(s))}))}else e.dataType.write(r,e.initial);t.unmap()}this._entryToBufferMap.set(e,t)}return t}textureFor(e){let t;"texture"in e?t=e.texture:t=e;let r=this._textures.get(t);if(!r){let s=E(G({},t.descriptor),{usage:t.flags});if(r=this.device.createTexture(s),!r)throw new Error(`Failed to create texture for ${e}`);this._textures.set(t,r)}return r}viewFor(e){let t=this._textureViews.get(e);return t||(t=this.textureFor(e.texture).createView(e.descriptor),this._textureViews.set(e,t)),t}externalTextureFor(e){return this.device.importExternalTexture(e.descriptor)}samplerFor(e){let t=this._samplers.get(e);if(!t){if(t=this.device.createSampler(e.descriptor),!t)throw new Error(`Failed to create sampler for ${e}`);this._samplers.set(e,t)}return t}async readBuffer(e){return this._taskQueue.enqueue(async()=>{var l;this.flush(),(!this._readBuffer||this._readBuffer.size<e.dataType.size)&&((l=this._readBuffer)==null||l.destroy(),this._readBuffer=this.device.createBuffer({usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ,size:e.dataType.size}));let t=this.bufferFor(e),r=this.device.createCommandEncoder();r.copyBufferToBuffer(t,0,this._readBuffer,0,e.dataType.size),this.device.queue.submit([r.finish()]),await this.device.queue.onSubmittedWorkDone(),await this._readBuffer.mapAsync(GPUMapMode.READ,0,e.dataType.size);let s=e.dataType.read(new ot(this._readBuffer.getMappedRange()));return this._readBuffer.unmap(),s})}writeBuffer(e,t){let r=this.bufferFor(e),s=fe(e.dataType.size,e.dataType.byteAlignment),l=new ArrayBuffer(s);e.dataType.write(new Ze(l),t),this.device.queue.writeBuffer(r,0,l,0,s)}readPlum(e){return this._plumStore.get(e)}setPlum(e,t){if(typeof t=="function"){let r=t;this._plumStore.set(e,r(this._plumStore.get(e)))}else this._plumStore.set(e,t)}onPlumChange(e,t){return this._plumStore.subscribe(e,t)}makeRenderPipeline(e){var y,x,d,W,A,j,D,V;let[t,r,s]=new M(this,e.vertex.code,e.fragment.code,e.vertex.output).build({bindingGroup:((y=e.externalLayouts)!=null?y:[]).length}),l=s.map((v,B)=>{if(!v.allocatable.vertexLayout)throw new Error(`Buffer ${v.allocatable} does not have a vertex layout`);return E(G({},v.allocatable.vertexLayout),{attributes:[{shaderLocation:B,offset:0,format:Ge(v.allocatable.dataType)}]})}),g=this.device.createShaderModule({code:t.code}),i=this.device.createShaderModule({code:r.code}),m=this.device.createPipelineLayout({label:(x=e.label)!=null?x:"",bindGroupLayouts:[...(d=e.externalLayouts)!=null?d:[],t.bindGroupLayout,r.bindGroupLayout]}),p=this.device.createRenderPipeline({label:(W=e.label)!=null?W:"",layout:m,vertex:{module:g,buffers:l},fragment:{module:i,targets:(j=(A=e.fragment)==null?void 0:A.target)!=null?j:[]},primitive:e.primitive}),c=s.map((v,B)=>[this.bufferFor(v.allocatable),B]),f=new Te(this,p,t,r,(V=(D=e.externalLayouts)==null?void 0:D.length)!=null?V:0,c);return this._pipelineExecutors.push(f),f}makeComputePipeline(e){var i,m,p,c,f,y,x;let t=new k(this,e.code,(i=e.workgroupSize)!=null?i:[1]).build({bindingGroup:((m=e.externalLayouts)!=null?m:[]).length}),r=this.device.createShaderModule({code:t.code}),s=this.device.createPipelineLayout({label:(p=e.label)!=null?p:"",bindGroupLayouts:[...(c=e.externalLayouts)!=null?c:[],t.bindGroupLayout]}),l=this.device.createComputePipeline({label:(f=e.label)!=null?f:"",layout:s,compute:{module:r}}),g=new ye(this,l,[t],(x=(y=e.externalLayouts)==null?void 0:y.length)!=null?x:0);return this._pipelineExecutors.push(g),g}flush(){this._commandEncoder&&(this.device.queue.submit([this._commandEncoder.finish()]),this._commandEncoder=null)}},q=class{constructor(e,t,r,s,l){this._runtime=e;this.pipeline=t;this.programs=r;this.externalLayoutCount=s;this.label=l}},Te=class extends q{constructor(t,r,s,l,g,i){super(t,r,[s,l],g);a(this,"_vertexProgram");a(this,"_fragmentProgram");a(this,"_usedVertexBuffers");this._vertexProgram=s,this._fragmentProgram=l,this._usedVertexBuffers=new Set(i)}execute(t){var f,y,x;let c=t,{vertexCount:r,instanceCount:s,firstVertex:l,firstInstance:g,externalBindGroups:i}=c,m=ve(c,["vertexCount","instanceCount","firstVertex","firstInstance","externalBindGroups"]);if(((f=i==null?void 0:i.length)!=null?f:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(y=i==null?void 0:i.length)!=null?y:0}`);let p=this._runtime.commandEncoder.beginRenderPass(E(G({},m),{label:(x=this.label)!=null?x:""}));p.setPipeline(this.pipeline),(i!=null?i:[]).forEach((d,W)=>p.setBindGroup(W,d)),p.setBindGroup((i!=null?i:[]).length,this._vertexProgram.bindGroup),p.setBindGroup((i!=null?i:[]).length+1,this._fragmentProgram.bindGroup);for(let[d,W]of this._usedVertexBuffers)p.setVertexBuffer(W,d);p.draw(r,s,l,g),p.end()}},ye=class extends q{execute(e){var l,g,i;let{workgroups:t=[1,1],externalBindGroups:r}=e!=null?e:{};if(((l=r==null?void 0:r.length)!=null?l:0)!==this.externalLayoutCount)throw new Error(`External bind group count doesn't match the external bind group layout configuration. Expected ${this.externalLayoutCount}, got: ${(g=r==null?void 0:r.length)!=null?g:0}`);let s=this._runtime.commandEncoder.beginComputePass({label:(i=this.label)!=null?i:""});s.setPipeline(this.pipeline),(r!=null?r:[]).forEach((m,p)=>s.setBindGroup(p,m)),this.programs.forEach((m,p)=>s.setBindGroup((r!=null?r:[]).length+p,m.bindGroup)),s.dispatchWorkgroups(...t),s.end()}};async function ut(n){if(n instanceof GPUDevice)return new z(n);if(!navigator.gpu)throw new Error("WebGPU is not supported by this browser.");let e=await navigator.gpu.requestAdapter(n==null?void 0:n.adapter);if(!e)throw new Error("Could not find a compatible GPU");return new z(await e.requestDevice(n==null?void 0:n.device))}export{we as MissingSlotValueError,_ as ProgramBuilder,b as RandomNameRegistry,dt as RecursiveDataTypeError,K as ResolutionError,X as StrictNameRegistry,$e as builtin,ut as createRuntime,Ge as deriveVertexFormat,mt as getBuiltinInfo,De as getUsedBuiltinsNamed,Se as isDepthTextureType,Ue as isExternalTextureType,Ae as isPointer,Y as isResolvable,Re as isSamplerType,_e as isSlot,pt as isStorageTextureType,gt as isTypedTextureType,Pe as isWgsl,it as wgsl};
|
49
|
+
//# sourceMappingURL=index.js.map
|