typegpu 0.0.0-alpha.4 → 0.0.0-alpha.6
Sign up to get free protection for your applications and to get access to all the features.
- package/chunk-337KOXP7.js +2 -0
- package/chunk-337KOXP7.js.map +1 -0
- package/chunk-6WFXH2OR.js +8 -0
- package/chunk-6WFXH2OR.js.map +1 -0
- package/chunk-G6QA55EY.cjs +8 -0
- package/chunk-G6QA55EY.cjs.map +1 -0
- package/chunk-S55XYV7U.cjs +2 -0
- package/chunk-S55XYV7U.cjs.map +1 -0
- package/data/index.cjs +1 -1
- package/data/index.d.cts +64 -23
- package/data/index.d.ts +64 -23
- package/data/index.js +1 -1
- package/index.cjs +1 -48
- package/index.cjs.map +1 -1
- package/index.d.cts +54 -330
- package/index.d.ts +54 -330
- package/index.js +1 -48
- package/index.js.map +1 -1
- package/macro/index.cjs +3 -3
- package/macro/index.cjs.map +1 -1
- package/macro/index.d.cts +1 -1
- package/macro/index.d.ts +1 -1
- package/macro/index.js +2 -2
- package/macro/index.js.map +1 -1
- package/package.json +7 -8
- package/types-DU0c7BuW.d.cts +207 -0
- package/types-DU0c7BuW.d.ts +207 -0
- package/chunk-7HTWRNOH.cjs +0 -12
- package/chunk-7HTWRNOH.cjs.map +0 -1
- package/chunk-K2GYQABQ.js +0 -12
- package/chunk-K2GYQABQ.js.map +0 -1
- package/std140-Cv7GDE9w.d.ts +0 -26
- package/std140-DRitCcmc.d.cts +0 -26
- package/types-ENDwr_p9.d.cts +0 -243
- package/types-ENDwr_p9.d.ts +0 -243
package/index.d.ts
CHANGED
@@ -1,348 +1,72 @@
|
|
1
|
-
import {
|
2
|
-
|
3
|
-
|
4
|
-
import { S as SimpleWgslData } from './std140-Cv7GDE9w.js';
|
1
|
+
import { Parsed } from 'typed-binary';
|
2
|
+
import { A as AnyTgpuData, B as BufferUsage, T as TgpuBindable, a as TgpuAllocatable, b as TgpuNamable, c as TgpuPlum, v as vecBase, d as vec3f, e as vec3i, f as vec3u } from './types-DU0c7BuW.js';
|
3
|
+
export { h as TexelFormat, g as TgpuData } from './types-DU0c7BuW.js';
|
5
4
|
|
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
|
-
}
|
19
|
-
/**
|
20
|
-
* @category Errors
|
21
|
-
*/
|
22
|
-
declare class MissingSlotValueError extends Error {
|
23
|
-
readonly slot: WgslSlot<unknown>;
|
24
|
-
constructor(slot: WgslSlot<unknown>);
|
25
|
-
}
|
26
|
-
/**
|
27
|
-
* @category Errors
|
28
|
-
*/
|
29
|
-
declare class RecursiveDataTypeError extends Error {
|
30
|
-
constructor();
|
31
|
-
}
|
32
|
-
|
33
|
-
declare abstract class Callable<TArgs extends [...any[]], TReturn> extends Function {
|
34
|
-
_bound: Callable<TArgs, TReturn>;
|
35
|
-
constructor();
|
36
|
-
abstract _call(...args: TArgs): TReturn;
|
5
|
+
interface TgpuBufferUsage<TData extends AnyTgpuData, TUsage extends BufferUsage = BufferUsage> extends TgpuBindable<TData, TUsage> {
|
37
6
|
}
|
38
|
-
type ICallable<TArgs extends [...any[]], TReturn> = (...args: TArgs) => TReturn;
|
39
|
-
type AsCallable<T, TArgs extends [...any[]], TReturn> = T & ICallable<TArgs, TReturn>;
|
40
7
|
|
41
|
-
|
42
|
-
|
43
|
-
interface WgslCode extends WgslResolvable {
|
44
|
-
$name(label?: string | undefined): WgslCode;
|
45
|
-
with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslCode;
|
46
|
-
}
|
47
|
-
type BoundWgslCode = Omit<WgslCode, '$name'>;
|
48
|
-
declare function code(strings: TemplateStringsArray, ...params: (Wgsl | Wgsl[] | InlineResolve)[]): WgslCode;
|
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);
|
100
|
-
interface TypeGpuRuntime {
|
8
|
+
interface Unmanaged {
|
101
9
|
readonly device: GPUDevice;
|
102
|
-
|
103
|
-
* The current command encoder. This property will
|
104
|
-
* hold the same value until `flush()` is called.
|
105
|
-
*/
|
106
|
-
readonly commandEncoder: GPUCommandEncoder;
|
107
|
-
readPlum<TPlum extends WgslPlum>(plum: TPlum): ExtractPlumValue<TPlum>;
|
108
|
-
setPlum<TPlum extends WgslPlum & WgslSettable>(plum: TPlum, value: SetPlumAction<ExtractPlumValue<TPlum>>): void;
|
109
|
-
onPlumChange<TValue>(plum: WgslPlum<TValue>, listener: PlumListener<TValue>): Unsubscribe;
|
110
|
-
writeBuffer<TValue extends AnyWgslData>(allocatable: WgslAllocatable<TValue>, data: Parsed<TValue>): void;
|
111
|
-
readBuffer<TData extends AnyWgslData>(allocatable: WgslAllocatable<TData>): Promise<Parsed<TData>>;
|
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;
|
117
|
-
dispose(): void;
|
118
|
-
/**
|
119
|
-
* Causes all commands enqueued by pipelines to be
|
120
|
-
* submitted to the GPU.
|
121
|
-
*/
|
122
|
-
flush(): void;
|
123
|
-
makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor;
|
124
|
-
makeComputePipeline(options: ComputePipelineOptions): ComputePipelineExecutor;
|
10
|
+
readonly buffer: GPUBuffer;
|
125
11
|
}
|
126
|
-
interface
|
127
|
-
|
128
|
-
code: WgslCode | BoundWgslCode;
|
129
|
-
output: {
|
130
|
-
[K in symbol]: string;
|
131
|
-
} & {
|
132
|
-
[K in string]: AnyWgslData;
|
133
|
-
};
|
134
|
-
};
|
135
|
-
fragment: {
|
136
|
-
code: WgslCode | BoundWgslCode;
|
137
|
-
target: Iterable<GPUColorTargetState | null>;
|
138
|
-
};
|
139
|
-
primitive: GPUPrimitiveState;
|
140
|
-
externalLayouts?: GPUBindGroupLayout[];
|
141
|
-
label?: string;
|
12
|
+
interface AllowUniform {
|
13
|
+
uniformAllowed: true;
|
142
14
|
}
|
143
|
-
interface
|
144
|
-
|
145
|
-
workgroupSize?: readonly [number, number?, number?];
|
146
|
-
externalLayouts?: GPUBindGroupLayout[];
|
147
|
-
label?: string;
|
15
|
+
interface AllowReadonly {
|
16
|
+
readonlyAllowed: true;
|
148
17
|
}
|
149
|
-
|
150
|
-
|
151
|
-
instanceCount?: number;
|
152
|
-
firstVertex?: number;
|
153
|
-
firstInstance?: number;
|
154
|
-
externalBindGroups?: GPUBindGroup[];
|
155
|
-
};
|
156
|
-
interface RenderPipelineExecutor {
|
157
|
-
execute(options: RenderPipelineExecutorOptions): void;
|
158
|
-
}
|
159
|
-
type ComputePipelineExecutorOptions = {
|
160
|
-
workgroups?: readonly [number, number?, number?];
|
161
|
-
externalBindGroups?: GPUBindGroup[];
|
162
|
-
};
|
163
|
-
interface ComputePipelineExecutor {
|
164
|
-
execute(options?: ComputePipelineExecutorOptions): void;
|
18
|
+
interface AllowMutable {
|
19
|
+
mutableAllowed: true;
|
165
20
|
}
|
166
|
-
|
167
|
-
|
168
|
-
interface NameRegistry {
|
169
|
-
nameFor(item: WgslResolvable): string;
|
21
|
+
interface AllowVertex {
|
22
|
+
vertexAllowed: true;
|
170
23
|
}
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
declare class StrictNameRegistry implements NameRegistry {
|
177
|
-
/**
|
178
|
-
* Allows to provide a good fallback for instances of the
|
179
|
-
* same function that are bound to different slot values.
|
180
|
-
*/
|
181
|
-
private readonly _usedNames;
|
182
|
-
private readonly _assignedNames;
|
183
|
-
nameFor(item: WgslResolvable): string;
|
184
|
-
}
|
185
|
-
|
186
|
-
type Program = {
|
187
|
-
readonly bindGroupLayout: GPUBindGroupLayout;
|
188
|
-
readonly bindGroup: GPUBindGroup;
|
189
|
-
readonly code: string;
|
24
|
+
type AllowedUsages<TData extends AnyTgpuData> = {
|
25
|
+
uniform: TgpuBufferUsage<TData, 'uniform'> | null;
|
26
|
+
mutable: TgpuBufferUsage<TData, 'mutable'> | null;
|
27
|
+
readonly: TgpuBufferUsage<TData, 'readonly'> | null;
|
28
|
+
vertex: TgpuBufferUsage<TData, 'vertex'> | null;
|
190
29
|
};
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
30
|
+
interface TgpuBuffer<TData extends AnyTgpuData> extends TgpuAllocatable<TData>, TgpuNamable {
|
31
|
+
$allowUniform(): this & AllowUniform;
|
32
|
+
$allowReadonly(): this & AllowReadonly;
|
33
|
+
$allowMutable(): this & AllowMutable;
|
34
|
+
$allowVertex(stepMode: 'vertex' | 'instance'): this & AllowVertex;
|
35
|
+
$addFlags(flags: GPUBufferUsageFlags): this;
|
36
|
+
$device(device: GPUDevice): this & Unmanaged;
|
37
|
+
_usages: AllowedUsages<TData>;
|
38
|
+
readonly label: string | undefined;
|
39
|
+
}
|
40
|
+
declare function buffer<TData extends AnyTgpuData>(typeSchema: TData, initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined): TgpuBuffer<TData>;
|
41
|
+
declare function buffer<TData extends AnyTgpuData>(typeSchema: TData, gpuBuffer: GPUBuffer): TgpuBuffer<TData>;
|
42
|
+
|
43
|
+
declare function write<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData> & Unmanaged, data: Parsed<TData>): void;
|
44
|
+
declare function read<TData extends AnyTgpuData>(buffer: TgpuBuffer<TData> & Unmanaged): Promise<Parsed<TData>>;
|
45
|
+
|
46
|
+
declare const tgpu: {
|
47
|
+
createBuffer: typeof buffer;
|
48
|
+
read: typeof read;
|
49
|
+
write: typeof write;
|
195
50
|
};
|
196
|
-
declare class ProgramBuilder {
|
197
|
-
private runtime;
|
198
|
-
private root;
|
199
|
-
constructor(runtime: TypeGpuRuntime, root: WgslResolvable);
|
200
|
-
build(options: BuildOptions): Program;
|
201
|
-
}
|
202
|
-
|
203
|
-
type VariableScope = 'private' | 'workgroup';
|
204
|
-
interface WgslVar<TDataType extends AnyWgslData> extends WgslResolvable {
|
205
|
-
$name(label: string): WgslVar<TDataType>;
|
206
|
-
}
|
207
|
-
|
208
|
-
interface WgslBufferUsage<TData extends AnyWgslData, TUsage extends BufferUsage = BufferUsage> extends WgslBindable<TData, TUsage> {
|
209
|
-
$name(label: string): WgslBufferUsage<TData, TUsage>;
|
210
|
-
}
|
211
51
|
|
212
|
-
type UsageGuard<TUsage extends BufferUsage, TData extends AnyWgslData, TAllows> = TUsage extends TAllows ? WgslBufferUsage<TData, TUsage> : null;
|
213
|
-
interface WgslBuffer<TData extends AnyWgslData, TAllows extends BufferUsage = never> extends WgslAllocatable<TData> {
|
214
|
-
$name(label: string): WgslBuffer<TData, TAllows>;
|
215
|
-
$allowUniform(): WgslBuffer<TData, TAllows | 'uniform'>;
|
216
|
-
$allowReadonly(): WgslBuffer<TData, TAllows | 'readonly'>;
|
217
|
-
$allowMutable(): WgslBuffer<TData, TAllows | 'mutable'>;
|
218
|
-
$allowVertex(stepMode: 'vertex' | 'instance'): WgslBuffer<TData, TAllows | 'vertex'>;
|
219
|
-
$addFlags(flags: GPUBufferUsageFlags): WgslBuffer<TData, TAllows>;
|
220
|
-
asUniform(): UsageGuard<'uniform', TData, TAllows>;
|
221
|
-
asMutable(): UsageGuard<'mutable', TData, TAllows>;
|
222
|
-
asReadonly(): UsageGuard<'readonly', TData, TAllows>;
|
223
|
-
asVertex(): UsageGuard<'vertex', TData, TAllows>;
|
224
|
-
}
|
225
|
-
declare function buffer<TData extends AnyWgslData, TUsage extends BufferUsage = never>(typeSchema: TData, initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined): WgslBuffer<TData, TUsage>;
|
226
|
-
|
227
|
-
interface WgslConst extends WgslResolvable {
|
228
|
-
$name(label: string): WgslConst;
|
229
|
-
}
|
230
52
|
/**
|
231
|
-
*
|
232
|
-
* to the passed in expression.
|
53
|
+
* @category Errors
|
233
54
|
*/
|
234
|
-
declare
|
235
|
-
|
236
|
-
interface WgslDeclare extends WgslResolvable {
|
237
|
-
}
|
238
|
-
declare function declare(strings: TemplateStringsArray, ...params: (Wgsl | Wgsl[] | InlineResolve)[]): WgslDeclare;
|
239
|
-
|
240
|
-
interface WgslFn$1 extends WgslResolvable {
|
241
|
-
$name(label: string): WgslFn$1;
|
242
|
-
with<T>(slot: WgslSlot<T>, value: Eventual<T>): BoundWgslFn;
|
243
|
-
}
|
244
|
-
type BoundWgslFn = Omit<WgslFn$1, '$name'>;
|
245
|
-
declare function fn$1(strings: TemplateStringsArray, ...params: (Wgsl | InlineResolve)[]): WgslFn$1;
|
246
|
-
|
247
|
-
interface WgslFn<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends WgslResolvable, Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> {
|
248
|
-
}
|
249
|
-
declare function fn<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined>(argTypes: TArgTypes, returnType?: TReturn): (bodyProducer: (...args: ValuesFromTypes<TArgTypes>) => Wgsl) => AsCallable<WgslFnImpl<TArgTypes, TReturn>, SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes>>;
|
250
|
-
type ValuesFromTypes<TArgTypes extends WgslFnArgument[]> = {
|
251
|
-
[K in keyof TArgTypes]: WgslValue<TArgTypes[K]> & WgslIdentifier;
|
252
|
-
};
|
253
|
-
type PairsFromTypes<TArgTypes extends WgslFnArgument[]> = {
|
254
|
-
[K in keyof TArgTypes]: readonly [WgslIdentifier, TArgTypes[K]];
|
255
|
-
};
|
256
|
-
type SegmentsFromTypes<TArgTypes extends WgslFnArgument[]> = {
|
257
|
-
[K in keyof TArgTypes]: Wgsl;
|
258
|
-
};
|
259
|
-
declare class WgslFunctionCall<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> implements WgslResolvable {
|
260
|
-
private usedFn;
|
261
|
-
private readonly args;
|
262
|
-
constructor(usedFn: WgslFn<TArgTypes, TReturn>, args: SegmentsFromTypes<TArgTypes>);
|
263
|
-
resolve(ctx: ResolutionCtx): string;
|
264
|
-
toString(): string;
|
265
|
-
}
|
266
|
-
declare class WgslFnImpl<TArgTypes extends [WgslFnArgument, ...WgslFnArgument[]] | [], TReturn extends AnyWgslData | undefined = undefined> extends Callable<SegmentsFromTypes<TArgTypes>, WgslFunctionCall<TArgTypes, TReturn>> implements WgslFn<TArgTypes, TReturn> {
|
267
|
-
private argPairs;
|
268
|
-
private returnType;
|
269
|
-
private readonly body;
|
270
|
-
private _label;
|
271
|
-
constructor(argPairs: PairsFromTypes<TArgTypes>, returnType: TReturn | undefined, body: Wgsl);
|
272
|
-
get label(): string | undefined;
|
273
|
-
$name(label: string): this;
|
274
|
-
resolve(ctx: ResolutionCtx): string;
|
275
|
-
_call(...args: SegmentsFromTypes<TArgTypes>): WgslFunctionCall<TArgTypes, TReturn>;
|
276
|
-
toString(): string;
|
55
|
+
declare class RecursiveDataTypeError extends Error {
|
56
|
+
constructor();
|
277
57
|
}
|
278
58
|
|
279
|
-
declare
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
constant: typeof constant;
|
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
|
-
};
|
59
|
+
declare const std: {
|
60
|
+
add: <T extends vecBase>(lhs: T, rhs: T) => T;
|
61
|
+
sub: <T extends vecBase>(lhs: T, rhs: T) => T;
|
62
|
+
mul: <T extends vecBase>(s: number, v: T) => T;
|
63
|
+
dot: <T extends vecBase>(lhs: T, rhs: T) => number;
|
64
|
+
normalize: <T extends vecBase>(v: T) => T;
|
65
|
+
cross: <T extends vec3f | vec3i | vec3u>(a: T, b: T) => T;
|
66
|
+
fract: (a: number) => number;
|
67
|
+
length: <T extends vecBase>(vector: T) => number;
|
68
|
+
sin: (x: number) => number;
|
69
|
+
cos: (x: number) => number;
|
312
70
|
};
|
313
71
|
|
314
|
-
|
315
|
-
* Options passed into {@link createRuntime}.
|
316
|
-
*/
|
317
|
-
type CreateRuntimeOptions = {
|
318
|
-
adapter: GPURequestAdapterOptions | undefined;
|
319
|
-
device: GPUDeviceDescriptor | undefined;
|
320
|
-
};
|
321
|
-
/**
|
322
|
-
* @param options
|
323
|
-
* @returns
|
324
|
-
*
|
325
|
-
* @example
|
326
|
-
* When given no options, the function will ask the browser for a suitable GPU device.
|
327
|
-
* ```ts
|
328
|
-
* createRuntime();
|
329
|
-
* ```
|
330
|
-
*
|
331
|
-
* @example
|
332
|
-
* If there are specific options that should be used when requesting a device, you can pass those in.
|
333
|
-
* ```ts
|
334
|
-
* const adapterOptions: GPURequestAdapterOptions = ...;
|
335
|
-
* const deviceDescriptor: GPUDeviceDescriptor = ...;
|
336
|
-
* createRuntime({ adapter: adapterOptions, device: deviceDescriptor });
|
337
|
-
* ```
|
338
|
-
*
|
339
|
-
* @example
|
340
|
-
* If a specific device should be used instead, it can be passed in as a parameter.
|
341
|
-
* ```ts
|
342
|
-
* const device: GPUDevice = ...;
|
343
|
-
* createRuntime(device);
|
344
|
-
* ```
|
345
|
-
*/
|
346
|
-
declare function createRuntime(options?: CreateRuntimeOptions | GPUDevice): Promise<TypeGpuRuntime>;
|
347
|
-
|
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 };
|
72
|
+
export { type AllowMutable, type AllowReadonly, type AllowUniform, type AllowVertex, AnyTgpuData, RecursiveDataTypeError, type TgpuBuffer, type Unmanaged, tgpu as default, std, tgpu };
|
package/index.js
CHANGED
@@ -1,49 +1,2 @@
|
|
1
|
-
import{
|
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};
|
1
|
+
import{a as P,b as C,c as _,l as G,n as T,o as g,p as x,q as i,r as s,s as c,t as v,u as m,v as w}from"./chunk-6WFXH2OR.js";import{a as r,b as R,c as b}from"./chunk-337KOXP7.js";import{BufferReader as D,BufferWriter as M}from"typed-binary";function $(e,t){let a=e.buffer,n=e.device;if(a.mapState==="mapped"){let y=a.getMappedRange();e.dataType.write(new M(y),t);return}let p=P(e.dataType.size,e.dataType.byteAlignment),U=new ArrayBuffer(p);e.dataType.write(new M(U),t),n.queue.writeBuffer(a,0,U,0,p)}async function V(e){let t=e.buffer,a=e.device;if(t.mapState==="mapped"){let y=t.getMappedRange();return e.dataType.read(new D(y))}if(t.usage&GPUBufferUsage.MAP_READ){await t.mapAsync(GPUMapMode.READ);let y=t.getMappedRange(),h=e.dataType.read(new D(y));return t.unmap(),h}let n=a.createBuffer({size:e.dataType.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),p=a.createCommandEncoder();p.copyBufferToBuffer(t,0,n,0,e.dataType.size),a.queue.submit([p.finish()]),await a.queue.onSubmittedWorkDone(),await n.mapAsync(GPUMapMode.READ,0,e.dataType.size);let U=e.dataType.read(new D(n.getMappedRange()));return n.unmap(),n.destroy(),U}import{BufferWriter as k}from"typed-binary";function f(e,t){return new z(e,t)}var z=class{constructor(t,a){this.buffer=t;this.usage=a}get label(){return this.buffer.label}get allocatable(){return this.buffer}resolve(t){let a=new b().$name(this.label);return t.addBinding(this,a),t.resolve(a)}toString(){var t;return`${this.usage}:${(t=this.label)!=null?t:"<unnamed>"}`}};function S(e,t){return new A(e,t)}var A=class{constructor(t,a){this.dataType=t;this.initialOrBuffer=a;r(this,"flags",GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC);r(this,"_device",null);r(this,"_buffer",null);r(this,"_usages",{uniform:null,mutable:null,readonly:null,vertex:null});r(this,"vertexLayout",null);r(this,"_label");r(this,"initial");R(a)?this._buffer=a:this.initial=a}get label(){return this._label}get buffer(){if(!this._device)throw new Error("To use this property, make the buffer unmanaged by passing a GPUDevice to $device");if(!this._buffer&&(this._buffer=this._device.createBuffer({size:this.dataType.size,usage:this.flags,mappedAtCreation:!!this.initial}),this.initial)){let t=new k(this._buffer.getMappedRange());this.dataType.write(t,this.initial),this._buffer.unmap()}return this._buffer}get device(){if(!this._device)throw new Error("This buffer is managed by TypeGPU and cannot be used directly");return this._device}$name(t){return this._label=t,this}$allowUniform(){return this.$addFlags(GPUBufferUsage.UNIFORM),this._usages.uniform||(this._usages.uniform=f(this,"uniform")),this}$allowReadonly(){return this.$addFlags(GPUBufferUsage.STORAGE),this._usages.readonly||(this._usages.readonly=f(this,"readonly")),this}$allowMutable(){return this.$addFlags(GPUBufferUsage.STORAGE),this._usages.mutable||(this._usages.mutable=f(this,"mutable")),this}$allowVertex(t="vertex"){if(this.$addFlags(GPUBufferUsage.VERTEX),!this.vertexLayout)if(this.dataType instanceof _)this.vertexLayout={arrayStride:this.dataType.size,stepMode:t},this._usages.vertex=f(this,"vertex");else if(this.dataType instanceof G)this.vertexLayout={arrayStride:this.dataType.elementType.size,stepMode:t},this._usages.vertex=f(this,"vertex");else throw new Error("Only simple data types can be used as vertex buffers");if(this.vertexLayout.stepMode!==t)throw new Error("Cannot change step mode of a vertex buffer");return this}$addFlags(t){return this.flags|=t,this}$device(t){return this._device=t,this}toString(){var t;return`buffer:${(t=this._label)!=null?t:"<unnamed>"}`}};function E(e){return e.charAt(0).toUpperCase()+e.slice(1)}function B(e,t){return a=>{if(a._usages[e]===null)throw new Error(`Cannot pass ${a} to as${E(e)} function, as the buffer does not allow ${e} usage. To allow it, use $allow${E(e)} TgpuBuffer method.`);return a._usages[e]}}var H=B("uniform",{uniformAllowed:!0}),J=B("readonly",{readonlyAllowed:!0}),Q=B("mutable",{mutableAllowed:!0}),Z=B("vertex",{vertexAllowed:!0});var F={createBuffer:S,read:V,write:$};var o=e=>Math.sqrt(e.x**2+e.y**2),l=e=>Math.sqrt(e.x**2+e.y**2+e.z**2),d=e=>Math.sqrt(e.x**2+e.y**2+e.z**2+e.w**2),u={length:{vec2f:o,vec2i:o,vec2u:o,vec3f:l,vec3i:l,vec3u:l,vec4f:d,vec4i:d,vec4u:d},add:{vec2f:(e,t)=>T(e.x+t.x,e.y+t.y),vec2i:(e,t)=>g(e.x+t.x,e.y+t.y),vec2u:(e,t)=>x(e.x+t.x,e.y+t.y),vec3f:(e,t)=>i(e.x+t.x,e.y+t.y,e.z+t.z),vec3i:(e,t)=>s(e.x+t.x,e.y+t.y,e.z+t.z),vec3u:(e,t)=>c(e.x+t.x,e.y+t.y,e.z+t.z),vec4f:(e,t)=>v(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4i:(e,t)=>m(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w),vec4u:(e,t)=>w(e.x+t.x,e.y+t.y,e.z+t.z,e.w+t.w)},sub:{vec2f:(e,t)=>T(e.x-t.x,e.y-t.y),vec2i:(e,t)=>g(e.x-t.x,e.y-t.y),vec2u:(e,t)=>x(e.x-t.x,e.y-t.y),vec3f:(e,t)=>i(e.x-t.x,e.y-t.y,e.z-t.z),vec3i:(e,t)=>s(e.x-t.x,e.y-t.y,e.z-t.z),vec3u:(e,t)=>c(e.x-t.x,e.y-t.y,e.z-t.z),vec4f:(e,t)=>v(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4i:(e,t)=>m(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w),vec4u:(e,t)=>w(e.x-t.x,e.y-t.y,e.z-t.z,e.w-t.w)},mul:{vec2f:(e,t)=>T(e*t.x,e*t.y),vec2i:(e,t)=>g(e*t.x,e*t.y),vec2u:(e,t)=>x(e*t.x,e*t.y),vec3f:(e,t)=>i(e*t.x,e*t.y,e*t.z),vec3i:(e,t)=>s(e*t.x,e*t.y,e*t.z),vec3u:(e,t)=>c(e*t.x,e*t.y,e*t.z),vec4f:(e,t)=>v(e*t.x,e*t.y,e*t.z,e*t.w),vec4i:(e,t)=>m(e*t.x,e*t.y,e*t.z,e*t.w),vec4u:(e,t)=>w(e*t.x,e*t.y,e*t.z,e*t.w)},dot:{vec2f:(e,t)=>e.x*t.x+e.y*t.y,vec2i:(e,t)=>e.x*t.x+e.y*t.y,vec2u:(e,t)=>e.x*t.x+e.y*t.y,vec3f:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec3i:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec3u:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,vec4f:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w,vec4i:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w,vec4u:(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z+e.w*t.w},normalize:{vec2f:e=>{let t=o(e);return T(e.x/t,e.y/t)},vec2i:e=>{let t=o(e);return g(e.x/t,e.y/t)},vec2u:e=>{let t=o(e);return x(e.x/t,e.y/t)},vec3f:e=>{let t=l(e);return i(e.x/t,e.y/t,e.z/t)},vec3i:e=>{let t=l(e);return s(e.x/t,e.y/t,e.z/t)},vec3u:e=>{let t=l(e);return c(e.x/t,e.y/t,e.z/t)},vec4f:e=>{let t=d(e);return v(e.x/t,e.y/t,e.z/t,e.w/t)},vec4i:e=>{let t=d(e);return m(e.x/t,e.y/t,e.z/t,e.w/t)},vec4u:e=>{let t=d(e);return w(e.x/t,e.y/t,e.z/t,e.w/t)}},cross:{vec3f:(e,t)=>i(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x),vec3i:(e,t)=>s(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x),vec3u:(e,t)=>c(e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x)}};var O={add:(e,t)=>u.add[e.kind](e,t),sub:(e,t)=>u.sub[e.kind](e,t),mul:(e,t)=>u.mul[t.kind](e,t),dot:(e,t)=>u.dot[e.kind](e,t),normalize:e=>u.normalize[e.kind](e),cross:(e,t)=>u.cross[e.kind](e,t),fract:e=>e-Math.floor(e),length:e=>u.length[e.kind](e),sin:Math.sin,cos:Math.cos};export{C as RecursiveDataTypeError,F as default,O as std,F as tgpu};
|
49
2
|
//# sourceMappingURL=index.js.map
|