typegpu 0.3.0-alpha.5 → 0.3.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { T as TgpuNamable, D as Default, F as F32, U as U32, I as I32, V as Vec4f, a as Vec4u, b as Vec4i, c as UnionToIntersection, A as AnyData, d as Infer, E as Exotic, O as OmitProps, P as Prettify, M as Mutable, W as WgslTypeLiteral, B as BaseWgslData, e as AnyWgslData } from './utilityTypes-CRzYf73j.cjs';
1
+ import { T as TgpuNamable, I as Infer, D as Default, F as F32, U as U32, a as I32, V as Vec4f, b as Vec4u, c as Vec4i, d as UnionToIntersection, A as AnyData, E as Exotic, O as OmitProps, P as Prettify, M as Mutable, W as WgslTypeLiteral, B as BaseWgslData, e as AnyWgslData } from './utilityTypes-D53GCmPw.cjs';
2
2
  import * as smol from 'tinyest';
3
3
  import { Block } from 'tinyest';
4
4
 
@@ -22,6 +22,32 @@ interface JitTranspiler {
22
22
  transpileFn(rawJs: string): TranspilationResult;
23
23
  }
24
24
 
25
+ interface TgpuSlot<T> extends TgpuNamable {
26
+ readonly resourceType: 'slot';
27
+ readonly defaultValue: T | undefined;
28
+ readonly label?: string | undefined;
29
+ /**
30
+ * Used to determine if code generated using either value `a` or `b` in place
31
+ * of the slot will be equivalent. Defaults to `Object.is`.
32
+ */
33
+ areEqual(a: T, b: T): boolean;
34
+ readonly value: Infer<T>;
35
+ }
36
+ interface TgpuDerived<T> {
37
+ readonly resourceType: 'derived';
38
+ readonly value: Infer<T>;
39
+ with<TValue>(slot: TgpuSlot<TValue>, value: Eventual<TValue>): TgpuDerived<T>;
40
+ /**
41
+ * @internal
42
+ */
43
+ '~compute'(): T;
44
+ }
45
+ /**
46
+ * Represents a value that is available at resolution time.
47
+ */
48
+ type Eventual<T> = T | TgpuSlot<T> | TgpuDerived<T>;
49
+ type SlotValuePair<T> = [TgpuSlot<T>, T];
50
+
25
51
  interface NameRegistry {
26
52
  /**
27
53
  * Creates a valid WGSL identifier, each guaranteed to be unique
@@ -34,7 +60,7 @@ interface NameRegistry {
34
60
  interface NotAllowed<TMsg> {
35
61
  reason: TMsg;
36
62
  }
37
- type ExtensionGuard<TFlag, TMsg, TAllowed> = boolean extends TFlag ? NotAllowed<TMsg> : TAllowed;
63
+ type ExtensionGuard<TFlag, TMsg, TAllowed> = boolean extends TFlag ? NotAllowed<TMsg> | TAllowed : TAllowed;
38
64
  interface Storage {
39
65
  usableAsStorage: true;
40
66
  }
@@ -155,6 +181,30 @@ declare const texelFormatToChannelType: {
155
181
  'astc-12x12-unorm-srgb': F32;
156
182
  };
157
183
  type TexelFormatToChannelType = typeof texelFormatToChannelType;
184
+ type TexelFormatToStringChannels = {
185
+ [Key in keyof TexelFormatToChannelType]: TexelFormatToChannelType[Key]['type'];
186
+ };
187
+ type KeysWithValue<T extends Record<string, unknown>, TValue> = keyof {
188
+ [Key in keyof T as T[Key] extends TValue ? Key : never]: Key;
189
+ };
190
+ type ChannelTypeToLegalFormats = {
191
+ [Key in TexelFormatToChannelType[keyof TexelFormatToChannelType]['type']]: KeysWithValue<TexelFormatToStringChannels, Key>;
192
+ };
193
+ type SampleTypeToStringChannelType = {
194
+ float: 'f32';
195
+ 'unfilterable-float': 'f32';
196
+ depth: 'f32';
197
+ sint: 'i32';
198
+ uint: 'u32';
199
+ };
200
+ type ViewDimensionToDimension = {
201
+ '1d': '1d';
202
+ '2d': '2d';
203
+ '2d-array': '2d';
204
+ '3d': '3d';
205
+ cube: '2d';
206
+ 'cube-array': '2d';
207
+ };
158
208
  /**
159
209
  * https://www.w3.org/TR/WGSL/#storage-texel-formats
160
210
  */
@@ -178,6 +228,14 @@ declare const texelFormatToDataType: {
178
228
  readonly rgba32float: Vec4f;
179
229
  readonly bgra8unorm: Vec4f;
180
230
  };
231
+ declare const channelFormatToSchema: {
232
+ float: F32;
233
+ 'unfilterable-float': F32;
234
+ uint: U32;
235
+ sint: I32;
236
+ depth: F32;
237
+ };
238
+ type ChannelFormatToSchema = typeof channelFormatToSchema;
181
239
  type TexelFormatToDataType = typeof texelFormatToDataType;
182
240
  type TexelFormatToDataTypeOrNever<T> = T extends keyof TexelFormatToDataType ? TexelFormatToDataType[T] : never;
183
241
  /**
@@ -453,7 +511,7 @@ type TgpuLayoutExternalTexture = TgpuLayoutEntryBase & {
453
511
  externalTexture: Record<string, never>;
454
512
  };
455
513
  type TgpuLayoutEntry = TgpuLayoutUniform | TgpuLayoutStorage | TgpuLayoutSampler | TgpuLayoutTexture | TgpuLayoutStorageTexture | TgpuLayoutExternalTexture;
456
- type UnwrapRuntimeConstructorInner<T extends BaseWgslData | ((_: number) => BaseWgslData)> = T extends BaseWgslData ? T : T extends (_: number) => infer Return ? Return : never;
514
+ type UnwrapRuntimeConstructorInner<T extends BaseWgslData | ((_: number) => BaseWgslData)> = T extends (_: number) => BaseWgslData ? ReturnType<T> : T;
457
515
  type UnwrapRuntimeConstructor<T extends AnyData | ((_: number) => AnyData)> = T extends unknown ? UnwrapRuntimeConstructorInner<T> : never;
458
516
  interface TgpuBindGroupLayout<Entries extends Record<string, TgpuLayoutEntry | null> = Record<string, TgpuLayoutEntry | null>> extends TgpuNamable {
459
517
  readonly resourceType: 'bind-group-layout';
@@ -484,10 +542,29 @@ interface TgpuBindGroupLayout<Entries extends Record<string, TgpuLayoutEntry | n
484
542
  type StorageUsageForEntry<T extends TgpuLayoutStorage> = T extends {
485
543
  access?: infer Access;
486
544
  } ? 'mutable' | 'readonly' extends Access ? TgpuBufferReadonly$1<UnwrapRuntimeConstructor<T['storage']>> | TgpuBufferMutable$1<UnwrapRuntimeConstructor<T['storage']>> : 'readonly' extends Access ? TgpuBufferReadonly$1<UnwrapRuntimeConstructor<T['storage']>> : 'mutable' extends Access ? TgpuBufferMutable$1<UnwrapRuntimeConstructor<T['storage']>> : TgpuBufferReadonly$1<UnwrapRuntimeConstructor<T['storage']>> | TgpuBufferMutable$1<UnwrapRuntimeConstructor<T['storage']>> : TgpuBufferReadonly$1<UnwrapRuntimeConstructor<T['storage']>>;
487
- type LayoutEntryToInput<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? (TgpuBuffer$1<UnwrapRuntimeConstructor<T['uniform']>> & Uniform) | GPUBuffer : T extends TgpuLayoutStorage ? (TgpuBuffer$1<UnwrapRuntimeConstructor<T['storage']>> & Storage) | GPUBuffer : T extends TgpuLayoutSampler ? GPUSampler : T extends TgpuLayoutTexture ? // TODO: Allow sampled usages here
488
- GPUTextureView | TgpuTexture : T extends TgpuLayoutStorageTexture ? // TODO: Allow storage usages here
489
- GPUTextureView | TgpuTexture : T extends TgpuLayoutExternalTexture ? GPUExternalTexture : never;
490
- type BindLayoutEntry<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? TgpuBufferUniform$1<UnwrapRuntimeConstructor<T['uniform']>> : T extends TgpuLayoutStorage ? StorageUsageForEntry<T> : T extends TgpuLayoutSampler ? TgpuSampler : never;
545
+ type GetUsageForStorageTexture<T extends TgpuLayoutStorageTexture, TAccess extends 'readonly' | 'writeonly' | 'mutable'> = {
546
+ mutable: TgpuMutableTexture<Default<GetDimension<T['viewDimension']>, '2d'>, TexelFormatToDataType[T['storageTexture']]>;
547
+ readonly: TgpuReadonlyTexture<Default<GetDimension<T['viewDimension']>, '2d'>, TexelFormatToDataType[T['storageTexture']]>;
548
+ writeonly: TgpuWriteonlyTexture<Default<GetDimension<T['viewDimension']>, '2d'>, TexelFormatToDataType[T['storageTexture']]>;
549
+ }[TAccess];
550
+ type StorageTextureUsageForEntry<T extends TgpuLayoutStorageTexture> = T extends unknown ? GetUsageForStorageTexture<T, Default<T['access'], 'writeonly'>> : never;
551
+ type GetDimension<T extends GPUTextureViewDimension | undefined> = T extends keyof ViewDimensionToDimension ? ViewDimensionToDimension[T] : undefined;
552
+ type GetTextureRestriction<T extends TgpuLayoutTexture> = Default<GetDimension<T['viewDimension']>, '2d'> extends infer Dimension ? Dimension extends '2d' ? {
553
+ format: ChannelTypeToLegalFormats[SampleTypeToStringChannelType[T['texture']]];
554
+ dimension?: Dimension;
555
+ } : {
556
+ format: ChannelTypeToLegalFormats[SampleTypeToStringChannelType[T['texture']]];
557
+ dimension: Dimension;
558
+ } : never;
559
+ type GetStorageTextureRestriction<T extends TgpuLayoutStorageTexture> = Default<GetDimension<T['viewDimension']>, '2d'> extends infer Dimension ? Dimension extends '2d' ? {
560
+ format: T['storageTexture'];
561
+ dimension?: Dimension;
562
+ } : {
563
+ format: T['storageTexture'];
564
+ dimension: Dimension;
565
+ } : never;
566
+ type LayoutEntryToInput<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? (TgpuBuffer$1<UnwrapRuntimeConstructor<T['uniform']>> & Uniform) | GPUBuffer : T extends TgpuLayoutStorage ? (TgpuBuffer$1<UnwrapRuntimeConstructor<T['storage']>> & Storage) | GPUBuffer : T extends TgpuLayoutSampler ? GPUSampler : T extends TgpuLayoutTexture ? GPUTextureView | (TgpuTexture<Prettify<TextureProps & GetTextureRestriction<T>>> & Sampled) : T extends TgpuLayoutStorageTexture ? GPUTextureView | (TgpuTexture<Prettify<TextureProps & GetStorageTextureRestriction<T>>> & Storage) : T extends TgpuLayoutExternalTexture ? GPUExternalTexture : never;
567
+ type BindLayoutEntry<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? TgpuBufferUniform$1<UnwrapRuntimeConstructor<T['uniform']>> : T extends TgpuLayoutStorage ? StorageUsageForEntry<T> : T extends TgpuLayoutSampler ? TgpuSampler : T extends TgpuLayoutTexture ? TgpuSampledTexture<Default<GetDimension<T['viewDimension']>, '2d'>, ChannelFormatToSchema[T['texture']]> : T extends TgpuLayoutStorageTexture ? StorageTextureUsageForEntry<T> : never;
491
568
  type TgpuBindGroup<Entries extends Record<string, TgpuLayoutEntry | null> = Record<string, TgpuLayoutEntry | null>> = {
492
569
  readonly resourceType: 'bind-group';
493
570
  readonly layout: TgpuBindGroupLayout<Entries>;
@@ -501,7 +578,7 @@ type ExoticEntries<T extends Record<string, TgpuLayoutEntry | null>> = {
501
578
  };
502
579
  declare function bindGroupLayout<Entries extends Record<string, TgpuLayoutEntry | null>>(entries: Entries): TgpuBindGroupLayout<Prettify<ExoticEntries<Entries>>>;
503
580
 
504
- type Wgsl = string | number | boolean | TgpuResolvable | AnyWgslData;
581
+ type Wgsl = Eventual<string | number | boolean | TgpuResolvable | AnyWgslData>;
505
582
  declare const UnknownData: unique symbol;
506
583
  type UnknownData = typeof UnknownData;
507
584
  type Resource = {
@@ -536,12 +613,14 @@ interface ResolutionCtx {
536
613
  group: string;
537
614
  binding: number;
538
615
  };
616
+ withSlots<T>(pairs: SlotValuePair<unknown>[], callback: () => T): T;
539
617
  /**
540
- * Unwraps all layers of slot indirection and returns the concrete value if available.
618
+ * Unwraps all layers of slot/derived indirection and returns the concrete value if available.
541
619
  * @throws {MissingSlotValueError}
542
620
  */
543
621
  unwrap<T>(eventual: Eventual<T>): T;
544
- resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;
622
+ resolve(item: Wgsl): string;
623
+ resolveValue<T extends BaseWgslData>(value: Infer<T>, schema: T): string;
545
624
  transpileFn(fn: string): {
546
625
  argNames: string[];
547
626
  body: Block;
@@ -556,23 +635,7 @@ interface TgpuResolvable {
556
635
  readonly label?: string | undefined;
557
636
  resolve(ctx: ResolutionCtx): string;
558
637
  }
559
- /**
560
- * Represents a value that is available at resolution time.
561
- */
562
- type Eventual<T> = T | TgpuSlot<T>;
563
- type SlotValuePair<T> = [TgpuSlot<T>, T];
564
638
  type BindableBufferUsage = 'uniform' | 'readonly' | 'mutable';
565
- interface TgpuSlot<T> extends TgpuNamable {
566
- readonly __brand: 'TgpuSlot';
567
- readonly defaultValue: T | undefined;
568
- readonly label?: string | undefined;
569
- /**
570
- * Used to determine if code generated using either value `a` or `b` in place
571
- * of the slot will be equivalent. Defaults to `Object.is`.
572
- */
573
- areEqual(a: T, b: T): boolean;
574
- readonly value: Infer<T>;
575
- }
576
639
 
577
640
  interface TgpuResolveOptions {
578
641
  input: string | TgpuResolvable | AnyWgslData | (string | TgpuResolvable | AnyWgslData)[];
@@ -643,9 +706,9 @@ declare function initFromDevice(options: InitFromDeviceOptions): TgpuRoot;
643
706
  */
644
707
  declare class ResolutionError extends Error {
645
708
  readonly cause: unknown;
646
- readonly trace: (TgpuResolvable | AnyWgslData)[];
647
- constructor(cause: unknown, trace: (TgpuResolvable | AnyWgslData)[]);
648
- appendToTrace(ancestor: TgpuResolvable | AnyWgslData): ResolutionError;
709
+ readonly trace: (TgpuResolvable | TgpuSlot<unknown> | TgpuDerived<unknown> | AnyWgslData)[];
710
+ constructor(cause: unknown, trace: (TgpuResolvable | TgpuSlot<unknown> | TgpuDerived<unknown> | AnyWgslData)[]);
711
+ appendToTrace(ancestor: TgpuResolvable | TgpuDerived<unknown> | AnyWgslData): ResolutionError;
649
712
  }
650
713
  /**
651
714
  * @category Errors
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { T as TgpuNamable, D as Default, F as F32, U as U32, I as I32, V as Vec4f, a as Vec4u, b as Vec4i, c as UnionToIntersection, A as AnyData, d as Infer, E as Exotic, O as OmitProps, P as Prettify, M as Mutable, W as WgslTypeLiteral, B as BaseWgslData, e as AnyWgslData } from './utilityTypes-CRzYf73j.js';
1
+ import { T as TgpuNamable, I as Infer, D as Default, F as F32, U as U32, a as I32, V as Vec4f, b as Vec4u, c as Vec4i, d as UnionToIntersection, A as AnyData, E as Exotic, O as OmitProps, P as Prettify, M as Mutable, W as WgslTypeLiteral, B as BaseWgslData, e as AnyWgslData } from './utilityTypes-D53GCmPw.js';
2
2
  import * as smol from 'tinyest';
3
3
  import { Block } from 'tinyest';
4
4
 
@@ -22,6 +22,32 @@ interface JitTranspiler {
22
22
  transpileFn(rawJs: string): TranspilationResult;
23
23
  }
24
24
 
25
+ interface TgpuSlot<T> extends TgpuNamable {
26
+ readonly resourceType: 'slot';
27
+ readonly defaultValue: T | undefined;
28
+ readonly label?: string | undefined;
29
+ /**
30
+ * Used to determine if code generated using either value `a` or `b` in place
31
+ * of the slot will be equivalent. Defaults to `Object.is`.
32
+ */
33
+ areEqual(a: T, b: T): boolean;
34
+ readonly value: Infer<T>;
35
+ }
36
+ interface TgpuDerived<T> {
37
+ readonly resourceType: 'derived';
38
+ readonly value: Infer<T>;
39
+ with<TValue>(slot: TgpuSlot<TValue>, value: Eventual<TValue>): TgpuDerived<T>;
40
+ /**
41
+ * @internal
42
+ */
43
+ '~compute'(): T;
44
+ }
45
+ /**
46
+ * Represents a value that is available at resolution time.
47
+ */
48
+ type Eventual<T> = T | TgpuSlot<T> | TgpuDerived<T>;
49
+ type SlotValuePair<T> = [TgpuSlot<T>, T];
50
+
25
51
  interface NameRegistry {
26
52
  /**
27
53
  * Creates a valid WGSL identifier, each guaranteed to be unique
@@ -34,7 +60,7 @@ interface NameRegistry {
34
60
  interface NotAllowed<TMsg> {
35
61
  reason: TMsg;
36
62
  }
37
- type ExtensionGuard<TFlag, TMsg, TAllowed> = boolean extends TFlag ? NotAllowed<TMsg> : TAllowed;
63
+ type ExtensionGuard<TFlag, TMsg, TAllowed> = boolean extends TFlag ? NotAllowed<TMsg> | TAllowed : TAllowed;
38
64
  interface Storage {
39
65
  usableAsStorage: true;
40
66
  }
@@ -155,6 +181,30 @@ declare const texelFormatToChannelType: {
155
181
  'astc-12x12-unorm-srgb': F32;
156
182
  };
157
183
  type TexelFormatToChannelType = typeof texelFormatToChannelType;
184
+ type TexelFormatToStringChannels = {
185
+ [Key in keyof TexelFormatToChannelType]: TexelFormatToChannelType[Key]['type'];
186
+ };
187
+ type KeysWithValue<T extends Record<string, unknown>, TValue> = keyof {
188
+ [Key in keyof T as T[Key] extends TValue ? Key : never]: Key;
189
+ };
190
+ type ChannelTypeToLegalFormats = {
191
+ [Key in TexelFormatToChannelType[keyof TexelFormatToChannelType]['type']]: KeysWithValue<TexelFormatToStringChannels, Key>;
192
+ };
193
+ type SampleTypeToStringChannelType = {
194
+ float: 'f32';
195
+ 'unfilterable-float': 'f32';
196
+ depth: 'f32';
197
+ sint: 'i32';
198
+ uint: 'u32';
199
+ };
200
+ type ViewDimensionToDimension = {
201
+ '1d': '1d';
202
+ '2d': '2d';
203
+ '2d-array': '2d';
204
+ '3d': '3d';
205
+ cube: '2d';
206
+ 'cube-array': '2d';
207
+ };
158
208
  /**
159
209
  * https://www.w3.org/TR/WGSL/#storage-texel-formats
160
210
  */
@@ -178,6 +228,14 @@ declare const texelFormatToDataType: {
178
228
  readonly rgba32float: Vec4f;
179
229
  readonly bgra8unorm: Vec4f;
180
230
  };
231
+ declare const channelFormatToSchema: {
232
+ float: F32;
233
+ 'unfilterable-float': F32;
234
+ uint: U32;
235
+ sint: I32;
236
+ depth: F32;
237
+ };
238
+ type ChannelFormatToSchema = typeof channelFormatToSchema;
181
239
  type TexelFormatToDataType = typeof texelFormatToDataType;
182
240
  type TexelFormatToDataTypeOrNever<T> = T extends keyof TexelFormatToDataType ? TexelFormatToDataType[T] : never;
183
241
  /**
@@ -453,7 +511,7 @@ type TgpuLayoutExternalTexture = TgpuLayoutEntryBase & {
453
511
  externalTexture: Record<string, never>;
454
512
  };
455
513
  type TgpuLayoutEntry = TgpuLayoutUniform | TgpuLayoutStorage | TgpuLayoutSampler | TgpuLayoutTexture | TgpuLayoutStorageTexture | TgpuLayoutExternalTexture;
456
- type UnwrapRuntimeConstructorInner<T extends BaseWgslData | ((_: number) => BaseWgslData)> = T extends BaseWgslData ? T : T extends (_: number) => infer Return ? Return : never;
514
+ type UnwrapRuntimeConstructorInner<T extends BaseWgslData | ((_: number) => BaseWgslData)> = T extends (_: number) => BaseWgslData ? ReturnType<T> : T;
457
515
  type UnwrapRuntimeConstructor<T extends AnyData | ((_: number) => AnyData)> = T extends unknown ? UnwrapRuntimeConstructorInner<T> : never;
458
516
  interface TgpuBindGroupLayout<Entries extends Record<string, TgpuLayoutEntry | null> = Record<string, TgpuLayoutEntry | null>> extends TgpuNamable {
459
517
  readonly resourceType: 'bind-group-layout';
@@ -484,10 +542,29 @@ interface TgpuBindGroupLayout<Entries extends Record<string, TgpuLayoutEntry | n
484
542
  type StorageUsageForEntry<T extends TgpuLayoutStorage> = T extends {
485
543
  access?: infer Access;
486
544
  } ? 'mutable' | 'readonly' extends Access ? TgpuBufferReadonly$1<UnwrapRuntimeConstructor<T['storage']>> | TgpuBufferMutable$1<UnwrapRuntimeConstructor<T['storage']>> : 'readonly' extends Access ? TgpuBufferReadonly$1<UnwrapRuntimeConstructor<T['storage']>> : 'mutable' extends Access ? TgpuBufferMutable$1<UnwrapRuntimeConstructor<T['storage']>> : TgpuBufferReadonly$1<UnwrapRuntimeConstructor<T['storage']>> | TgpuBufferMutable$1<UnwrapRuntimeConstructor<T['storage']>> : TgpuBufferReadonly$1<UnwrapRuntimeConstructor<T['storage']>>;
487
- type LayoutEntryToInput<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? (TgpuBuffer$1<UnwrapRuntimeConstructor<T['uniform']>> & Uniform) | GPUBuffer : T extends TgpuLayoutStorage ? (TgpuBuffer$1<UnwrapRuntimeConstructor<T['storage']>> & Storage) | GPUBuffer : T extends TgpuLayoutSampler ? GPUSampler : T extends TgpuLayoutTexture ? // TODO: Allow sampled usages here
488
- GPUTextureView | TgpuTexture : T extends TgpuLayoutStorageTexture ? // TODO: Allow storage usages here
489
- GPUTextureView | TgpuTexture : T extends TgpuLayoutExternalTexture ? GPUExternalTexture : never;
490
- type BindLayoutEntry<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? TgpuBufferUniform$1<UnwrapRuntimeConstructor<T['uniform']>> : T extends TgpuLayoutStorage ? StorageUsageForEntry<T> : T extends TgpuLayoutSampler ? TgpuSampler : never;
545
+ type GetUsageForStorageTexture<T extends TgpuLayoutStorageTexture, TAccess extends 'readonly' | 'writeonly' | 'mutable'> = {
546
+ mutable: TgpuMutableTexture<Default<GetDimension<T['viewDimension']>, '2d'>, TexelFormatToDataType[T['storageTexture']]>;
547
+ readonly: TgpuReadonlyTexture<Default<GetDimension<T['viewDimension']>, '2d'>, TexelFormatToDataType[T['storageTexture']]>;
548
+ writeonly: TgpuWriteonlyTexture<Default<GetDimension<T['viewDimension']>, '2d'>, TexelFormatToDataType[T['storageTexture']]>;
549
+ }[TAccess];
550
+ type StorageTextureUsageForEntry<T extends TgpuLayoutStorageTexture> = T extends unknown ? GetUsageForStorageTexture<T, Default<T['access'], 'writeonly'>> : never;
551
+ type GetDimension<T extends GPUTextureViewDimension | undefined> = T extends keyof ViewDimensionToDimension ? ViewDimensionToDimension[T] : undefined;
552
+ type GetTextureRestriction<T extends TgpuLayoutTexture> = Default<GetDimension<T['viewDimension']>, '2d'> extends infer Dimension ? Dimension extends '2d' ? {
553
+ format: ChannelTypeToLegalFormats[SampleTypeToStringChannelType[T['texture']]];
554
+ dimension?: Dimension;
555
+ } : {
556
+ format: ChannelTypeToLegalFormats[SampleTypeToStringChannelType[T['texture']]];
557
+ dimension: Dimension;
558
+ } : never;
559
+ type GetStorageTextureRestriction<T extends TgpuLayoutStorageTexture> = Default<GetDimension<T['viewDimension']>, '2d'> extends infer Dimension ? Dimension extends '2d' ? {
560
+ format: T['storageTexture'];
561
+ dimension?: Dimension;
562
+ } : {
563
+ format: T['storageTexture'];
564
+ dimension: Dimension;
565
+ } : never;
566
+ type LayoutEntryToInput<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? (TgpuBuffer$1<UnwrapRuntimeConstructor<T['uniform']>> & Uniform) | GPUBuffer : T extends TgpuLayoutStorage ? (TgpuBuffer$1<UnwrapRuntimeConstructor<T['storage']>> & Storage) | GPUBuffer : T extends TgpuLayoutSampler ? GPUSampler : T extends TgpuLayoutTexture ? GPUTextureView | (TgpuTexture<Prettify<TextureProps & GetTextureRestriction<T>>> & Sampled) : T extends TgpuLayoutStorageTexture ? GPUTextureView | (TgpuTexture<Prettify<TextureProps & GetStorageTextureRestriction<T>>> & Storage) : T extends TgpuLayoutExternalTexture ? GPUExternalTexture : never;
567
+ type BindLayoutEntry<T extends TgpuLayoutEntry | null> = T extends TgpuLayoutUniform ? TgpuBufferUniform$1<UnwrapRuntimeConstructor<T['uniform']>> : T extends TgpuLayoutStorage ? StorageUsageForEntry<T> : T extends TgpuLayoutSampler ? TgpuSampler : T extends TgpuLayoutTexture ? TgpuSampledTexture<Default<GetDimension<T['viewDimension']>, '2d'>, ChannelFormatToSchema[T['texture']]> : T extends TgpuLayoutStorageTexture ? StorageTextureUsageForEntry<T> : never;
491
568
  type TgpuBindGroup<Entries extends Record<string, TgpuLayoutEntry | null> = Record<string, TgpuLayoutEntry | null>> = {
492
569
  readonly resourceType: 'bind-group';
493
570
  readonly layout: TgpuBindGroupLayout<Entries>;
@@ -501,7 +578,7 @@ type ExoticEntries<T extends Record<string, TgpuLayoutEntry | null>> = {
501
578
  };
502
579
  declare function bindGroupLayout<Entries extends Record<string, TgpuLayoutEntry | null>>(entries: Entries): TgpuBindGroupLayout<Prettify<ExoticEntries<Entries>>>;
503
580
 
504
- type Wgsl = string | number | boolean | TgpuResolvable | AnyWgslData;
581
+ type Wgsl = Eventual<string | number | boolean | TgpuResolvable | AnyWgslData>;
505
582
  declare const UnknownData: unique symbol;
506
583
  type UnknownData = typeof UnknownData;
507
584
  type Resource = {
@@ -536,12 +613,14 @@ interface ResolutionCtx {
536
613
  group: string;
537
614
  binding: number;
538
615
  };
616
+ withSlots<T>(pairs: SlotValuePair<unknown>[], callback: () => T): T;
539
617
  /**
540
- * Unwraps all layers of slot indirection and returns the concrete value if available.
618
+ * Unwraps all layers of slot/derived indirection and returns the concrete value if available.
541
619
  * @throws {MissingSlotValueError}
542
620
  */
543
621
  unwrap<T>(eventual: Eventual<T>): T;
544
- resolve(item: Wgsl, slotValueOverrides?: SlotValuePair<unknown>[]): string;
622
+ resolve(item: Wgsl): string;
623
+ resolveValue<T extends BaseWgslData>(value: Infer<T>, schema: T): string;
545
624
  transpileFn(fn: string): {
546
625
  argNames: string[];
547
626
  body: Block;
@@ -556,23 +635,7 @@ interface TgpuResolvable {
556
635
  readonly label?: string | undefined;
557
636
  resolve(ctx: ResolutionCtx): string;
558
637
  }
559
- /**
560
- * Represents a value that is available at resolution time.
561
- */
562
- type Eventual<T> = T | TgpuSlot<T>;
563
- type SlotValuePair<T> = [TgpuSlot<T>, T];
564
638
  type BindableBufferUsage = 'uniform' | 'readonly' | 'mutable';
565
- interface TgpuSlot<T> extends TgpuNamable {
566
- readonly __brand: 'TgpuSlot';
567
- readonly defaultValue: T | undefined;
568
- readonly label?: string | undefined;
569
- /**
570
- * Used to determine if code generated using either value `a` or `b` in place
571
- * of the slot will be equivalent. Defaults to `Object.is`.
572
- */
573
- areEqual(a: T, b: T): boolean;
574
- readonly value: Infer<T>;
575
- }
576
639
 
577
640
  interface TgpuResolveOptions {
578
641
  input: string | TgpuResolvable | AnyWgslData | (string | TgpuResolvable | AnyWgslData)[];
@@ -643,9 +706,9 @@ declare function initFromDevice(options: InitFromDeviceOptions): TgpuRoot;
643
706
  */
644
707
  declare class ResolutionError extends Error {
645
708
  readonly cause: unknown;
646
- readonly trace: (TgpuResolvable | AnyWgslData)[];
647
- constructor(cause: unknown, trace: (TgpuResolvable | AnyWgslData)[]);
648
- appendToTrace(ancestor: TgpuResolvable | AnyWgslData): ResolutionError;
709
+ readonly trace: (TgpuResolvable | TgpuSlot<unknown> | TgpuDerived<unknown> | AnyWgslData)[];
710
+ constructor(cause: unknown, trace: (TgpuResolvable | TgpuSlot<unknown> | TgpuDerived<unknown> | AnyWgslData)[]);
711
+ appendToTrace(ancestor: TgpuResolvable | TgpuDerived<unknown> | AnyWgslData): ResolutionError;
649
712
  }
650
713
  /**
651
714
  * @category Errors