Skip to content

Commit 6b7adf7

Browse files
committed
feat: makeDereferencable
1 parent a22dd50 commit 6b7adf7

3 files changed

Lines changed: 82 additions & 0 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { snip, type Origin } from '../data/snippet.ts';
2+
import type { BaseData } from '../data/wgslTypes.ts';
3+
import { $gpuValueOf, $internal, $ownSnippet, $resolve } from '../shared/symbols.ts';
4+
import { valueProxyHandler } from '../core/valueProxyUtils.ts';
5+
import type { SelfResolvable } from '../types.ts';
6+
7+
export function makeDereferencable<T extends SelfResolvable>(
8+
value: T,
9+
options: makeDereferencable.Options,
10+
): T {
11+
Object.defineProperty(value, $gpuValueOf, {
12+
value: function () {
13+
const [dataType, origin] = options.getDataTypeAndOrigin();
14+
15+
return new Proxy(
16+
{
17+
[$internal]: true,
18+
get [$ownSnippet]() {
19+
return snip(this, dataType, origin);
20+
},
21+
[$resolve]: (ctx) => ctx.resolve(this),
22+
toString: () => `${this.toString()}.$`,
23+
},
24+
valueProxyHandler,
25+
);
26+
},
27+
});
28+
29+
return value;
30+
}
31+
32+
export namespace makeDereferencable {
33+
export interface Options {
34+
getDataTypeAndOrigin(): [dataType: BaseData, origin: Origin];
35+
}
36+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { snip, type Origin, type ResolvedSnippet } from '../data/snippet.ts';
2+
import { type BaseData } from '../data/wgslTypes.ts';
3+
import { $internal, $resolve, isMarkedInternal } from '../shared/symbols.ts';
4+
import type { ResolutionCtx } from '../types.ts';
5+
6+
/**
7+
*
8+
* @param value
9+
* @param options
10+
* @returns
11+
*/
12+
export function makeResolvable<T>(
13+
value: T,
14+
options: makeResolvable.Options,
15+
): T & { [$resolve](ctx: ResolutionCtx): ResolvedSnippet } {
16+
if (!isMarkedInternal(value)) {
17+
Object.defineProperty(value, $internal, {
18+
value: true,
19+
});
20+
}
21+
22+
Object.defineProperty(value, $resolve, {
23+
value: (ctx: ResolutionCtx): ResolvedSnippet => {
24+
const protoSnippet = options.resolve(ctx);
25+
26+
return snip(protoSnippet.value, protoSnippet.dataType, protoSnippet.origin);
27+
},
28+
});
29+
30+
return value as T & { [$resolve](ctx: ResolutionCtx): ResolvedSnippet };
31+
}
32+
33+
interface ProtoSnippet {
34+
value: string;
35+
dataType: BaseData;
36+
origin: Origin;
37+
}
38+
39+
export namespace makeResolvable {
40+
export interface Options {
41+
resolve: (ctx: ResolutionCtx) => ProtoSnippet;
42+
asString(): string;
43+
}
44+
}

packages/typegpu/src/tgsl/shaderGenerator_members.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import type { FunctionArgument, TgpuShaderStage } from '../types.ts';
44

55
export { UnknownData } from '../data/dataTypes.ts';
66
export { getName } from '../shared/meta.ts';
7+
export { makeDereferencable } from './makeDereferencable.ts';
8+
export { makeResolvable } from './makeResolvable.ts';
79

810
// types
911
export type { ResolutionCtx, FunctionArgument, TgpuShaderStage } from '../types.ts';

0 commit comments

Comments
 (0)