typegpu 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. package/README.md +29 -0
  2. package/chunk-34O2K2PT.js +2 -0
  3. package/chunk-34O2K2PT.js.map +1 -0
  4. package/chunk-T3YCU4G4.cjs +2 -0
  5. package/chunk-T3YCU4G4.cjs.map +1 -0
  6. package/data/index.cjs +8 -0
  7. package/data/index.cjs.map +1 -0
  8. package/data/index.d.cts +109 -0
  9. package/data/index.d.ts +109 -0
  10. package/data/index.js +8 -0
  11. package/data/index.js.map +1 -0
  12. package/index.cjs +2 -0
  13. package/index.cjs.map +1 -0
  14. package/index.d.cts +72 -0
  15. package/index.d.ts +72 -0
  16. package/index.js +2 -0
  17. package/index.js.map +1 -0
  18. package/package.json +28 -37
  19. package/types-D2gslu2F.d.cts +202 -0
  20. package/types-D2gslu2F.d.ts +202 -0
  21. package/dist/chunk-5ZQTJALJ.cjs +0 -4
  22. package/dist/chunk-5ZQTJALJ.cjs.map +0 -1
  23. package/dist/chunk-AS7UPXZ3.cjs +0 -2
  24. package/dist/chunk-AS7UPXZ3.cjs.map +0 -1
  25. package/dist/chunk-G3U6RTMF.cjs +0 -2
  26. package/dist/chunk-G3U6RTMF.cjs.map +0 -1
  27. package/dist/chunk-JJZKRDXD.js +0 -4
  28. package/dist/chunk-JJZKRDXD.js.map +0 -1
  29. package/dist/chunk-KBVQVOLY.cjs +0 -2
  30. package/dist/chunk-KBVQVOLY.cjs.map +0 -1
  31. package/dist/chunk-OZ2XZ4ZA.js +0 -2
  32. package/dist/chunk-OZ2XZ4ZA.js.map +0 -1
  33. package/dist/chunk-TVPC7ZME.js +0 -2
  34. package/dist/chunk-TVPC7ZME.js.map +0 -1
  35. package/dist/chunk-XGSMOADT.js +0 -2
  36. package/dist/chunk-XGSMOADT.js.map +0 -1
  37. package/dist/data/index.cjs +0 -10
  38. package/dist/data/index.cjs.map +0 -1
  39. package/dist/data/index.d.cts +0 -84
  40. package/dist/data/index.d.ts +0 -84
  41. package/dist/data/index.js +0 -10
  42. package/dist/data/index.js.map +0 -1
  43. package/dist/index.cjs +0 -6
  44. package/dist/index.cjs.map +0 -1
  45. package/dist/index.d.cts +0 -145
  46. package/dist/index.d.ts +0 -145
  47. package/dist/index.js +0 -6
  48. package/dist/index.js.map +0 -1
  49. package/dist/macro/index.cjs +0 -8
  50. package/dist/macro/index.cjs.map +0 -1
  51. package/dist/macro/index.d.cts +0 -7
  52. package/dist/macro/index.d.ts +0 -7
  53. package/dist/macro/index.js +0 -8
  54. package/dist/macro/index.js.map +0 -1
  55. package/dist/struct-CFmatz6R.d.ts +0 -9
  56. package/dist/struct-CRg8uhjj.d.cts +0 -9
  57. package/dist/typegpuRuntime-BZwyf0k_.d.ts +0 -77
  58. package/dist/typegpuRuntime-Dg50sa5T.d.cts +0 -77
  59. package/dist/types-Dgp6OHLq.d.cts +0 -148
  60. package/dist/types-Dgp6OHLq.d.ts +0 -148
  61. package/dist/web/index.cjs +0 -23
  62. package/dist/web/index.cjs.map +0 -1
  63. package/dist/web/index.d.cts +0 -40
  64. package/dist/web/index.d.ts +0 -40
  65. package/dist/web/index.js +0 -23
  66. package/dist/web/index.js.map +0 -1
@@ -0,0 +1,202 @@
1
+ import { ISchema, Parsed } from 'typed-binary';
2
+
3
+ interface Swizzle2<T2> {
4
+ readonly xx: T2;
5
+ readonly xy: T2;
6
+ readonly yx: T2;
7
+ readonly yy: T2;
8
+ }
9
+ interface Swizzle3<T2, T3> extends Swizzle2<T2> {
10
+ }
11
+ interface Swizzle4<T2, T3, T4> extends Swizzle3<T2, T3> {
12
+ }
13
+ interface vec2 {
14
+ x: number;
15
+ y: number;
16
+ [Symbol.iterator](): Iterator<number>;
17
+ }
18
+ interface vec3 {
19
+ x: number;
20
+ y: number;
21
+ z: number;
22
+ [Symbol.iterator](): Iterator<number>;
23
+ }
24
+ interface vec4 {
25
+ x: number;
26
+ y: number;
27
+ z: number;
28
+ w: number;
29
+ [Symbol.iterator](): Iterator<number>;
30
+ }
31
+ type VecKind = 'vec2f' | 'vec2i' | 'vec2u' | 'vec3f' | 'vec3i' | 'vec3u' | 'vec4f' | 'vec4i' | 'vec4u';
32
+ interface vecBase {
33
+ kind: VecKind;
34
+ [Symbol.iterator](): Iterator<number>;
35
+ }
36
+ type Vec2f = TgpuData<vec2f> & ((x: number, y: number) => vec2f) & ((xy: number) => vec2f) & (() => vec2f);
37
+ interface vec2f extends vec2, Swizzle2<vec2f> {
38
+ /** use to distinguish between vectors of the same size on the type level */
39
+ kind: 'vec2f';
40
+ }
41
+ declare const vec2f: Vec2f;
42
+ type Vec2i = TgpuData<vec2i> & ((x: number, y: number) => vec2i) & ((xy: number) => vec2i) & (() => vec2i);
43
+ interface vec2i extends vec2, Swizzle2<vec2i> {
44
+ /** use to distinguish between vectors of the same size on the type level */
45
+ kind: 'vec2i';
46
+ }
47
+ declare const vec2i: Vec2i;
48
+ type Vec2u = TgpuData<vec2u> & ((x: number, y: number) => vec2u) & ((xy: number) => vec2u) & (() => vec2u);
49
+ interface vec2u extends vec2, Swizzle2<vec2u> {
50
+ /** use to distinguish between vectors of the same size on the type level */
51
+ kind: 'vec2u';
52
+ }
53
+ declare const vec2u: Vec2u;
54
+ type Vec3f = TgpuData<vec3f> & ((x: number, y: number, z: number) => vec3f) & ((xyz: number) => vec3f) & (() => vec3f);
55
+ interface vec3f extends vec3, Swizzle3<vec2f, vec3f> {
56
+ /** use to distinguish between vectors of the same size on the type level */
57
+ kind: 'vec3f';
58
+ }
59
+ declare const vec3f: Vec3f;
60
+ type Vec3i = TgpuData<vec3i> & ((x: number, y: number, z: number) => vec3i) & ((xyz: number) => vec3i) & (() => vec3i);
61
+ interface vec3i extends vec3, Swizzle3<vec2i, vec3i> {
62
+ /** use to distinguish between vectors of the same size on the type level */
63
+ kind: 'vec3i';
64
+ }
65
+ declare const vec3i: Vec3i;
66
+ type Vec3u = TgpuData<vec3u> & ((x: number, y: number, z: number) => vec3u) & ((xyz: number) => vec3u) & (() => vec3u);
67
+ interface vec3u extends vec3, Swizzle3<vec2u, vec3u> {
68
+ /** use to distinguish between vectors of the same size on the type level */
69
+ kind: 'vec3u';
70
+ }
71
+ declare const vec3u: Vec3u;
72
+ type Vec4f = TgpuData<vec4f> & ((x: number, y: number, z: number, w: number) => vec4f) & ((xyzw: number) => vec4f) & (() => vec4f);
73
+ interface vec4f extends vec4, Swizzle4<vec2f, vec3f, vec4f> {
74
+ /** use to distinguish between vectors of the same size on the type level */
75
+ kind: 'vec4f';
76
+ }
77
+ declare const vec4f: Vec4f;
78
+ type Vec4i = TgpuData<vec4i> & ((x: number, y: number, z: number, w: number) => vec4i) & ((xyzw: number) => vec4i) & (() => vec4i);
79
+ interface vec4i extends vec4, Swizzle4<vec2i, vec3i, vec4i> {
80
+ /** use to distinguish between vectors of the same size on the type level */
81
+ kind: 'vec4i';
82
+ }
83
+ declare const vec4i: Vec4i;
84
+ type Vec4u = TgpuData<vec4u> & ((x: number, y: number, z: number, w: number) => vec4u) & ((xyzw: number) => vec4u) & (() => vec4u);
85
+ interface vec4u extends vec4, Swizzle4<vec2u, vec3u, vec4u> {
86
+ /** use to distinguish between vectors of the same size on the type level */
87
+ kind: 'vec4u';
88
+ }
89
+ declare const vec4u: Vec4u;
90
+
91
+ /**
92
+ * Helpful when creating new Resolvable types. For internal use.
93
+ */
94
+ declare class TgpuIdentifier implements TgpuResolvable, TgpuNamable {
95
+ label?: string | undefined;
96
+ $name(label: string | undefined): this;
97
+ resolve(ctx: ResolutionCtx): string;
98
+ toString(): string;
99
+ }
100
+
101
+ interface Builtin {
102
+ symbol: symbol;
103
+ name: string;
104
+ stage: 'vertex' | 'fragment' | 'compute';
105
+ direction: 'input' | 'output';
106
+ identifier: TgpuIdentifier;
107
+ }
108
+
109
+ type Getter = <T>(plum: TgpuPlum<T>) => T;
110
+ interface TgpuPlum<TValue = unknown> extends TgpuNamable {
111
+ readonly __brand: 'TgpuPlum';
112
+ /**
113
+ * Computes the value of this plum. Circumvents the store
114
+ * memoization, so use with care.
115
+ */
116
+ compute(get: Getter): TValue;
117
+ }
118
+
119
+ type Wgsl = string | number | TgpuResolvable | symbol | boolean;
120
+ /**
121
+ * Passed into each resolvable item. All sibling items share a resolution ctx,
122
+ * and a new resolution ctx is made when going down each level in the tree.
123
+ */
124
+ interface ResolutionCtx {
125
+ /**
126
+ * Slots that were used by items resolved by this context.
127
+ */
128
+ readonly usedSlots: Iterable<TgpuSlot<unknown>>;
129
+ addDeclaration(item: TgpuResolvable): void;
130
+ addBinding(bindable: TgpuBindable, identifier: TgpuIdentifier): void;
131
+ addRenderResource(resource: TgpuRenderResource, identifier: TgpuIdentifier): void;
132
+ addBuiltin(builtin: Builtin): void;
133
+ nameFor(token: TgpuResolvable): string;
134
+ /**
135
+ * Unwraps all layers of slot indirection and returns the concrete value if available.
136
+ * @throws {MissingSlotValueError}
137
+ */
138
+ unwrap<T>(eventual: Eventual<T>): T;
139
+ resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;
140
+ }
141
+ interface TgpuResolvable {
142
+ readonly label?: string | undefined;
143
+ resolve(ctx: ResolutionCtx): string;
144
+ }
145
+ /**
146
+ * Can be assigned a name. Not to be confused with
147
+ * being able to HAVE a name.
148
+ */
149
+ interface TgpuNamable {
150
+ $name(label?: string | undefined): this;
151
+ }
152
+ interface TgpuSlot<T> extends TgpuNamable {
153
+ readonly __brand: 'TgpuSlot';
154
+ readonly defaultValue: T | undefined;
155
+ readonly label?: string | undefined;
156
+ /**
157
+ * Used to determine if code generated using either value `a` or `b` in place
158
+ * of the slot will be equivalent. Defaults to `Object.is`.
159
+ */
160
+ areEqual(a: T, b: T): boolean;
161
+ }
162
+ /**
163
+ * Represents a value that is available at resolution time.
164
+ */
165
+ type Eventual<T> = T | TgpuSlot<T>;
166
+ type SlotValuePair<T> = [TgpuSlot<T>, T];
167
+ interface TgpuAllocatable<TData extends AnyTgpuData = AnyTgpuData> {
168
+ /**
169
+ * The data type this allocatable was constructed with.
170
+ * It informs the size and format of data in both JS and
171
+ * binary.
172
+ */
173
+ readonly dataType: TData;
174
+ readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;
175
+ readonly flags: GPUBufferUsageFlags;
176
+ }
177
+ interface TgpuBindable<TData extends AnyTgpuData = AnyTgpuData, TUsage extends BufferUsage = BufferUsage> extends TgpuResolvable {
178
+ readonly allocatable: TgpuAllocatable<TData>;
179
+ readonly usage: TUsage;
180
+ }
181
+ type TgpuSamplerType = 'sampler' | 'sampler_comparison';
182
+ type TgpuTypedTextureType = 'texture_1d' | 'texture_2d' | 'texture_2d_array' | 'texture_3d' | 'texture_cube' | 'texture_cube_array' | 'texture_multisampled_2d';
183
+ type TgpuDepthTextureType = 'texture_depth_2d' | 'texture_depth_2d_array' | 'texture_depth_cube' | 'texture_depth_cube_array' | 'texture_depth_multisampled_2d';
184
+ type TgpuStorageTextureType = 'texture_storage_1d' | 'texture_storage_2d' | 'texture_storage_2d_array' | 'texture_storage_3d';
185
+ type TgpuExternalTextureType = 'texture_external';
186
+ type TgpuRenderResourceType = TgpuSamplerType | TgpuTypedTextureType | TgpuDepthTextureType | TgpuStorageTextureType | TgpuExternalTextureType;
187
+ interface TgpuRenderResource extends TgpuResolvable {
188
+ readonly type: TgpuRenderResourceType;
189
+ }
190
+ type BufferUsage = 'uniform' | 'readonly' | 'mutable' | 'vertex';
191
+ interface TgpuData<TInner> extends ISchema<TInner>, TgpuResolvable {
192
+ readonly byteAlignment: number;
193
+ readonly size: number;
194
+ }
195
+ type AnyTgpuData = TgpuData<unknown>;
196
+ type TexelFormat = Vec4u | Vec4i | Vec4f;
197
+ interface TgpuPointer<TScope extends 'function', TInner extends AnyTgpuData> {
198
+ readonly scope: TScope;
199
+ readonly pointsTo: TInner;
200
+ }
201
+
202
+ export { type AnyTgpuData as A, type ResolutionCtx as R, type TgpuAllocatable as T, type VecKind as V, type TgpuNamable as a, type TgpuPlum as b, vec3f as c, vec3i as d, vec3u as e, type TgpuData as f, type TexelFormat as g, vec2f as h, vec4f as i, type TgpuPointer as j, vec2i as k, vec2u as l, vec4i as m, vec4u as n, type Vec2f as o, type Vec2i as p, type Vec2u as q, type Vec3f as r, type Vec3i as s, type Vec3u as t, type Vec4f as u, type vecBase as v, type Vec4i as w, type Vec4u as x };
@@ -0,0 +1,202 @@
1
+ import { ISchema, Parsed } from 'typed-binary';
2
+
3
+ interface Swizzle2<T2> {
4
+ readonly xx: T2;
5
+ readonly xy: T2;
6
+ readonly yx: T2;
7
+ readonly yy: T2;
8
+ }
9
+ interface Swizzle3<T2, T3> extends Swizzle2<T2> {
10
+ }
11
+ interface Swizzle4<T2, T3, T4> extends Swizzle3<T2, T3> {
12
+ }
13
+ interface vec2 {
14
+ x: number;
15
+ y: number;
16
+ [Symbol.iterator](): Iterator<number>;
17
+ }
18
+ interface vec3 {
19
+ x: number;
20
+ y: number;
21
+ z: number;
22
+ [Symbol.iterator](): Iterator<number>;
23
+ }
24
+ interface vec4 {
25
+ x: number;
26
+ y: number;
27
+ z: number;
28
+ w: number;
29
+ [Symbol.iterator](): Iterator<number>;
30
+ }
31
+ type VecKind = 'vec2f' | 'vec2i' | 'vec2u' | 'vec3f' | 'vec3i' | 'vec3u' | 'vec4f' | 'vec4i' | 'vec4u';
32
+ interface vecBase {
33
+ kind: VecKind;
34
+ [Symbol.iterator](): Iterator<number>;
35
+ }
36
+ type Vec2f = TgpuData<vec2f> & ((x: number, y: number) => vec2f) & ((xy: number) => vec2f) & (() => vec2f);
37
+ interface vec2f extends vec2, Swizzle2<vec2f> {
38
+ /** use to distinguish between vectors of the same size on the type level */
39
+ kind: 'vec2f';
40
+ }
41
+ declare const vec2f: Vec2f;
42
+ type Vec2i = TgpuData<vec2i> & ((x: number, y: number) => vec2i) & ((xy: number) => vec2i) & (() => vec2i);
43
+ interface vec2i extends vec2, Swizzle2<vec2i> {
44
+ /** use to distinguish between vectors of the same size on the type level */
45
+ kind: 'vec2i';
46
+ }
47
+ declare const vec2i: Vec2i;
48
+ type Vec2u = TgpuData<vec2u> & ((x: number, y: number) => vec2u) & ((xy: number) => vec2u) & (() => vec2u);
49
+ interface vec2u extends vec2, Swizzle2<vec2u> {
50
+ /** use to distinguish between vectors of the same size on the type level */
51
+ kind: 'vec2u';
52
+ }
53
+ declare const vec2u: Vec2u;
54
+ type Vec3f = TgpuData<vec3f> & ((x: number, y: number, z: number) => vec3f) & ((xyz: number) => vec3f) & (() => vec3f);
55
+ interface vec3f extends vec3, Swizzle3<vec2f, vec3f> {
56
+ /** use to distinguish between vectors of the same size on the type level */
57
+ kind: 'vec3f';
58
+ }
59
+ declare const vec3f: Vec3f;
60
+ type Vec3i = TgpuData<vec3i> & ((x: number, y: number, z: number) => vec3i) & ((xyz: number) => vec3i) & (() => vec3i);
61
+ interface vec3i extends vec3, Swizzle3<vec2i, vec3i> {
62
+ /** use to distinguish between vectors of the same size on the type level */
63
+ kind: 'vec3i';
64
+ }
65
+ declare const vec3i: Vec3i;
66
+ type Vec3u = TgpuData<vec3u> & ((x: number, y: number, z: number) => vec3u) & ((xyz: number) => vec3u) & (() => vec3u);
67
+ interface vec3u extends vec3, Swizzle3<vec2u, vec3u> {
68
+ /** use to distinguish between vectors of the same size on the type level */
69
+ kind: 'vec3u';
70
+ }
71
+ declare const vec3u: Vec3u;
72
+ type Vec4f = TgpuData<vec4f> & ((x: number, y: number, z: number, w: number) => vec4f) & ((xyzw: number) => vec4f) & (() => vec4f);
73
+ interface vec4f extends vec4, Swizzle4<vec2f, vec3f, vec4f> {
74
+ /** use to distinguish between vectors of the same size on the type level */
75
+ kind: 'vec4f';
76
+ }
77
+ declare const vec4f: Vec4f;
78
+ type Vec4i = TgpuData<vec4i> & ((x: number, y: number, z: number, w: number) => vec4i) & ((xyzw: number) => vec4i) & (() => vec4i);
79
+ interface vec4i extends vec4, Swizzle4<vec2i, vec3i, vec4i> {
80
+ /** use to distinguish between vectors of the same size on the type level */
81
+ kind: 'vec4i';
82
+ }
83
+ declare const vec4i: Vec4i;
84
+ type Vec4u = TgpuData<vec4u> & ((x: number, y: number, z: number, w: number) => vec4u) & ((xyzw: number) => vec4u) & (() => vec4u);
85
+ interface vec4u extends vec4, Swizzle4<vec2u, vec3u, vec4u> {
86
+ /** use to distinguish between vectors of the same size on the type level */
87
+ kind: 'vec4u';
88
+ }
89
+ declare const vec4u: Vec4u;
90
+
91
+ /**
92
+ * Helpful when creating new Resolvable types. For internal use.
93
+ */
94
+ declare class TgpuIdentifier implements TgpuResolvable, TgpuNamable {
95
+ label?: string | undefined;
96
+ $name(label: string | undefined): this;
97
+ resolve(ctx: ResolutionCtx): string;
98
+ toString(): string;
99
+ }
100
+
101
+ interface Builtin {
102
+ symbol: symbol;
103
+ name: string;
104
+ stage: 'vertex' | 'fragment' | 'compute';
105
+ direction: 'input' | 'output';
106
+ identifier: TgpuIdentifier;
107
+ }
108
+
109
+ type Getter = <T>(plum: TgpuPlum<T>) => T;
110
+ interface TgpuPlum<TValue = unknown> extends TgpuNamable {
111
+ readonly __brand: 'TgpuPlum';
112
+ /**
113
+ * Computes the value of this plum. Circumvents the store
114
+ * memoization, so use with care.
115
+ */
116
+ compute(get: Getter): TValue;
117
+ }
118
+
119
+ type Wgsl = string | number | TgpuResolvable | symbol | boolean;
120
+ /**
121
+ * Passed into each resolvable item. All sibling items share a resolution ctx,
122
+ * and a new resolution ctx is made when going down each level in the tree.
123
+ */
124
+ interface ResolutionCtx {
125
+ /**
126
+ * Slots that were used by items resolved by this context.
127
+ */
128
+ readonly usedSlots: Iterable<TgpuSlot<unknown>>;
129
+ addDeclaration(item: TgpuResolvable): void;
130
+ addBinding(bindable: TgpuBindable, identifier: TgpuIdentifier): void;
131
+ addRenderResource(resource: TgpuRenderResource, identifier: TgpuIdentifier): void;
132
+ addBuiltin(builtin: Builtin): void;
133
+ nameFor(token: TgpuResolvable): string;
134
+ /**
135
+ * Unwraps all layers of slot indirection and returns the concrete value if available.
136
+ * @throws {MissingSlotValueError}
137
+ */
138
+ unwrap<T>(eventual: Eventual<T>): T;
139
+ resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;
140
+ }
141
+ interface TgpuResolvable {
142
+ readonly label?: string | undefined;
143
+ resolve(ctx: ResolutionCtx): string;
144
+ }
145
+ /**
146
+ * Can be assigned a name. Not to be confused with
147
+ * being able to HAVE a name.
148
+ */
149
+ interface TgpuNamable {
150
+ $name(label?: string | undefined): this;
151
+ }
152
+ interface TgpuSlot<T> extends TgpuNamable {
153
+ readonly __brand: 'TgpuSlot';
154
+ readonly defaultValue: T | undefined;
155
+ readonly label?: string | undefined;
156
+ /**
157
+ * Used to determine if code generated using either value `a` or `b` in place
158
+ * of the slot will be equivalent. Defaults to `Object.is`.
159
+ */
160
+ areEqual(a: T, b: T): boolean;
161
+ }
162
+ /**
163
+ * Represents a value that is available at resolution time.
164
+ */
165
+ type Eventual<T> = T | TgpuSlot<T>;
166
+ type SlotValuePair<T> = [TgpuSlot<T>, T];
167
+ interface TgpuAllocatable<TData extends AnyTgpuData = AnyTgpuData> {
168
+ /**
169
+ * The data type this allocatable was constructed with.
170
+ * It informs the size and format of data in both JS and
171
+ * binary.
172
+ */
173
+ readonly dataType: TData;
174
+ readonly initial?: Parsed<TData> | TgpuPlum<Parsed<TData>> | undefined;
175
+ readonly flags: GPUBufferUsageFlags;
176
+ }
177
+ interface TgpuBindable<TData extends AnyTgpuData = AnyTgpuData, TUsage extends BufferUsage = BufferUsage> extends TgpuResolvable {
178
+ readonly allocatable: TgpuAllocatable<TData>;
179
+ readonly usage: TUsage;
180
+ }
181
+ type TgpuSamplerType = 'sampler' | 'sampler_comparison';
182
+ type TgpuTypedTextureType = 'texture_1d' | 'texture_2d' | 'texture_2d_array' | 'texture_3d' | 'texture_cube' | 'texture_cube_array' | 'texture_multisampled_2d';
183
+ type TgpuDepthTextureType = 'texture_depth_2d' | 'texture_depth_2d_array' | 'texture_depth_cube' | 'texture_depth_cube_array' | 'texture_depth_multisampled_2d';
184
+ type TgpuStorageTextureType = 'texture_storage_1d' | 'texture_storage_2d' | 'texture_storage_2d_array' | 'texture_storage_3d';
185
+ type TgpuExternalTextureType = 'texture_external';
186
+ type TgpuRenderResourceType = TgpuSamplerType | TgpuTypedTextureType | TgpuDepthTextureType | TgpuStorageTextureType | TgpuExternalTextureType;
187
+ interface TgpuRenderResource extends TgpuResolvable {
188
+ readonly type: TgpuRenderResourceType;
189
+ }
190
+ type BufferUsage = 'uniform' | 'readonly' | 'mutable' | 'vertex';
191
+ interface TgpuData<TInner> extends ISchema<TInner>, TgpuResolvable {
192
+ readonly byteAlignment: number;
193
+ readonly size: number;
194
+ }
195
+ type AnyTgpuData = TgpuData<unknown>;
196
+ type TexelFormat = Vec4u | Vec4i | Vec4f;
197
+ interface TgpuPointer<TScope extends 'function', TInner extends AnyTgpuData> {
198
+ readonly scope: TScope;
199
+ readonly pointsTo: TInner;
200
+ }
201
+
202
+ export { type AnyTgpuData as A, type ResolutionCtx as R, type TgpuAllocatable as T, type VecKind as V, type TgpuNamable as a, type TgpuPlum as b, vec3f as c, vec3i as d, vec3u as e, type TgpuData as f, type TexelFormat as g, vec2f as h, vec4f as i, type TgpuPointer as j, vec2i as k, vec2u as l, vec4i as m, vec4u as n, type Vec2f as o, type Vec2i as p, type Vec2u as q, type Vec3f as r, type Vec3i as s, type Vec3u as t, type Vec4f as u, type vecBase as v, type Vec4i as w, type Vec4u as x };
@@ -1,4 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkG3U6RTMFcjs = require('./chunk-G3U6RTMF.cjs');var _chunkAS7UPXZ3cjs = require('./chunk-AS7UPXZ3.cjs');var g=class{constructor(){_chunkAS7UPXZ3cjs.d.call(void 0, this,"lastUniqueId",0);_chunkAS7UPXZ3cjs.d.call(void 0, this,"names",new WeakMap)}nameFor(e){let t=this.names.get(e);if(t===void 0){let s;e.label?(s=e.label.replaceAll(/\s/g,"_"),s=s.replaceAll(/[^\w\d]/g,"")):s="item",t=`${s}_${this.lastUniqueId++}`,this.names.set(e,t)}return t}},x= exports.b =class{constructor(){_chunkAS7UPXZ3cjs.d.call(void 0, this,"_usedNames",new Set);_chunkAS7UPXZ3cjs.d.call(void 0, this,"_assignedNames",new WeakMap)}nameFor(e){let t=this._assignedNames.get(e);if(t!==void 0)return t;if(e.label===void 0)throw new Error("Unnamed item found when using a strict NameRegistry");let s=0,l=e.label;for(;this._usedNames.has(l);)s++,l=`${e.label}_${s}`;return this._usedNames.add(l),this._assignedNames.set(e,l),l}};var P={uniform:"uniform",mutable_storage:"storage, read_write",readonly_storage:"storage, read"},b=class{constructor(e,t){this.names=e;this._bindingGroup=t;_chunkAS7UPXZ3cjs.d.call(void 0, this,"_memoizedResolves",new WeakMap);_chunkAS7UPXZ3cjs.d.call(void 0, this,"_nextFreeBindingIdx",0);_chunkAS7UPXZ3cjs.d.call(void 0, this,"_usedBindables",new Set);_chunkAS7UPXZ3cjs.d.call(void 0, this,"_declarations",[])}get usedBindables(){return this._usedBindables}get declarations(){return this._declarations}getOrInstantiate(e,t){var u;let s=(u=this._memoizedResolves.get(e))!=null?u:[];for(let a of s)if([...a.slotToValueMap.entries()].every(([o,R])=>t.readSlot(o)===R))return a.result;let l=e.resolve(t),i=new Map;for(let a of t.usedSlots)i.set(a,t.readSlot(a));return s.push({slotToValueMap:i,result:l}),this._memoizedResolves.set(e,s),l}reserveBindingEntry(e){return this._usedBindables.add(e),{group:this._bindingGroup,idx:this._nextFreeBindingIdx++}}addDeclaration(e){this._declarations.push(e)}},p=class{constructor({names:e,bindingGroup:t}){_chunkAS7UPXZ3cjs.d.call(void 0, this,"_shared");_chunkAS7UPXZ3cjs.d.call(void 0, this,"usedSlots",new Set);this._shared=new b(e,t!=null?t:0)}get usedBindables(){return this._shared.usedBindables}addDeclaration(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addBinding(e,t){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){if(e.defaultValue===void 0)throw new (0, _chunkG3U6RTMFcjs.a)(e);return e.defaultValue}unwrap(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}resolve(e,t=[]){if(!_chunkAS7UPXZ3cjs.e.call(void 0, e))return String(e);let s=new c(this,this._shared,t),l=this._shared.getOrInstantiate(e,s);return`${[...this._shared.declarations].join(`
2
-
3
- `)}${l}`}},c=class n{constructor(e,t,s){this._parent=e;this._shared=t;this._slotValuePairs=s;_chunkAS7UPXZ3cjs.d.call(void 0, this,"usedSlots",new Set)}addDeclaration(e){this._shared.addDeclaration(this.resolve(e))}addBinding(e,t){let{group:s,idx:l}=this._shared.reserveBindingEntry(e);this.addDeclaration(_chunkAS7UPXZ3cjs.i`@group(${s}) @binding(${l}) var<${P[e.usage]}> ${t}: ${e.allocatable.dataType};`)}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){let t=this._slotValuePairs.find(([s])=>s===e);return t?(this.usedSlots.add(e),t[1]):(this.usedSlots.add(e),this._parent.readSlot(e))}unwrap(e){let t=e;for(;_chunkAS7UPXZ3cjs.g.call(void 0, t);)t=this.readSlot(t);return t}resolve(e,t=[]){if(!_chunkAS7UPXZ3cjs.e.call(void 0, e))return String(e);let s=new n(this,this._shared,t);return this._shared.getOrInstantiate(e,s)}};var V={uniform:"uniform",mutable_storage:"storage",readonly_storage:"read-only-storage"},h= exports.c =class{constructor(e,t){this.runtime=e;this.root=t}build(e){var a;let t=new p({names:(a=e.nameRegistry)!=null?a:new g,bindingGroup:e.bindingGroup}),s=t.resolve(this.root),l=Array.from(t.usedBindables),i=this.runtime.device.createBindGroupLayout({entries:l.map((d,o)=>({binding:o,visibility:e.shaderStage,buffer:{type:V[d.usage]}}))}),u=this.runtime.device.createBindGroup({layout:i,entries:l.map((d,o)=>({binding:o,resource:{buffer:this.runtime.bufferFor(d.allocatable)}}))});return{bindGroupLayout:i,bindGroup:u,code:s}}};var S=Symbol("This item can be set, owns its value (does not get value from an external source)");var w=Symbol("This plum's value is sourced from outside the runtime.");function z(n){return n[w]===!0}function A(n){return typeof n=="function"?new y(n):new f(n)}function j(n,e){return new v(n,e)}function q(n){return n.__brand==="WgslPlum"}var B,f=class{constructor(e){this._initial=e;_chunkAS7UPXZ3cjs.d.call(void 0, this,"__brand","WgslPlum");_chunkAS7UPXZ3cjs.d.call(void 0, this,B,!0);_chunkAS7UPXZ3cjs.d.call(void 0, 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>"}`}};B=S;var y=class{constructor(e){this._compute=e;_chunkAS7UPXZ3cjs.d.call(void 0, this,"__brand","WgslPlum");_chunkAS7UPXZ3cjs.d.call(void 0, 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>"}`}},G,v=class{constructor(e,t){this._subscribe=e;this._getLatest=t;_chunkAS7UPXZ3cjs.d.call(void 0, this,"__brand","WgslPlum");_chunkAS7UPXZ3cjs.d.call(void 0, this,G,!0);_chunkAS7UPXZ3cjs.d.call(void 0, this,"_label");_chunkAS7UPXZ3cjs.d.call(void 0, this,"_prev");_chunkAS7UPXZ3cjs.d.call(void 0, 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>"}`}};G=w;exports.a = g; exports.b = x; exports.c = h; exports.d = z; exports.e = A; exports.f = j; exports.g = q;
4
- //# sourceMappingURL=chunk-5ZQTJALJ.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/nameRegistry.ts","../src/resolutionCtx.ts","../src/programBuilder.ts","../src/settableTrait.ts","../src/wgslPlum.ts"],"names":["RandomNameRegistry","__publicField","item","name","label","StrictNameRegistry","assignedName","index","unusedName","usageToVarTemplateMap","SharedResolutionState","names","_bindingGroup","itemCtx","_a","instances","instance","slot","expectedValue","result","slotToValueMap","usedSlot","_bindable","declaration","ResolutionCtxImpl","bindingGroup","_declaration","_identifier","MissingSlotValueError","eventual","slotValueOverrides","isResolvable","ScopedResolutionCtx","_ScopedResolutionCtx","_parent","_shared","_slotValuePairs","bindable","identifier","group","idx","code","token","slotToValuePair","boundSlot","maybeSlot","isSlot","usageToBindingTypeMap","ProgramBuilder","runtime","root","options","ctx","codeString","usedBindables","bindGroupLayout","bindGroup","WgslSettableTrait","WgslExternalPlumTrait","isExternalPlum","value","plum","initialOrCompute","WgslDerivedPlumImpl","WgslSourcePlumImpl","plumFromEvent","subscribe","getLatest","WgslExternalPlumImpl","isPlum","_initial","_get","_compute","get","_subscribe","_getLatest","listener","latest"],"mappings":"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","sourcesContent":["import type { WgslResolvable } from './types';\n\nexport interface NameRegistry {\n nameFor(item: WgslResolvable): string;\n}\n\nexport class RandomNameRegistry implements NameRegistry {\n private lastUniqueId = 0;\n private names = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable) {\n let name = this.names.get(item);\n\n if (name === undefined) {\n // creating sanitized name\n let label: string;\n if (item.label) {\n label = item.label.replaceAll(/\\s/g, '_'); // whitespace -> _\n label = label.replaceAll(/[^\\w\\d]/g, ''); // removing illegal characters\n } else {\n label = 'item';\n }\n name = `${label}_${this.lastUniqueId++}`;\n this.names.set(item, name);\n }\n\n return name;\n }\n}\n\nexport class StrictNameRegistry implements NameRegistry {\n /**\n * Allows to provide a good fallback for instances of the\n * same function that are bound to different slot values.\n */\n private readonly _usedNames = new Set<string>();\n\n private readonly _assignedNames = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable): string {\n const assignedName = this._assignedNames.get(item);\n if (assignedName !== undefined) {\n return assignedName;\n }\n\n if (item.label === undefined) {\n throw new Error('Unnamed item found when using a strict NameRegistry');\n }\n\n let index = 0;\n let unusedName = item.label;\n while (this._usedNames.has(unusedName)) {\n index++;\n unusedName = `${item.label}_${index}`;\n }\n\n this._usedNames.add(unusedName);\n this._assignedNames.set(item, unusedName);\n return unusedName;\n }\n}\n","import { MissingSlotValueError } from './errors';\nimport type { NameRegistry } from './nameRegistry';\nimport {\n type BufferUsage,\n type Eventual,\n type ResolutionCtx,\n type SlotValuePair,\n type Wgsl,\n type WgslBindable,\n type WgslResolvable,\n type WgslSlot,\n isResolvable,\n isSlot,\n} from './types';\nimport { code } from './wgslCode';\nimport type { WgslIdentifier } from './wgslIdentifier';\n\nexport type ResolutionCtxImplOptions = {\n readonly names: NameRegistry;\n readonly bindingGroup?: number;\n};\n\ntype SlotToValueMap = Map<WgslSlot<unknown>, unknown>;\n\nconst usageToVarTemplateMap: Record<BufferUsage, string> = {\n uniform: 'uniform',\n mutable_storage: 'storage, read_write',\n readonly_storage: 'storage, read',\n};\n\nclass SharedResolutionState {\n private readonly _memoizedResolves = new WeakMap<\n // WeakMap because if the resolvable does not exist anymore,\n // apart from this map, there is no way to access the cached value anyway.\n WgslResolvable,\n { slotToValueMap: SlotToValueMap; result: string }[]\n >();\n\n private _nextFreeBindingIdx = 0;\n private readonly _usedBindables = new Set<WgslBindable>();\n private readonly _declarations: string[] = [];\n\n constructor(\n public readonly names: NameRegistry,\n private readonly _bindingGroup: number,\n ) {}\n\n get usedBindables(): Iterable<WgslBindable> {\n return this._usedBindables;\n }\n\n get declarations(): Iterable<string> {\n return this._declarations;\n }\n\n /**\n * @param item The item whose resolution should be either retrieved from the cache (if there is a cache hit), or resolved\n * with the `compute` method.\n * @param compute Returns the resolved item and the corresponding bindingMap. This result will be discarded if a sufficient cache entry is found.\n */\n getOrInstantiate(item: WgslResolvable, itemCtx: ScopedResolutionCtx): string {\n // All memoized versions of `item`\n const instances = this._memoizedResolves.get(item) ?? [];\n\n for (const instance of instances) {\n const slotValuePairs = [...instance.slotToValueMap.entries()];\n\n if (\n slotValuePairs.every(\n ([slot, expectedValue]) => itemCtx.readSlot(slot) === expectedValue,\n )\n ) {\n return instance.result;\n }\n }\n\n // If we got here, no item with the given slot-to-value combo exists in cache yet\n const result = item.resolve(itemCtx);\n\n // We know which bindables the item used while resolving\n const slotToValueMap = new Map<WgslSlot<unknown>, unknown>();\n for (const usedSlot of itemCtx.usedSlots) {\n slotToValueMap.set(usedSlot, itemCtx.readSlot(usedSlot));\n }\n\n instances.push({ slotToValueMap, result });\n this._memoizedResolves.set(item, instances);\n\n return result;\n }\n\n reserveBindingEntry(_bindable: WgslBindable) {\n this._usedBindables.add(_bindable);\n\n return { group: this._bindingGroup, idx: this._nextFreeBindingIdx++ };\n }\n\n addDeclaration(declaration: string) {\n this._declarations.push(declaration);\n }\n}\n\nexport class ResolutionCtxImpl implements ResolutionCtx {\n private readonly _shared: SharedResolutionState;\n\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor({ names, bindingGroup }: ResolutionCtxImplOptions) {\n this._shared = new SharedResolutionState(names, bindingGroup ?? 0);\n }\n\n get usedBindables() {\n return this._shared.usedBindables;\n }\n\n addDeclaration(_declaration: WgslResolvable) {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n addBinding(_bindable: WgslBindable, _identifier: WgslIdentifier): void {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n nameFor(item: WgslResolvable): string {\n return this._shared.names.nameFor(item);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n if (slot.defaultValue === undefined) {\n throw new MissingSlotValueError(slot);\n }\n\n return slot.defaultValue;\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n resolve(item: Wgsl, slotValueOverrides: SlotValuePair<unknown>[] = []) {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n const result = this._shared.getOrInstantiate(item, itemCtx);\n\n return `${[...this._shared.declarations].join('\\n\\n')}${result}`;\n }\n}\n\nclass ScopedResolutionCtx implements ResolutionCtx {\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor(\n private readonly _parent: ResolutionCtxImpl | ScopedResolutionCtx,\n private readonly _shared: SharedResolutionState,\n private readonly _slotValuePairs: SlotValuePair<unknown>[],\n ) {}\n\n addDeclaration(declaration: WgslResolvable): void {\n this._shared.addDeclaration(this.resolve(declaration));\n }\n\n addBinding(bindable: WgslBindable, identifier: WgslIdentifier): void {\n const { group, idx } = this._shared.reserveBindingEntry(bindable);\n\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var<${usageToVarTemplateMap[bindable.usage]}> ${identifier}: ${bindable.allocatable.dataType};`,\n );\n }\n\n nameFor(token: WgslResolvable): string {\n return this._shared.names.nameFor(token);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n const slotToValuePair = this._slotValuePairs.find(\n ([boundSlot]) => boundSlot === slot,\n ) as SlotValuePair<T> | undefined;\n\n if (!slotToValuePair) {\n // Not yet available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n // Maybe the parent ctx has it.\n return this._parent.readSlot(slot);\n }\n\n // Available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n return slotToValuePair[1];\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n let maybeSlot = eventual;\n\n // Unwrapping all layers of slots.\n while (isSlot(maybeSlot)) {\n maybeSlot = this.readSlot(maybeSlot);\n }\n\n return maybeSlot;\n }\n\n resolve(\n item: Wgsl,\n slotValueOverrides: SlotValuePair<unknown>[] = [],\n ): string {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n return this._shared.getOrInstantiate(item, itemCtx);\n }\n}\n","import { type NameRegistry, RandomNameRegistry } from './nameRegistry';\nimport { ResolutionCtxImpl } from './resolutionCtx';\nimport type { TypeGpuRuntime } from './typegpuRuntime';\nimport type { BufferUsage, WgslResolvable } from './types';\n\nexport type Program = {\n readonly bindGroupLayout: GPUBindGroupLayout;\n readonly bindGroup: GPUBindGroup;\n readonly code: string;\n};\n\ntype BuildOptions = {\n shaderStage: number;\n bindingGroup: number;\n nameRegistry?: NameRegistry;\n};\n\nconst usageToBindingTypeMap: Record<BufferUsage, GPUBufferBindingType> = {\n uniform: 'uniform',\n mutable_storage: 'storage',\n readonly_storage: 'read-only-storage',\n};\n\nexport default class ProgramBuilder {\n constructor(\n private runtime: TypeGpuRuntime,\n private root: WgslResolvable,\n ) {}\n\n build(options: BuildOptions): Program {\n const ctx = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n\n // Resolving code\n const codeString = ctx.resolve(this.root);\n const usedBindables = Array.from(ctx.usedBindables);\n\n const bindGroupLayout = this.runtime.device.createBindGroupLayout({\n entries: usedBindables.map((bindable, idx) => ({\n binding: idx,\n visibility: options.shaderStage,\n buffer: {\n type: usageToBindingTypeMap[bindable.usage],\n },\n })),\n });\n\n const bindGroup = this.runtime.device.createBindGroup({\n layout: bindGroupLayout,\n entries: usedBindables.map((bindable, idx) => ({\n binding: idx,\n resource: {\n buffer: this.runtime.bufferFor(bindable.allocatable),\n },\n })),\n });\n\n return {\n bindGroupLayout,\n bindGroup,\n code: codeString,\n };\n }\n}\n","export const WgslSettableTrait = Symbol(\n 'This item can be set, owns its value (does not get value from an external source)',\n);\n\nexport interface WgslSettable {\n readonly [WgslSettableTrait]: true;\n}\n\nexport function isSettable(\n value: WgslSettable | unknown,\n): value is WgslSettable {\n return (value as WgslSettable)[WgslSettableTrait] === true;\n}\n","import { type WgslSettable, WgslSettableTrait } from './settableTrait';\nimport type { Wgsl, WgslResolvable } from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport type Getter = <T>(plum: WgslPlum<T>) => T;\nexport type Unsubscribe = () => unknown;\nexport type ExtractPlumValue<T> = T extends WgslPlum<infer TValue>\n ? TValue\n : never;\n\nexport interface WgslPlum<TValue = unknown> {\n readonly __brand: 'WgslPlum';\n\n $name(label: string): this;\n\n /**\n * Computes the value of this plum. Circumvents the store\n * memoization, so use with care.\n */\n compute(get: Getter): TValue;\n}\n\nexport const WgslExternalPlumTrait = Symbol(\n `This plum's value is sourced from outside the runtime.`,\n);\nexport interface WgslExternalPlum {\n readonly [WgslExternalPlumTrait]: true;\n\n readonly version: number;\n subscribe(listener: () => unknown): Unsubscribe;\n}\n\nexport function isExternalPlum(\n value: unknown | WgslExternalPlum,\n): value is WgslExternalPlum {\n return (value as WgslExternalPlum)[WgslExternalPlumTrait] === true;\n}\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T extends Wgsl>(\n compute: (get: Getter) => T,\n): WgslPlum<T> & WgslResolvable;\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T>(compute: (get: Getter) => T): WgslPlum<T>;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T extends Wgsl>(\n initial: T,\n): WgslPlum<T> & WgslSettable & WgslResolvable;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T>(initial: T): WgslPlum<T> & WgslSettable;\n\nexport function plum<T>(\n initialOrCompute: T | ((get: Getter) => T),\n): WgslPlum<T> | (WgslPlum<T> & WgslSettable) {\n if (typeof initialOrCompute === 'function') {\n return new WgslDerivedPlumImpl(initialOrCompute as (get: Getter) => T);\n }\n\n return new WgslSourcePlumImpl(initialOrCompute);\n}\n\nexport function plumFromEvent<T>(\n subscribe: (listener: () => unknown) => Unsubscribe,\n getLatest: () => T,\n): WgslPlum<T> & WgslExternalPlum {\n return new WgslExternalPlumImpl(subscribe, getLatest);\n}\n\nexport function isPlum<T>(value: WgslPlum<T> | unknown): value is WgslPlum<T> {\n return (value as WgslPlum).__brand === 'WgslPlum';\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSourcePlumImpl<TValue> implements WgslPlum<TValue>, WgslSettable {\n readonly __brand = 'WgslPlum';\n readonly [WgslSettableTrait] = true;\n\n private _label: string | undefined;\n\n constructor(private readonly _initial: TValue) {}\n\n compute(_get: Getter) {\n return this._initial;\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslDerivedPlumImpl<TValue> implements WgslPlum<TValue> {\n readonly __brand = 'WgslPlum';\n private _label: string | undefined;\n\n constructor(private readonly _compute: (get: Getter) => TValue) {}\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n compute(get: Getter): TValue {\n return this._compute(get);\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslExternalPlumImpl<TValue>\n implements WgslPlum<TValue>, WgslExternalPlum\n{\n readonly __brand = 'WgslPlum';\n readonly [WgslExternalPlumTrait] = true;\n\n private _label: string | undefined;\n private _prev: TValue;\n private _version = 0;\n\n constructor(\n private readonly _subscribe: (listener: () => unknown) => Unsubscribe,\n private readonly _getLatest: () => TValue,\n ) {\n this._prev = _getLatest();\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n get version(): number {\n return this._version;\n }\n\n subscribe(listener: () => unknown): Unsubscribe {\n return this._subscribe(listener);\n }\n\n compute(): TValue {\n const latest = this._getLatest();\n\n if (!Object.is(latest, this._prev)) {\n this._version++;\n this._prev = latest;\n }\n\n return this._prev;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n"]}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var W=Object.defineProperty,y=Object.defineProperties;var f=Object.getOwnPropertyDescriptors;var a=Object.getOwnPropertySymbols;var d=Object.prototype.hasOwnProperty,u=Object.prototype.propertyIsEnumerable;var r=(e,l,t)=>l in e?W(e,l,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[l]=t,T= exports.a =(e,l)=>{for(var t in l||(l={}))d.call(l,t)&&r(e,t,l[t]);if(a)for(var t of a(l))u.call(l,t)&&r(e,t,l[t]);return e},b= exports.b =(e,l)=>y(e,f(l));var c=(e,l)=>{var t={};for(var n in e)d.call(e,n)&&l.indexOf(n)<0&&(t[n]=e[n]);if(e!=null&&a)for(var n of a(e))l.indexOf(n)<0&&u.call(e,n)&&(t[n]=e[n]);return t};var p=(e,l,t)=>(r(e,typeof l!="symbol"?l+"":l,t),t);function i(e){return!!e&&(typeof e=="object"||typeof e=="function")&&"resolve"in e}function m(e){return typeof e=="number"||typeof e=="string"||i(e)}function v(e){return e.__brand==="WgslSlot"}function S(e){return"pointsTo"in e}function D(e,...l){let t=e.flatMap((n,o)=>{let s=l[o];return s===void 0?[n]:Array.isArray(s)?[n,...s]:[n,s]});return new g(t)}var g=class{constructor(l){this.segments=l;p(this,"_label")}get label(){return this._label}$name(l){return this._label=l,this}resolve(l){let t="";for(let n of this.segments)if(typeof n=="function"){let o=n(s=>l.unwrap(s));t+=l.resolve(o)}else i(n)?t+=l.resolve(n):t+=String(n);return t}toString(){var l;return`code:${(l=this._label)!=null?l:"<unnamed>"}`}};exports.a = T; exports.b = b; exports.c = c; exports.d = p; exports.e = i; exports.f = m; exports.g = v; exports.h = S; exports.i = D;
2
- //# sourceMappingURL=chunk-AS7UPXZ3.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types.ts","../src/wgslCode.ts"],"names":["isResolvable","value","isWgsl","isSlot","isPointer","code","strings","params","segments","string","idx","param","WgslCodeImpl","__publicField","label","ctx","s","result","eventual","_a"],"mappings":"moBAiCO,SAASA,EAAaC,EAAyC,CACpE,MACE,CAAC,CAACA,IACD,OAAOA,GAAU,UAAY,OAAOA,GAAU,aAC/C,YAAaA,CAEjB,CAEO,SAASC,EAAOD,EAA+B,CACpD,OACE,OAAOA,GAAU,UACjB,OAAOA,GAAU,UACjBD,EAAaC,CAAK,CAEtB,CAkBO,SAASE,EAAUF,EAAoD,CAC5E,OAAQA,EAAsB,UAAY,UAC5C,CAkEO,SAASG,EACdH,EACyB,CACzB,MAAO,aAAcA,CACvB,CCzHO,SAASI,EACdC,KACGC,EACO,CACV,IAAMC,EAAqCF,EAAQ,QAAQ,CAACG,EAAQC,IAAQ,CAC1E,IAAMC,EAAQJ,EAAOG,CAAG,EACxB,OAAIC,IAAU,OACL,CAACF,CAAM,EAGT,MAAM,QAAQE,CAAK,EAAI,CAACF,EAAQ,GAAGE,CAAK,EAAI,CAACF,EAAQE,CAAK,CACnE,CAAC,EAED,OAAO,IAAIC,EAAaJ,CAAQ,CAClC,CAMA,IAAMI,EAAN,KAAuC,CAGrC,YAA4BJ,EAAoC,CAApC,cAAAA,EAF5BK,EAAA,KAAQ,SAEyD,CAEjE,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,MAAMC,EAA4B,CAChC,YAAK,OAASA,EACP,IACT,CAEA,QAAQC,EAAoB,CAC1B,IAAIV,EAAO,GAEX,QAAWW,KAAK,KAAK,SACnB,GAAI,OAAOA,GAAM,WAAY,CAC3B,IAAMC,EAASD,EAAGE,GAAaH,EAAI,OAAOG,CAAQ,CAAC,EACnDb,GAAQU,EAAI,QAAQE,CAAM,CAC5B,MAAWjB,EAAagB,CAAC,EACvBX,GAAQU,EAAI,QAAQC,CAAC,EAErBX,GAAQ,OAAOW,CAAC,EAIpB,OAAOX,CACT,CAEA,UAAmB,CAnErB,IAAAc,EAoEI,MAAO,SAAQA,EAAA,KAAK,SAAL,KAAAA,EAAe,WAAW,EAC3C,CACF","sourcesContent":["import type { ISchema, Parsed } from 'typed-binary';\nimport type { WgslIdentifier } from './wgslIdentifier';\nimport type { WgslPlum } from './wgslPlum';\n\nexport type Wgsl = string | boolean | number | WgslResolvable;\n\n/**\n * Passed into each resolvable item. All sibling items share a resolution ctx,\n * and a new resolution ctx is made when going down each level in the tree.\n */\nexport interface ResolutionCtx {\n /**\n * Slots that were used by items resolved by this context.\n */\n readonly usedSlots: Iterable<WgslSlot<unknown>>;\n\n addDeclaration(item: WgslResolvable): void;\n addBinding(bindable: WgslBindable, identifier: WgslIdentifier): void;\n nameFor(token: WgslResolvable): string;\n /**\n * Unwraps all layers of slot indirection and returns the concrete value if available.\n * @throws {MissingSlotValueError}\n */\n unwrap<T>(eventual: Eventual<T>): T;\n resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;\n}\n\nexport interface WgslResolvable {\n readonly label?: string | undefined;\n\n resolve(ctx: ResolutionCtx): string;\n}\n\nexport function isResolvable(value: unknown): value is WgslResolvable {\n return (\n !!value &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'resolve' in value\n );\n}\n\nexport function isWgsl(value: unknown): value is Wgsl {\n return (\n typeof value === 'number' ||\n typeof value === 'string' ||\n isResolvable(value)\n );\n}\n\nexport interface WgslSlot<T> {\n readonly __brand: 'WgslSlot';\n\n readonly defaultValue: T | undefined;\n\n readonly label?: string | undefined;\n\n $name(label: string): WgslSlot<T>;\n\n /**\n * Used to determine if code generated using either value `a` or `b` in place\n * of the slot will be equivalent. Defaults to `Object.is`.\n */\n areEqual(a: T, b: T): boolean;\n}\n\nexport function isSlot<T>(value: unknown | WgslSlot<T>): value is WgslSlot<T> {\n return (value as WgslSlot<T>).__brand === 'WgslSlot';\n}\n\n/**\n * Represents a value that is available at resolution time.\n */\nexport type Eventual<T> = T | WgslSlot<T>;\n\nexport type EventualGetter = <T>(value: Eventual<T>) => T;\n\nexport type InlineResolve = (get: EventualGetter) => Wgsl;\n\nexport interface WgslResolvableSlot<T extends Wgsl>\n extends WgslResolvable,\n WgslSlot<T> {\n $name(label: string): WgslResolvableSlot<T>;\n}\n\nexport type SlotValuePair<T> = [WgslSlot<T>, T];\n\nexport interface WgslAllocatable<TData extends AnyWgslData = AnyWgslData> {\n /**\n * The data type this allocatable was constructed with.\n * It informs the size and format of data in both JS and\n * binary.\n */\n readonly dataType: TData;\n readonly initial?: Parsed<TData> | WgslPlum<Parsed<TData>> | undefined;\n readonly flags: GPUBufferUsageFlags;\n}\n\nexport interface WgslBindable<\n TData extends AnyWgslData = AnyWgslData,\n TUsage extends BufferUsage = BufferUsage,\n> extends WgslResolvable {\n readonly allocatable: WgslAllocatable<TData>;\n readonly usage: TUsage;\n}\n\nexport type BufferUsage = 'uniform' | 'readonly_storage' | 'mutable_storage';\n\nexport interface WgslData<TInner> extends ISchema<TInner>, WgslResolvable {\n readonly byteAlignment: number;\n readonly size: number;\n}\n\nexport type AnyWgslData = WgslData<unknown>;\n\nexport interface WgslPointer<\n TScope extends 'function',\n TInner extends AnyWgslData,\n> {\n readonly scope: TScope;\n readonly pointsTo: TInner;\n}\n\n/**\n * A virtual representation of a WGSL value.\n */\nexport type WgslValue<TDataType> = {\n readonly __dataType: TDataType;\n};\n\nexport type AnyWgslPointer = WgslPointer<'function', AnyWgslData>;\n\nexport type WgslFnArgument = AnyWgslPointer | AnyWgslData;\n\nexport function isPointer(\n value: AnyWgslPointer | AnyWgslData,\n): value is AnyWgslPointer {\n return 'pointsTo' in value;\n}\n","import {\n type InlineResolve,\n type ResolutionCtx,\n type Wgsl,\n type WgslResolvable,\n isResolvable,\n} from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport interface WgslCode extends WgslResolvable {\n $name(label?: string | undefined): WgslCode;\n}\n\nexport function code(\n strings: TemplateStringsArray,\n ...params: (Wgsl | Wgsl[] | InlineResolve)[]\n): WgslCode {\n const segments: (Wgsl | InlineResolve)[] = strings.flatMap((string, idx) => {\n const param = params[idx];\n if (param === undefined) {\n return [string];\n }\n\n return Array.isArray(param) ? [string, ...param] : [string, param];\n });\n\n return new WgslCodeImpl(segments);\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslCodeImpl implements WgslCode {\n private _label: string | undefined;\n\n constructor(public readonly segments: (Wgsl | InlineResolve)[]) {}\n\n get label() {\n return this._label;\n }\n\n $name(label?: string | undefined) {\n this._label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx) {\n let code = '';\n\n for (const s of this.segments) {\n if (typeof s === 'function') {\n const result = s((eventual) => ctx.unwrap(eventual));\n code += ctx.resolve(result);\n } else if (isResolvable(s)) {\n code += ctx.resolve(s);\n } else {\n code += String(s);\n }\n }\n\n return code;\n }\n\n toString(): string {\n return `code:${this._label ?? '<unnamed>'}`;\n }\n}\n"]}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var o=class t extends Error{constructor(s){super(`Missing value for '${s}'`);this.slot=s;Object.setPrototypeOf(this,t.prototype)}},e= exports.b =class t extends Error{constructor(){super("Recursive types are not supported in WGSL"),Object.setPrototypeOf(this,t.prototype)}};exports.a = o; exports.b = e;
2
- //# sourceMappingURL=chunk-G3U6RTMF.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/errors.ts"],"names":["MissingSlotValueError","_MissingSlotValueError","slot","RecursiveDataTypeError","_RecursiveDataTypeError"],"mappings":"AAKO,IAAMA,EAAN,MAAMC,UAA8B,KAAM,CAC/C,YAA4BC,EAAyB,CACnD,MAAM,sBAAsBA,CAAI,GAAG,EADT,UAAAA,EAI1B,OAAO,eAAe,KAAMD,EAAsB,SAAS,CAC7D,CACF,EAKaE,EAAN,MAAMC,UAA+B,KAAM,CAChD,aAAc,CACZ,MAAM,2CAA2C,EAGjD,OAAO,eAAe,KAAMA,EAAuB,SAAS,CAC9D,CACF","sourcesContent":["import type { WgslSlot } from './types';\n\n/**\n * @category Errors\n */\nexport class MissingSlotValueError extends Error {\n constructor(public readonly slot: WgslSlot<unknown>) {\n super(`Missing value for '${slot}'`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingSlotValueError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class RecursiveDataTypeError extends Error {\n constructor() {\n super('Recursive types are not supported in WGSL');\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, RecursiveDataTypeError.prototype);\n }\n}\n"]}
@@ -1,4 +0,0 @@
1
- import{a as _}from"./chunk-XGSMOADT.js";import{d as r,e as m,g as W,i as T}from"./chunk-TVPC7ZME.js";var g=class{constructor(){r(this,"lastUniqueId",0);r(this,"names",new WeakMap)}nameFor(e){let t=this.names.get(e);if(t===void 0){let s;e.label?(s=e.label.replaceAll(/\s/g,"_"),s=s.replaceAll(/[^\w\d]/g,"")):s="item",t=`${s}_${this.lastUniqueId++}`,this.names.set(e,t)}return t}},x=class{constructor(){r(this,"_usedNames",new Set);r(this,"_assignedNames",new WeakMap)}nameFor(e){let t=this._assignedNames.get(e);if(t!==void 0)return t;if(e.label===void 0)throw new Error("Unnamed item found when using a strict NameRegistry");let s=0,l=e.label;for(;this._usedNames.has(l);)s++,l=`${e.label}_${s}`;return this._usedNames.add(l),this._assignedNames.set(e,l),l}};var P={uniform:"uniform",mutable_storage:"storage, read_write",readonly_storage:"storage, read"},b=class{constructor(e,t){this.names=e;this._bindingGroup=t;r(this,"_memoizedResolves",new WeakMap);r(this,"_nextFreeBindingIdx",0);r(this,"_usedBindables",new Set);r(this,"_declarations",[])}get usedBindables(){return this._usedBindables}get declarations(){return this._declarations}getOrInstantiate(e,t){var u;let s=(u=this._memoizedResolves.get(e))!=null?u:[];for(let a of s)if([...a.slotToValueMap.entries()].every(([o,R])=>t.readSlot(o)===R))return a.result;let l=e.resolve(t),i=new Map;for(let a of t.usedSlots)i.set(a,t.readSlot(a));return s.push({slotToValueMap:i,result:l}),this._memoizedResolves.set(e,s),l}reserveBindingEntry(e){return this._usedBindables.add(e),{group:this._bindingGroup,idx:this._nextFreeBindingIdx++}}addDeclaration(e){this._declarations.push(e)}},p=class{constructor({names:e,bindingGroup:t}){r(this,"_shared");r(this,"usedSlots",new Set);this._shared=new b(e,t!=null?t:0)}get usedBindables(){return this._shared.usedBindables}addDeclaration(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}addBinding(e,t){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){if(e.defaultValue===void 0)throw new _(e);return e.defaultValue}unwrap(e){throw new Error("Call ctx.resolve(item) instead of item.resolve(ctx)")}resolve(e,t=[]){if(!m(e))return String(e);let s=new c(this,this._shared,t),l=this._shared.getOrInstantiate(e,s);return`${[...this._shared.declarations].join(`
2
-
3
- `)}${l}`}},c=class n{constructor(e,t,s){this._parent=e;this._shared=t;this._slotValuePairs=s;r(this,"usedSlots",new Set)}addDeclaration(e){this._shared.addDeclaration(this.resolve(e))}addBinding(e,t){let{group:s,idx:l}=this._shared.reserveBindingEntry(e);this.addDeclaration(T`@group(${s}) @binding(${l}) var<${P[e.usage]}> ${t}: ${e.allocatable.dataType};`)}nameFor(e){return this._shared.names.nameFor(e)}readSlot(e){let t=this._slotValuePairs.find(([s])=>s===e);return t?(this.usedSlots.add(e),t[1]):(this.usedSlots.add(e),this._parent.readSlot(e))}unwrap(e){let t=e;for(;W(t);)t=this.readSlot(t);return t}resolve(e,t=[]){if(!m(e))return String(e);let s=new n(this,this._shared,t);return this._shared.getOrInstantiate(e,s)}};var V={uniform:"uniform",mutable_storage:"storage",readonly_storage:"read-only-storage"},h=class{constructor(e,t){this.runtime=e;this.root=t}build(e){var a;let t=new p({names:(a=e.nameRegistry)!=null?a:new g,bindingGroup:e.bindingGroup}),s=t.resolve(this.root),l=Array.from(t.usedBindables),i=this.runtime.device.createBindGroupLayout({entries:l.map((d,o)=>({binding:o,visibility:e.shaderStage,buffer:{type:V[d.usage]}}))}),u=this.runtime.device.createBindGroup({layout:i,entries:l.map((d,o)=>({binding:o,resource:{buffer:this.runtime.bufferFor(d.allocatable)}}))});return{bindGroupLayout:i,bindGroup:u,code:s}}};var S=Symbol("This item can be set, owns its value (does not get value from an external source)");var w=Symbol("This plum's value is sourced from outside the runtime.");function z(n){return n[w]===!0}function A(n){return typeof n=="function"?new y(n):new f(n)}function j(n,e){return new v(n,e)}function q(n){return n.__brand==="WgslPlum"}var B,f=class{constructor(e){this._initial=e;r(this,"__brand","WgslPlum");r(this,B,!0);r(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>"}`}};B=S;var y=class{constructor(e){this._compute=e;r(this,"__brand","WgslPlum");r(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>"}`}},G,v=class{constructor(e,t){this._subscribe=e;this._getLatest=t;r(this,"__brand","WgslPlum");r(this,G,!0);r(this,"_label");r(this,"_prev");r(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>"}`}};G=w;export{g as a,x as b,h as c,z as d,A as e,j as f,q as g};
4
- //# sourceMappingURL=chunk-JJZKRDXD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/nameRegistry.ts","../src/resolutionCtx.ts","../src/programBuilder.ts","../src/settableTrait.ts","../src/wgslPlum.ts"],"sourcesContent":["import type { WgslResolvable } from './types';\n\nexport interface NameRegistry {\n nameFor(item: WgslResolvable): string;\n}\n\nexport class RandomNameRegistry implements NameRegistry {\n private lastUniqueId = 0;\n private names = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable) {\n let name = this.names.get(item);\n\n if (name === undefined) {\n // creating sanitized name\n let label: string;\n if (item.label) {\n label = item.label.replaceAll(/\\s/g, '_'); // whitespace -> _\n label = label.replaceAll(/[^\\w\\d]/g, ''); // removing illegal characters\n } else {\n label = 'item';\n }\n name = `${label}_${this.lastUniqueId++}`;\n this.names.set(item, name);\n }\n\n return name;\n }\n}\n\nexport class StrictNameRegistry implements NameRegistry {\n /**\n * Allows to provide a good fallback for instances of the\n * same function that are bound to different slot values.\n */\n private readonly _usedNames = new Set<string>();\n\n private readonly _assignedNames = new WeakMap<WgslResolvable, string>();\n\n nameFor(item: WgslResolvable): string {\n const assignedName = this._assignedNames.get(item);\n if (assignedName !== undefined) {\n return assignedName;\n }\n\n if (item.label === undefined) {\n throw new Error('Unnamed item found when using a strict NameRegistry');\n }\n\n let index = 0;\n let unusedName = item.label;\n while (this._usedNames.has(unusedName)) {\n index++;\n unusedName = `${item.label}_${index}`;\n }\n\n this._usedNames.add(unusedName);\n this._assignedNames.set(item, unusedName);\n return unusedName;\n }\n}\n","import { MissingSlotValueError } from './errors';\nimport type { NameRegistry } from './nameRegistry';\nimport {\n type BufferUsage,\n type Eventual,\n type ResolutionCtx,\n type SlotValuePair,\n type Wgsl,\n type WgslBindable,\n type WgslResolvable,\n type WgslSlot,\n isResolvable,\n isSlot,\n} from './types';\nimport { code } from './wgslCode';\nimport type { WgslIdentifier } from './wgslIdentifier';\n\nexport type ResolutionCtxImplOptions = {\n readonly names: NameRegistry;\n readonly bindingGroup?: number;\n};\n\ntype SlotToValueMap = Map<WgslSlot<unknown>, unknown>;\n\nconst usageToVarTemplateMap: Record<BufferUsage, string> = {\n uniform: 'uniform',\n mutable_storage: 'storage, read_write',\n readonly_storage: 'storage, read',\n};\n\nclass SharedResolutionState {\n private readonly _memoizedResolves = new WeakMap<\n // WeakMap because if the resolvable does not exist anymore,\n // apart from this map, there is no way to access the cached value anyway.\n WgslResolvable,\n { slotToValueMap: SlotToValueMap; result: string }[]\n >();\n\n private _nextFreeBindingIdx = 0;\n private readonly _usedBindables = new Set<WgslBindable>();\n private readonly _declarations: string[] = [];\n\n constructor(\n public readonly names: NameRegistry,\n private readonly _bindingGroup: number,\n ) {}\n\n get usedBindables(): Iterable<WgslBindable> {\n return this._usedBindables;\n }\n\n get declarations(): Iterable<string> {\n return this._declarations;\n }\n\n /**\n * @param item The item whose resolution should be either retrieved from the cache (if there is a cache hit), or resolved\n * with the `compute` method.\n * @param compute Returns the resolved item and the corresponding bindingMap. This result will be discarded if a sufficient cache entry is found.\n */\n getOrInstantiate(item: WgslResolvable, itemCtx: ScopedResolutionCtx): string {\n // All memoized versions of `item`\n const instances = this._memoizedResolves.get(item) ?? [];\n\n for (const instance of instances) {\n const slotValuePairs = [...instance.slotToValueMap.entries()];\n\n if (\n slotValuePairs.every(\n ([slot, expectedValue]) => itemCtx.readSlot(slot) === expectedValue,\n )\n ) {\n return instance.result;\n }\n }\n\n // If we got here, no item with the given slot-to-value combo exists in cache yet\n const result = item.resolve(itemCtx);\n\n // We know which bindables the item used while resolving\n const slotToValueMap = new Map<WgslSlot<unknown>, unknown>();\n for (const usedSlot of itemCtx.usedSlots) {\n slotToValueMap.set(usedSlot, itemCtx.readSlot(usedSlot));\n }\n\n instances.push({ slotToValueMap, result });\n this._memoizedResolves.set(item, instances);\n\n return result;\n }\n\n reserveBindingEntry(_bindable: WgslBindable) {\n this._usedBindables.add(_bindable);\n\n return { group: this._bindingGroup, idx: this._nextFreeBindingIdx++ };\n }\n\n addDeclaration(declaration: string) {\n this._declarations.push(declaration);\n }\n}\n\nexport class ResolutionCtxImpl implements ResolutionCtx {\n private readonly _shared: SharedResolutionState;\n\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor({ names, bindingGroup }: ResolutionCtxImplOptions) {\n this._shared = new SharedResolutionState(names, bindingGroup ?? 0);\n }\n\n get usedBindables() {\n return this._shared.usedBindables;\n }\n\n addDeclaration(_declaration: WgslResolvable) {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n addBinding(_bindable: WgslBindable, _identifier: WgslIdentifier): void {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n nameFor(item: WgslResolvable): string {\n return this._shared.names.nameFor(item);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n if (slot.defaultValue === undefined) {\n throw new MissingSlotValueError(slot);\n }\n\n return slot.defaultValue;\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n throw new Error('Call ctx.resolve(item) instead of item.resolve(ctx)');\n }\n\n resolve(item: Wgsl, slotValueOverrides: SlotValuePair<unknown>[] = []) {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n const result = this._shared.getOrInstantiate(item, itemCtx);\n\n return `${[...this._shared.declarations].join('\\n\\n')}${result}`;\n }\n}\n\nclass ScopedResolutionCtx implements ResolutionCtx {\n usedSlots = new Set<WgslSlot<unknown>>();\n\n constructor(\n private readonly _parent: ResolutionCtxImpl | ScopedResolutionCtx,\n private readonly _shared: SharedResolutionState,\n private readonly _slotValuePairs: SlotValuePair<unknown>[],\n ) {}\n\n addDeclaration(declaration: WgslResolvable): void {\n this._shared.addDeclaration(this.resolve(declaration));\n }\n\n addBinding(bindable: WgslBindable, identifier: WgslIdentifier): void {\n const { group, idx } = this._shared.reserveBindingEntry(bindable);\n\n this.addDeclaration(\n code`@group(${group}) @binding(${idx}) var<${usageToVarTemplateMap[bindable.usage]}> ${identifier}: ${bindable.allocatable.dataType};`,\n );\n }\n\n nameFor(token: WgslResolvable): string {\n return this._shared.names.nameFor(token);\n }\n\n readSlot<T>(slot: WgslSlot<T>): T {\n const slotToValuePair = this._slotValuePairs.find(\n ([boundSlot]) => boundSlot === slot,\n ) as SlotValuePair<T> | undefined;\n\n if (!slotToValuePair) {\n // Not yet available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n // Maybe the parent ctx has it.\n return this._parent.readSlot(slot);\n }\n\n // Available locally, ctx's owner resolvable depends on `slot`.\n this.usedSlots.add(slot);\n return slotToValuePair[1];\n }\n\n unwrap<T>(eventual: Eventual<T>): T {\n let maybeSlot = eventual;\n\n // Unwrapping all layers of slots.\n while (isSlot(maybeSlot)) {\n maybeSlot = this.readSlot(maybeSlot);\n }\n\n return maybeSlot;\n }\n\n resolve(\n item: Wgsl,\n slotValueOverrides: SlotValuePair<unknown>[] = [],\n ): string {\n if (!isResolvable(item)) {\n return String(item);\n }\n\n const itemCtx = new ScopedResolutionCtx(\n this,\n this._shared,\n slotValueOverrides,\n );\n\n return this._shared.getOrInstantiate(item, itemCtx);\n }\n}\n","import { type NameRegistry, RandomNameRegistry } from './nameRegistry';\nimport { ResolutionCtxImpl } from './resolutionCtx';\nimport type { TypeGpuRuntime } from './typegpuRuntime';\nimport type { BufferUsage, WgslResolvable } from './types';\n\nexport type Program = {\n readonly bindGroupLayout: GPUBindGroupLayout;\n readonly bindGroup: GPUBindGroup;\n readonly code: string;\n};\n\ntype BuildOptions = {\n shaderStage: number;\n bindingGroup: number;\n nameRegistry?: NameRegistry;\n};\n\nconst usageToBindingTypeMap: Record<BufferUsage, GPUBufferBindingType> = {\n uniform: 'uniform',\n mutable_storage: 'storage',\n readonly_storage: 'read-only-storage',\n};\n\nexport default class ProgramBuilder {\n constructor(\n private runtime: TypeGpuRuntime,\n private root: WgslResolvable,\n ) {}\n\n build(options: BuildOptions): Program {\n const ctx = new ResolutionCtxImpl({\n names: options.nameRegistry ?? new RandomNameRegistry(),\n bindingGroup: options.bindingGroup,\n });\n\n // Resolving code\n const codeString = ctx.resolve(this.root);\n const usedBindables = Array.from(ctx.usedBindables);\n\n const bindGroupLayout = this.runtime.device.createBindGroupLayout({\n entries: usedBindables.map((bindable, idx) => ({\n binding: idx,\n visibility: options.shaderStage,\n buffer: {\n type: usageToBindingTypeMap[bindable.usage],\n },\n })),\n });\n\n const bindGroup = this.runtime.device.createBindGroup({\n layout: bindGroupLayout,\n entries: usedBindables.map((bindable, idx) => ({\n binding: idx,\n resource: {\n buffer: this.runtime.bufferFor(bindable.allocatable),\n },\n })),\n });\n\n return {\n bindGroupLayout,\n bindGroup,\n code: codeString,\n };\n }\n}\n","export const WgslSettableTrait = Symbol(\n 'This item can be set, owns its value (does not get value from an external source)',\n);\n\nexport interface WgslSettable {\n readonly [WgslSettableTrait]: true;\n}\n\nexport function isSettable(\n value: WgslSettable | unknown,\n): value is WgslSettable {\n return (value as WgslSettable)[WgslSettableTrait] === true;\n}\n","import { type WgslSettable, WgslSettableTrait } from './settableTrait';\nimport type { Wgsl, WgslResolvable } from './types';\n\n// ----------\n// Public API\n// ----------\n\nexport type Getter = <T>(plum: WgslPlum<T>) => T;\nexport type Unsubscribe = () => unknown;\nexport type ExtractPlumValue<T> = T extends WgslPlum<infer TValue>\n ? TValue\n : never;\n\nexport interface WgslPlum<TValue = unknown> {\n readonly __brand: 'WgslPlum';\n\n $name(label: string): this;\n\n /**\n * Computes the value of this plum. Circumvents the store\n * memoization, so use with care.\n */\n compute(get: Getter): TValue;\n}\n\nexport const WgslExternalPlumTrait = Symbol(\n `This plum's value is sourced from outside the runtime.`,\n);\nexport interface WgslExternalPlum {\n readonly [WgslExternalPlumTrait]: true;\n\n readonly version: number;\n subscribe(listener: () => unknown): Unsubscribe;\n}\n\nexport function isExternalPlum(\n value: unknown | WgslExternalPlum,\n): value is WgslExternalPlum {\n return (value as WgslExternalPlum)[WgslExternalPlumTrait] === true;\n}\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T extends Wgsl>(\n compute: (get: Getter) => T,\n): WgslPlum<T> & WgslResolvable;\n\n/**\n * Creates a computed plum. Its value depends on the plums read using `get`\n * inside the `compute` function, so cannot be set imperatively.\n *\n * @param compute A pure function that describes this plum's value.\n */\nexport function plum<T>(compute: (get: Getter) => T): WgslPlum<T>;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T extends Wgsl>(\n initial: T,\n): WgslPlum<T> & WgslSettable & WgslResolvable;\n\n/**\n * Creates a plum with an initial value of `initial`.\n * Its value can be updated by calling `runtime.setPlum(thePlum, newValue)`.\n *\n * @param initial The initial value of this plum.\n */\nexport function plum<T>(initial: T): WgslPlum<T> & WgslSettable;\n\nexport function plum<T>(\n initialOrCompute: T | ((get: Getter) => T),\n): WgslPlum<T> | (WgslPlum<T> & WgslSettable) {\n if (typeof initialOrCompute === 'function') {\n return new WgslDerivedPlumImpl(initialOrCompute as (get: Getter) => T);\n }\n\n return new WgslSourcePlumImpl(initialOrCompute);\n}\n\nexport function plumFromEvent<T>(\n subscribe: (listener: () => unknown) => Unsubscribe,\n getLatest: () => T,\n): WgslPlum<T> & WgslExternalPlum {\n return new WgslExternalPlumImpl(subscribe, getLatest);\n}\n\nexport function isPlum<T>(value: WgslPlum<T> | unknown): value is WgslPlum<T> {\n return (value as WgslPlum).__brand === 'WgslPlum';\n}\n\n// --------------\n// Implementation\n// --------------\n\nclass WgslSourcePlumImpl<TValue> implements WgslPlum<TValue>, WgslSettable {\n readonly __brand = 'WgslPlum';\n readonly [WgslSettableTrait] = true;\n\n private _label: string | undefined;\n\n constructor(private readonly _initial: TValue) {}\n\n compute(_get: Getter) {\n return this._initial;\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslDerivedPlumImpl<TValue> implements WgslPlum<TValue> {\n readonly __brand = 'WgslPlum';\n private _label: string | undefined;\n\n constructor(private readonly _compute: (get: Getter) => TValue) {}\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n compute(get: Getter): TValue {\n return this._compute(get);\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n\nclass WgslExternalPlumImpl<TValue>\n implements WgslPlum<TValue>, WgslExternalPlum\n{\n readonly __brand = 'WgslPlum';\n readonly [WgslExternalPlumTrait] = true;\n\n private _label: string | undefined;\n private _prev: TValue;\n private _version = 0;\n\n constructor(\n private readonly _subscribe: (listener: () => unknown) => Unsubscribe,\n private readonly _getLatest: () => TValue,\n ) {\n this._prev = _getLatest();\n }\n\n $name(label: string): this {\n this._label = label;\n return this;\n }\n\n get label(): string | undefined {\n return this._label;\n }\n\n get version(): number {\n return this._version;\n }\n\n subscribe(listener: () => unknown): Unsubscribe {\n return this._subscribe(listener);\n }\n\n compute(): TValue {\n const latest = this._getLatest();\n\n if (!Object.is(latest, this._prev)) {\n this._version++;\n this._prev = latest;\n }\n\n return this._prev;\n }\n\n toString(): string {\n return `plum:${this._label ?? '<unnamed>'}`;\n }\n}\n"],"mappings":"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","names":["RandomNameRegistry","__publicField","item","name","label","StrictNameRegistry","assignedName","index","unusedName","usageToVarTemplateMap","SharedResolutionState","names","_bindingGroup","__publicField","item","itemCtx","_a","instances","instance","slot","expectedValue","result","slotToValueMap","usedSlot","_bindable","declaration","ResolutionCtxImpl","bindingGroup","_declaration","_identifier","MissingSlotValueError","eventual","slotValueOverrides","isResolvable","ScopedResolutionCtx","_ScopedResolutionCtx","_parent","_shared","_slotValuePairs","bindable","identifier","group","idx","code","token","slotToValuePair","boundSlot","maybeSlot","isSlot","usageToBindingTypeMap","ProgramBuilder","runtime","root","options","_a","ctx","ResolutionCtxImpl","RandomNameRegistry","codeString","usedBindables","bindGroupLayout","bindable","idx","bindGroup","WgslSettableTrait","WgslExternalPlumTrait","isExternalPlum","value","plum","initialOrCompute","WgslDerivedPlumImpl","WgslSourcePlumImpl","plumFromEvent","subscribe","getLatest","WgslExternalPlumImpl","isPlum","_a","_initial","__publicField","_get","label","WgslSettableTrait","_compute","get","_subscribe","_getLatest","listener","latest"]}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkAS7UPXZ3cjs = require('./chunk-AS7UPXZ3.cjs');var n=class{constructor(){_chunkAS7UPXZ3cjs.d.call(void 0, this,"label")}$name(e){return this.label=e,this}resolve(e){return e.nameFor(this)}toString(){var e;return`id:${(e=this.label)!=null?e:"<unnamed>"}`}};exports.a = n;
2
- //# sourceMappingURL=chunk-KBVQVOLY.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/wgslIdentifier.ts"],"names":["WgslIdentifier","__publicField","label","ctx","_a"],"mappings":"yCAKO,IAAMA,EAAN,KAA+C,CAA/C,cACLC,EAAA,cAEA,MAAMC,EAA2B,CAC/B,YAAK,MAAQA,EACN,IACT,CAEA,QAAQC,EAA4B,CAClC,OAAOA,EAAI,QAAQ,IAAI,CACzB,CAEA,UAAmB,CAjBrB,IAAAC,EAkBI,MAAO,OAAMA,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,EACxC,CACF","sourcesContent":["import type { ResolutionCtx, WgslResolvable } from './types';\n\n/**\n * Helpful when creating new Resolvable types. For internal use.\n */\nexport class WgslIdentifier implements WgslResolvable {\n label?: string | undefined;\n\n $name(label: string | undefined) {\n this.label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.nameFor(this);\n }\n\n toString(): string {\n return `id:${this.label ?? '<unnamed>'}`;\n }\n}\n"]}
@@ -1,2 +0,0 @@
1
- import{d as t}from"./chunk-TVPC7ZME.js";var n=class{constructor(){t(this,"label")}$name(e){return this.label=e,this}resolve(e){return e.nameFor(this)}toString(){var e;return`id:${(e=this.label)!=null?e:"<unnamed>"}`}};export{n as a};
2
- //# sourceMappingURL=chunk-OZ2XZ4ZA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/wgslIdentifier.ts"],"sourcesContent":["import type { ResolutionCtx, WgslResolvable } from './types';\n\n/**\n * Helpful when creating new Resolvable types. For internal use.\n */\nexport class WgslIdentifier implements WgslResolvable {\n label?: string | undefined;\n\n $name(label: string | undefined) {\n this.label = label;\n return this;\n }\n\n resolve(ctx: ResolutionCtx): string {\n return ctx.nameFor(this);\n }\n\n toString(): string {\n return `id:${this.label ?? '<unnamed>'}`;\n }\n}\n"],"mappings":"wCAKO,IAAMA,EAAN,KAA+C,CAA/C,cACLC,EAAA,cAEA,MAAMC,EAA2B,CAC/B,YAAK,MAAQA,EACN,IACT,CAEA,QAAQC,EAA4B,CAClC,OAAOA,EAAI,QAAQ,IAAI,CACzB,CAEA,UAAmB,CAjBrB,IAAAC,EAkBI,MAAO,OAAMA,EAAA,KAAK,QAAL,KAAAA,EAAc,WAAW,EACxC,CACF","names":["WgslIdentifier","__publicField","label","ctx","_a"]}
@@ -1,2 +0,0 @@
1
- var W=Object.defineProperty,y=Object.defineProperties;var f=Object.getOwnPropertyDescriptors;var a=Object.getOwnPropertySymbols;var d=Object.prototype.hasOwnProperty,u=Object.prototype.propertyIsEnumerable;var r=(e,l,t)=>l in e?W(e,l,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[l]=t,T=(e,l)=>{for(var t in l||(l={}))d.call(l,t)&&r(e,t,l[t]);if(a)for(var t of a(l))u.call(l,t)&&r(e,t,l[t]);return e},b=(e,l)=>y(e,f(l));var c=(e,l)=>{var t={};for(var n in e)d.call(e,n)&&l.indexOf(n)<0&&(t[n]=e[n]);if(e!=null&&a)for(var n of a(e))l.indexOf(n)<0&&u.call(e,n)&&(t[n]=e[n]);return t};var p=(e,l,t)=>(r(e,typeof l!="symbol"?l+"":l,t),t);function i(e){return!!e&&(typeof e=="object"||typeof e=="function")&&"resolve"in e}function m(e){return typeof e=="number"||typeof e=="string"||i(e)}function v(e){return e.__brand==="WgslSlot"}function S(e){return"pointsTo"in e}function D(e,...l){let t=e.flatMap((n,o)=>{let s=l[o];return s===void 0?[n]:Array.isArray(s)?[n,...s]:[n,s]});return new g(t)}var g=class{constructor(l){this.segments=l;p(this,"_label")}get label(){return this._label}$name(l){return this._label=l,this}resolve(l){let t="";for(let n of this.segments)if(typeof n=="function"){let o=n(s=>l.unwrap(s));t+=l.resolve(o)}else i(n)?t+=l.resolve(n):t+=String(n);return t}toString(){var l;return`code:${(l=this._label)!=null?l:"<unnamed>"}`}};export{T as a,b,c,p as d,i as e,m as f,v as g,S as h,D as i};
2
- //# sourceMappingURL=chunk-TVPC7ZME.js.map