@tapez/core 0.0.0-alpha.2 → 0.0.0-alpha.4

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.
Files changed (50) hide show
  1. package/README.md +33 -0
  2. package/dist/index.d.ts +389 -21
  3. package/dist/index.js +556 -30
  4. package/dist/index.js.map +1 -1
  5. package/package.json +7 -5
  6. package/dist/array.d.ts +0 -26
  7. package/dist/array.d.ts.map +0 -1
  8. package/dist/array.js +0 -30
  9. package/dist/array.js.map +0 -1
  10. package/dist/bind-helpers.d.ts +0 -36
  11. package/dist/bind-helpers.d.ts.map +0 -1
  12. package/dist/bind-helpers.js +0 -44
  13. package/dist/bind-helpers.js.map +0 -1
  14. package/dist/const.d.ts +0 -26
  15. package/dist/const.d.ts.map +0 -1
  16. package/dist/const.js +0 -43
  17. package/dist/const.js.map +0 -1
  18. package/dist/gpu-buffer-utils.d.ts +0 -40
  19. package/dist/gpu-buffer-utils.d.ts.map +0 -1
  20. package/dist/gpu-buffer-utils.js +0 -105
  21. package/dist/gpu-buffer-utils.js.map +0 -1
  22. package/dist/index.d.ts.map +0 -1
  23. package/dist/layout.d.ts +0 -36
  24. package/dist/layout.d.ts.map +0 -1
  25. package/dist/layout.js +0 -39
  26. package/dist/layout.js.map +0 -1
  27. package/dist/matrix.d.ts +0 -20
  28. package/dist/matrix.d.ts.map +0 -1
  29. package/dist/matrix.js +0 -25
  30. package/dist/matrix.js.map +0 -1
  31. package/dist/schemas.d.ts +0 -61
  32. package/dist/schemas.d.ts.map +0 -1
  33. package/dist/schemas.js +0 -85
  34. package/dist/schemas.js.map +0 -1
  35. package/dist/struct.d.ts +0 -47
  36. package/dist/struct.d.ts.map +0 -1
  37. package/dist/struct.js +0 -81
  38. package/dist/struct.js.map +0 -1
  39. package/dist/typed-buffer.d.ts +0 -117
  40. package/dist/typed-buffer.d.ts.map +0 -1
  41. package/dist/typed-buffer.js +0 -273
  42. package/dist/typed-buffer.js.map +0 -1
  43. package/dist/types.d.ts +0 -33
  44. package/dist/types.d.ts.map +0 -1
  45. package/dist/types.js +0 -23
  46. package/dist/types.js.map +0 -1
  47. package/dist/vectors.d.ts +0 -26
  48. package/dist/vectors.d.ts.map +0 -1
  49. package/dist/vectors.js +0 -44
  50. package/dist/vectors.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # @tapez/core
2
+
3
+ Typed GPU schema system for WebGPU.
4
+
5
+ Define a GPU struct once — get a type-safe buffer wrapper **and** the WGSL struct definition, guaranteed to stay in sync.
6
+
7
+ ```ts
8
+ import * as tapez from '@tapez/core'
9
+
10
+ const RowsConfig = tapez.struct('RowsConfig', {
11
+ midPrice: tapez.f32,
12
+ rowHeight: tapez.f32,
13
+ decimals: tapez.u32,
14
+ })
15
+
16
+ // In your entity:
17
+ const buf = tapez.TypedBuffer.createUniform(device, RowsConfig, 'config')
18
+ buf.set.midPrice(50000.5)
19
+ buf.set.decimals(2)
20
+ buf.writeIfDirty(queue)
21
+ ```
22
+
23
+ The same schema emits a WGSL struct via `RowsConfig.toWGSL()`, consumable in shaders through [`@tapez/vite`](../vite)'s `@import` syntax.
24
+
25
+ ## Contents
26
+
27
+ - **Schemas** — `f32`, `u32`, `i32`, `vec2f/3f/4f`, `mat2x2f/3x3f/4x4f`, `struct`, `arrayOf`, `const`, `atomic`
28
+ - **TypedBuffer** — named setters, dirty tracking, factory methods
29
+ - **Bind helpers** — `uniformEntry`, `storageEntry`, `bufferEntry`
30
+
31
+ ## Status
32
+
33
+ Alpha. API may change.
package/dist/index.d.ts CHANGED
@@ -1,29 +1,397 @@
1
1
  /**
2
- * @tapez/coreTyped GPU schema system for WebGPU.
2
+ * TapeZ type system — GPU data type definitions.
3
3
  *
4
- * Usage:
5
- * import * as tapez from '@tapez/core'
4
+ * Each type carries its WGSL name, byte size, and alignment
5
+ * following the WGSL specification for host-shareable types.
6
+ */
7
+ interface TapezType {
8
+ /** Unique tag for runtime discrimination */
9
+ readonly kind: string;
10
+ /** WGSL type name, e.g. 'f32', 'vec4<f32>' */
11
+ readonly wgslType: string;
12
+ /** Byte size of this type in a buffer */
13
+ readonly byteSize: number;
14
+ /** Required alignment in bytes (WGSL spec) */
15
+ readonly alignment: number;
16
+ }
17
+ interface TapezScalar extends TapezType {
18
+ readonly kind: 'scalar';
19
+ /** Which typed array setter to use */
20
+ readonly arrayKind: 'f32' | 'u32' | 'i32';
21
+ }
22
+ declare const f32: TapezScalar;
23
+ declare const u32: TapezScalar;
24
+ declare const i32: TapezScalar;
25
+ interface TapezAtomic extends TapezType {
26
+ readonly kind: 'atomic';
27
+ /** The wrapped scalar type */
28
+ readonly inner: TapezScalar;
29
+ /** Which typed array setter to use (same as inner) */
30
+ readonly arrayKind: 'f32' | 'u32' | 'i32';
31
+ }
32
+ declare function atomic(inner: TapezScalar): TapezAtomic;
33
+
34
+ /**
35
+ * TapeZ vector types — vec2, vec3, vec4 for f32/u32/i32.
36
+ *
37
+ * WGSL alignment rules:
38
+ * vec2<T> → size 8, align 8
39
+ * vec3<T> → size 12, align 16
40
+ * vec4<T> → size 16, align 16
41
+ */
42
+
43
+ interface TapezVector extends TapezType {
44
+ readonly kind: 'vector';
45
+ /** Number of components (2, 3, or 4) */
46
+ readonly components: number;
47
+ /** Component scalar type */
48
+ readonly componentType: TapezScalar;
49
+ }
50
+ declare const vec2f: TapezVector;
51
+ declare const vec3f: TapezVector;
52
+ declare const vec4f: TapezVector;
53
+ declare const vec2u: TapezVector;
54
+ declare const vec3u: TapezVector;
55
+ declare const vec4u: TapezVector;
56
+ declare const vec2i: TapezVector;
57
+ declare const vec3i: TapezVector;
58
+ declare const vec4i: TapezVector;
59
+
60
+ /**
61
+ * TapeZ matrix types — mat2x2f, mat3x3f, mat4x4f.
62
+ *
63
+ * WGSL matrices are column-major arrays of column vectors.
64
+ * mat2x2<f32> → 2 columns of vec2<f32> → size 16, align 8
65
+ * mat3x3<f32> → 3 columns of vec3<f32> → size 48, align 16
66
+ * mat4x4<f32> → 4 columns of vec4<f32> → size 64, align 16
67
+ */
68
+
69
+ interface TapezMatrix extends TapezType {
70
+ readonly kind: 'matrix';
71
+ /** Number of columns */
72
+ readonly columns: number;
73
+ /** Number of rows */
74
+ readonly rows: number;
75
+ }
76
+ declare const mat2x2f: TapezMatrix;
77
+ declare const mat3x3f: TapezMatrix;
78
+ declare const mat4x4f: TapezMatrix;
79
+
80
+ /**
81
+ * WGSL struct layout computation — alignment, padding, field offsets.
82
+ *
83
+ * Implements the WGSL spec's struct layout algorithm:
84
+ * https://www.w3.org/TR/WGSL/#structure-member-layout
85
+ */
86
+
87
+ /** Round `offset` up to the next multiple of `alignment`. */
88
+ declare function roundUp(alignment: number, offset: number): number;
89
+ interface FieldLayout {
90
+ /** Field name */
91
+ readonly name: string;
92
+ /** Field type */
93
+ readonly type: TapezType;
94
+ /** Byte offset from struct start */
95
+ readonly offset: number;
96
+ }
97
+ interface StructLayout {
98
+ /** Ordered field layouts */
99
+ readonly fields: readonly FieldLayout[];
100
+ /** Total byte size (padded to struct alignment) */
101
+ readonly byteSize: number;
102
+ /** Struct alignment = max(field alignments) */
103
+ readonly alignment: number;
104
+ /** Map from field name to byte offset */
105
+ readonly offsets: Record<string, number>;
106
+ }
107
+ /**
108
+ * Compute the byte layout of a struct given its fields in order.
109
+ * Follows WGSL struct member layout rules.
110
+ */
111
+ declare function computeStructLayout(fields: readonly {
112
+ name: string;
113
+ type: TapezType;
114
+ }[]): StructLayout;
115
+
116
+ /**
117
+ * TapeZ struct definition — the core of the schema system.
6
118
  *
119
+ * Usage:
7
120
  * const MyConfig = tapez.struct('MyConfig', {
8
121
  * midPrice: tapez.f32,
122
+ * rowHeight: tapez.f32,
9
123
  * decimals: tapez.u32,
10
- * color: tapez.vec4f,
11
124
  * })
125
+ *
126
+ * MyConfig.byteSize // 12
127
+ * MyConfig.offsets // { midPrice: 0, rowHeight: 4, decimals: 8 }
128
+ * MyConfig.toWGSL() // "struct MyConfig {\n midPrice: f32,\n ..."
129
+ */
130
+
131
+ interface TapezStruct<F extends Record<string, TapezType> = Record<string, TapezType>> extends TapezType {
132
+ readonly kind: 'struct';
133
+ /** Struct name (used in WGSL output) */
134
+ readonly name: string;
135
+ /** Field type definitions, keyed by name */
136
+ readonly fields: F;
137
+ /** Byte offset of each field */
138
+ readonly offsets: {
139
+ readonly [K in keyof F]: number;
140
+ };
141
+ /** Field names in definition order */
142
+ readonly fieldOrder: readonly (keyof F & string)[];
143
+ /** Full computed layout with per-field metadata */
144
+ readonly layout: StructLayout;
145
+ /** Generate WGSL struct declaration */
146
+ toWGSL(): string;
147
+ /**
148
+ * Create a new struct with specified fields wrapped in atomic<>.
149
+ * Same memory layout — atomic<u32> and u32 are identical in size/alignment.
150
+ * Only u32 and i32 fields can be made atomic.
151
+ */
152
+ withAtomics<K extends keyof F & string>(name: string, atomicFields: K[]): TapezStruct<F>;
153
+ }
154
+ /**
155
+ * Define a GPU struct schema.
156
+ *
157
+ * Fields are laid out in definition order following WGSL alignment rules.
158
+ * The returned object is frozen and can be shared across entities.
159
+ */
160
+ declare function struct<F extends Record<string, TapezType>>(name: string, fields: F): TapezStruct<F>;
161
+
162
+ /**
163
+ * TapeZ array type — fixed-size GPU arrays.
164
+ *
165
+ * WGSL array layout:
166
+ * Element stride = roundUp(alignment, sizeof(element))
167
+ * Array size = count * stride
168
+ * Array alignment = element alignment
169
+ */
170
+
171
+ interface TapezArray extends TapezType {
172
+ readonly kind: 'array';
173
+ /** Element type */
174
+ readonly elementType: TapezType;
175
+ /** Number of elements */
176
+ readonly count: number;
177
+ /** Byte stride between consecutive elements (includes padding) */
178
+ readonly stride: number;
179
+ }
180
+ /**
181
+ * Define a fixed-size GPU array.
182
+ *
183
+ * Element stride follows WGSL array layout rules:
184
+ * stride = roundUp(element.alignment, element.byteSize)
185
+ */
186
+ declare function arrayOf(elementType: TapezType, count: number): TapezArray;
187
+
188
+ /**
189
+ * TapeZ constants — shared between TypeScript and WGSL.
190
+ *
191
+ * Usage:
192
+ * const MAX_ROWS = tapez.const('MAX_ROWS', tapez.u32, 4096)
193
+ *
194
+ * MAX_ROWS.value // 4096 (use in TypeScript)
195
+ * MAX_ROWS.toWGSL() // 'const MAX_ROWS: u32 = 4096u;' (injected into WGSL)
196
+ */
197
+
198
+ interface TapezConst<T extends TapezScalar = TapezScalar> {
199
+ readonly kind: 'const';
200
+ /** Constant name (used in both TS and WGSL) */
201
+ readonly name: string;
202
+ /** Scalar type */
203
+ readonly type: T;
204
+ /** The value */
205
+ readonly value: number;
206
+ /** Generate WGSL const declaration */
207
+ toWGSL(): string;
208
+ }
209
+ /**
210
+ * Define a shared constant available in both TypeScript and WGSL.
211
+ */
212
+ declare function constant<T extends TapezScalar>(name: string, type: T, value: number): TapezConst<T>;
213
+
214
+ declare class UniformBuffer {
215
+ readonly buffer: GPUBuffer;
216
+ readonly scratch: ArrayBuffer;
217
+ readonly u32: Uint32Array;
218
+ readonly i32: Int32Array;
219
+ readonly f32: Float32Array;
220
+ readonly byteSize: number;
221
+ constructor(device: GPUDevice, label: string, byteSize: number, usage?: GPUBufferUsageFlags);
222
+ write(queue: GPUQueue, offsetBytes?: number): void;
223
+ destroy(): void;
224
+ }
225
+ /**
226
+ * UniformBuffer with dirty tracking for conditional GPU uploads.
227
+ * Use set* methods to write values - they only mark dirty if value changed.
228
+ * Call writeIfDirty(queue) once per frame to upload if any values changed.
229
+ *
230
+ * Eliminates boilerplate "cache field + comparison + write" patterns in entities.
231
+ */
232
+ declare class DirtyUniformBuffer extends UniformBuffer {
233
+ private _dirty;
234
+ /** Set a u32 value at index, marks dirty only if value changed */
235
+ setU32(i: number, v: number): void;
236
+ /** Set an i32 value at index, marks dirty only if value changed */
237
+ setI32(i: number, v: number): void;
238
+ /** Set an f32 value at index, marks dirty only if value changed */
239
+ setF32(i: number, v: number): void;
240
+ /** Force dirty state (use when external factors require re-upload) */
241
+ markDirty(): void;
242
+ /** Returns true if any values have changed since last write */
243
+ get isDirty(): boolean;
244
+ /** Upload to GPU only if dirty, then clear dirty flag */
245
+ writeIfDirty(queue: GPUQueue, offsetBytes?: number): void;
246
+ }
247
+
248
+ /**
249
+ * TypedBuffer — GPU buffer backed by a tapez type.
250
+ *
251
+ * Accepts any TapezType: scalars, vectors, arrays, structs.
252
+ * For structs, provides named field setters/getters with dirty tracking.
253
+ * For all types, provides the raw GPUBuffer, typed array views, and lifecycle.
254
+ *
255
+ * Usage:
256
+ * // Struct — named setters
257
+ * const config = TypedBuffer.createUniform(device, MyStruct, 'config')
258
+ * config.set.midPrice(1.5)
259
+ * config.writeIfDirty(queue)
260
+ *
261
+ * // Array — raw typed array access
262
+ * const rows = TypedBuffer.createStorage(device, tapez.arrayOf(tapez.f32, 4096), 'rows')
263
+ * rows.raw.f32.set(myData)
264
+ * rows.write(queue)
265
+ *
266
+ * // Indirect draw
267
+ * const indirect = TypedBuffer.createIndirect(device, IndirectDraw, 'indirect')
268
+ */
269
+
270
+ /** Maps a TapezType to its TypeScript setter value type */
271
+ type SetterValue<T extends TapezType> = T extends TapezScalar | TapezAtomic ? number : T extends TapezVector ? number[] | Float32Array | Uint32Array | Int32Array : number[] | Float32Array;
272
+ /** Setter functions keyed by field name */
273
+ type Setters<F extends Record<string, TapezType>> = {
274
+ readonly [K in keyof F]: (value: SetterValue<F[K]>) => void;
275
+ };
276
+ /** Getter functions keyed by field name */
277
+ type Getters<F extends Record<string, TapezType>> = {
278
+ readonly [K in keyof F]: () => SetterValue<F[K]>;
279
+ };
280
+ /** Extract the fields type from a TapezStruct, or never */
281
+ type FieldsOf<T extends TapezType> = T extends TapezStruct<infer F> ? F : never;
282
+ interface TypedBufferBase {
283
+ readonly buffer: GPUBuffer;
284
+ readonly byteSize: number;
285
+ readonly isDirty: boolean;
286
+ markDirty(): void;
287
+ writeIfDirty(queue: GPUQueue): void;
288
+ write(queue: GPUQueue): void;
289
+ writeRaw(queue: GPUQueue, data: BufferSource | SharedArrayBuffer, bufferOffset?: number, dataOffset?: number, size?: number): void;
290
+ copyTo(encoder: GPUCommandEncoder, dest: TypedBufferBase, srcOffset?: number, dstOffset?: number, size?: number): void;
291
+ copyFrom(encoder: GPUCommandEncoder, src: TypedBufferBase, srcOffset?: number, dstOffset?: number, size?: number): void;
292
+ drawIndirect(pass: GPURenderPassEncoder, offset?: number): void;
293
+ dispatchIndirect(pass: GPUComputePassEncoder, offset?: number): void;
294
+ mapRead(): Promise<ArrayBuffer>;
295
+ unmap(): void;
296
+ destroy(): void;
297
+ }
298
+ declare class TypedBuffer<T extends TapezType = TapezType> implements TypedBufferBase {
299
+ /** The underlying DirtyUniformBuffer (provides typed array views: .f32, .u32, .i32) */
300
+ readonly raw: DirtyUniformBuffer;
301
+ /** The tapez type this buffer was created from */
302
+ readonly type: T;
303
+ /**
304
+ * Named field setters. Only available for struct types.
305
+ * For non-struct buffers this is an empty object.
306
+ */
307
+ readonly set: T extends TapezStruct<infer F> ? Setters<F> : Record<string, never>;
308
+ /**
309
+ * Named field getters. Only available for struct types.
310
+ * For non-struct buffers this is an empty object.
311
+ */
312
+ readonly get: T extends TapezStruct<infer F> ? Getters<F> : Record<string, never>;
313
+ private constructor();
314
+ /** The raw GPUBuffer — for texture/sampler bind group entries only */
315
+ get buffer(): GPUBuffer;
316
+ /** Total byte size of the buffer */
317
+ get byteSize(): number;
318
+ /** Whether any values have changed since last write */
319
+ get isDirty(): boolean;
320
+ /** Force dirty state (for external invalidation) */
321
+ markDirty(): void;
322
+ /** Upload to GPU only if dirty, then clear dirty flag */
323
+ writeIfDirty(queue: GPUQueue): void;
324
+ /** Upload to GPU unconditionally */
325
+ write(queue: GPUQueue): void;
326
+ /**
327
+ * Bulk set multiple struct fields at once.
328
+ * Only available for struct-typed buffers.
329
+ */
330
+ writeFields(values: Partial<{
331
+ [K in keyof FieldsOf<T>]: SetterValue<FieldsOf<T>[K]>;
332
+ }>): void;
333
+ /** Destroy the underlying GPU buffer */
334
+ destroy(): void;
335
+ /** Write raw data to this buffer via queue.writeBuffer */
336
+ writeRaw(queue: GPUQueue, data: BufferSource | SharedArrayBuffer, bufferOffset?: number, dataOffset?: number, size?: number): void;
337
+ /** Copy data from this buffer to another TypedBuffer */
338
+ copyTo(encoder: GPUCommandEncoder, dest: TypedBuffer, srcOffset?: number, dstOffset?: number, size?: number): void;
339
+ /** Copy data from another TypedBuffer into this buffer */
340
+ copyFrom(encoder: GPUCommandEncoder, src: TypedBuffer, srcOffset?: number, dstOffset?: number, size?: number): void;
341
+ /** Use this buffer for drawIndirect */
342
+ drawIndirect(pass: GPURenderPassEncoder, offset?: number): void;
343
+ /** Use this buffer for dispatchWorkgroupsIndirect */
344
+ dispatchIndirect(pass: GPUComputePassEncoder, offset?: number): void;
345
+ /** Map buffer for reading (for readback buffers). Returns the mapped ArrayBuffer. */
346
+ mapRead(): Promise<ArrayBuffer>;
347
+ /** Unmap a previously mapped buffer */
348
+ unmap(): void;
349
+ /** Create a buffer with explicit usage flags. Accepts any TapezType. */
350
+ static create<T extends TapezType>(device: GPUDevice, type: T, label: string, usage: GPUBufferUsageFlags): TypedBuffer<T>;
351
+ /** Create a uniform buffer (UNIFORM | STORAGE | COPY_DST) */
352
+ static createUniform<T extends TapezType>(device: GPUDevice, type: T, label: string): TypedBuffer<T>;
353
+ /** Create a storage buffer (STORAGE | COPY_DST). Pass extraFlags for COPY_SRC etc. */
354
+ static createStorage<T extends TapezType>(device: GPUDevice, type: T, label: string, extraFlags?: GPUBufferUsageFlags): TypedBuffer<T>;
355
+ /** Create an indirect draw/dispatch buffer (INDIRECT | STORAGE | COPY_DST) */
356
+ static createIndirect<T extends TapezType>(device: GPUDevice, type: T, label: string): TypedBuffer<T>;
357
+ /** Create a readback buffer (MAP_READ | COPY_DST). For GPU→CPU data transfer. */
358
+ static createReadback<T extends TapezType>(device: GPUDevice, type: T, label: string): TypedBuffer<T>;
359
+ }
360
+
361
+ /**
362
+ * Bind group layout/entry helpers for TypedBuffer.
363
+ *
364
+ * Reduces boilerplate when creating bind group layouts and bind groups
365
+ * from typed buffers.
366
+ *
367
+ * Usage:
368
+ * const layout = device.createBindGroupLayout({
369
+ * entries: [
370
+ * uniformEntry(0, GPUShaderStage.COMPUTE),
371
+ * storageEntry(1, GPUShaderStage.COMPUTE, 'read-only-storage'),
372
+ * ]
373
+ * })
374
+ *
375
+ * const bindGroup = device.createBindGroup({
376
+ * layout,
377
+ * entries: [
378
+ * bufferEntry(0, configBuf),
379
+ * bufferEntry(1, stateBuf),
380
+ * ]
381
+ * })
382
+ */
383
+
384
+ /**
385
+ * Create a bind group layout entry for a uniform buffer.
386
+ */
387
+ declare function uniformEntry(binding: number, visibility: GPUShaderStageFlags): GPUBindGroupLayoutEntry;
388
+ /**
389
+ * Create a bind group layout entry for a storage buffer.
390
+ */
391
+ declare function storageEntry(binding: number, visibility: GPUShaderStageFlags, type?: 'storage' | 'read-only-storage'): GPUBindGroupLayoutEntry;
392
+ /**
393
+ * Create a bind group entry from a TypedBuffer or raw GPUBuffer.
12
394
  */
13
- export { f32, u32, i32, atomic } from './types';
14
- export type { TapezType, TapezScalar, TapezAtomic } from './types';
15
- export { vec2f, vec3f, vec4f, vec2u, vec3u, vec4u, vec2i, vec3i, vec4i } from './vectors';
16
- export type { TapezVector } from './vectors';
17
- export { mat2x2f, mat3x3f, mat4x4f } from './matrix';
18
- export type { TapezMatrix } from './matrix';
19
- export { struct } from './struct';
20
- export type { TapezStruct } from './struct';
21
- export { arrayOf } from './array';
22
- export type { TapezArray } from './array';
23
- export { constant as const } from './const';
24
- export type { TapezConst } from './const';
25
- export { TypedBuffer, type TypedBufferBase } from './typed-buffer';
26
- export { uniformEntry, storageEntry, bufferEntry } from './bind-helpers';
27
- export { roundUp, computeStructLayout } from './layout';
28
- export type { FieldLayout, StructLayout } from './layout';
29
- //# sourceMappingURL=index.d.ts.map
395
+ declare function bufferEntry(binding: number, buf: TypedBufferBase | GPUBuffer): GPUBindGroupEntry;
396
+
397
+ export { type FieldLayout, type StructLayout, type TapezArray, type TapezAtomic, type TapezConst, type TapezMatrix, type TapezScalar, type TapezStruct, type TapezType, type TapezVector, TypedBuffer, type TypedBufferBase, arrayOf, atomic, bufferEntry, computeStructLayout, constant as const, f32, i32, mat2x2f, mat3x3f, mat4x4f, roundUp, storageEntry, struct, u32, uniformEntry, vec2f, vec2i, vec2u, vec3f, vec3i, vec3u, vec4f, vec4i, vec4u };