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

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/dist/array.d.ts +26 -0
  2. package/dist/array.d.ts.map +1 -0
  3. package/dist/array.js +30 -0
  4. package/dist/array.js.map +1 -0
  5. package/dist/bind-helpers.d.ts +36 -0
  6. package/dist/bind-helpers.d.ts.map +1 -0
  7. package/dist/bind-helpers.js +44 -0
  8. package/dist/bind-helpers.js.map +1 -0
  9. package/dist/const.d.ts +26 -0
  10. package/dist/const.d.ts.map +1 -0
  11. package/dist/const.js +43 -0
  12. package/dist/const.js.map +1 -0
  13. package/dist/gpu-buffer-utils.d.ts +40 -0
  14. package/dist/gpu-buffer-utils.d.ts.map +1 -0
  15. package/dist/gpu-buffer-utils.js +105 -0
  16. package/dist/gpu-buffer-utils.js.map +1 -0
  17. package/dist/index.d.ts +29 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +31 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/layout.d.ts +36 -0
  22. package/dist/layout.d.ts.map +1 -0
  23. package/dist/layout.js +39 -0
  24. package/dist/layout.js.map +1 -0
  25. package/dist/matrix.d.ts +20 -0
  26. package/dist/matrix.d.ts.map +1 -0
  27. package/dist/matrix.js +25 -0
  28. package/dist/matrix.js.map +1 -0
  29. package/dist/schemas.d.ts +61 -0
  30. package/dist/schemas.d.ts.map +1 -0
  31. package/dist/schemas.js +85 -0
  32. package/dist/schemas.js.map +1 -0
  33. package/dist/struct.d.ts +47 -0
  34. package/dist/struct.d.ts.map +1 -0
  35. package/dist/struct.js +81 -0
  36. package/dist/struct.js.map +1 -0
  37. package/dist/typed-buffer.d.ts +117 -0
  38. package/dist/typed-buffer.d.ts.map +1 -0
  39. package/dist/typed-buffer.js +273 -0
  40. package/dist/typed-buffer.js.map +1 -0
  41. package/dist/types.d.ts +33 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +23 -0
  44. package/dist/types.js.map +1 -0
  45. package/dist/vectors.d.ts +26 -0
  46. package/dist/vectors.d.ts.map +1 -0
  47. package/dist/vectors.js +44 -0
  48. package/dist/vectors.js.map +1 -0
  49. package/package.json +26 -3
  50. package/README.md +0 -3
@@ -0,0 +1,26 @@
1
+ /**
2
+ * TapeZ array type — fixed-size GPU arrays.
3
+ *
4
+ * WGSL array layout:
5
+ * Element stride = roundUp(alignment, sizeof(element))
6
+ * Array size = count * stride
7
+ * Array alignment = element alignment
8
+ */
9
+ import type { TapezType } from './types';
10
+ export interface TapezArray extends TapezType {
11
+ readonly kind: 'array';
12
+ /** Element type */
13
+ readonly elementType: TapezType;
14
+ /** Number of elements */
15
+ readonly count: number;
16
+ /** Byte stride between consecutive elements (includes padding) */
17
+ readonly stride: number;
18
+ }
19
+ /**
20
+ * Define a fixed-size GPU array.
21
+ *
22
+ * Element stride follows WGSL array layout rules:
23
+ * stride = roundUp(element.alignment, element.byteSize)
24
+ */
25
+ export declare function arrayOf(elementType: TapezType, count: number): TapezArray;
26
+ //# sourceMappingURL=array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../src/array.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAOxC,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,mBAAmB;IACnB,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAA;IAC/B,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAczE"}
package/dist/array.js ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * TapeZ array type — fixed-size GPU arrays.
3
+ *
4
+ * WGSL array layout:
5
+ * Element stride = roundUp(alignment, sizeof(element))
6
+ * Array size = count * stride
7
+ * Array alignment = element alignment
8
+ */
9
+ import { roundUp } from './layout';
10
+ /**
11
+ * Define a fixed-size GPU array.
12
+ *
13
+ * Element stride follows WGSL array layout rules:
14
+ * stride = roundUp(element.alignment, element.byteSize)
15
+ */
16
+ export function arrayOf(elementType, count) {
17
+ const stride = roundUp(elementType.alignment, elementType.byteSize);
18
+ const byteSize = count * stride;
19
+ const alignment = elementType.alignment;
20
+ return Object.freeze({
21
+ kind: 'array',
22
+ wgslType: `array<${elementType.wgslType}, ${count}>`,
23
+ byteSize,
24
+ alignment,
25
+ elementType,
26
+ count,
27
+ stride
28
+ });
29
+ }
30
+ //# sourceMappingURL=array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array.js","sourceRoot":"","sources":["../src/array.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAgBlC;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,WAAsB,EAAE,KAAa;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;IACnE,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;IAC/B,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAA;IAEvC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,SAAS,WAAW,CAAC,QAAQ,KAAK,KAAK,GAAG;QACpD,QAAQ;QACR,SAAS;QACT,WAAW;QACX,KAAK;QACL,MAAM;KACP,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Bind group layout/entry helpers for TypedBuffer.
3
+ *
4
+ * Reduces boilerplate when creating bind group layouts and bind groups
5
+ * from typed buffers.
6
+ *
7
+ * Usage:
8
+ * const layout = device.createBindGroupLayout({
9
+ * entries: [
10
+ * uniformEntry(0, GPUShaderStage.COMPUTE),
11
+ * storageEntry(1, GPUShaderStage.COMPUTE, 'read-only-storage'),
12
+ * ]
13
+ * })
14
+ *
15
+ * const bindGroup = device.createBindGroup({
16
+ * layout,
17
+ * entries: [
18
+ * bufferEntry(0, configBuf),
19
+ * bufferEntry(1, stateBuf),
20
+ * ]
21
+ * })
22
+ */
23
+ import type { TypedBufferBase } from './typed-buffer';
24
+ /**
25
+ * Create a bind group layout entry for a uniform buffer.
26
+ */
27
+ export declare function uniformEntry(binding: number, visibility: GPUShaderStageFlags): GPUBindGroupLayoutEntry;
28
+ /**
29
+ * Create a bind group layout entry for a storage buffer.
30
+ */
31
+ export declare function storageEntry(binding: number, visibility: GPUShaderStageFlags, type?: 'storage' | 'read-only-storage'): GPUBindGroupLayoutEntry;
32
+ /**
33
+ * Create a bind group entry from a TypedBuffer or raw GPUBuffer.
34
+ */
35
+ export declare function bufferEntry(binding: number, buf: TypedBufferBase | GPUBuffer): GPUBindGroupEntry;
36
+ //# sourceMappingURL=bind-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bind-helpers.d.ts","sourceRoot":"","sources":["../src/bind-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,mBAAmB,GAC9B,uBAAuB,CAEzB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,mBAAmB,EAC/B,IAAI,GAAE,SAAS,GAAG,mBAA+B,GAChD,uBAAuB,CAEzB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,SAAS,GAAG,iBAAiB,CAKhG"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Bind group layout/entry helpers for TypedBuffer.
3
+ *
4
+ * Reduces boilerplate when creating bind group layouts and bind groups
5
+ * from typed buffers.
6
+ *
7
+ * Usage:
8
+ * const layout = device.createBindGroupLayout({
9
+ * entries: [
10
+ * uniformEntry(0, GPUShaderStage.COMPUTE),
11
+ * storageEntry(1, GPUShaderStage.COMPUTE, 'read-only-storage'),
12
+ * ]
13
+ * })
14
+ *
15
+ * const bindGroup = device.createBindGroup({
16
+ * layout,
17
+ * entries: [
18
+ * bufferEntry(0, configBuf),
19
+ * bufferEntry(1, stateBuf),
20
+ * ]
21
+ * })
22
+ */
23
+ /**
24
+ * Create a bind group layout entry for a uniform buffer.
25
+ */
26
+ export function uniformEntry(binding, visibility) {
27
+ return { binding, visibility, buffer: { type: 'uniform' } };
28
+ }
29
+ /**
30
+ * Create a bind group layout entry for a storage buffer.
31
+ */
32
+ export function storageEntry(binding, visibility, type = 'storage') {
33
+ return { binding, visibility, buffer: { type } };
34
+ }
35
+ /**
36
+ * Create a bind group entry from a TypedBuffer or raw GPUBuffer.
37
+ */
38
+ export function bufferEntry(binding, buf) {
39
+ const gpuBuffer = 'buffer' in buf && typeof buf.byteSize === 'number'
40
+ ? buf.buffer
41
+ : buf;
42
+ return { binding, resource: { buffer: gpuBuffer } };
43
+ }
44
+ //# sourceMappingURL=bind-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bind-helpers.js","sourceRoot":"","sources":["../src/bind-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,UAA+B;IAE/B,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAA;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,UAA+B,EAC/B,OAAwC,SAAS;IAEjD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAA;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,GAAgC;IAC3E,MAAM,SAAS,GAAG,QAAQ,IAAI,GAAG,IAAI,OAAQ,GAAuB,CAAC,QAAQ,KAAK,QAAQ;QACxF,CAAC,CAAE,GAAuB,CAAC,MAAM;QACjC,CAAC,CAAC,GAAgB,CAAA;IACpB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAA;AACrD,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * TapeZ constants — shared between TypeScript and WGSL.
3
+ *
4
+ * Usage:
5
+ * const MAX_ROWS = tapez.const('MAX_ROWS', tapez.u32, 4096)
6
+ *
7
+ * MAX_ROWS.value // 4096 (use in TypeScript)
8
+ * MAX_ROWS.toWGSL() // 'const MAX_ROWS: u32 = 4096u;' (injected into WGSL)
9
+ */
10
+ import type { TapezScalar } from './types';
11
+ export interface TapezConst<T extends TapezScalar = TapezScalar> {
12
+ readonly kind: 'const';
13
+ /** Constant name (used in both TS and WGSL) */
14
+ readonly name: string;
15
+ /** Scalar type */
16
+ readonly type: T;
17
+ /** The value */
18
+ readonly value: number;
19
+ /** Generate WGSL const declaration */
20
+ toWGSL(): string;
21
+ }
22
+ /**
23
+ * Define a shared constant available in both TypeScript and WGSL.
24
+ */
25
+ export declare function constant<T extends TapezScalar>(name: string, type: T, value: number): TapezConst<T>;
26
+ //# sourceMappingURL=const.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../src/const.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAM1C,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IAC7D,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,kBAAkB;IAClB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,gBAAgB;IAChB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,sCAAsC;IACtC,MAAM,IAAI,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,WAAW,EAC5C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,MAAM,GACZ,UAAU,CAAC,CAAC,CAAC,CAUf"}
package/dist/const.js ADDED
@@ -0,0 +1,43 @@
1
+ /**
2
+ * TapeZ constants — shared between TypeScript and WGSL.
3
+ *
4
+ * Usage:
5
+ * const MAX_ROWS = tapez.const('MAX_ROWS', tapez.u32, 4096)
6
+ *
7
+ * MAX_ROWS.value // 4096 (use in TypeScript)
8
+ * MAX_ROWS.toWGSL() // 'const MAX_ROWS: u32 = 4096u;' (injected into WGSL)
9
+ */
10
+ /**
11
+ * Define a shared constant available in both TypeScript and WGSL.
12
+ */
13
+ export function constant(name, type, value) {
14
+ return Object.freeze({
15
+ kind: 'const',
16
+ name,
17
+ type,
18
+ value,
19
+ toWGSL() {
20
+ return constToWGSL(name, type, value);
21
+ }
22
+ });
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // WGSL emission
26
+ // ---------------------------------------------------------------------------
27
+ function constToWGSL(name, type, value) {
28
+ let literal;
29
+ switch (type.arrayKind) {
30
+ case 'f32':
31
+ // Ensure float literal has a decimal point
32
+ literal = Number.isInteger(value) ? `${value}.0` : `${value}`;
33
+ break;
34
+ case 'u32':
35
+ literal = `${value >>> 0}u`;
36
+ break;
37
+ case 'i32':
38
+ literal = `${value | 0}i`;
39
+ break;
40
+ }
41
+ return `const ${name}: ${type.wgslType} = ${literal};`;
42
+ }
43
+ //# sourceMappingURL=const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.js","sourceRoot":"","sources":["../src/const.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,IAAY,EACZ,IAAO,EACP,KAAa;IAEb,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,OAAO;QACb,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,MAAM;YACJ,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QACvC,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,SAAS,WAAW,CAAC,IAAY,EAAE,IAAiB,EAAE,KAAa;IACjE,IAAI,OAAe,CAAA;IACnB,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,KAAK,KAAK;YACR,2CAA2C;YAC3C,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAA;YAC7D,MAAK;QACP,KAAK,KAAK;YACR,OAAO,GAAG,GAAG,KAAK,KAAK,CAAC,GAAG,CAAA;YAC3B,MAAK;QACP,KAAK,KAAK;YACR,OAAO,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,CAAA;YACzB,MAAK;IACT,CAAC;IACD,OAAO,SAAS,IAAI,KAAK,IAAI,CAAC,QAAQ,MAAM,OAAO,GAAG,CAAA;AACxD,CAAC"}
@@ -0,0 +1,40 @@
1
+ /** Static 16-byte ArrayBuffer containing [0, 0, 0, 0] for GPU buffer resets */
2
+ export declare const ZERO_U32_4_BUFFER: ArrayBuffer;
3
+ /** Static 16-byte ArrayBuffer containing [6, 0, 0, 0] for indirect draw buffer init */
4
+ export declare const INDIRECT_INIT_6_BUFFER: ArrayBuffer;
5
+ export declare function makeIndirectBuffer(device: GPUDevice, label: string, byteSize?: number): GPUBuffer;
6
+ export declare function makeStorageBuffer(device: GPUDevice, label: string, byteSize: number, extraUsageFlags?: GPUBufferUsageFlags): GPUBuffer;
7
+ export declare class UniformBuffer {
8
+ readonly buffer: GPUBuffer;
9
+ readonly scratch: ArrayBuffer;
10
+ readonly u32: Uint32Array;
11
+ readonly i32: Int32Array;
12
+ readonly f32: Float32Array;
13
+ readonly byteSize: number;
14
+ constructor(device: GPUDevice, label: string, byteSize: number, usage?: GPUBufferUsageFlags);
15
+ write(queue: GPUQueue, offsetBytes?: number): void;
16
+ destroy(): void;
17
+ }
18
+ /**
19
+ * UniformBuffer with dirty tracking for conditional GPU uploads.
20
+ * Use set* methods to write values - they only mark dirty if value changed.
21
+ * Call writeIfDirty(queue) once per frame to upload if any values changed.
22
+ *
23
+ * Eliminates boilerplate "cache field + comparison + write" patterns in entities.
24
+ */
25
+ export declare class DirtyUniformBuffer extends UniformBuffer {
26
+ private _dirty;
27
+ /** Set a u32 value at index, marks dirty only if value changed */
28
+ setU32(i: number, v: number): void;
29
+ /** Set an i32 value at index, marks dirty only if value changed */
30
+ setI32(i: number, v: number): void;
31
+ /** Set an f32 value at index, marks dirty only if value changed */
32
+ setF32(i: number, v: number): void;
33
+ /** Force dirty state (use when external factors require re-upload) */
34
+ markDirty(): void;
35
+ /** Returns true if any values have changed since last write */
36
+ get isDirty(): boolean;
37
+ /** Upload to GPU only if dirty, then clear dirty flag */
38
+ writeIfDirty(queue: GPUQueue, offsetBytes?: number): void;
39
+ }
40
+ //# sourceMappingURL=gpu-buffer-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu-buffer-utils.d.ts","sourceRoot":"","sources":["../src/gpu-buffer-utils.ts"],"names":[],"mappings":"AAMA,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,aAAsB,CAAA;AAEpD,uFAAuF;AACvF,eAAO,MAAM,sBAAsB,aAAsB,CAAA;AAOzD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,SAAoC,GAC3C,SAAS,CAMX;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,eAAe,GAAE,mBAAuB,GACvC,SAAS,CAMX;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;IACzB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;gBAEb,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,mBAAmB;IAqB3F,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,SAAI,GAAG,IAAI;IAI7C,OAAO,IAAI,IAAI;CAGhB;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,aAAa;IACnD,OAAO,CAAC,MAAM,CAAO;IAErB,kEAAkE;IAClE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAOlC,mEAAmE;IACnE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAOlC,mEAAmE;IACnE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAOlC,sEAAsE;IACtE,SAAS,IAAI,IAAI;IAIjB,+DAA+D;IAC/D,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,yDAAyD;IACzD,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,SAAI,GAAG,IAAI;CAKrD"}
@@ -0,0 +1,105 @@
1
+ const DEFAULT_INDIRECT_BUFFER_BYTE_SIZE = 16;
2
+ // ============================================================================
3
+ // Static Reset Constants (zero-allocation hot path resets)
4
+ // ============================================================================
5
+ /** Static 16-byte ArrayBuffer containing [0, 0, 0, 0] for GPU buffer resets */
6
+ export const ZERO_U32_4_BUFFER = new ArrayBuffer(16); // ArrayBuffer is zero-initialized by spec
7
+ /** Static 16-byte ArrayBuffer containing [6, 0, 0, 0] for indirect draw buffer init */
8
+ export const INDIRECT_INIT_6_BUFFER = new ArrayBuffer(16);
9
+ new Uint32Array(INDIRECT_INIT_6_BUFFER).set([6, 0, 0, 0]);
10
+ // ============================================================================
11
+ // Buffer Factory Functions
12
+ // ============================================================================
13
+ export function makeIndirectBuffer(device, label, byteSize = DEFAULT_INDIRECT_BUFFER_BYTE_SIZE) {
14
+ return device.createBuffer({
15
+ label,
16
+ size: byteSize,
17
+ usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
18
+ });
19
+ }
20
+ export function makeStorageBuffer(device, label, byteSize, extraUsageFlags = 0) {
21
+ return device.createBuffer({
22
+ label,
23
+ size: byteSize,
24
+ usage: GPUBufferUsage.STORAGE | extraUsageFlags
25
+ });
26
+ }
27
+ export class UniformBuffer {
28
+ buffer;
29
+ scratch;
30
+ u32;
31
+ i32;
32
+ f32;
33
+ byteSize;
34
+ constructor(device, label, byteSize, usage) {
35
+ if (byteSize <= 0) {
36
+ throw new Error(`UniformBuffer size must be positive, got ${byteSize}`);
37
+ }
38
+ if (byteSize % 4 !== 0) {
39
+ throw new Error(`UniformBuffer size must be 4-byte aligned, got ${byteSize}`);
40
+ }
41
+ this.byteSize = byteSize;
42
+ this.buffer = device.createBuffer({
43
+ label,
44
+ size: byteSize,
45
+ usage: usage ?? (GPUBufferUsage.UNIFORM | GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST)
46
+ });
47
+ this.scratch = new ArrayBuffer(byteSize);
48
+ this.u32 = new Uint32Array(this.scratch);
49
+ this.i32 = new Int32Array(this.scratch);
50
+ this.f32 = new Float32Array(this.scratch);
51
+ }
52
+ write(queue, offsetBytes = 0) {
53
+ queue.writeBuffer(this.buffer, offsetBytes, this.scratch);
54
+ }
55
+ destroy() {
56
+ this.buffer.destroy();
57
+ }
58
+ }
59
+ /**
60
+ * UniformBuffer with dirty tracking for conditional GPU uploads.
61
+ * Use set* methods to write values - they only mark dirty if value changed.
62
+ * Call writeIfDirty(queue) once per frame to upload if any values changed.
63
+ *
64
+ * Eliminates boilerplate "cache field + comparison + write" patterns in entities.
65
+ */
66
+ export class DirtyUniformBuffer extends UniformBuffer {
67
+ _dirty = true;
68
+ /** Set a u32 value at index, marks dirty only if value changed */
69
+ setU32(i, v) {
70
+ if (this.u32[i] !== v) {
71
+ this.u32[i] = v;
72
+ this._dirty = true;
73
+ }
74
+ }
75
+ /** Set an i32 value at index, marks dirty only if value changed */
76
+ setI32(i, v) {
77
+ if (this.i32[i] !== v) {
78
+ this.i32[i] = v;
79
+ this._dirty = true;
80
+ }
81
+ }
82
+ /** Set an f32 value at index, marks dirty only if value changed */
83
+ setF32(i, v) {
84
+ if (this.f32[i] !== v) {
85
+ this.f32[i] = v;
86
+ this._dirty = true;
87
+ }
88
+ }
89
+ /** Force dirty state (use when external factors require re-upload) */
90
+ markDirty() {
91
+ this._dirty = true;
92
+ }
93
+ /** Returns true if any values have changed since last write */
94
+ get isDirty() {
95
+ return this._dirty;
96
+ }
97
+ /** Upload to GPU only if dirty, then clear dirty flag */
98
+ writeIfDirty(queue, offsetBytes = 0) {
99
+ if (!this._dirty)
100
+ return;
101
+ this.write(queue, offsetBytes);
102
+ this._dirty = false;
103
+ }
104
+ }
105
+ //# sourceMappingURL=gpu-buffer-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu-buffer-utils.js","sourceRoot":"","sources":["../src/gpu-buffer-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @tapez/core — Typed GPU schema system for WebGPU.
3
+ *
4
+ * Usage:
5
+ * import * as tapez from '@tapez/core'
6
+ *
7
+ * const MyConfig = tapez.struct('MyConfig', {
8
+ * midPrice: tapez.f32,
9
+ * decimals: tapez.u32,
10
+ * color: tapez.vec4f,
11
+ * })
12
+ */
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAC/C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAGlE,OAAO,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACN,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAG5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAG3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAG3C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAGzC,OAAO,EAAE,QAAQ,IAAI,KAAK,EAAE,MAAM,SAAS,CAAA;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAGzC,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGlE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAGxE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACvD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @tapez/core — Typed GPU schema system for WebGPU.
3
+ *
4
+ * Usage:
5
+ * import * as tapez from '@tapez/core'
6
+ *
7
+ * const MyConfig = tapez.struct('MyConfig', {
8
+ * midPrice: tapez.f32,
9
+ * decimals: tapez.u32,
10
+ * color: tapez.vec4f,
11
+ * })
12
+ */
13
+ // Scalars
14
+ export { f32, u32, i32, atomic } from './types';
15
+ // Vectors
16
+ export { vec2f, vec3f, vec4f, vec2u, vec3u, vec4u, vec2i, vec3i, vec4i } from './vectors';
17
+ // Matrices
18
+ export { mat2x2f, mat3x3f, mat4x4f } from './matrix';
19
+ // Structs
20
+ export { struct } from './struct';
21
+ // Arrays
22
+ export { arrayOf } from './array';
23
+ // Constants
24
+ export { constant as const } from './const';
25
+ // Typed buffer
26
+ export { TypedBuffer } from './typed-buffer';
27
+ // Bind group helpers
28
+ export { uniformEntry, storageEntry, bufferEntry } from './bind-helpers';
29
+ // Layout utilities (for advanced use)
30
+ export { roundUp, computeStructLayout } from './layout';
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,UAAU;AACV,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAG/C,UAAU;AACV,OAAO,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACN,MAAM,WAAW,CAAA;AAGlB,WAAW;AACX,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAGpD,UAAU;AACV,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAGjC,SAAS;AACT,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGjC,YAAY;AACZ,OAAO,EAAE,QAAQ,IAAI,KAAK,EAAE,MAAM,SAAS,CAAA;AAG3C,eAAe;AACf,OAAO,EAAE,WAAW,EAAwB,MAAM,gBAAgB,CAAA;AAElE,qBAAqB;AACrB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAExE,sCAAsC;AACtC,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * WGSL struct layout computation — alignment, padding, field offsets.
3
+ *
4
+ * Implements the WGSL spec's struct layout algorithm:
5
+ * https://www.w3.org/TR/WGSL/#structure-member-layout
6
+ */
7
+ import type { TapezType } from './types';
8
+ /** Round `offset` up to the next multiple of `alignment`. */
9
+ export declare function roundUp(alignment: number, offset: number): number;
10
+ export interface FieldLayout {
11
+ /** Field name */
12
+ readonly name: string;
13
+ /** Field type */
14
+ readonly type: TapezType;
15
+ /** Byte offset from struct start */
16
+ readonly offset: number;
17
+ }
18
+ export interface StructLayout {
19
+ /** Ordered field layouts */
20
+ readonly fields: readonly FieldLayout[];
21
+ /** Total byte size (padded to struct alignment) */
22
+ readonly byteSize: number;
23
+ /** Struct alignment = max(field alignments) */
24
+ readonly alignment: number;
25
+ /** Map from field name to byte offset */
26
+ readonly offsets: Record<string, number>;
27
+ }
28
+ /**
29
+ * Compute the byte layout of a struct given its fields in order.
30
+ * Follows WGSL struct member layout rules.
31
+ */
32
+ export declare function computeStructLayout(fields: readonly {
33
+ name: string;
34
+ type: TapezType;
35
+ }[]): StructLayout;
36
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAMxC,6DAA6D;AAC7D,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjE;AAMD,MAAM,WAAW,WAAW;IAC1B,iBAAiB;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,iBAAiB;IACjB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAA;IACvC,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACzC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,EAAE,GACnD,YAAY,CAyBd"}
package/dist/layout.js ADDED
@@ -0,0 +1,39 @@
1
+ /**
2
+ * WGSL struct layout computation — alignment, padding, field offsets.
3
+ *
4
+ * Implements the WGSL spec's struct layout algorithm:
5
+ * https://www.w3.org/TR/WGSL/#structure-member-layout
6
+ */
7
+ // ---------------------------------------------------------------------------
8
+ // Layout helpers
9
+ // ---------------------------------------------------------------------------
10
+ /** Round `offset` up to the next multiple of `alignment`. */
11
+ export function roundUp(alignment, offset) {
12
+ return Math.ceil(offset / alignment) * alignment;
13
+ }
14
+ /**
15
+ * Compute the byte layout of a struct given its fields in order.
16
+ * Follows WGSL struct member layout rules.
17
+ */
18
+ export function computeStructLayout(fields) {
19
+ const layouts = [];
20
+ const offsets = {};
21
+ let offset = 0;
22
+ let maxAlignment = 1;
23
+ for (const { name, type } of fields) {
24
+ // Align the field
25
+ offset = roundUp(type.alignment, offset);
26
+ layouts.push({ name, type, offset });
27
+ offsets[name] = offset;
28
+ // Advance past this field
29
+ offset += type.byteSize;
30
+ // Track max alignment for struct alignment
31
+ if (type.alignment > maxAlignment) {
32
+ maxAlignment = type.alignment;
33
+ }
34
+ }
35
+ // Struct size is rounded up to struct alignment
36
+ const byteSize = roundUp(maxAlignment, offset);
37
+ return { fields: layouts, byteSize, alignment: maxAlignment, offsets };
38
+ }
39
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,6DAA6D;AAC7D,MAAM,UAAU,OAAO,CAAC,SAAiB,EAAE,MAAc;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAA;AAClD,CAAC;AA0BD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAoD;IAEpD,MAAM,OAAO,GAAkB,EAAE,CAAA;IACjC,MAAM,OAAO,GAA2B,EAAE,CAAA;IAC1C,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,YAAY,GAAG,CAAC,CAAA;IAEpB,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;QACpC,kBAAkB;QAClB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QACxC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QACpC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAA;QAEtB,0BAA0B;QAC1B,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAA;QAEvB,2CAA2C;QAC3C,IAAI,IAAI,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;YAClC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;IAE9C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAA;AACxE,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * TapeZ matrix types — mat2x2f, mat3x3f, mat4x4f.
3
+ *
4
+ * WGSL matrices are column-major arrays of column vectors.
5
+ * mat2x2<f32> → 2 columns of vec2<f32> → size 16, align 8
6
+ * mat3x3<f32> → 3 columns of vec3<f32> → size 48, align 16
7
+ * mat4x4<f32> → 4 columns of vec4<f32> → size 64, align 16
8
+ */
9
+ import type { TapezType } from './types';
10
+ export interface TapezMatrix extends TapezType {
11
+ readonly kind: 'matrix';
12
+ /** Number of columns */
13
+ readonly columns: number;
14
+ /** Number of rows */
15
+ readonly rows: number;
16
+ }
17
+ export declare const mat2x2f: TapezMatrix;
18
+ export declare const mat3x3f: TapezMatrix;
19
+ export declare const mat4x4f: TapezMatrix;
20
+ //# sourceMappingURL=matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAMxC,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,wBAAwB;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAcD,eAAO,MAAM,OAAO,EAAE,WAA8B,CAAA;AAGpD,eAAO,MAAM,OAAO,EAAE,WAA+B,CAAA;AAGrD,eAAO,MAAM,OAAO,EAAE,WAA+B,CAAA"}
package/dist/matrix.js ADDED
@@ -0,0 +1,25 @@
1
+ /**
2
+ * TapeZ matrix types — mat2x2f, mat3x3f, mat4x4f.
3
+ *
4
+ * WGSL matrices are column-major arrays of column vectors.
5
+ * mat2x2<f32> → 2 columns of vec2<f32> → size 16, align 8
6
+ * mat3x3<f32> → 3 columns of vec3<f32> → size 48, align 16
7
+ * mat4x4<f32> → 4 columns of vec4<f32> → size 64, align 16
8
+ */
9
+ function mat(cols, rows, byteSize, alignment) {
10
+ return Object.freeze({
11
+ kind: 'matrix',
12
+ wgslType: `mat${cols}x${rows}<f32>`,
13
+ byteSize,
14
+ alignment,
15
+ columns: cols,
16
+ rows: rows
17
+ });
18
+ }
19
+ // mat2x2f: 2 columns of vec2f (8 bytes each) = 16 bytes, align 8
20
+ export const mat2x2f = mat(2, 2, 16, 8);
21
+ // mat3x3f: 3 columns of vec3f (12 bytes each, padded to 16) = 48 bytes, align 16
22
+ export const mat3x3f = mat(3, 3, 48, 16);
23
+ // mat4x4f: 4 columns of vec4f (16 bytes each) = 64 bytes, align 16
24
+ export const mat4x4f = mat(4, 4, 64, 16);
25
+ //# sourceMappingURL=matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix.js","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgBH,SAAS,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,QAAgB,EAAE,SAAiB;IAC1E,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,MAAM,IAAI,IAAI,IAAI,OAAO;QACnC,QAAQ;QACR,SAAS;QACT,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,IAAI;KACX,CAAC,CAAA;AACJ,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,OAAO,GAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;AAEpD,iFAAiF;AACjF,MAAM,CAAC,MAAM,OAAO,GAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;AAErD,mEAAmE;AACnE,MAAM,CAAC,MAAM,OAAO,GAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA"}