typegpu 0.11.9 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/bin.mjs +28 -6
  2. package/builtin.d.ts +51 -53
  3. package/builtin.js +30 -34
  4. package/common/fullScreenTriangle.d.ts +2 -10
  5. package/common/fullScreenTriangle.js +20 -28
  6. package/common/index.d.ts +2 -9
  7. package/common/index.js +3 -12
  8. package/common/writeSoA.d.ts +11 -12
  9. package/common/writeSoA.js +88 -76
  10. package/core/buffer/buffer.d.ts +79 -62
  11. package/core/buffer/buffer.js +283 -205
  12. package/core/buffer/bufferBinding.d.ts +71 -0
  13. package/core/buffer/bufferBinding.js +154 -0
  14. package/core/buffer/bufferUsage.d.ts +14 -45
  15. package/core/buffer/bufferUsage.js +1 -171
  16. package/core/buffer/laidOutBuffer.d.ts +25 -0
  17. package/core/buffer/laidOutBuffer.js +55 -0
  18. package/core/commandEncoder/attachments.d.ts +125 -0
  19. package/core/commandEncoder/attachments.js +29 -0
  20. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  21. package/core/commandEncoder/commandEncoder.js +56 -0
  22. package/core/commandEncoder/computePass.d.ts +58 -0
  23. package/core/commandEncoder/computePass.js +63 -0
  24. package/core/commandEncoder/renderPass.d.ts +121 -0
  25. package/core/commandEncoder/renderPass.js +196 -0
  26. package/core/constant/tgpuConstant.d.ts +26 -26
  27. package/core/constant/tgpuConstant.js +76 -65
  28. package/core/declare/tgpuDeclare.d.ts +3 -6
  29. package/core/declare/tgpuDeclare.js +36 -36
  30. package/core/function/autoIO.d.ts +61 -33
  31. package/core/function/autoIO.js +68 -73
  32. package/core/function/comptime.d.ts +11 -13
  33. package/core/function/comptime.js +60 -52
  34. package/core/function/createCallableSchema.d.ts +16 -0
  35. package/core/function/createCallableSchema.js +50 -40
  36. package/core/function/dualImpl.d.ts +44 -0
  37. package/core/function/dualImpl.js +71 -50
  38. package/core/function/entryInputRouter.d.ts +26 -0
  39. package/core/function/entryInputRouter.js +31 -33
  40. package/core/function/extractArgs.d.ts +38 -0
  41. package/core/function/extractArgs.js +202 -200
  42. package/core/function/fnCore.d.ts +44 -5
  43. package/core/function/fnCore.js +148 -93
  44. package/core/function/fnTypes.d.ts +31 -29
  45. package/core/function/fnTypes.js +1 -0
  46. package/core/function/ioSchema.d.ts +12 -10
  47. package/core/function/ioSchema.js +65 -47
  48. package/core/function/shelllessImpl.d.ts +9 -12
  49. package/core/function/shelllessImpl.js +17 -22
  50. package/core/function/templateUtils.d.ts +2 -0
  51. package/core/function/templateUtils.js +9 -8
  52. package/core/function/tgpuComputeFn.d.ts +26 -28
  53. package/core/function/tgpuComputeFn.js +47 -48
  54. package/core/function/tgpuFn.d.ts +34 -37
  55. package/core/function/tgpuFn.js +179 -153
  56. package/core/function/tgpuFragmentFn.d.ts +52 -53
  57. package/core/function/tgpuFragmentFn.js +63 -56
  58. package/core/function/tgpuVertexFn.d.ts +36 -39
  59. package/core/function/tgpuVertexFn.js +56 -53
  60. package/core/pipeline/computePipeline.d.ts +141 -53
  61. package/core/pipeline/computePipeline.js +291 -225
  62. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  63. package/core/pipeline/connectAttachmentToShader.js +25 -22
  64. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  65. package/core/pipeline/connectTargetsToShader.js +29 -27
  66. package/core/pipeline/drawState.d.ts +52 -0
  67. package/core/pipeline/drawState.js +225 -0
  68. package/core/pipeline/performanceTracker.d.ts +14 -0
  69. package/core/pipeline/performanceTracker.js +34 -0
  70. package/core/pipeline/pipelineUtils.d.ts +18 -0
  71. package/core/pipeline/pipelineUtils.js +54 -25
  72. package/core/pipeline/priors.d.ts +1 -0
  73. package/core/pipeline/priors.js +12 -0
  74. package/core/pipeline/renderPipeline.d.ts +246 -261
  75. package/core/pipeline/renderPipeline.js +487 -480
  76. package/core/pipeline/timeable.d.ts +28 -18
  77. package/core/pipeline/timeable.js +90 -52
  78. package/core/pipeline/typeGuards.d.ts +17 -0
  79. package/core/pipeline/typeGuards.js +52 -22
  80. package/core/pipeline/webgpuLimitations.d.ts +10 -0
  81. package/core/pipeline/webgpuLimitations.js +81 -0
  82. package/core/querySet/querySet.d.ts +26 -21
  83. package/core/querySet/querySet.js +127 -103
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  85. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  86. package/core/resolve/externals.d.ts +25 -8
  87. package/core/resolve/externals.js +78 -54
  88. package/core/resolve/namespace.d.ts +22 -25
  89. package/core/resolve/namespace.js +16 -21
  90. package/core/resolve/resolvableString.d.ts +7 -0
  91. package/core/resolve/resolvableString.js +13 -0
  92. package/core/resolve/resolveData.d.ts +10 -0
  93. package/core/resolve/resolveData.js +162 -121
  94. package/core/resolve/stitch.d.ts +8 -0
  95. package/core/resolve/stitch.js +23 -21
  96. package/core/resolve/tgpuResolve.d.ts +55 -53
  97. package/core/resolve/tgpuResolve.js +106 -53
  98. package/core/root/configurableImpl.d.ts +10 -0
  99. package/core/root/configurableImpl.js +17 -19
  100. package/core/root/init.d.ts +76 -38
  101. package/core/root/init.js +346 -455
  102. package/core/root/rootTypes.d.ts +461 -636
  103. package/core/root/rootTypes.js +1 -0
  104. package/core/sampler/sampler.d.ts +50 -31
  105. package/core/sampler/sampler.js +120 -113
  106. package/core/simulate/tgpuSimulate.d.ts +9 -12
  107. package/core/simulate/tgpuSimulate.js +68 -71
  108. package/core/slot/accessor.d.ts +36 -13
  109. package/core/slot/accessor.js +138 -91
  110. package/core/slot/internalSlots.d.ts +2 -0
  111. package/core/slot/internalSlots.js +1 -6
  112. package/core/slot/lazy.d.ts +2 -6
  113. package/core/slot/lazy.js +71 -39
  114. package/core/slot/slot.d.ts +2 -6
  115. package/core/slot/slot.js +45 -38
  116. package/core/slot/slotTypes.d.ts +78 -80
  117. package/core/slot/slotTypes.js +11 -16
  118. package/core/texture/externalTexture.d.ts +20 -11
  119. package/core/texture/externalTexture.js +46 -46
  120. package/core/texture/texture.d.ts +152 -97
  121. package/core/texture/texture.js +407 -314
  122. package/core/texture/textureFormats.d.ts +42 -23
  123. package/core/texture/textureFormats.js +104 -75
  124. package/core/texture/textureProps.d.ts +7 -10
  125. package/core/texture/textureProps.js +1 -0
  126. package/core/texture/textureUtils.d.ts +8 -0
  127. package/core/texture/textureUtils.js +185 -179
  128. package/core/texture/usageExtension.d.ts +21 -18
  129. package/core/texture/usageExtension.js +13 -17
  130. package/core/unroll/tgpuUnroll.d.ts +20 -19
  131. package/core/unroll/tgpuUnroll.js +82 -91
  132. package/core/valueProxyUtils.d.ts +3 -0
  133. package/core/valueProxyUtils.js +52 -41
  134. package/core/variable/tgpuVariable.d.ts +26 -27
  135. package/core/variable/tgpuVariable.js +93 -96
  136. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  137. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  138. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  139. package/core/vertexLayout/vertexAttribute.js +1 -0
  140. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  141. package/core/vertexLayout/vertexLayout.js +130 -99
  142. package/core/whitespaces.d.ts +2 -0
  143. package/core/whitespaces.js +16 -0
  144. package/data/alignIO.d.ts +7 -0
  145. package/data/alignIO.js +13 -13
  146. package/data/alignmentOf.d.ts +5 -8
  147. package/data/alignmentOf.js +90 -75
  148. package/data/array.d.ts +17 -9
  149. package/data/array.js +57 -40
  150. package/data/atomic.d.ts +2 -7
  151. package/data/atomic.js +26 -23
  152. package/data/attributes.d.ts +19 -21
  153. package/data/attributes.js +192 -132
  154. package/data/autoStruct.d.ts +36 -3
  155. package/data/autoStruct.js +84 -81
  156. package/data/compiledIO.d.ts +5 -0
  157. package/data/compiledIO.js +231 -215
  158. package/data/dataIO.d.ts +13 -11
  159. package/data/dataIO.js +643 -589
  160. package/data/dataTypes.d.ts +83 -65
  161. package/data/dataTypes.js +66 -68
  162. package/data/deepEqual.d.ts +2 -7
  163. package/data/deepEqual.js +80 -55
  164. package/data/disarray.d.ts +6 -10
  165. package/data/disarray.js +52 -46
  166. package/data/float16Conversion.d.ts +4 -0
  167. package/data/float16Conversion.js +7 -0
  168. package/data/generalizeFn.d.ts +25 -0
  169. package/data/generalizeFn.js +89 -0
  170. package/data/getLongestContiguousPrefix.d.ts +4 -8
  171. package/data/getLongestContiguousPrefix.js +6 -11
  172. package/data/index.d.ts +30 -31
  173. package/data/index.js +39 -172
  174. package/data/instanceToSchema.d.ts +24 -27
  175. package/data/instanceToSchema.js +1 -0
  176. package/data/isContiguous.d.ts +4 -8
  177. package/data/isContiguous.js +6 -11
  178. package/data/matrix.d.ts +21 -21
  179. package/data/matrix.js +513 -505
  180. package/data/numberOps.d.ts +5 -0
  181. package/data/numberOps.js +21 -21
  182. package/data/numeric.d.ts +21 -12
  183. package/data/numeric.js +287 -197
  184. package/data/offsetUtils.d.ts +9 -13
  185. package/data/offsetUtils.js +204 -144
  186. package/data/offsets.d.ts +8 -0
  187. package/data/offsets.js +33 -33
  188. package/data/partialIO.d.ts +13 -8
  189. package/data/partialIO.js +124 -113
  190. package/data/ptr.d.ts +12 -12
  191. package/data/ptr.js +42 -44
  192. package/data/ref.d.ts +40 -27
  193. package/data/ref.js +125 -95
  194. package/data/sampler.d.ts +99 -101
  195. package/data/sampler.js +17 -21
  196. package/data/schemaCallWrapper.d.ts +19 -0
  197. package/data/schemaCallWrapper.js +31 -26
  198. package/data/schemaMemoryLayout.d.ts +8 -0
  199. package/data/schemaMemoryLayout.js +213 -185
  200. package/data/sizeOf.d.ts +4 -8
  201. package/data/sizeOf.js +6 -11
  202. package/data/snippet.d.ts +96 -20
  203. package/data/snippet.js +75 -86
  204. package/data/struct.d.ts +4 -7
  205. package/data/struct.js +51 -39
  206. package/data/texture.d.ts +253 -250
  207. package/data/texture.js +238 -200
  208. package/data/unstruct.d.ts +2 -7
  209. package/data/unstruct.js +43 -37
  210. package/data/vector.d.ts +33 -21
  211. package/data/vector.js +234 -221
  212. package/data/vectorImpl.d.ts +231 -0
  213. package/data/vectorImpl.js +563 -515
  214. package/data/vectorOps.d.ts +25 -0
  215. package/data/vectorOps.js +118 -669
  216. package/data/vertexFormatData.d.ts +181 -184
  217. package/data/vertexFormatData.js +104 -106
  218. package/data/wgslTypes.d.ts +665 -600
  219. package/data/wgslTypes.js +220 -198
  220. package/errors.d.ts +50 -24
  221. package/errors.js +146 -126
  222. package/execMode.d.ts +16 -0
  223. package/execMode.js +47 -40
  224. package/extension.d.ts +13 -8
  225. package/extension.js +10 -16
  226. package/getGPUValue.d.ts +1 -0
  227. package/getGPUValue.js +2 -7
  228. package/index.d.ts +28 -68
  229. package/index.js +8 -28
  230. package/indexNamedExports.d.ts +69 -42
  231. package/indexNamedExports.js +25 -0
  232. package/internal.d.ts +16 -0
  233. package/internal.js +12 -0
  234. package/mathUtils.d.ts +5 -0
  235. package/mathUtils.js +7 -11
  236. package/memo.d.ts +11 -0
  237. package/memo.js +20 -22
  238. package/minify.d.ts +5 -0
  239. package/minify.js +93 -0
  240. package/nameUtils.d.ts +29 -0
  241. package/nameUtils.js +427 -394
  242. package/package.json +5 -1
  243. package/resolutionCtx.d.ts +162 -22
  244. package/resolutionCtx.js +911 -629
  245. package/serial/registry.d.ts +15 -0
  246. package/serial/registry.js +106 -0
  247. package/serial/restore.d.ts +49 -0
  248. package/serial/restore.js +68 -0
  249. package/serial/schema.d.ts +58 -0
  250. package/serial/schema.js +209 -0
  251. package/serial/types.d.ts +5 -0
  252. package/serial/types.js +1 -0
  253. package/shared/env.d.ts +9 -0
  254. package/shared/env.js +9 -12
  255. package/shared/generators.d.ts +4 -0
  256. package/shared/generators.js +10 -12
  257. package/shared/meta.d.ts +29 -14
  258. package/shared/meta.js +71 -55
  259. package/shared/normalizeMetadata.d.ts +32 -27
  260. package/shared/normalizeMetadata.js +23 -36
  261. package/shared/repr.d.ts +73 -55
  262. package/shared/repr.js +1 -0
  263. package/shared/soul.d.ts +17 -0
  264. package/shared/soul.js +1 -0
  265. package/shared/stringify.d.ts +2 -0
  266. package/shared/stringify.js +29 -20
  267. package/shared/symbols.d.ts +26 -20
  268. package/shared/symbols.js +79 -79
  269. package/shared/tseynit.d.ts +2 -0
  270. package/shared/tseynit.js +160 -75
  271. package/shared/utilityTypes.d.ts +30 -14
  272. package/shared/utilityTypes.js +2 -6
  273. package/shared/vertexFormat.d.ts +41 -43
  274. package/shared/vertexFormat.js +59 -62
  275. package/std/array.d.ts +2 -7
  276. package/std/array.js +18 -23
  277. package/std/atomic.d.ts +14 -18
  278. package/std/atomic.js +96 -95
  279. package/std/bitcast.d.ts +193 -10
  280. package/std/bitcast.js +309 -39
  281. package/std/boolean.d.ts +19 -33
  282. package/std/boolean.js +296 -292
  283. package/std/copy.d.ts +2 -7
  284. package/std/copy.js +27 -24
  285. package/std/derivative.d.ts +11 -15
  286. package/std/derivative.js +56 -79
  287. package/std/discard.d.ts +1 -6
  288. package/std/discard.js +7 -14
  289. package/std/environment.d.ts +19 -14
  290. package/std/environment.js +71 -51
  291. package/std/extensions.d.ts +2 -8
  292. package/std/extensions.js +10 -11
  293. package/std/index.d.ts +20 -24
  294. package/std/index.js +32 -187
  295. package/std/matrix.d.ts +6 -12
  296. package/std/matrix.js +60 -69
  297. package/std/numeric.d.ts +150 -146
  298. package/std/numeric.js +771 -727
  299. package/std/operators.d.ts +19 -27
  300. package/std/operators.js +195 -194
  301. package/std/packing.d.ts +5 -11
  302. package/std/packing.js +67 -75
  303. package/std/range.d.ts +6 -11
  304. package/std/range.js +48 -36
  305. package/std/subgroup.d.ts +33 -37
  306. package/std/subgroup.js +180 -217
  307. package/std/texture.d.ts +70 -38
  308. package/std/texture.js +176 -172
  309. package/taskQueue.d.ts +6 -0
  310. package/taskQueue.js +30 -0
  311. package/tgpu.d.ts +16 -0
  312. package/tgpu.js +17 -44
  313. package/tgpuBindGroupLayout.d.ts +132 -152
  314. package/tgpuBindGroupLayout.js +346 -268
  315. package/tgpuLogger.d.ts +34 -0
  316. package/tgpuLogger.js +64 -0
  317. package/tgpuUnstable.d.ts +16 -22
  318. package/tgpuUnstable.js +13 -35
  319. package/tgsl/accessIndex.d.ts +2 -0
  320. package/tgsl/accessIndex.js +76 -33
  321. package/tgsl/accessProp.d.ts +2 -0
  322. package/tgsl/accessProp.js +142 -101
  323. package/tgsl/accessStructProp.d.ts +5 -0
  324. package/tgsl/accessStructProp.js +13 -15
  325. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  326. package/tgsl/consoleLog/deserializers.js +119 -103
  327. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  328. package/tgsl/consoleLog/logGenerator.js +85 -80
  329. package/tgsl/consoleLog/serializers.d.ts +21 -0
  330. package/tgsl/consoleLog/serializers.js +119 -100
  331. package/tgsl/consoleLog/types.d.ts +40 -39
  332. package/tgsl/consoleLog/types.js +1 -0
  333. package/tgsl/conversion.d.ts +33 -0
  334. package/tgsl/conversion.js +271 -216
  335. package/tgsl/forOfUtils.d.ts +15 -0
  336. package/tgsl/forOfUtils.js +85 -70
  337. package/tgsl/generationHelpers.d.ts +22 -39
  338. package/tgsl/generationHelpers.js +85 -58
  339. package/tgsl/infixDispatch.d.ts +70 -0
  340. package/tgsl/infixDispatch.js +48 -46
  341. package/tgsl/jsPolyfills.d.ts +16 -19
  342. package/tgsl/jsPolyfills.js +44 -42
  343. package/tgsl/makeDereferenceable.d.ts +48 -0
  344. package/tgsl/makeDereferenceable.js +86 -0
  345. package/tgsl/makeResolvable.d.ts +22 -0
  346. package/tgsl/makeResolvable.js +33 -0
  347. package/tgsl/shaderGenerator.d.ts +77 -17
  348. package/tgsl/shaderGenerator.js +1 -0
  349. package/tgsl/shellless.d.ts +6 -9
  350. package/tgsl/shellless.js +73 -43
  351. package/tgsl/wgslGenerator.d.ts +66 -59
  352. package/tgsl/wgslGenerator.js +1345 -760
  353. package/types.d.ts +287 -222
  354. package/types.js +61 -44
  355. package/unwrapper.d.ts +31 -26
  356. package/unwrapper.js +1 -0
  357. package/wgslExtensions.d.ts +3 -5
  358. package/wgslExtensions.js +12 -16
  359. package/_virtual/rolldown_runtime.js +0 -13
  360. package/core/buffer/bufferShorthand.d.ts +0 -50
  361. package/core/buffer/bufferShorthand.js +0 -55
  362. package/core/pipeline/applyPipelineState.js +0 -37
  363. package/core/pipeline/limitsOverflow.js +0 -13
  364. package/package.js +0 -5
  365. package/tgsl/shaderGenerator_members.d.ts +0 -33
  366. package/tgsl/shaderGenerator_members.js +0 -12
@@ -1,49 +1,47 @@
1
- import { TgpuNamable } from "../../shared/meta.js";
2
- import { $internal } from "../../shared/symbols.js";
3
- import { AnyComputeBuiltin } from "../../builtin.js";
4
- import { IORecord, InferIO } from "./fnTypes.js";
5
- import { Void } from "../../data/wgslTypes.js";
6
-
7
- //#region src/core/function/tgpuComputeFn.d.ts
8
-
1
+ import type { AnyComputeBuiltin } from '../../builtin.ts';
2
+ import { Void } from '../../data/wgslTypes.ts';
3
+ import { type TgpuNamable } from '../../shared/meta.ts';
4
+ import { $internal } from '../../shared/symbols.ts';
5
+ import type { InferIO, IORecord } from './fnTypes.ts';
9
6
  /**
10
7
  * Describes a compute entry function signature (its arguments, return type and workgroup size)
11
8
  */
12
9
  type TgpuComputeFnShellHeader<ComputeIn extends IORecord<AnyComputeBuiltin>> = {
13
- readonly argTypes: ComputeIn[keyof ComputeIn][];
14
- readonly returnType: Void;
15
- readonly workgroupSize: number[];
16
- readonly entryPoint: 'compute';
10
+ readonly argTypes: ComputeIn[keyof ComputeIn][];
11
+ readonly returnType: Void;
12
+ readonly workgroupSize: number[];
13
+ readonly entryPoint: 'compute';
17
14
  };
18
15
  /**
19
16
  * Describes a compute entry function signature (its arguments, return type and workgroup size).
20
17
  * Allows creating tgpu compute functions by calling this shell
21
18
  * and passing the implementation (as WGSL string or JS function) as the argument.
22
19
  */
23
- type TgpuComputeFnShell<ComputeIn extends IORecord<AnyComputeBuiltin>> = TgpuComputeFnShellHeader<ComputeIn> &
20
+ export type TgpuComputeFnShell<ComputeIn extends IORecord<AnyComputeBuiltin>> = TgpuComputeFnShellHeader<ComputeIn> &
24
21
  /**
25
22
  * Creates a type-safe implementation of this signature
26
23
  */
27
- ((implementation: (input: InferIO<ComputeIn>) => undefined) => TgpuComputeFn<ComputeIn>) &
24
+ ((implementation: (input: InferIO<ComputeIn>) => undefined) => TgpuComputeFn<ComputeIn>) &
28
25
  /**
29
26
  * @param implementation
30
27
  * Raw WGSL function implementation with header and body
31
28
  * without `fn` keyword and function name
32
29
  * e.g. `"(x: f32) -> f32 { return x; }"`;
33
- */
34
- ((implementation: string) => TgpuComputeFn<ComputeIn>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuComputeFn<ComputeIn>);
35
- interface TgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin> = any> extends TgpuNamable {
36
- readonly [$internal]: true;
37
- readonly shell: TgpuComputeFnShellHeader<ComputeIn>;
38
- $uses(dependencyMap: Record<string, unknown>): this;
30
+ */ ((implementation: string) => TgpuComputeFn<ComputeIn>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuComputeFn<ComputeIn>);
31
+ export interface TgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin> = any> extends TgpuNamable {
32
+ readonly [$internal]: true;
33
+ readonly shell: TgpuComputeFnShellHeader<ComputeIn>;
34
+ $uses(dependencyMap: Record<string, unknown>): this;
35
+ }
36
+ export interface ComputeFnOptions {
37
+ workgroupSize: number[];
39
38
  }
40
- declare function computeFn(options: {
41
- workgroupSize: number[];
39
+ export declare function computeFn(options: {
40
+ workgroupSize: number[];
42
41
  }): TgpuComputeFnShell<{}>;
43
- declare function computeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(options: {
44
- in: ComputeIn;
45
- workgroupSize: number[];
42
+ export declare function computeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(options: {
43
+ in: ComputeIn;
44
+ workgroupSize: number[];
46
45
  }): TgpuComputeFnShell<ComputeIn>;
47
- declare function isTgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(value: unknown): value is TgpuComputeFn<ComputeIn>;
48
- //#endregion
49
- export { TgpuComputeFn, TgpuComputeFnShell, computeFn, isTgpuComputeFn };
46
+ export declare function isTgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(value: unknown): value is TgpuComputeFn<ComputeIn>;
47
+ export {};
@@ -1,57 +1,56 @@
1
- import { $getNameForward, $internal, $resolve } from "../../shared/symbols.js";
2
1
  import { Void } from "../../data/wgslTypes.js";
3
2
  import { getName, setName } from "../../shared/meta.js";
4
- import { separateBuiltins } from "./ioSchema.js";
3
+ import { $getNameForward, $internal, $resolve } from "../../shared/symbols.js";
4
+ import { shaderStageSlot } from "../slot/internalSlots.js";
5
5
  import { createFnCore } from "./fnCore.js";
6
+ import { separateBuiltins } from "./ioSchema.js";
6
7
  import { stripTemplate } from "./templateUtils.js";
7
- import { shaderStageSlot } from "../slot/internalSlots.js";
8
-
9
- //#region src/core/function/tgpuComputeFn.ts
10
8
  /**
11
- * Creates a shell of a typed entry function for the compute shader stage. Any function
12
- * that implements this shell can perform general-purpose computation.
13
- *
14
- * @param options.in
15
- * Record with builtins used by the compute shader.
16
- * @param options.workgroupSize
17
- * Size of blocks that the thread grid will be divided into (up to 3 dimensions).
18
- */
19
- function computeFn(options) {
20
- const shell = {
21
- argTypes: Object.values(options.in ?? {}),
22
- returnType: Void,
23
- workgroupSize: options.workgroupSize,
24
- entryPoint: "compute"
25
- };
26
- const entryInput = separateBuiltins(options.in ?? {});
27
- const call = (arg, ...values) => createComputeFn(shell, options.workgroupSize, stripTemplate(arg, ...values), entryInput);
28
- return Object.assign(call, shell);
9
+ * Creates a shell of a typed entry function for the compute shader stage. Any function
10
+ * that implements this shell can perform general-purpose computation.
11
+ *
12
+ * @param options.in
13
+ * Record with builtins used by the compute shader.
14
+ * @param options.workgroupSize
15
+ * Size of blocks that the thread grid will be divided into (up to 3 dimensions).
16
+ */
17
+ export function computeFn(options) {
18
+ const shell = {
19
+ argTypes: Object.values(options.in ?? {}),
20
+ returnType: Void,
21
+ workgroupSize: options.workgroupSize,
22
+ entryPoint: 'compute',
23
+ };
24
+ const entryInput = separateBuiltins(options.in ?? {});
25
+ const call = (arg, ...values) => createComputeFn(shell, options.workgroupSize, stripTemplate(arg, ...values), entryInput);
26
+ return Object.assign(call, shell);
29
27
  }
30
- function isTgpuComputeFn(value) {
31
- return value?.shell?.entryPoint === "compute";
28
+ export function isTgpuComputeFn(value) {
29
+ return value?.shell?.entryPoint === 'compute';
32
30
  }
31
+ // --------------
32
+ // Implementation
33
+ // --------------
33
34
  function createComputeFn(shell, workgroupSize, implementation, entryInput) {
34
- const core = createFnCore(implementation, "compute", workgroupSize);
35
- return {
36
- shell,
37
- $uses(newExternals) {
38
- core.setExternals("userProvided", newExternals);
39
- return this;
40
- },
41
- [$internal]: true,
42
- [$getNameForward]: core,
43
- $name(newLabel) {
44
- setName(this, newLabel);
45
- return this;
46
- },
47
- [$resolve](ctx) {
48
- return ctx.withSlots([[shaderStageSlot, "compute"]], () => core.resolve(ctx, [], shell.returnType, entryInput));
49
- },
50
- toString() {
51
- return `computeFn:${getName(core) ?? "<unnamed>"}`;
52
- }
53
- };
35
+ const core = createFnCore(implementation, 'compute', workgroupSize);
36
+ const result = {
37
+ shell,
38
+ $uses(newExternals) {
39
+ core.setExternals('userProvided', newExternals);
40
+ return this;
41
+ },
42
+ [$internal]: true,
43
+ [$getNameForward]: core,
44
+ $name(newLabel) {
45
+ setName(this, newLabel);
46
+ return this;
47
+ },
48
+ [$resolve](ctx) {
49
+ return ctx.withSlots([[shaderStageSlot, 'compute']], () => core.resolve(ctx, [], shell.returnType, entryInput));
50
+ },
51
+ toString() {
52
+ return `computeFn:${getName(core) ?? '<unnamed>'}`;
53
+ },
54
+ };
55
+ return result;
54
56
  }
55
-
56
- //#endregion
57
- export { computeFn, isTgpuComputeFn };
@@ -1,53 +1,50 @@
1
- import { TgpuNamable } from "../../shared/meta.js";
2
- import { $internal, $providing } from "../../shared/symbols.js";
3
- import { Prettify } from "../../shared/utilityTypes.js";
4
- import { AnyFn, Implementation, InferArgs, InferImplSchema, InheritArgNames } from "./fnTypes.js";
5
- import { Providing } from "../slot/slotTypes.js";
6
- import { Withable } from "../root/rootTypes.js";
7
- import { DualFn } from "../../types.js";
8
- import { BaseData, Void } from "../../data/wgslTypes.js";
9
- import { InferGPU } from "../../shared/repr.js";
10
-
11
- //#region src/core/function/tgpuFn.d.ts
12
-
1
+ import { type BaseData, Void } from '../../data/wgslTypes.ts';
2
+ import type { TgpuNamable } from '../../shared/meta.ts';
3
+ import type { InferGPU } from '../../shared/repr.ts';
4
+ import { $internal, $providing } from '../../shared/symbols.ts';
5
+ import type { Prettify } from '../../shared/utilityTypes.ts';
6
+ import type { DualFn } from '../../types.ts';
7
+ import { type Providing } from '../slot/slotTypes.ts';
8
+ import type { AnyFn, Implementation, InferArgs, InferImplSchema, InheritArgNames } from './fnTypes.ts';
9
+ import type { Withable } from '../root/rootTypes.ts';
13
10
  /**
14
11
  * Describes a function signature (its arguments and return type)
15
12
  */
16
13
  type TgpuFnShellHeader<Args extends BaseData[], Return extends BaseData> = {
17
- readonly [$internal]: true;
18
- readonly argTypes: Args;
19
- readonly returnType: Return;
14
+ readonly [$internal]: true;
15
+ readonly argTypes: Args;
16
+ readonly returnType: Return;
20
17
  };
21
18
  /**
22
19
  * Describes a function signature (its arguments and return type).
23
20
  * Allows creating tgpu functions by calling this shell
24
21
  * and passing the implementation (as WGSL string or JS function) as the argument.
25
22
  */
26
- type TgpuFnShell<Args extends BaseData[], Return extends BaseData> = TgpuFnShellHeader<Args, Return> & (<T extends (...args: InferArgs<Args>) => InferGPU<Return>>(implementation: T) => TgpuFn<Prettify<InheritArgNames<(...args: Args) => Return, T>>['result']>) & ((implementation: string) => TgpuFn<(...args: Args) => Return>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuFn<(...args: Args) => Return>);
23
+ export type TgpuFnShell<Args extends BaseData[], Return extends BaseData> = TgpuFnShellHeader<Args, Return> & (<T extends (...args: InferArgs<Args>) => InferGPU<Return>>(implementation: T) => TgpuFn<Prettify<InheritArgNames<(...args: Args) => Return, T>>['result']>) & ((implementation: string) => TgpuFn<(...args: Args) => Return>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuFn<(...args: Args) => Return>);
27
24
  interface TgpuFnBase<ImplSchema extends AnyFn> extends TgpuNamable, Withable<TgpuFn<ImplSchema>> {
28
- [$internal]: {
29
- implementation: Implementation<ImplSchema>;
30
- };
31
- readonly resourceType: 'function';
32
- readonly shell: TgpuFnShellHeader<Parameters<ImplSchema>, Extract<ReturnType<ImplSchema>, BaseData>>;
33
- readonly [$providing]?: Providing | undefined;
34
- $uses(dependencyMap: Record<string, unknown>): this;
25
+ [$internal]: {
26
+ implementation: Implementation<ImplSchema>;
27
+ };
28
+ readonly resourceType: 'function';
29
+ readonly shell: TgpuFnShellHeader<Parameters<ImplSchema>, Extract<ReturnType<ImplSchema>, BaseData>>;
30
+ readonly [$providing]?: Providing | undefined;
31
+ $uses(dependencyMap: Record<string, unknown>): this;
35
32
  }
36
- type TgpuFn<ImplSchema extends AnyFn = (...args: any[]) => any> = DualFn<InferImplSchema<ImplSchema>> & TgpuFnBase<ImplSchema>;
33
+ export type TgpuFn<ImplSchema extends AnyFn = (...args: any[]) => any> = DualFn<InferImplSchema<ImplSchema>> & TgpuFnBase<ImplSchema>;
37
34
  /**
38
35
  * A function wrapper that allows providing slot and accessor overrides for shellless functions
39
36
  */
40
- interface TgpuGenericFn<T extends AnyFn> extends TgpuNamable, Withable<TgpuGenericFn<T>> {
41
- readonly [$internal]: {
42
- inner: T;
43
- };
44
- readonly [$providing]?: Providing | undefined;
45
- readonly resourceType: 'generic-function';
46
- (...args: Parameters<T>): ReturnType<T>;
37
+ export interface TgpuGenericFn<T extends AnyFn> extends TgpuNamable, Withable<TgpuGenericFn<T>> {
38
+ readonly [$internal]: {
39
+ inner: T;
40
+ };
41
+ readonly [$providing]?: Providing | undefined;
42
+ readonly resourceType: 'generic-function';
43
+ (...args: Parameters<T>): ReturnType<T>;
47
44
  }
48
- declare function fn<Args extends BaseData[] | []>(argTypes: Args, returnType?: undefined): TgpuFnShell<Args, Void>;
49
- declare function fn<Args extends BaseData[] | [], Return extends BaseData>(argTypes: Args, returnType: Return): TgpuFnShell<Args, Return>;
50
- declare function fn<T extends AnyFn>(inner: T): TgpuGenericFn<T>;
51
- declare function isTgpuFn<Args extends BaseData[] | [], Return extends BaseData>(value: unknown): value is TgpuFn<(...args: Args) => Return>;
52
- //#endregion
53
- export { TgpuFn, TgpuFnShell, TgpuGenericFn, fn, isTgpuFn };
45
+ export declare function fn<Args extends BaseData[] | []>(argTypes: Args, returnType?: undefined): TgpuFnShell<Args, Void>;
46
+ export declare function fn<Args extends BaseData[] | [], Return extends BaseData>(argTypes: Args, returnType: Return): TgpuFnShell<Args, Return>;
47
+ export declare function fn<T extends AnyFn>(inner: T): TgpuGenericFn<T>;
48
+ export declare function isTgpuFn<Args extends BaseData[] | [], Return extends BaseData>(value: unknown): value is TgpuFn<(...args: Args) => Return>;
49
+ export declare function isGenericFn<Callback extends AnyFn>(value: unknown): value is TgpuGenericFn<Callback>;
50
+ export {};
@@ -1,171 +1,197 @@
1
- import { $getNameForward, $internal, $providing, $resolve, isMarkedInternal } from "../../shared/symbols.js";
1
+ import { schemaCallWrapper } from "../../data/schemaCallWrapper.js";
2
2
  import { Void } from "../../data/wgslTypes.js";
3
- import { getName, setName } from "../../shared/meta.js";
4
3
  import { ExecutionError } from "../../errors.js";
5
- import { isAccessor, isMutableAccessor } from "../slot/slotTypes.js";
6
4
  import { provideInsideTgpuFn } from "../../execMode.js";
5
+ import { getName, setName } from "../../shared/meta.js";
6
+ import { isMarkedInternal } from "../../shared/symbols.js";
7
+ import { $getNameForward, $internal, $providing, $resolve } from "../../shared/symbols.js";
8
+ import { addArgTypesToExternals, addReturnTypeToExternals } from "../resolve/externals.js";
7
9
  import { stitch } from "../resolve/stitch.js";
8
- import { schemaCallWrapper } from "../../data/schemaCallWrapper.js";
10
+ import { isAccessor, isMutableAccessor, } from "../slot/slotTypes.js";
9
11
  import { dualImpl } from "./dualImpl.js";
10
- import { comptime } from "./comptime.js";
11
- import { addArgTypesToExternals, addReturnTypeToExternals } from "../resolve/externals.js";
12
12
  import { createFnCore } from "./fnCore.js";
13
13
  import { stripTemplate } from "./templateUtils.js";
14
-
15
- //#region src/core/function/tgpuFn.ts
16
- function fn(argTypesOrCallback, returnType) {
17
- if (typeof argTypesOrCallback === "function") return createGenericFn(argTypesOrCallback, []);
18
- const argTypes = argTypesOrCallback;
19
- const shell = {
20
- [$internal]: true,
21
- argTypes,
22
- returnType: returnType ?? Void
23
- };
24
- const call = (arg, ...values) => createFn(shell, stripTemplate(arg, ...values));
25
- return Object.assign(call, shell);
14
+ import { comptime } from "./comptime.js";
15
+ export function fn(argTypesOrCallback, returnType) {
16
+ if (typeof argTypesOrCallback === 'function') {
17
+ return createGenericFn(argTypesOrCallback, []);
18
+ }
19
+ const argTypes = argTypesOrCallback;
20
+ const shell = {
21
+ [$internal]: true,
22
+ argTypes,
23
+ returnType: returnType ?? Void,
24
+ };
25
+ const call = (arg, ...values) => createFn(shell, stripTemplate(arg, ...values));
26
+ return Object.assign(call, shell);
26
27
  }
27
- function isTgpuFn(value) {
28
- return isMarkedInternal(value) && value?.resourceType === "function";
28
+ export function isTgpuFn(value) {
29
+ return (isMarkedInternal(value) &&
30
+ value?.resourceType === 'function');
29
31
  }
30
- function isGenericFn(value) {
31
- return isMarkedInternal(value) && value?.resourceType === "generic-function";
32
+ export function isGenericFn(value) {
33
+ return (isMarkedInternal(value) &&
34
+ value?.resourceType === 'generic-function');
32
35
  }
36
+ // --------------
37
+ // Implementation
38
+ // --------------
33
39
  function stringifyPair([slot, value]) {
34
- return `${getName(slot) ?? "<unnamed>"}=${value}`;
40
+ return `${getName(slot) ?? '<unnamed>'}=${value}`;
35
41
  }
36
42
  function createFn(shell, _implementation) {
37
- let pairs = [];
38
- let implementation;
39
- if (isGenericFn(_implementation)) {
40
- pairs = _implementation[$providing]?.pairs ?? [];
41
- implementation = _implementation[$internal].inner;
42
- } else implementation = _implementation;
43
- const core = createFnCore(implementation, "normal");
44
- const fnBase = {
45
- shell,
46
- resourceType: "function",
47
- [$internal]: { implementation },
48
- $uses(newExternals) {
49
- core.setExternals("userProvided", newExternals);
50
- return this;
51
- },
52
- [$getNameForward]: core,
53
- $name(label) {
54
- setName(this, label);
55
- return this;
56
- },
57
- with: comptime((slot, value) => {
58
- return createBoundFunction(fn$1, [[isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot, value]]);
59
- }),
60
- [$resolve](ctx) {
61
- if (typeof implementation === "string") {
62
- addArgTypesToExternals(implementation, shell.argTypes, core);
63
- addReturnTypeToExternals(implementation, shell.returnType, core);
64
- }
65
- return core.resolve(ctx, shell.argTypes, shell.returnType);
66
- }
67
- };
68
- const call = dualImpl({
69
- name: void 0,
70
- noComptime: true,
71
- signature: {
72
- argTypes: shell.argTypes,
73
- returnType: shell.returnType
74
- },
75
- normalImpl: (...args) => provideInsideTgpuFn(() => {
76
- try {
77
- if (typeof implementation === "string") throw new Error("Cannot execute on the CPU functions constructed with raw WGSL");
78
- const castAndCopiedArgs = args.map((arg, index) => schemaCallWrapper(shell.argTypes[index], arg));
79
- const result = implementation(...castAndCopiedArgs);
80
- return schemaCallWrapper(shell.returnType, result);
81
- } catch (err) {
82
- if (err instanceof ExecutionError) throw err.appendToTrace(fn$1);
83
- throw new ExecutionError(err, [fn$1]);
84
- }
85
- }),
86
- codegenImpl: (ctx, args) => ctx.withResetIndentLevel(() => stitch`${ctx.resolve(fn$1).value}(${args})`)
87
- });
88
- const fn$1 = Object.assign(call, fnBase);
89
- Object.defineProperty(fn$1, "toString", { value() {
90
- return `fn:${getName(core) ?? "<unnamed>"}`;
91
- } });
92
- if (pairs.length > 0) return createBoundFunction(fn$1, pairs);
93
- return fn$1;
43
+ let pairs = [];
44
+ // Unwrapping generic functions
45
+ let implementation;
46
+ if (isGenericFn(_implementation)) {
47
+ pairs = _implementation[$providing]?.pairs ?? [];
48
+ implementation = _implementation[$internal].inner;
49
+ }
50
+ else {
51
+ implementation = _implementation;
52
+ }
53
+ const core = createFnCore(implementation, 'normal');
54
+ const fnBase = {
55
+ shell,
56
+ resourceType: 'function',
57
+ [$internal]: { implementation },
58
+ $uses(newExternals) {
59
+ core.setExternals('userProvided', newExternals);
60
+ return this;
61
+ },
62
+ [$getNameForward]: core,
63
+ $name(label) {
64
+ setName(this, label);
65
+ return this;
66
+ },
67
+ with: comptime((slot, value) => {
68
+ const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
69
+ return createBoundFunction(fn, [[s, value]]);
70
+ }),
71
+ [$resolve](ctx) {
72
+ if (typeof implementation === 'string') {
73
+ addArgTypesToExternals(implementation, shell.argTypes, core);
74
+ addReturnTypeToExternals(implementation, shell.returnType, core);
75
+ }
76
+ return core.resolve(ctx, shell.argTypes, shell.returnType);
77
+ },
78
+ };
79
+ const call = dualImpl({
80
+ name: undefined, // the name is forwarded to the core anyway
81
+ noComptime: true,
82
+ signature: { argTypes: shell.argTypes, returnType: shell.returnType },
83
+ normalImpl: (...args) => provideInsideTgpuFn(() => {
84
+ try {
85
+ if (typeof implementation === 'string') {
86
+ throw new Error('Cannot execute on the CPU functions constructed with raw WGSL');
87
+ }
88
+ const castAndCopiedArgs = args.map((arg, index) => schemaCallWrapper(shell.argTypes[index], arg));
89
+ const result = implementation(...castAndCopiedArgs);
90
+ // Casting the result to the appropriate schema
91
+ return schemaCallWrapper(shell.returnType, result);
92
+ }
93
+ catch (err) {
94
+ if (err instanceof ExecutionError) {
95
+ throw err.appendToTrace(fn);
96
+ }
97
+ throw new ExecutionError(err, [fn]);
98
+ }
99
+ }),
100
+ codegenImpl: (ctx, args) => ctx.withResetIndentLevel(() => stitch `${ctx.resolve(fn).value}(${args})`),
101
+ sideEffects: true,
102
+ });
103
+ const fn = Object.assign(call, fnBase);
104
+ Object.defineProperty(fn, 'toString', {
105
+ value() {
106
+ return `fn:${getName(core) ?? '<unnamed>'}`;
107
+ },
108
+ });
109
+ if (pairs.length > 0) {
110
+ return createBoundFunction(fn, pairs);
111
+ }
112
+ return fn;
94
113
  }
95
114
  function createBoundFunction(innerFn, pairs) {
96
- const fnBase = {
97
- resourceType: "function",
98
- shell: innerFn.shell,
99
- [$internal]: { implementation: innerFn[$internal].implementation },
100
- [$providing]: {
101
- inner: innerFn,
102
- pairs
103
- },
104
- $uses(newExternals) {
105
- innerFn.$uses(newExternals);
106
- return this;
107
- },
108
- $name(label) {
109
- setName(this, label);
110
- return this;
111
- },
112
- with: comptime((slot, value) => {
113
- const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
114
- return createBoundFunction(innerFn, [...pairs, [s, value]]);
115
- })
116
- };
117
- const call = dualImpl({
118
- name: void 0,
119
- noComptime: true,
120
- signature: {
121
- argTypes: innerFn.shell.argTypes,
122
- returnType: innerFn.shell.returnType
123
- },
124
- normalImpl: innerFn,
125
- codegenImpl: (ctx, args) => ctx.withResetIndentLevel(() => stitch`${ctx.resolve(fn$1).value}(${args})`)
126
- });
127
- const fn$1 = Object.assign(call, fnBase);
128
- Object.defineProperty(fn$1, "toString", { value() {
129
- return `fn:${getName(this) ?? "<unnamed>"}[${pairs.map(stringifyPair).join(", ")}]`;
130
- } });
131
- const innerName = getName(innerFn);
132
- if (innerName) setName(fn$1, innerName);
133
- return fn$1;
115
+ const fnBase = {
116
+ resourceType: 'function',
117
+ shell: innerFn.shell,
118
+ [$internal]: { implementation: innerFn[$internal].implementation },
119
+ [$providing]: { inner: innerFn, pairs },
120
+ $uses(newExternals) {
121
+ innerFn.$uses(newExternals);
122
+ return this;
123
+ },
124
+ $name(label) {
125
+ setName(this, label);
126
+ return this;
127
+ },
128
+ with: comptime((slot, value) => {
129
+ const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
130
+ return createBoundFunction(innerFn, [...pairs, [s, value]]);
131
+ }),
132
+ };
133
+ const call = dualImpl({
134
+ name: undefined, // setting name here would override autonaming
135
+ noComptime: true,
136
+ signature: {
137
+ argTypes: innerFn.shell.argTypes,
138
+ returnType: innerFn.shell.returnType,
139
+ },
140
+ normalImpl: innerFn,
141
+ codegenImpl: (ctx, args) => ctx.withResetIndentLevel(() => stitch `${ctx.resolve(fn).value}(${args})`),
142
+ sideEffects: true,
143
+ });
144
+ const fn = Object.assign(call, fnBase);
145
+ Object.defineProperty(fn, 'toString', {
146
+ value() {
147
+ const fnLabel = getName(this) ?? '<unnamed>';
148
+ return `fn:${fnLabel}[${pairs.map(stringifyPair).join(', ')}]`;
149
+ },
150
+ });
151
+ const innerName = getName(innerFn);
152
+ if (innerName) {
153
+ setName(fn, innerName);
154
+ }
155
+ return fn;
134
156
  }
135
157
  function createGenericFn(inner, pairs) {
136
- const fnBase = {
137
- [$internal]: { inner },
138
- resourceType: "generic-function",
139
- [$providing]: pairs.length > 0 ? {
140
- inner,
141
- pairs
142
- } : void 0,
143
- $name(label) {
144
- setName(this, label);
145
- if (!getName(inner)) setName(inner, label);
146
- return this;
147
- },
148
- [$resolve](ctx) {
149
- return ctx.resolve(inner);
150
- },
151
- with(slot, value) {
152
- const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
153
- return createGenericFn(inner, [...pairs, [s, value]]);
154
- }
155
- };
156
- const call = (...args) => {
157
- return inner(...args);
158
- };
159
- const genericFn = Object.assign(call, fnBase);
160
- const innerName = getName(inner);
161
- if (innerName) setName(genericFn, innerName);
162
- Object.defineProperty(genericFn, "toString", { value() {
163
- const fnLabel = getName(genericFn) ?? "<unnamed>";
164
- if (pairs.length > 0) return `fn*:${fnLabel}[${pairs.map(stringifyPair).join(", ")}]`;
165
- return `fn*:${fnLabel}`;
166
- } });
167
- return genericFn;
158
+ const fnBase = {
159
+ [$internal]: { inner },
160
+ resourceType: 'generic-function',
161
+ [$providing]: pairs.length > 0 ? { inner, pairs } : undefined,
162
+ $name(label) {
163
+ setName(this, label);
164
+ // Giving `inner` a name if it doesn't have one
165
+ if (!getName(inner)) {
166
+ setName(inner, label);
167
+ }
168
+ return this;
169
+ },
170
+ [$resolve](ctx) {
171
+ return ctx.resolve(inner);
172
+ },
173
+ with(slot, value) {
174
+ const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
175
+ return createGenericFn(inner, [...pairs, [s, value]]);
176
+ },
177
+ };
178
+ const call = (...args) => {
179
+ return inner(...args);
180
+ };
181
+ const genericFn = Object.assign(call, fnBase);
182
+ // Inheriting name from `inner`, if it exists
183
+ const innerName = getName(inner);
184
+ if (innerName) {
185
+ setName(genericFn, innerName);
186
+ }
187
+ Object.defineProperty(genericFn, 'toString', {
188
+ value() {
189
+ const fnLabel = getName(genericFn) ?? '<unnamed>';
190
+ if (pairs.length > 0) {
191
+ return `fn*:${fnLabel}[${pairs.map(stringifyPair).join(', ')}]`;
192
+ }
193
+ return `fn*:${fnLabel}`;
194
+ },
195
+ });
196
+ return genericFn;
168
197
  }
169
-
170
- //#endregion
171
- export { fn, isGenericFn, isTgpuFn };