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,147 +1,207 @@
1
1
  import { $internal } from "../shared/symbols.js";
2
- import { isAlignAttrib, isBuiltinAttrib, isDecorated, isSizeAttrib, isWgslData } from "./wgslTypes.js";
3
- import { isLooseData, isLooseDecorated } from "./dataTypes.js";
2
+ import { $gpuRepr, $inRepr, $invalidSchemaReason, $memIdent, $repr, $reprPartial, $reprPatch, $validStorageSchema, $validUniformSchema, $validVertexSchema, } from "../shared/symbols.js";
4
3
  import { alignmentOf } from "./alignmentOf.js";
4
+ import { isLooseData, isLooseDecorated, } from "./dataTypes.js";
5
5
  import { sizeOf } from "./sizeOf.js";
6
-
7
- //#region src/data/attributes.ts
8
- function attribute(data, attrib) {
9
- if (isDecorated(data)) return new DecoratedImpl(data.inner, [attrib, ...data.attribs]);
10
- if (isLooseDecorated(data)) return new LooseDecoratedImpl(data.inner, [attrib, ...data.attribs]);
11
- if (isLooseData(data)) return new LooseDecoratedImpl(data, [attrib]);
12
- return new DecoratedImpl(data, [attrib]);
6
+ import { isAlignAttrib, isBuiltinAttrib, isDecorated, isSizeAttrib, isWgslData, } from "./wgslTypes.js";
7
+ // ----------
8
+ // Public API
9
+ // ----------
10
+ export const builtinNames = [
11
+ 'vertex_index',
12
+ 'instance_index',
13
+ 'clip_distances',
14
+ 'position',
15
+ 'front_facing',
16
+ 'frag_depth',
17
+ 'primitive_index',
18
+ 'sample_index',
19
+ 'sample_mask',
20
+ 'fragment',
21
+ 'local_invocation_id',
22
+ 'local_invocation_index',
23
+ 'global_invocation_id',
24
+ 'global_invocation_index',
25
+ 'workgroup_id',
26
+ 'workgroup_index',
27
+ 'num_workgroups',
28
+ 'subgroup_invocation_id',
29
+ 'subgroup_size',
30
+ 'subgroup_id',
31
+ 'num_subgroups',
32
+ ];
33
+ export function attribute(data, attrib) {
34
+ if (isDecorated(data)) {
35
+ return new DecoratedImpl(data.inner, [attrib, ...data.attribs]);
36
+ }
37
+ if (isLooseDecorated(data)) {
38
+ return new LooseDecoratedImpl(data.inner, [attrib, ...data.attribs]);
39
+ }
40
+ if (isLooseData(data)) {
41
+ return new LooseDecoratedImpl(data, [attrib]);
42
+ }
43
+ return new DecoratedImpl(data, [attrib]);
13
44
  }
14
45
  /**
15
- * Gives the wrapped data-type a custom byte alignment. Useful in order to
16
- * fulfill uniform alignment requirements.
17
- *
18
- * @example
19
- * const Data = d.struct({
20
- * a: u32, // takes up 4 bytes
21
- * // 12 bytes of padding, because `b` is custom aligned to multiples of 16 bytes
22
- * b: d.align(16, u32),
23
- * });
24
- *
25
- * @param alignment The multiple of bytes this data should align itself to.
26
- * @param data The data-type to align.
27
- */
28
- function align(alignment, data) {
29
- return attribute(data, {
30
- [$internal]: true,
31
- type: "@align",
32
- params: [alignment]
33
- });
46
+ * Gives the wrapped data-type a custom byte alignment. Useful in order to
47
+ * fulfill uniform alignment requirements.
48
+ *
49
+ * @example
50
+ * const Data = d.struct({
51
+ * a: u32, // takes up 4 bytes
52
+ * // 12 bytes of padding, because `b` is custom aligned to multiples of 16 bytes
53
+ * b: d.align(16, u32),
54
+ * });
55
+ *
56
+ * @param alignment The multiple of bytes this data should align itself to.
57
+ * @param data The data-type to align.
58
+ */
59
+ export function align(alignment, data) {
60
+ return attribute(data, {
61
+ [$internal]: true,
62
+ type: '@align',
63
+ params: [alignment],
64
+ // oxlint-disable-next-line typescript/no-explicit-any -- tired of lying to types
65
+ });
34
66
  }
35
67
  /**
36
- * Adds padding bytes after the wrapped data-type, until the whole value takes up `size` bytes.
37
- *
38
- * @example
39
- * const Data = d.struct({
40
- * a: d.size(16, u32), // takes up 16 bytes, instead of 4
41
- * b: u32, // starts at byte 16, because `a` has a custom size
42
- * });
43
- *
44
- * @param size The amount of bytes that should be reserved for this data-type.
45
- * @param data The data-type to wrap.
46
- */
47
- function size(size$1, data) {
48
- return attribute(data, {
49
- [$internal]: true,
50
- type: "@size",
51
- params: [size$1]
52
- });
68
+ * Adds padding bytes after the wrapped data-type, until the whole value takes up `size` bytes.
69
+ *
70
+ * @example
71
+ * const Data = d.struct({
72
+ * a: d.size(16, u32), // takes up 16 bytes, instead of 4
73
+ * b: u32, // starts at byte 16, because `a` has a custom size
74
+ * });
75
+ *
76
+ * @param size The amount of bytes that should be reserved for this data-type.
77
+ * @param data The data-type to wrap.
78
+ */
79
+ export function size(size, data) {
80
+ return attribute(data, {
81
+ [$internal]: true,
82
+ type: '@size',
83
+ params: [size],
84
+ // oxlint-disable-next-line typescript/no-explicit-any -- tired of lying to types
85
+ });
53
86
  }
54
87
  /**
55
- * Assigns an explicit numeric location to a struct member or a parameter that has this type.
56
- *
57
- * @example
58
- * const VertexOutput = {
59
- * a: d.u32, // has implicit location 0
60
- * b: d.location(5, d.u32),
61
- * c: d.u32, // has implicit location 6
62
- * };
63
- *
64
- * @param location The explicit numeric location.
65
- * @param data The data-type to wrap.
66
- */
67
- function location(location$1, data) {
68
- return attribute(data, {
69
- [$internal]: true,
70
- type: "@location",
71
- params: [location$1]
72
- });
88
+ * Assigns an explicit numeric location to a struct member or a parameter that has this type.
89
+ *
90
+ * @example
91
+ * const VertexOutput = {
92
+ * a: d.u32, // has implicit location 0
93
+ * b: d.location(5, d.u32),
94
+ * c: d.u32, // has implicit location 6
95
+ * };
96
+ *
97
+ * @param location The explicit numeric location.
98
+ * @param data The data-type to wrap.
99
+ */
100
+ export function location(location, data) {
101
+ return attribute(data, {
102
+ [$internal]: true,
103
+ type: '@location',
104
+ params: [location],
105
+ // oxlint-disable-next-line typescript/no-explicit-any -- tired of lying to types
106
+ });
73
107
  }
74
- function interpolate(interpolationType, data) {
75
- return attribute(data, {
76
- [$internal]: true,
77
- type: "@interpolate",
78
- params: [interpolationType]
79
- });
108
+ export function interpolate(interpolationType, data) {
109
+ return attribute(data, {
110
+ [$internal]: true,
111
+ type: '@interpolate',
112
+ params: [interpolationType],
113
+ // oxlint-disable-next-line typescript/no-explicit-any -- tired of lying to types
114
+ });
80
115
  }
81
116
  /**
82
- * Marks a position built-in output value as invariant in vertex shaders.
83
- * If the data and control flow match for two position outputs in different
84
- * entry points, then the result values are guaranteed to be the same.
85
- *
86
- * Must only be applied to the position built-in value.
87
- *
88
- * @example
89
- * const VertexOutput = {
90
- * pos: d.invariant(d.builtin.position),
91
- * };
92
- *
93
- * @param data The position built-in data-type to mark as invariant.
94
- */
95
- function invariant(data) {
96
- if (!isBuiltin(data)) throw new Error("The @invariant attribute must only be applied to the position built-in value.");
97
- const builtinAttrib = isDecorated(data) || isLooseDecorated(data) ? data.attribs.find(isBuiltinAttrib) : void 0;
98
- if (!builtinAttrib || builtinAttrib.params[0] !== "position") throw new Error("The @invariant attribute must only be applied to the position built-in value.");
99
- return attribute(data, {
100
- [$internal]: true,
101
- type: "@invariant",
102
- params: []
103
- });
117
+ * Marks a position built-in output value as invariant in vertex shaders.
118
+ * If the data and control flow match for two position outputs in different
119
+ * entry points, then the result values are guaranteed to be the same.
120
+ *
121
+ * Must only be applied to the position built-in value.
122
+ *
123
+ * @example
124
+ * const VertexOutput = {
125
+ * pos: d.invariant(d.builtin.position),
126
+ * };
127
+ *
128
+ * @param data The position built-in data-type to mark as invariant.
129
+ */
130
+ export function invariant(data) {
131
+ // Validate that invariant is only applied to position built-in
132
+ if (!isBuiltin(data)) {
133
+ throw new Error('The @invariant attribute must only be applied to the position built-in value.');
134
+ }
135
+ // Find the builtin attribute to check if it's position
136
+ const builtinAttrib = isDecorated(data) || isLooseDecorated(data) ? data.attribs.find(isBuiltinAttrib) : undefined;
137
+ if (!builtinAttrib || builtinAttrib.params[0] !== 'position') {
138
+ throw new Error('The @invariant attribute must only be applied to the position built-in value.');
139
+ }
140
+ return attribute(data, {
141
+ [$internal]: true,
142
+ type: '@invariant',
143
+ params: [],
144
+ // oxlint-disable-next-line typescript/no-explicit-any -- tired of lying to types
145
+ });
104
146
  }
105
- function isBuiltin(value) {
106
- return (isDecorated(value) || isLooseDecorated(value)) && value.attribs.find(isBuiltinAttrib) !== void 0;
147
+ export function isBuiltin(value) {
148
+ return ((isDecorated(value) || isLooseDecorated(value)) &&
149
+ value.attribs.find(isBuiltinAttrib) !== undefined);
107
150
  }
108
- function getAttributesString(field) {
109
- if (!isDecorated(field) && !isLooseDecorated(field)) return "";
110
- return field.attribs.map((attrib) => {
111
- if (attrib.params.length === 0) return `${attrib.type} `;
112
- return `${attrib.type}(${attrib.params.join(", ")}) `;
113
- }).join("");
151
+ export function getAttributesString(field) {
152
+ if (!isDecorated(field) && !isLooseDecorated(field)) {
153
+ return '';
154
+ }
155
+ return field.attribs
156
+ .map((attrib) => {
157
+ if (attrib.params.length === 0) {
158
+ return `${attrib.type} `;
159
+ }
160
+ return `${attrib.type}(${attrib.params.join(', ')}) `;
161
+ })
162
+ .join('');
163
+ }
164
+ // --------------
165
+ // Implementation
166
+ // --------------
167
+ class BaseDecoratedImpl {
168
+ [$internal] = {};
169
+ inner;
170
+ attribs;
171
+ // ---
172
+ constructor(inner, attribs) {
173
+ this.inner = inner;
174
+ this.attribs = attribs;
175
+ const alignAttrib = attribs.find(isAlignAttrib)?.params[0];
176
+ const sizeAttrib = attribs.find(isSizeAttrib)?.params[0];
177
+ if (alignAttrib !== undefined) {
178
+ if (alignAttrib <= 0) {
179
+ throw new Error(`Custom data alignment must be a positive number, got: ${alignAttrib}.`);
180
+ }
181
+ if (Math.log2(alignAttrib) % 1 !== 0) {
182
+ throw new Error(`Alignment has to be a power of 2, got: ${alignAttrib}.`);
183
+ }
184
+ if (isWgslData(this.inner)) {
185
+ if (alignAttrib % alignmentOf(this.inner) !== 0) {
186
+ throw new Error(`Custom alignment has to be a multiple of the standard data alignment. Got: ${alignAttrib}, expected multiple of: ${alignmentOf(this.inner)}.`);
187
+ }
188
+ }
189
+ }
190
+ if (sizeAttrib !== undefined) {
191
+ if (sizeAttrib < sizeOf(this.inner)) {
192
+ throw new Error(`Custom data size cannot be smaller then the standard data size. Got: ${sizeAttrib}, expected at least: ${sizeOf(this.inner)}.`);
193
+ }
194
+ if (sizeAttrib <= 0) {
195
+ throw new Error(`Custom data size must be a positive number. Got: ${sizeAttrib}.`);
196
+ }
197
+ }
198
+ }
199
+ }
200
+ class DecoratedImpl extends BaseDecoratedImpl {
201
+ [$internal] = {};
202
+ type = 'decorated';
203
+ }
204
+ class LooseDecoratedImpl extends BaseDecoratedImpl {
205
+ [$internal] = {};
206
+ type = 'loose-decorated';
114
207
  }
115
- var BaseDecoratedImpl = class {
116
- [$internal] = {};
117
- inner;
118
- attribs;
119
- constructor(inner, attribs) {
120
- this.inner = inner;
121
- this.attribs = attribs;
122
- const alignAttrib = attribs.find(isAlignAttrib)?.params[0];
123
- const sizeAttrib = attribs.find(isSizeAttrib)?.params[0];
124
- if (alignAttrib !== void 0) {
125
- if (alignAttrib <= 0) throw new Error(`Custom data alignment must be a positive number, got: ${alignAttrib}.`);
126
- if (Math.log2(alignAttrib) % 1 !== 0) throw new Error(`Alignment has to be a power of 2, got: ${alignAttrib}.`);
127
- if (isWgslData(this.inner)) {
128
- if (alignAttrib % alignmentOf(this.inner) !== 0) throw new Error(`Custom alignment has to be a multiple of the standard data alignment. Got: ${alignAttrib}, expected multiple of: ${alignmentOf(this.inner)}.`);
129
- }
130
- }
131
- if (sizeAttrib !== void 0) {
132
- if (sizeAttrib < sizeOf(this.inner)) throw new Error(`Custom data size cannot be smaller then the standard data size. Got: ${sizeAttrib}, expected at least: ${sizeOf(this.inner)}.`);
133
- if (sizeAttrib <= 0) throw new Error(`Custom data size must be a positive number. Got: ${sizeAttrib}.`);
134
- }
135
- }
136
- };
137
- var DecoratedImpl = class extends BaseDecoratedImpl {
138
- [$internal] = {};
139
- type = "decorated";
140
- };
141
- var LooseDecoratedImpl = class extends BaseDecoratedImpl {
142
- [$internal] = {};
143
- type = "loose-decorated";
144
- };
145
-
146
- //#endregion
147
- export { align, attribute, getAttributesString, interpolate, invariant, isBuiltin, location, size };
@@ -1,3 +1,36 @@
1
- import "./snippet.js";
2
- import "../types.js";
3
- import "./wgslTypes.js";
1
+ import { $internal, $repr, $resolve } from '../shared/symbols.ts';
2
+ import type { ResolutionCtx, SelfResolvable } from '../types.ts';
3
+ import type { ResolvedSnippet } from './snippet.ts';
4
+ import type { BaseData, WgslStruct } from './wgslTypes.ts';
5
+ /**
6
+ * A requirement for the generated struct is that non-builtin properties need to
7
+ * have the same name in WGSL as they do in JS. This allows locations to be properly
8
+ * matched between the Vertex output and Fragment input.
9
+ */
10
+ export declare class AutoStruct implements BaseData, SelfResolvable {
11
+ #private;
12
+ [$internal]: Record<string, never>;
13
+ type: 'auto-struct';
14
+ readonly [$repr]: Record<string, unknown>;
15
+ constructor(validProps: Record<string, BaseData>, typeForExtraProps: BaseData | undefined, locations?: Record<string, number>);
16
+ /**
17
+ * Used for accessing builtins, varying and attributes in code.
18
+ */
19
+ accessProp(key: string): {
20
+ prop: string;
21
+ type: BaseData;
22
+ } | undefined;
23
+ /**
24
+ * Used for providing new varyings.
25
+ *
26
+ * @privateRemarks
27
+ * Internally used by `accessProp`.
28
+ */
29
+ provideProp(key: string, dataType: BaseData): {
30
+ prop: string;
31
+ type: BaseData;
32
+ };
33
+ get completeStruct(): WgslStruct<Record<string, BaseData>>;
34
+ [$resolve](ctx: ResolutionCtx): ResolvedSnippet;
35
+ toString(): string;
36
+ }
@@ -1,84 +1,87 @@
1
- import { $internal, $resolve } from "../shared/symbols.js";
2
- import { getName, setName } from "../shared/meta.js";
3
- import { validateProp } from "../nameUtils.js";
4
1
  import { createIoSchema } from "../core/function/ioSchema.js";
5
-
6
- //#region src/data/autoStruct.ts
2
+ import { validateProp } from "../nameUtils.js";
3
+ import { getName, setName } from "../shared/meta.js";
4
+ import { $internal, $repr, $resolve } from "../shared/symbols.js";
7
5
  /**
8
- * A requirement for the generated struct is that non-builtin properties need to
9
- * have the same name in WGSL as they do in JS. This allows locations to be properly
10
- * matched between the Vertex output and Fragment input.
11
- */
12
- var AutoStruct = class {
13
- /**
14
- * js key -> data type
15
- */
16
- #validProps;
17
- /**
18
- * js key -> { prop: 'wgsl key', type: ... }
19
- * @example '$position' -> { prop: 'position', type: ... }
20
- */
21
- #allocated;
22
- #usedWgslKeys;
23
- #locations;
24
- #cachedStruct;
25
- #typeForExtraProps;
26
- constructor(validProps, typeForExtraProps, locations) {
27
- this.#validProps = validProps;
28
- this.#typeForExtraProps = typeForExtraProps;
29
- this.#allocated = {};
30
- this.#locations = locations;
31
- this.#usedWgslKeys = /* @__PURE__ */ new Set();
32
- }
33
- /**
34
- * Used for accessing builtins, varying and attributes in code.
35
- */
36
- accessProp(key) {
37
- const dataType = this.#validProps[key] ?? this.#typeForExtraProps;
38
- if (!dataType) return;
39
- return this.provideProp(key, dataType);
40
- }
41
- /**
42
- * Used for providing new varyings.
43
- *
44
- * @privateRemarks
45
- * Internally used by `accessProp`.
46
- */
47
- provideProp(key, dataType) {
48
- let alloc = this.#allocated[key];
49
- if (!alloc) {
50
- const wgslKey = key.replaceAll("$", "");
51
- if (this.#usedWgslKeys.has(wgslKey)) throw new Error(`Property name '${wgslKey}' causes naming clashes. Choose a different name.`);
52
- const result = /* @__PURE__ */ validateProp(wgslKey);
53
- if (!result.success) throw new Error(`Invalid property key '${key}'${result.error ? `: ${result.error}` : ""}`);
54
- this.#usedWgslKeys.add(wgslKey);
55
- alloc = {
56
- prop: wgslKey,
57
- type: dataType
58
- };
59
- this.#allocated[key] = alloc;
60
- }
61
- return alloc;
62
- }
63
- get completeStruct() {
64
- if (!this.#cachedStruct) {
65
- this.#cachedStruct = createIoSchema(Object.fromEntries(Object.values(this.#allocated).map((alloc) => {
66
- return [alloc.prop, alloc.type];
67
- })), this.#locations);
68
- const ownName = getName(this);
69
- if (ownName) setName(this.#cachedStruct, ownName);
70
- }
71
- return this.#cachedStruct;
72
- }
73
- [$resolve](ctx) {
74
- return ctx.resolve(this.completeStruct);
75
- }
76
- toString() {
77
- return `auto-struct:${getName(this) ?? "<unnamed>"}`;
78
- }
79
- };
6
+ * A requirement for the generated struct is that non-builtin properties need to
7
+ * have the same name in WGSL as they do in JS. This allows locations to be properly
8
+ * matched between the Vertex output and Fragment input.
9
+ */
10
+ export class AutoStruct {
11
+ // ---
12
+ /**
13
+ * js key -> data type
14
+ */
15
+ #validProps;
16
+ /**
17
+ * js key -> { prop: 'wgsl key', type: ... }
18
+ * @example '$position' -> { prop: 'position', type: ... }
19
+ */
20
+ #allocated;
21
+ #usedWgslKeys;
22
+ #locations;
23
+ #cachedStruct;
24
+ #typeForExtraProps;
25
+ constructor(validProps, typeForExtraProps, locations) {
26
+ this.#validProps = validProps;
27
+ this.#typeForExtraProps = typeForExtraProps;
28
+ this.#allocated = {};
29
+ this.#locations = locations;
30
+ this.#usedWgslKeys = new Set();
31
+ }
32
+ /**
33
+ * Used for accessing builtins, varying and attributes in code.
34
+ */
35
+ accessProp(key) {
36
+ // If the prop is not found in validProps, we consider it an extra property
37
+ const dataType = this.#validProps[key] ?? this.#typeForExtraProps;
38
+ if (!dataType) {
39
+ return undefined;
40
+ }
41
+ return this.provideProp(key, dataType);
42
+ }
43
+ /**
44
+ * Used for providing new varyings.
45
+ *
46
+ * @privateRemarks
47
+ * Internally used by `accessProp`.
48
+ */
49
+ provideProp(key, dataType) {
50
+ let alloc = this.#allocated[key];
51
+ if (!alloc) {
52
+ const wgslKey = key.replaceAll('$', '');
53
+ if (this.#usedWgslKeys.has(wgslKey)) {
54
+ throw new Error(`Property name '${wgslKey}' causes naming clashes. Choose a different name.`);
55
+ }
56
+ const result = validateProp(wgslKey);
57
+ if (!result.success) {
58
+ throw new Error(`Invalid property key '${key}'${result.error ? `: ${result.error}` : ''}`);
59
+ }
60
+ this.#usedWgslKeys.add(wgslKey);
61
+ alloc = { prop: wgslKey, type: dataType };
62
+ this.#allocated[key] = alloc;
63
+ }
64
+ return alloc;
65
+ }
66
+ get completeStruct() {
67
+ if (!this.#cachedStruct) {
68
+ this.#cachedStruct = createIoSchema(Object.fromEntries(Object.values(this.#allocated).map((alloc) => {
69
+ return [alloc.prop, alloc.type];
70
+ })), this.#locations);
71
+ const ownName = getName(this);
72
+ // Passing the given name forward
73
+ if (ownName) {
74
+ setName(this.#cachedStruct, ownName);
75
+ }
76
+ }
77
+ return this.#cachedStruct;
78
+ }
79
+ [$resolve](ctx) {
80
+ return ctx.resolve(this.completeStruct);
81
+ }
82
+ toString() {
83
+ return `auto-struct:${getName(this) ?? '<unnamed>'}`;
84
+ }
85
+ }
80
86
  AutoStruct.prototype[$internal] = {};
81
- AutoStruct.prototype.type = "auto-struct";
82
-
83
- //#endregion
84
- export { AutoStruct };
87
+ AutoStruct.prototype.type = 'auto-struct';
@@ -0,0 +1,5 @@
1
+ import * as wgsl from './wgslTypes.ts';
2
+ export declare const EVAL_ALLOWED_IN_ENV: boolean;
3
+ export type CompiledWriter = (output: DataView, offset: number, value: unknown, littleEndian?: boolean, endOffset?: number) => void;
4
+ export declare function buildWriter(node: wgsl.BaseData, offsetExpr: string, valueExpr: string, depth?: number, partial?: boolean): string;
5
+ export declare function getCompiledWriter(schema: wgsl.BaseData): CompiledWriter | undefined;