Skip to content

Commit e9eb6f8

Browse files
authored
Merge branch 'main' into chore/lower-node-tgpucli
2 parents 03e5e80 + 5204990 commit e9eb6f8

10 files changed

Lines changed: 49 additions & 20 deletions

File tree

packages/typegpu/src/builtin.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ export type BuiltinSampleMask = Decorated<U32, [Builtin<'sample_mask'>]>;
3232
export type BuiltinLocalInvocationId = Decorated<Vec3u, [Builtin<'local_invocation_id'>]>;
3333
export type BuiltinLocalInvocationIndex = Decorated<U32, [Builtin<'local_invocation_index'>]>;
3434
export type BuiltinGlobalInvocationId = Decorated<Vec3u, [Builtin<'global_invocation_id'>]>;
35+
export type BuiltinGlobalInvocationIndex = Decorated<U32, [Builtin<'global_invocation_index'>]>;
3536
export type BuiltinWorkgroupId = Decorated<Vec3u, [Builtin<'workgroup_id'>]>;
37+
export type BuiltinWorkgroupIndex = Decorated<U32, [Builtin<'workgroup_index'>]>;
3638
export type BuiltinNumWorkgroups = Decorated<Vec3u, [Builtin<'num_workgroups'>]>;
3739
export type BuiltinSubgroupInvocationId = Decorated<U32, [Builtin<'subgroup_invocation_id'>]>;
3840
export type BuiltinSubgroupSize = Decorated<U32, [Builtin<'subgroup_size'>]>;
@@ -64,7 +66,12 @@ export const builtin = {
6466
localInvocationId: defineBuiltin<BuiltinLocalInvocationId>(vec3u, 'local_invocation_id'),
6567
localInvocationIndex: defineBuiltin<BuiltinLocalInvocationIndex>(u32, 'local_invocation_index'),
6668
globalInvocationId: defineBuiltin<BuiltinGlobalInvocationId>(vec3u, 'global_invocation_id'),
69+
globalInvocationIndex: defineBuiltin<BuiltinGlobalInvocationIndex>(
70+
u32,
71+
'global_invocation_index',
72+
),
6773
workgroupId: defineBuiltin<BuiltinWorkgroupId>(vec3u, 'workgroup_id'),
74+
workgroupIndex: defineBuiltin<BuiltinWorkgroupIndex>(u32, 'workgroup_index'),
6875
numWorkgroups: defineBuiltin<BuiltinNumWorkgroups>(vec3u, 'num_workgroups'),
6976
subgroupInvocationId: defineBuiltin<BuiltinSubgroupInvocationId>(u32, 'subgroup_invocation_id'),
7077
subgroupSize: defineBuiltin<BuiltinSubgroupSize>(u32, 'subgroup_size'),
@@ -77,7 +84,9 @@ export type AnyComputeBuiltin =
7784
| BuiltinLocalInvocationId
7885
| BuiltinLocalInvocationIndex
7986
| BuiltinGlobalInvocationId
87+
| BuiltinGlobalInvocationIndex
8088
| BuiltinWorkgroupId
89+
| BuiltinWorkgroupIndex
8190
| BuiltinNumWorkgroups
8291
| BuiltinSubgroupInvocationId
8392
| BuiltinSubgroupSize

packages/typegpu/src/core/pipeline/computePipeline.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { isGPUCommandEncoder, isGPUComputePassEncoder } from './typeGuards.ts';
1919
import { logDataFromGPU } from '../../tgsl/consoleLog/deserializers.ts';
2020
import type { LogResources } from '../../tgsl/consoleLog/types.ts';
2121
import { isGPUBuffer, type ResolutionCtx, type SelfResolvable } from '../../types.ts';
22-
import { wgslExtensions, wgslExtensionToFeatureName } from '../../wgslExtensions.ts';
22+
import { wgslEnableExtensions, wgslEnableExtensionToFeatureName } from '../../wgslExtensions.ts';
2323
import type { IORecord } from '../function/fnTypes.ts';
2424
import type { TgpuComputeFn } from '../function/tgpuComputeFn.ts';
2525
import { namespace } from '../resolve/namespace.ts';
@@ -355,8 +355,8 @@ class ComputePipelineCore implements SelfResolvable {
355355
public unwrap(): Memo {
356356
if (this._memo === undefined) {
357357
const device = this.root.device;
358-
const enableExtensions = wgslExtensions.filter((extension) =>
359-
this.root.enabledFeatures.has(wgslExtensionToFeatureName[extension]),
358+
const enableExtensions = wgslEnableExtensions.filter((extension) =>
359+
this.root.enabledFeatures.has(wgslEnableExtensionToFeatureName[extension]),
360360
);
361361

362362
// Resolving code

packages/typegpu/src/core/pipeline/renderPipeline.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import { logDataFromGPU } from '../../tgsl/consoleLog/deserializers.ts';
3838
import type { LogResources } from '../../tgsl/consoleLog/types.ts';
3939
import type { ResolutionCtx, SelfResolvable } from '../../types.ts';
4040
import { isGPUBuffer } from '../../types.ts';
41-
import { wgslExtensions, wgslExtensionToFeatureName } from '../../wgslExtensions.ts';
41+
import { wgslEnableExtensions, wgslEnableExtensionToFeatureName } from '../../wgslExtensions.ts';
4242
import {
4343
type AnyAutoCustoms,
4444
AutoFragmentFn,
@@ -1073,8 +1073,8 @@ class RenderPipelineCore implements SelfResolvable {
10731073

10741074
const { root, descriptor: tgpuDescriptor } = this.options;
10751075
const device = root.device;
1076-
const enableExtensions = wgslExtensions.filter((extension) =>
1077-
root.enabledFeatures.has(wgslExtensionToFeatureName[extension]),
1076+
const enableExtensions = wgslEnableExtensions.filter((extension) =>
1077+
root.enabledFeatures.has(wgslEnableExtensionToFeatureName[extension]),
10781078
);
10791079

10801080
// Resolving code

packages/typegpu/src/core/resolve/tgpuResolve.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { $internal, $resolve } from '../../shared/symbols.ts';
55
import { isBindGroupLayout } from '../../tgpuBindGroupLayout.ts';
66
import type { ShaderGenerator } from '../../tgsl/shaderGenerator.ts';
77
import type { ResolvableObject, SelfResolvable, Wgsl } from '../../types.ts';
8-
import type { WgslExtension } from '../../wgslExtensions.ts';
8+
import type { WgslEnableExtension } from '../../wgslExtensions.ts';
99
import { isPipeline } from '../pipeline/typeGuards.ts';
1010
import type { Configurable, ExperimentalTgpuRoot } from '../root/rootTypes.ts';
1111
import { applyExternals, replaceExternalsInWgsl } from './externals.ts';
@@ -32,7 +32,7 @@ export interface TgpuResolveOptions {
3232
/**
3333
* List of WGSL shader extensions to enable.
3434
*/
35-
enableExtensions?: WgslExtension[] | undefined;
35+
enableExtensions?: WgslEnableExtension[] | undefined;
3636
/**
3737
* **NOTE: This is an unstable API and may change in the future.**
3838
*

packages/typegpu/src/data/attributes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ export const builtinNames = [
7575
'local_invocation_id',
7676
'local_invocation_index',
7777
'global_invocation_id',
78+
'global_invocation_index',
7879
'workgroup_id',
80+
'workgroup_index',
7981
'num_workgroups',
8082
'subgroup_invocation_id',
8183
'subgroup_size',

packages/typegpu/src/resolutionCtx.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ import type {
5050
Wgsl,
5151
} from './types.ts';
5252
import { CodegenState, isSelfResolvable, NormalState } from './types.ts';
53-
import type { WgslExtension } from './wgslExtensions.ts';
53+
import type { WgslEnableExtension } from './wgslExtensions.ts';
5454
import { getName, hasTinyestMetadata, setName } from './shared/meta.ts';
5555
import { FuncParameterType } from 'tinyest';
5656
import { accessProp } from './tgsl/accessProp.ts';
@@ -73,7 +73,7 @@ import { validateIdentifier, sanitizePrimer } from './nameUtils.ts';
7373
const CATCHALL_BIND_GROUP_IDX_MARKER = '#CATCHALL#';
7474

7575
export type ResolutionCtxImplOptions = {
76-
readonly enableExtensions?: WgslExtension[] | undefined;
76+
readonly enableExtensions?: WgslEnableExtension[] | undefined;
7777
readonly shaderGenerator?: ShaderGenerator | undefined;
7878
readonly config?: ((cfg: Configurable) => Configurable) | undefined;
7979
readonly root?: ExperimentalTgpuRoot | undefined;
@@ -400,7 +400,7 @@ export class ResolutionCtxImpl implements ResolutionCtx {
400400
public readonly fixedBindings: FixedBindingConfig[] = [];
401401
// --
402402

403-
public readonly enableExtensions: WgslExtension[] | undefined;
403+
public readonly enableExtensions: WgslEnableExtension[] | undefined;
404404
public expectedType: BaseData | undefined;
405405

406406
/**

packages/typegpu/src/std/extensions.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import { comptime } from '../core/function/comptime.ts';
22
import { getResolutionCtx } from '../execMode.ts';
3-
import { type WgslExtension, wgslExtensions } from '../wgslExtensions.ts';
3+
import { type WgslEnableExtension, wgslEnableExtensions } from '../wgslExtensions.ts';
44

5-
export const extensionEnabled = comptime((extensionName: WgslExtension): boolean => {
5+
export const extensionEnabled = comptime((extensionName: WgslEnableExtension): boolean => {
66
const resolutionCtx = getResolutionCtx();
77
if (!resolutionCtx) {
88
throw new Error(
99
"Functions using `extensionEnabled` cannot be called directly. Either generate WGSL from them, or use tgpu['~unstable'].simulate(...)",
1010
);
1111
}
1212

13-
if (typeof extensionName !== 'string' || !wgslExtensions.includes(extensionName)) {
13+
if (typeof extensionName !== 'string' || !wgslEnableExtensions.includes(extensionName)) {
1414
throw new Error(
1515
`extensionEnabled has to be called with a string literal representing a valid WGSL extension name. Got: '${extensionName}'`,
1616
);

packages/typegpu/src/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import {
4545
$resolve,
4646
} from './shared/symbols.ts';
4747
import type { TgpuBindGroupLayout, TgpuLayoutEntry } from './tgpuBindGroupLayout.ts';
48-
import type { WgslExtension } from './wgslExtensions.ts';
48+
import type { WgslEnableExtension } from './wgslExtensions.ts';
4949
import type { Infer } from './shared/repr.ts';
5050
import { ShaderGenerator } from './tgsl/shaderGenerator.ts';
5151

@@ -275,7 +275,7 @@ export interface ResolutionCtx {
275275
};
276276

277277
readonly mode: ExecState;
278-
readonly enableExtensions: WgslExtension[] | undefined;
278+
readonly enableExtensions: WgslEnableExtension[] | undefined;
279279
readonly gen: ShaderGenerator;
280280

281281
addDeclaration(declaration: string): void;
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
export const wgslExtensions = [
1+
export const wgslEnableExtensions = [
22
'f16',
33
'clip_distances',
44
'dual_source_blending',
55
'subgroups',
66
'primitive_index',
77
] as const;
8-
export type WgslExtension = (typeof wgslExtensions)[number];
8+
export type WgslEnableExtension = (typeof wgslEnableExtensions)[number];
99

10-
export const wgslExtensionToFeatureName: Record<WgslExtension, GPUFeatureName> = {
10+
export const wgslEnableExtensionToFeatureName: Record<WgslEnableExtension, GPUFeatureName> = {
1111
f16: 'shader-f16',
1212
clip_distances: 'clip-distances',
1313
dual_source_blending: 'dual-source-blending',
1414
subgroups: 'subgroups',
15-
primitive_index: 'primitive-index' as GPUFeatureName,
15+
primitive_index: 'primitive-index',
1616
};

packages/typegpu/tests/tgslFn.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,24 @@ describe('TGSL tgpu.fn function', () => {
302302
`);
303303
});
304304

305+
it('resolves linear compute builtins', () => {
306+
const computeFn = tgpu.computeFn({
307+
in: {
308+
globalIndex: builtin.globalInvocationIndex,
309+
workgroupIndex: builtin.workgroupIndex,
310+
},
311+
workgroupSize: [24],
312+
})((input) => {
313+
const index = input.globalIndex + input.workgroupIndex;
314+
});
315+
316+
expect(tgpu.resolve([computeFn])).toMatchInlineSnapshot(`
317+
"@compute @workgroup_size(24) fn computeFn(@builtin(global_invocation_index) globalIndex: u32, @builtin(workgroup_index) workgroupIndex: u32) {
318+
let index = (globalIndex + workgroupIndex);
319+
}"
320+
`);
321+
});
322+
305323
it('allows destructuring the input argument in computeFn', () => {
306324
const computeFn = tgpu
307325
.computeFn({

0 commit comments

Comments
 (0)