typegpu 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.cts CHANGED
@@ -1,13 +1,289 @@
1
+ import { T as TgpuRenderResource, a as TgpuNamable, b as TgpuBuffer, A as AnyTgpuData, O as OmitProps, c as TgpuBufferUsage, U as Uniform, S as Storage, d as TgpuBufferUniform, e as TgpuShaderStage, f as TgpuBufferReadonly, g as TgpuBufferMutable, h as U32, I as I32, F as F32, V as Vec4u, i as Vec4i, j as Vec4f, k as TgpuPlum, E as ExtractPlumValue, l as Unsubscribe, m as TgpuCode, B as BoundTgpuCode, n as Block, v as vecBase, o as vec3f, p as vec3i, q as vec3u } from './types-CGmVkuAt.cjs';
2
+ export { r as TgpuData, w as Vertex, s as isUsableAsStorage, t as isUsableAsUniform, u as isUsableAsVertex } from './types-CGmVkuAt.cjs';
1
3
  import { Parsed } from 'typed-binary';
2
- import { A as AnyTgpuData, T as TgpuPlum, a as TgpuBuffer, v as vecBase, b as vec3f, c as vec3i, d as vec3u, U as Uniform, S as Storage, V as Vertex } from './tgpuBuffer-BVk2wCHR.cjs';
3
- export { e as TgpuData, i as isUsableAsStorage, f as isUsableAsUniform, g as isUsableAsVertex } from './tgpuBuffer-BVk2wCHR.cjs';
4
+
5
+ declare const TgpuSettableTrait: unique symbol;
6
+ interface TgpuSettable {
7
+ readonly [TgpuSettableTrait]: true;
8
+ }
9
+
10
+ type PlumListener<T> = (newValue: T) => unknown;
11
+
12
+ interface TgpuSampler extends TgpuRenderResource, TgpuNamable {
13
+ readonly descriptor: GPUSamplerDescriptor;
14
+ }
15
+
16
+ interface Unwrapper {
17
+ readonly device: GPUDevice;
18
+ unwrap(resource: TgpuBuffer<AnyTgpuData>): GPUBuffer;
19
+ unwrap(resource: TgpuBindGroupLayout): GPUBindGroupLayout;
20
+ unwrap(resource: TgpuBindGroup): GPUBindGroup;
21
+ }
22
+
23
+ type TgpuLayoutEntryBase = {
24
+ /**
25
+ * Limits this resource's visibility to specific shader stages.
26
+ *
27
+ * By default, each resource is visible to all shader stage types, but
28
+ * depending on the underlying implementation, this may have performance implications.
29
+ *
30
+ * @default ['compute'] for mutable resources
31
+ * @default ['compute','vertex','fragment'] for everything else
32
+ */
33
+ visibility?: TgpuShaderStage[];
34
+ };
35
+ type TgpuLayoutUniform = TgpuLayoutEntryBase & {
36
+ uniform: AnyTgpuData | ((arrayLength: number) => AnyTgpuData);
37
+ };
38
+ type TgpuLayoutStorage = TgpuLayoutEntryBase & {
39
+ storage: AnyTgpuData | ((arrayLength: number) => AnyTgpuData);
40
+ /** @default 'readonly' */
41
+ access?: 'mutable' | 'readonly';
42
+ };
43
+ type TgpuLayoutSampler = TgpuLayoutEntryBase & {
44
+ sampler: GPUSamplerBindingType;
45
+ };
46
+ type TgpuLayoutTexture<TSampleType extends GPUTextureSampleType = GPUTextureSampleType> = TgpuLayoutEntryBase & {
47
+ /**
48
+ * - 'float' - f32
49
+ * - 'unfilterable-float' - f32, cannot be used with filtering samplers
50
+ * - 'depth' - f32
51
+ * - 'sint' - i32
52
+ * - 'uint' - u32
53
+ */
54
+ texture: TSampleType;
55
+ /**
56
+ * @default '2d'
57
+ */
58
+ viewDimension?: GPUTextureViewDimension;
59
+ /**
60
+ * @default false
61
+ */
62
+ multisampled?: boolean;
63
+ };
64
+ type TgpuLayoutStorageTexture<TFormat extends GPUTextureFormat = GPUTextureFormat> = TgpuLayoutEntryBase & {
65
+ storageTexture: TFormat;
66
+ /** @default 'writeonly' */
67
+ access?: 'readonly' | 'writeonly' | 'mutable';
68
+ /** @default '2d' */
69
+ viewDimension?: GPUTextureViewDimension;
70
+ };
71
+ type TgpuLayoutExternalTexture = TgpuLayoutEntryBase & {
72
+ externalTexture: Record<string, never>;
73
+ };
74
+ type TgpuLayoutEntry = TgpuLayoutUniform | TgpuLayoutStorage | TgpuLayoutSampler | TgpuLayoutTexture | TgpuLayoutStorageTexture | TgpuLayoutExternalTexture;
75
+ type UnwrapRuntimeConstructorInner<T extends AnyTgpuData | ((_: number) => AnyTgpuData)> = T extends AnyTgpuData ? T : T extends (_: number) => infer Return ? Return : never;
76
+ type UnwrapRuntimeConstructor<T extends AnyTgpuData | ((_: number) => AnyTgpuData)> = T extends unknown ? UnwrapRuntimeConstructorInner<T> : never;
77
+ interface TgpuBindGroupLayout<Entries extends Record<string, TgpuLayoutEntry | null> = Record<string, TgpuLayoutEntry | null>> extends TgpuNamable {
78
+ readonly resourceType: 'bind-group-layout';
79
+ readonly label: string | undefined;
80
+ readonly entries: Entries;
81
+ populate(entries: {
82
+ [K in keyof OmitProps<Entries, null>]: LayoutEntryToInput<Entries[K]>;
83
+ }): TgpuBindGroup<Entries>;
84
+ /**
85
+ * Creates a raw WebGPU resource based on the typed descriptor.
86
+ * NOTE: This creates a new resource every time, better to use `root.unwrap(...)` instead.
87
+ * @param unwrapper Used to unwrap any resources that this resource depends on.
88
+ */
89
+ unwrap(unwrapper: Unwrapper): GPUBindGroupLayout;
90
+ }
91
+ type StorageUsageForEntry<T extends TgpuLayoutStorage> = T extends {
92
+ access?: infer Access;
93
+ } ? 'mutable' | 'readonly' extends Access ? TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>> | TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>> : 'readonly' extends Access ? TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>> : 'mutable' extends Access ? TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>> : TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>> | TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>> : TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>;
94
+ type LayoutEntryToInput<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? TgpuBufferUsage<UnwrapRuntimeConstructor<T['uniform']>, 'uniform'> | (TgpuBuffer<UnwrapRuntimeConstructor<T['uniform']>> & Uniform) | GPUBuffer : T extends TgpuLayoutStorage ? StorageUsageForEntry<T> | (TgpuBuffer<UnwrapRuntimeConstructor<T['storage']>> & Storage) | GPUBuffer : T extends TgpuLayoutSampler ? GPUSampler : T extends TgpuLayoutTexture ? GPUTextureView : T extends TgpuLayoutStorageTexture ? GPUTextureView : T extends TgpuLayoutExternalTexture ? GPUExternalTexture : never;
95
+ type BindLayoutEntry<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? TgpuBufferUniform<UnwrapRuntimeConstructor<T['uniform']>> : T extends TgpuLayoutStorage ? StorageUsageForEntry<T> : T extends TgpuLayoutSampler ? TgpuSampler : never;
96
+ type TgpuBindGroup<Entries extends Record<string, TgpuLayoutEntry | null> = Record<string, TgpuLayoutEntry | null>> = {
97
+ readonly resourceType: 'bind-group';
98
+ readonly layout: TgpuBindGroupLayout<Entries>;
99
+ unwrap(unwrapper: Unwrapper): GPUBindGroup;
100
+ };
101
+ declare function bindGroupLayout<Entries extends Record<string, TgpuLayoutEntry | null>>(entries: Entries): TgpuBindGroupLayout<Entries>;
102
+
103
+ type StorageTextureAccess = 'read' | 'write' | 'read_write';
104
+ type TextureScalarFormat = U32 | I32 | F32;
105
+ type TexelFormat = Vec4u | Vec4i | Vec4f;
106
+
107
+ type Optional<T> = {
108
+ [P in keyof T]?: T[P] | undefined;
109
+ };
110
+ interface TgpuAnyTextureView extends TgpuRenderResource {
111
+ readonly descriptor: GPUTextureViewDescriptor;
112
+ readonly texture: TgpuAnyTexture;
113
+ readonly dataType: TextureScalarFormat | TexelFormat;
114
+ readonly access: StorageTextureAccess | undefined;
115
+ }
116
+ interface TgpuAnyTexture {
117
+ readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;
118
+ get flags(): GPUTextureUsageFlags;
119
+ }
120
+ interface TgpuTextureExternal extends TgpuRenderResource, TgpuNamable {
121
+ readonly descriptor: Optional<GPUExternalTextureDescriptor>;
122
+ get source(): HTMLVideoElement | VideoFrame | undefined;
123
+ }
124
+
125
+ type SetPlumAction<T> = T | ((prev: T) => T);
126
+ interface TgpuRoot extends Unwrapper {
127
+ /**
128
+ * The GPU device associated with this root.
129
+ */
130
+ readonly device: GPUDevice;
131
+ /**
132
+ * @param typeSchema The type of data that this buffer will hold.
133
+ * @param initial The initial value of the buffer. (optional)
134
+ */
135
+ createBuffer<TData extends AnyTgpuData>(typeSchema: TData, initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined): TgpuBuffer<TData>;
136
+ /**
137
+ * @param typeSchema The type of data that this buffer will hold.
138
+ * @param gpuBuffer A vanilla WebGPU buffer.
139
+ */
140
+ createBuffer<TData extends AnyTgpuData>(typeSchema: TData, gpuBuffer: GPUBuffer): TgpuBuffer<TData>;
141
+ unwrap(resource: TgpuBuffer<AnyTgpuData>): GPUBuffer;
142
+ unwrap(resource: TgpuBindGroupLayout): GPUBindGroupLayout;
143
+ unwrap(resource: TgpuBindGroup): GPUBindGroup;
144
+ destroy(): void;
145
+ }
146
+ interface ExperimentalTgpuRoot extends TgpuRoot {
147
+ readonly jitTranspiler?: JitTranspiler | undefined;
148
+ /**
149
+ * The current command encoder. This property will
150
+ * hold the same value until `flush()` is called.
151
+ */
152
+ readonly commandEncoder: GPUCommandEncoder;
153
+ readPlum<TPlum extends TgpuPlum>(plum: TPlum): ExtractPlumValue<TPlum>;
154
+ setPlum<TPlum extends TgpuPlum & TgpuSettable>(plum: TPlum, value: SetPlumAction<ExtractPlumValue<TPlum>>): void;
155
+ onPlumChange<TValue>(plum: TgpuPlum<TValue>, listener: PlumListener<TValue>): Unsubscribe;
156
+ setSource(texture: TgpuTextureExternal, source: HTMLVideoElement | VideoFrame): void;
157
+ isDirty(texture: TgpuTextureExternal): boolean;
158
+ markClean(texture: TgpuTextureExternal): void;
159
+ textureFor(view: TgpuAnyTexture | TgpuAnyTextureView): GPUTexture;
160
+ viewFor(view: TgpuAnyTextureView): GPUTextureView;
161
+ externalTextureFor(texture: TgpuTextureExternal): GPUExternalTexture;
162
+ samplerFor(sampler: TgpuSampler): GPUSampler;
163
+ /**
164
+ * Causes all commands enqueued by pipelines to be
165
+ * submitted to the GPU.
166
+ */
167
+ flush(): void;
168
+ makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor;
169
+ makeComputePipeline(options: ComputePipelineOptions): ComputePipelineExecutor;
170
+ }
171
+ interface RenderPipelineOptions {
172
+ vertex: {
173
+ code: TgpuCode | BoundTgpuCode;
174
+ output: {
175
+ [K in symbol]: string;
176
+ } & {
177
+ [K in string]: AnyTgpuData;
178
+ };
179
+ };
180
+ fragment: {
181
+ code: TgpuCode | BoundTgpuCode;
182
+ target: Iterable<GPUColorTargetState | null>;
183
+ };
184
+ primitive: GPUPrimitiveState;
185
+ externalLayouts?: GPUBindGroupLayout[];
186
+ label?: string;
187
+ }
188
+ interface ComputePipelineOptions {
189
+ code: TgpuCode | BoundTgpuCode;
190
+ workgroupSize?: readonly [number, number?, number?];
191
+ externalLayouts?: GPUBindGroupLayout[];
192
+ label?: string;
193
+ }
194
+ type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {
195
+ vertexCount: number;
196
+ instanceCount?: number;
197
+ firstVertex?: number;
198
+ firstInstance?: number;
199
+ externalBindGroups?: GPUBindGroup[];
200
+ };
201
+ interface RenderPipelineExecutor {
202
+ execute(options: RenderPipelineExecutorOptions): void;
203
+ }
204
+ type ComputePipelineExecutorOptions = {
205
+ workgroups?: readonly [number, number?, number?];
206
+ externalBindGroups?: GPUBindGroup[];
207
+ };
208
+ interface ComputePipelineExecutor {
209
+ execute(options?: ComputePipelineExecutorOptions): void;
210
+ }
211
+
212
+ /**
213
+ * Information extracted from transpiling a JS function.
214
+ */
215
+ type TranspilationResult = {
216
+ argNames: string[];
217
+ body: Block;
218
+ /**
219
+ * All identifiers found in the function code that are not declared in the
220
+ * function itself, or in the block that is accessing that identifier.
221
+ */
222
+ externalNames: string[];
223
+ };
224
+
225
+ /**
226
+ * Used to transpile JS resources into SMoL on demand.
227
+ */
228
+ interface JitTranspiler {
229
+ transpileFn(rawJs: string): TranspilationResult;
230
+ }
231
+
232
+ /**
233
+ * Options passed into {@link init}.
234
+ */
235
+ type InitOptions = {
236
+ adapter?: GPURequestAdapterOptions | undefined;
237
+ device?: GPUDeviceDescriptor | undefined;
238
+ unstable_jitTranspiler?: JitTranspiler | undefined;
239
+ };
240
+ /**
241
+ * Options passed into {@link initFromDevice}.
242
+ */
243
+ type InitFromDeviceOptions = {
244
+ device: GPUDevice;
245
+ unstable_jitTranspiler?: JitTranspiler | undefined;
246
+ };
247
+ /**
248
+ * Requests a new GPU device and creates a root around it.
249
+ * If a specific device should be used instead, use @see initFromDevice.
250
+ *
251
+ * @example
252
+ * When given no options, the function will ask the browser for a suitable GPU device.
253
+ * ```ts
254
+ * const root = await tgpu.init();
255
+ * ```
256
+ *
257
+ * @example
258
+ * If there are specific options that should be used when requesting a device, you can pass those in.
259
+ * ```ts
260
+ * const adapterOptions: GPURequestAdapterOptions = ...;
261
+ * const deviceDescriptor: GPUDeviceDescriptor = ...;
262
+ * const root = await tgpu.init({ adapter: adapterOptions, device: deviceDescriptor });
263
+ * ```
264
+ */
265
+ declare function init(options?: InitOptions): Promise<ExperimentalTgpuRoot>;
266
+ /**
267
+ * Creates a root from the given device, instead of requesting it like @see init.
268
+ *
269
+ * @example
270
+ * ```ts
271
+ * const device: GPUDevice = ...;
272
+ * const root = tgpu.initFromDevice({ device });
273
+ * ```
274
+ */
275
+ declare function initFromDevice(options: InitFromDeviceOptions): ExperimentalTgpuRoot;
4
276
 
5
277
  /**
278
+ * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`
279
+ *
6
280
  * @param typeSchema The type of data that this buffer will hold.
7
281
  * @param initial The initial value of the buffer. (optional)
8
282
  */
9
283
  declare function createBuffer<TData extends AnyTgpuData>(typeSchema: TData, initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined): TgpuBuffer<TData>;
10
284
  /**
285
+ * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`
286
+ *
11
287
  * @param typeSchema The type of data that this buffer will hold.
12
288
  * @param gpuBuffer A vanilla WebGPU buffer.
13
289
  */
@@ -41,12 +317,18 @@ declare const std: {
41
317
  */
42
318
 
43
319
  declare const tgpu: {
44
- Uniform: Uniform;
45
- Storage: Storage;
46
- Vertex: Vertex;
320
+ /** @deprecated Use `'uniform'` string literal instead. */
321
+ Uniform: "uniform";
322
+ /** @deprecated Use `'storage'` string literal instead. */
323
+ Storage: "storage";
324
+ /** @deprecated Use `'vertex'` string literal instead. */
325
+ Vertex: "vertex";
326
+ bindGroupLayout: typeof bindGroupLayout;
327
+ init: typeof init;
328
+ initFromDevice: typeof initFromDevice;
47
329
  createBuffer: typeof createBuffer;
48
330
  read: typeof read;
49
331
  write: typeof write;
50
332
  };
51
333
 
52
- export { AnyTgpuData, RecursiveDataTypeError, TgpuBuffer, tgpu as default, std, tgpu };
334
+ export { AnyTgpuData, type BindLayoutEntry, type LayoutEntryToInput, RecursiveDataTypeError, Storage, type TgpuBindGroup, type TgpuBindGroupLayout, TgpuBuffer, type TgpuLayoutEntry, type TgpuLayoutSampler, type TgpuLayoutUniform, Uniform, tgpu as default, std, tgpu };
package/index.d.ts CHANGED
@@ -1,13 +1,289 @@
1
+ import { T as TgpuRenderResource, a as TgpuNamable, b as TgpuBuffer, A as AnyTgpuData, O as OmitProps, c as TgpuBufferUsage, U as Uniform, S as Storage, d as TgpuBufferUniform, e as TgpuShaderStage, f as TgpuBufferReadonly, g as TgpuBufferMutable, h as U32, I as I32, F as F32, V as Vec4u, i as Vec4i, j as Vec4f, k as TgpuPlum, E as ExtractPlumValue, l as Unsubscribe, m as TgpuCode, B as BoundTgpuCode, n as Block, v as vecBase, o as vec3f, p as vec3i, q as vec3u } from './types-CGmVkuAt.js';
2
+ export { r as TgpuData, w as Vertex, s as isUsableAsStorage, t as isUsableAsUniform, u as isUsableAsVertex } from './types-CGmVkuAt.js';
1
3
  import { Parsed } from 'typed-binary';
2
- import { A as AnyTgpuData, T as TgpuPlum, a as TgpuBuffer, v as vecBase, b as vec3f, c as vec3i, d as vec3u, U as Uniform, S as Storage, V as Vertex } from './tgpuBuffer-BVk2wCHR.js';
3
- export { e as TgpuData, i as isUsableAsStorage, f as isUsableAsUniform, g as isUsableAsVertex } from './tgpuBuffer-BVk2wCHR.js';
4
+
5
+ declare const TgpuSettableTrait: unique symbol;
6
+ interface TgpuSettable {
7
+ readonly [TgpuSettableTrait]: true;
8
+ }
9
+
10
+ type PlumListener<T> = (newValue: T) => unknown;
11
+
12
+ interface TgpuSampler extends TgpuRenderResource, TgpuNamable {
13
+ readonly descriptor: GPUSamplerDescriptor;
14
+ }
15
+
16
+ interface Unwrapper {
17
+ readonly device: GPUDevice;
18
+ unwrap(resource: TgpuBuffer<AnyTgpuData>): GPUBuffer;
19
+ unwrap(resource: TgpuBindGroupLayout): GPUBindGroupLayout;
20
+ unwrap(resource: TgpuBindGroup): GPUBindGroup;
21
+ }
22
+
23
+ type TgpuLayoutEntryBase = {
24
+ /**
25
+ * Limits this resource's visibility to specific shader stages.
26
+ *
27
+ * By default, each resource is visible to all shader stage types, but
28
+ * depending on the underlying implementation, this may have performance implications.
29
+ *
30
+ * @default ['compute'] for mutable resources
31
+ * @default ['compute','vertex','fragment'] for everything else
32
+ */
33
+ visibility?: TgpuShaderStage[];
34
+ };
35
+ type TgpuLayoutUniform = TgpuLayoutEntryBase & {
36
+ uniform: AnyTgpuData | ((arrayLength: number) => AnyTgpuData);
37
+ };
38
+ type TgpuLayoutStorage = TgpuLayoutEntryBase & {
39
+ storage: AnyTgpuData | ((arrayLength: number) => AnyTgpuData);
40
+ /** @default 'readonly' */
41
+ access?: 'mutable' | 'readonly';
42
+ };
43
+ type TgpuLayoutSampler = TgpuLayoutEntryBase & {
44
+ sampler: GPUSamplerBindingType;
45
+ };
46
+ type TgpuLayoutTexture<TSampleType extends GPUTextureSampleType = GPUTextureSampleType> = TgpuLayoutEntryBase & {
47
+ /**
48
+ * - 'float' - f32
49
+ * - 'unfilterable-float' - f32, cannot be used with filtering samplers
50
+ * - 'depth' - f32
51
+ * - 'sint' - i32
52
+ * - 'uint' - u32
53
+ */
54
+ texture: TSampleType;
55
+ /**
56
+ * @default '2d'
57
+ */
58
+ viewDimension?: GPUTextureViewDimension;
59
+ /**
60
+ * @default false
61
+ */
62
+ multisampled?: boolean;
63
+ };
64
+ type TgpuLayoutStorageTexture<TFormat extends GPUTextureFormat = GPUTextureFormat> = TgpuLayoutEntryBase & {
65
+ storageTexture: TFormat;
66
+ /** @default 'writeonly' */
67
+ access?: 'readonly' | 'writeonly' | 'mutable';
68
+ /** @default '2d' */
69
+ viewDimension?: GPUTextureViewDimension;
70
+ };
71
+ type TgpuLayoutExternalTexture = TgpuLayoutEntryBase & {
72
+ externalTexture: Record<string, never>;
73
+ };
74
+ type TgpuLayoutEntry = TgpuLayoutUniform | TgpuLayoutStorage | TgpuLayoutSampler | TgpuLayoutTexture | TgpuLayoutStorageTexture | TgpuLayoutExternalTexture;
75
+ type UnwrapRuntimeConstructorInner<T extends AnyTgpuData | ((_: number) => AnyTgpuData)> = T extends AnyTgpuData ? T : T extends (_: number) => infer Return ? Return : never;
76
+ type UnwrapRuntimeConstructor<T extends AnyTgpuData | ((_: number) => AnyTgpuData)> = T extends unknown ? UnwrapRuntimeConstructorInner<T> : never;
77
+ interface TgpuBindGroupLayout<Entries extends Record<string, TgpuLayoutEntry | null> = Record<string, TgpuLayoutEntry | null>> extends TgpuNamable {
78
+ readonly resourceType: 'bind-group-layout';
79
+ readonly label: string | undefined;
80
+ readonly entries: Entries;
81
+ populate(entries: {
82
+ [K in keyof OmitProps<Entries, null>]: LayoutEntryToInput<Entries[K]>;
83
+ }): TgpuBindGroup<Entries>;
84
+ /**
85
+ * Creates a raw WebGPU resource based on the typed descriptor.
86
+ * NOTE: This creates a new resource every time, better to use `root.unwrap(...)` instead.
87
+ * @param unwrapper Used to unwrap any resources that this resource depends on.
88
+ */
89
+ unwrap(unwrapper: Unwrapper): GPUBindGroupLayout;
90
+ }
91
+ type StorageUsageForEntry<T extends TgpuLayoutStorage> = T extends {
92
+ access?: infer Access;
93
+ } ? 'mutable' | 'readonly' extends Access ? TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>> | TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>> : 'readonly' extends Access ? TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>> : 'mutable' extends Access ? TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>> : TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>> | TgpuBufferMutable<UnwrapRuntimeConstructor<T['storage']>> : TgpuBufferReadonly<UnwrapRuntimeConstructor<T['storage']>>;
94
+ type LayoutEntryToInput<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? TgpuBufferUsage<UnwrapRuntimeConstructor<T['uniform']>, 'uniform'> | (TgpuBuffer<UnwrapRuntimeConstructor<T['uniform']>> & Uniform) | GPUBuffer : T extends TgpuLayoutStorage ? StorageUsageForEntry<T> | (TgpuBuffer<UnwrapRuntimeConstructor<T['storage']>> & Storage) | GPUBuffer : T extends TgpuLayoutSampler ? GPUSampler : T extends TgpuLayoutTexture ? GPUTextureView : T extends TgpuLayoutStorageTexture ? GPUTextureView : T extends TgpuLayoutExternalTexture ? GPUExternalTexture : never;
95
+ type BindLayoutEntry<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? TgpuBufferUniform<UnwrapRuntimeConstructor<T['uniform']>> : T extends TgpuLayoutStorage ? StorageUsageForEntry<T> : T extends TgpuLayoutSampler ? TgpuSampler : never;
96
+ type TgpuBindGroup<Entries extends Record<string, TgpuLayoutEntry | null> = Record<string, TgpuLayoutEntry | null>> = {
97
+ readonly resourceType: 'bind-group';
98
+ readonly layout: TgpuBindGroupLayout<Entries>;
99
+ unwrap(unwrapper: Unwrapper): GPUBindGroup;
100
+ };
101
+ declare function bindGroupLayout<Entries extends Record<string, TgpuLayoutEntry | null>>(entries: Entries): TgpuBindGroupLayout<Entries>;
102
+
103
+ type StorageTextureAccess = 'read' | 'write' | 'read_write';
104
+ type TextureScalarFormat = U32 | I32 | F32;
105
+ type TexelFormat = Vec4u | Vec4i | Vec4f;
106
+
107
+ type Optional<T> = {
108
+ [P in keyof T]?: T[P] | undefined;
109
+ };
110
+ interface TgpuAnyTextureView extends TgpuRenderResource {
111
+ readonly descriptor: GPUTextureViewDescriptor;
112
+ readonly texture: TgpuAnyTexture;
113
+ readonly dataType: TextureScalarFormat | TexelFormat;
114
+ readonly access: StorageTextureAccess | undefined;
115
+ }
116
+ interface TgpuAnyTexture {
117
+ readonly descriptor: Omit<GPUTextureDescriptor, 'usage'>;
118
+ get flags(): GPUTextureUsageFlags;
119
+ }
120
+ interface TgpuTextureExternal extends TgpuRenderResource, TgpuNamable {
121
+ readonly descriptor: Optional<GPUExternalTextureDescriptor>;
122
+ get source(): HTMLVideoElement | VideoFrame | undefined;
123
+ }
124
+
125
+ type SetPlumAction<T> = T | ((prev: T) => T);
126
+ interface TgpuRoot extends Unwrapper {
127
+ /**
128
+ * The GPU device associated with this root.
129
+ */
130
+ readonly device: GPUDevice;
131
+ /**
132
+ * @param typeSchema The type of data that this buffer will hold.
133
+ * @param initial The initial value of the buffer. (optional)
134
+ */
135
+ createBuffer<TData extends AnyTgpuData>(typeSchema: TData, initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined): TgpuBuffer<TData>;
136
+ /**
137
+ * @param typeSchema The type of data that this buffer will hold.
138
+ * @param gpuBuffer A vanilla WebGPU buffer.
139
+ */
140
+ createBuffer<TData extends AnyTgpuData>(typeSchema: TData, gpuBuffer: GPUBuffer): TgpuBuffer<TData>;
141
+ unwrap(resource: TgpuBuffer<AnyTgpuData>): GPUBuffer;
142
+ unwrap(resource: TgpuBindGroupLayout): GPUBindGroupLayout;
143
+ unwrap(resource: TgpuBindGroup): GPUBindGroup;
144
+ destroy(): void;
145
+ }
146
+ interface ExperimentalTgpuRoot extends TgpuRoot {
147
+ readonly jitTranspiler?: JitTranspiler | undefined;
148
+ /**
149
+ * The current command encoder. This property will
150
+ * hold the same value until `flush()` is called.
151
+ */
152
+ readonly commandEncoder: GPUCommandEncoder;
153
+ readPlum<TPlum extends TgpuPlum>(plum: TPlum): ExtractPlumValue<TPlum>;
154
+ setPlum<TPlum extends TgpuPlum & TgpuSettable>(plum: TPlum, value: SetPlumAction<ExtractPlumValue<TPlum>>): void;
155
+ onPlumChange<TValue>(plum: TgpuPlum<TValue>, listener: PlumListener<TValue>): Unsubscribe;
156
+ setSource(texture: TgpuTextureExternal, source: HTMLVideoElement | VideoFrame): void;
157
+ isDirty(texture: TgpuTextureExternal): boolean;
158
+ markClean(texture: TgpuTextureExternal): void;
159
+ textureFor(view: TgpuAnyTexture | TgpuAnyTextureView): GPUTexture;
160
+ viewFor(view: TgpuAnyTextureView): GPUTextureView;
161
+ externalTextureFor(texture: TgpuTextureExternal): GPUExternalTexture;
162
+ samplerFor(sampler: TgpuSampler): GPUSampler;
163
+ /**
164
+ * Causes all commands enqueued by pipelines to be
165
+ * submitted to the GPU.
166
+ */
167
+ flush(): void;
168
+ makeRenderPipeline(options: RenderPipelineOptions): RenderPipelineExecutor;
169
+ makeComputePipeline(options: ComputePipelineOptions): ComputePipelineExecutor;
170
+ }
171
+ interface RenderPipelineOptions {
172
+ vertex: {
173
+ code: TgpuCode | BoundTgpuCode;
174
+ output: {
175
+ [K in symbol]: string;
176
+ } & {
177
+ [K in string]: AnyTgpuData;
178
+ };
179
+ };
180
+ fragment: {
181
+ code: TgpuCode | BoundTgpuCode;
182
+ target: Iterable<GPUColorTargetState | null>;
183
+ };
184
+ primitive: GPUPrimitiveState;
185
+ externalLayouts?: GPUBindGroupLayout[];
186
+ label?: string;
187
+ }
188
+ interface ComputePipelineOptions {
189
+ code: TgpuCode | BoundTgpuCode;
190
+ workgroupSize?: readonly [number, number?, number?];
191
+ externalLayouts?: GPUBindGroupLayout[];
192
+ label?: string;
193
+ }
194
+ type RenderPipelineExecutorOptions = GPURenderPassDescriptor & {
195
+ vertexCount: number;
196
+ instanceCount?: number;
197
+ firstVertex?: number;
198
+ firstInstance?: number;
199
+ externalBindGroups?: GPUBindGroup[];
200
+ };
201
+ interface RenderPipelineExecutor {
202
+ execute(options: RenderPipelineExecutorOptions): void;
203
+ }
204
+ type ComputePipelineExecutorOptions = {
205
+ workgroups?: readonly [number, number?, number?];
206
+ externalBindGroups?: GPUBindGroup[];
207
+ };
208
+ interface ComputePipelineExecutor {
209
+ execute(options?: ComputePipelineExecutorOptions): void;
210
+ }
211
+
212
+ /**
213
+ * Information extracted from transpiling a JS function.
214
+ */
215
+ type TranspilationResult = {
216
+ argNames: string[];
217
+ body: Block;
218
+ /**
219
+ * All identifiers found in the function code that are not declared in the
220
+ * function itself, or in the block that is accessing that identifier.
221
+ */
222
+ externalNames: string[];
223
+ };
224
+
225
+ /**
226
+ * Used to transpile JS resources into SMoL on demand.
227
+ */
228
+ interface JitTranspiler {
229
+ transpileFn(rawJs: string): TranspilationResult;
230
+ }
231
+
232
+ /**
233
+ * Options passed into {@link init}.
234
+ */
235
+ type InitOptions = {
236
+ adapter?: GPURequestAdapterOptions | undefined;
237
+ device?: GPUDeviceDescriptor | undefined;
238
+ unstable_jitTranspiler?: JitTranspiler | undefined;
239
+ };
240
+ /**
241
+ * Options passed into {@link initFromDevice}.
242
+ */
243
+ type InitFromDeviceOptions = {
244
+ device: GPUDevice;
245
+ unstable_jitTranspiler?: JitTranspiler | undefined;
246
+ };
247
+ /**
248
+ * Requests a new GPU device and creates a root around it.
249
+ * If a specific device should be used instead, use @see initFromDevice.
250
+ *
251
+ * @example
252
+ * When given no options, the function will ask the browser for a suitable GPU device.
253
+ * ```ts
254
+ * const root = await tgpu.init();
255
+ * ```
256
+ *
257
+ * @example
258
+ * If there are specific options that should be used when requesting a device, you can pass those in.
259
+ * ```ts
260
+ * const adapterOptions: GPURequestAdapterOptions = ...;
261
+ * const deviceDescriptor: GPUDeviceDescriptor = ...;
262
+ * const root = await tgpu.init({ adapter: adapterOptions, device: deviceDescriptor });
263
+ * ```
264
+ */
265
+ declare function init(options?: InitOptions): Promise<ExperimentalTgpuRoot>;
266
+ /**
267
+ * Creates a root from the given device, instead of requesting it like @see init.
268
+ *
269
+ * @example
270
+ * ```ts
271
+ * const device: GPUDevice = ...;
272
+ * const root = tgpu.initFromDevice({ device });
273
+ * ```
274
+ */
275
+ declare function initFromDevice(options: InitFromDeviceOptions): ExperimentalTgpuRoot;
4
276
 
5
277
  /**
278
+ * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`
279
+ *
6
280
  * @param typeSchema The type of data that this buffer will hold.
7
281
  * @param initial The initial value of the buffer. (optional)
8
282
  */
9
283
  declare function createBuffer<TData extends AnyTgpuData>(typeSchema: TData, initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined): TgpuBuffer<TData>;
10
284
  /**
285
+ * @deprecated Use the `root.createBuffer` API instead, accessible through `await tgpu.init()`
286
+ *
11
287
  * @param typeSchema The type of data that this buffer will hold.
12
288
  * @param gpuBuffer A vanilla WebGPU buffer.
13
289
  */
@@ -41,12 +317,18 @@ declare const std: {
41
317
  */
42
318
 
43
319
  declare const tgpu: {
44
- Uniform: Uniform;
45
- Storage: Storage;
46
- Vertex: Vertex;
320
+ /** @deprecated Use `'uniform'` string literal instead. */
321
+ Uniform: "uniform";
322
+ /** @deprecated Use `'storage'` string literal instead. */
323
+ Storage: "storage";
324
+ /** @deprecated Use `'vertex'` string literal instead. */
325
+ Vertex: "vertex";
326
+ bindGroupLayout: typeof bindGroupLayout;
327
+ init: typeof init;
328
+ initFromDevice: typeof initFromDevice;
47
329
  createBuffer: typeof createBuffer;
48
330
  read: typeof read;
49
331
  write: typeof write;
50
332
  };
51
333
 
52
- export { AnyTgpuData, RecursiveDataTypeError, TgpuBuffer, tgpu as default, std, tgpu };
334
+ export { AnyTgpuData, type BindLayoutEntry, type LayoutEntryToInput, RecursiveDataTypeError, Storage, type TgpuBindGroup, type TgpuBindGroupLayout, TgpuBuffer, type TgpuLayoutEntry, type TgpuLayoutSampler, type TgpuLayoutUniform, Uniform, tgpu as default, std, tgpu };