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,88 +1,103 @@
1
- import { isDecorated, isWgslArray, isWgslStruct } from "./wgslTypes.js";
2
1
  import { safeStringify } from "../shared/stringify.js";
3
- import { getCustomAlignment, isDisarray, isLooseDecorated, isUnstruct } from "./dataTypes.js";
2
+ import { getCustomAlignment, isDisarray, isLooseDecorated, isUnstruct, } from "./dataTypes.js";
4
3
  import { packedFormats } from "./vertexFormatData.js";
5
-
6
- //#region src/data/alignmentOf.ts
4
+ import { isDecorated, isWgslArray, isWgslStruct } from "./wgslTypes.js";
7
5
  const knownAlignmentMap = {
8
- f32: 4,
9
- f16: 2,
10
- i32: 4,
11
- u32: 4,
12
- bool: 4,
13
- u16: 2,
14
- vec2f: 8,
15
- vec2h: 4,
16
- vec2i: 8,
17
- vec2u: 8,
18
- "vec2<bool>": 8,
19
- vec3f: 16,
20
- vec3h: 8,
21
- vec3i: 16,
22
- vec3u: 16,
23
- "vec3<bool>": 16,
24
- vec4f: 16,
25
- vec4h: 8,
26
- vec4i: 16,
27
- vec4u: 16,
28
- "vec4<bool>": 16,
29
- mat2x2f: 8,
30
- mat3x3f: 16,
31
- mat4x4f: 16,
32
- atomic: 4
6
+ f32: 4,
7
+ f16: 2,
8
+ i32: 4,
9
+ u32: 4,
10
+ bool: 4,
11
+ u16: 2,
12
+ vec2f: 8,
13
+ vec2h: 4,
14
+ vec2i: 8,
15
+ vec2u: 8,
16
+ 'vec2<bool>': 8,
17
+ vec3f: 16,
18
+ vec3h: 8,
19
+ vec3i: 16,
20
+ vec3u: 16,
21
+ 'vec3<bool>': 16,
22
+ vec4f: 16,
23
+ vec4h: 8,
24
+ vec4i: 16,
25
+ vec4u: 16,
26
+ 'vec4<bool>': 16,
27
+ mat2x2f: 8,
28
+ mat3x3f: 16,
29
+ mat4x4f: 16,
30
+ atomic: 4,
33
31
  };
34
32
  function computeAlignment(data) {
35
- const dataType = data?.type;
36
- const knownAlignment = knownAlignmentMap[dataType];
37
- if (knownAlignment !== void 0) return knownAlignment;
38
- if (isWgslStruct(data)) return Object.values(data.propTypes).map(alignmentOf).reduce((a, b) => a > b ? a : b);
39
- if (isWgslArray(data)) return alignmentOf(data.elementType);
40
- if (isUnstruct(data)) {
41
- const firstProp = Object.values(data.propTypes)[0];
42
- return firstProp ? getCustomAlignment(firstProp) ?? 1 : 1;
43
- }
44
- if (isDisarray(data)) return getCustomAlignment(data.elementType) ?? 1;
45
- if (isDecorated(data) || isLooseDecorated(data)) return getCustomAlignment(data) ?? alignmentOf(data.inner);
46
- if (packedFormats.has(dataType)) return 1;
47
- throw new Error(`Cannot determine alignment of data: ${safeStringify(data)}`);
33
+ const dataType = data?.type;
34
+ const knownAlignment = knownAlignmentMap[dataType];
35
+ if (knownAlignment !== undefined) {
36
+ return knownAlignment;
37
+ }
38
+ if (isWgslStruct(data)) {
39
+ return Object.values(data.propTypes)
40
+ .map(alignmentOf)
41
+ .reduce((a, b) => (a > b ? a : b));
42
+ }
43
+ if (isWgslArray(data)) {
44
+ return alignmentOf(data.elementType);
45
+ }
46
+ if (isUnstruct(data)) {
47
+ // A loose struct is aligned to its first property.
48
+ const firstProp = Object.values(data.propTypes)[0];
49
+ return firstProp ? (getCustomAlignment(firstProp) ?? 1) : 1;
50
+ }
51
+ if (isDisarray(data)) {
52
+ return getCustomAlignment(data.elementType) ?? 1;
53
+ }
54
+ if (isDecorated(data) || isLooseDecorated(data)) {
55
+ return getCustomAlignment(data) ?? alignmentOf(data.inner);
56
+ }
57
+ if (packedFormats.has(dataType)) {
58
+ return 1;
59
+ }
60
+ throw new Error(`Cannot determine alignment of data: ${safeStringify(data)}`);
48
61
  }
49
62
  function computeCustomAlignment(data) {
50
- if (isUnstruct(data)) {
51
- const firstProp = Object.values(data.propTypes)[0];
52
- return firstProp ? customAlignmentOf(firstProp) : 1;
53
- }
54
- if (isDisarray(data)) return customAlignmentOf(data.elementType);
55
- if (isLooseDecorated(data)) return getCustomAlignment(data) ?? customAlignmentOf(data.inner);
56
- return getCustomAlignment(data) ?? 1;
63
+ if (isUnstruct(data)) {
64
+ // A loose struct is aligned to its first property.
65
+ const firstProp = Object.values(data.propTypes)[0];
66
+ return firstProp ? customAlignmentOf(firstProp) : 1;
67
+ }
68
+ if (isDisarray(data)) {
69
+ return customAlignmentOf(data.elementType);
70
+ }
71
+ if (isLooseDecorated(data)) {
72
+ return getCustomAlignment(data) ?? customAlignmentOf(data.inner);
73
+ }
74
+ return getCustomAlignment(data) ?? 1;
57
75
  }
58
76
  /**
59
- * Since alignments can be inferred from data types, they are not stored on them.
60
- * Instead, this weak map acts as an extended property of those data types.
61
- */
62
- const cachedAlignments = /* @__PURE__ */ new WeakMap();
63
- const cachedCustomAlignments = /* @__PURE__ */ new WeakMap();
64
- function alignmentOf(data) {
65
- let alignment = cachedAlignments.get(data);
66
- if (alignment === void 0) {
67
- alignment = computeAlignment(data);
68
- cachedAlignments.set(data, alignment);
69
- }
70
- return alignment;
77
+ * Since alignments can be inferred from data types, they are not stored on them.
78
+ * Instead, this weak map acts as an extended property of those data types.
79
+ */
80
+ const cachedAlignments = new WeakMap();
81
+ const cachedCustomAlignments = new WeakMap();
82
+ export function alignmentOf(data) {
83
+ let alignment = cachedAlignments.get(data);
84
+ if (alignment === undefined) {
85
+ alignment = computeAlignment(data);
86
+ cachedAlignments.set(data, alignment);
87
+ }
88
+ return alignment;
71
89
  }
72
- function customAlignmentOf(data) {
73
- let alignment = cachedCustomAlignments.get(data);
74
- if (alignment === void 0) {
75
- alignment = computeCustomAlignment(data);
76
- cachedCustomAlignments.set(data, alignment);
77
- }
78
- return alignment;
90
+ export function customAlignmentOf(data) {
91
+ let alignment = cachedCustomAlignments.get(data);
92
+ if (alignment === undefined) {
93
+ alignment = computeCustomAlignment(data);
94
+ cachedCustomAlignments.set(data, alignment);
95
+ }
96
+ return alignment;
79
97
  }
80
98
  /**
81
- * Returns the alignment (in bytes) of data represented by the `schema`.
82
- */
83
- function PUBLIC_alignmentOf(schema) {
84
- return alignmentOf(schema);
99
+ * Returns the alignment (in bytes) of data represented by the `schema`.
100
+ */
101
+ export function PUBLIC_alignmentOf(schema) {
102
+ return alignmentOf(schema);
85
103
  }
86
-
87
- //#endregion
88
- export { PUBLIC_alignmentOf, alignmentOf, customAlignmentOf };
package/data/array.d.ts CHANGED
@@ -1,15 +1,23 @@
1
- import { AnyWgslData, WgslArray } from "./wgslTypes.js";
2
- import { TgpuComptime } from "../core/function/comptime.js";
3
-
4
- //#region src/data/array.d.ts
1
+ import { type TgpuComptime } from '../core/function/comptime.ts';
2
+ import type { AnyWgslData, Decorated, Location, WgslArray } from './wgslTypes.ts';
3
+ type ForbiddenDecoratedArrayElement<T> = T extends Decorated<infer _, infer Attribs> ? Attribs[number] extends Location ? never : T : never;
5
4
  interface WgslArrayConstructor {
6
- <TElement extends AnyWgslData>(elementType: TElement): (elementCount: number) => WgslArray<TElement>;
7
- <TElement extends AnyWgslData>(elementType: TElement, elementCount: number): WgslArray<TElement>;
5
+ /**
6
+ * @deprecated Error: Arrays cannot hold decorated types other than @location.
7
+ * Wrap align/size in a struct instead, e.g. d.arrayOf(d.struct({ value: d.align(16, d.u32) }), n).
8
+ */
9
+ <TElement extends AnyWgslData>(elementType: ForbiddenDecoratedArrayElement<TElement>, elementCount?: number): 'Error: Arrays cannot hold decorated types other than @location. Wrap it in a struct instead, e.g. d.arrayOf(d.struct({ value: d.align(16, d.u32) }), n).';
10
+ <TElement extends AnyWgslData>(elementType: TElement): (elementCount: number) => WgslArray<TElement>;
11
+ <TElement extends AnyWgslData>(elementType: TElement, elementCount: number): WgslArray<TElement>;
8
12
  }
9
13
  /**
10
14
  * Creates an array schema that can be used to construct gpu buffers.
11
15
  * Describes arrays with fixed-size length, storing elements of the same type.
12
16
  *
17
+ * The only decoration allowed on element types is `d.location`. Decorators like
18
+ * `d.align` and `d.size` cannot be applied directly — wrap them in a struct instead,
19
+ * e.g. `d.arrayOf(d.struct({ value: d.align(16, d.u32) }), n)`.
20
+ *
13
21
  * @example
14
22
  * const LENGTH = 3;
15
23
  * const array = d.arrayOf(d.u32, LENGTH);
@@ -21,7 +29,7 @@ interface WgslArrayConstructor {
21
29
  *
22
30
  * @param elementType The type of elements in the array.
23
31
  * @param elementCount The number of elements in the array.
32
+ * @throws If `elementType` is decorated with anything other than `d.location`.
24
33
  */
25
- declare const arrayOf: TgpuComptime<WgslArrayConstructor>;
26
- //#endregion
27
- export { arrayOf };
34
+ export declare const arrayOf: TgpuComptime<WgslArrayConstructor>;
35
+ export {};
package/data/array.js CHANGED
@@ -1,48 +1,65 @@
1
+ import { comptime } from "../core/function/comptime.js";
1
2
  import { $internal } from "../shared/symbols.js";
2
3
  import { schemaCallWrapper } from "./schemaCallWrapper.js";
3
4
  import { sizeOf } from "./sizeOf.js";
4
- import { comptime } from "../core/function/comptime.js";
5
-
6
- //#region src/data/array.ts
5
+ import { isDecorated, isLocationAttrib } from "./wgslTypes.js";
7
6
  /**
8
- * Creates an array schema that can be used to construct gpu buffers.
9
- * Describes arrays with fixed-size length, storing elements of the same type.
10
- *
11
- * @example
12
- * const LENGTH = 3;
13
- * const array = d.arrayOf(d.u32, LENGTH);
14
- *
15
- * If `elementCount` is not specified, a partially applied function is returned.
16
- * @example
17
- * const array = d.arrayOf(d.vec3f);
18
- * // ^? (n: number) => WgslArray<d.Vec3f>
19
- *
20
- * @param elementType The type of elements in the array.
21
- * @param elementCount The number of elements in the array.
22
- */
23
- const arrayOf = comptime(((elementType, elementCount) => {
24
- if (elementCount === void 0) return comptime((count) => cpu_arrayOf(elementType, count));
25
- return cpu_arrayOf(elementType, elementCount);
26
- })).$name("arrayOf");
7
+ * Creates an array schema that can be used to construct gpu buffers.
8
+ * Describes arrays with fixed-size length, storing elements of the same type.
9
+ *
10
+ * The only decoration allowed on element types is `d.location`. Decorators like
11
+ * `d.align` and `d.size` cannot be applied directly — wrap them in a struct instead,
12
+ * e.g. `d.arrayOf(d.struct({ value: d.align(16, d.u32) }), n)`.
13
+ *
14
+ * @example
15
+ * const LENGTH = 3;
16
+ * const array = d.arrayOf(d.u32, LENGTH);
17
+ *
18
+ * If `elementCount` is not specified, a partially applied function is returned.
19
+ * @example
20
+ * const array = d.arrayOf(d.vec3f);
21
+ * // ^? (n: number) => WgslArray<d.Vec3f>
22
+ *
23
+ * @param elementType The type of elements in the array.
24
+ * @param elementCount The number of elements in the array.
25
+ * @throws If `elementType` is decorated with anything other than `d.location`.
26
+ */
27
+ export const arrayOf = comptime(((elementType, elementCount) => {
28
+ if (isDecorated(elementType) && !elementType.attribs.every(isLocationAttrib)) {
29
+ throw new Error('Arrays cannot hold decorated types other than @location. Wrap it in a struct instead, e.g. d.arrayOf(d.struct({ value: d.align(16, d.u32) }), n).');
30
+ }
31
+ if (elementCount === undefined) {
32
+ return comptime((count) => cpu_arrayOf(elementType, count));
33
+ }
34
+ return cpu_arrayOf(elementType, elementCount);
35
+ })).$name('arrayOf');
36
+ // --------------
37
+ // Implementation
38
+ // --------------
27
39
  function cpu_arrayOf(elementType, elementCount) {
28
- const arraySchema = (elements) => {
29
- if (elements && elements.length !== elementCount) throw new Error(`Array schema of ${elementCount} elements of type ${elementType.type} called with ${elements.length} argument(s).`);
30
- return Array.from({ length: elementCount }, (_, i) => schemaCallWrapper(elementType, elements?.[i]));
31
- };
32
- Object.setPrototypeOf(arraySchema, WgslArrayImpl);
33
- if (Number.isNaN(sizeOf(elementType))) throw new Error("Cannot nest runtime sized arrays.");
34
- arraySchema.elementType = elementType;
35
- if (!Number.isInteger(elementCount) || elementCount < 0) throw new Error(`Cannot create array schema with invalid element count: ${elementCount}.`);
36
- arraySchema.elementCount = elementCount;
37
- return arraySchema;
40
+ // In the schema call, create and return a deep copy
41
+ // by wrapping all the values in `elementType` schema calls.
42
+ const arraySchema = (elements) => {
43
+ if (elements && elements.length !== elementCount) {
44
+ throw new Error(`Array schema of ${elementCount} elements of type ${elementType.type} called with ${elements.length} argument(s).`);
45
+ }
46
+ return Array.from({ length: elementCount }, (_, i) => schemaCallWrapper(elementType, elements?.[i]));
47
+ };
48
+ Object.setPrototypeOf(arraySchema, WgslArrayImpl);
49
+ if (Number.isNaN(sizeOf(elementType))) {
50
+ throw new Error('Cannot nest runtime sized arrays.');
51
+ }
52
+ arraySchema.elementType = elementType;
53
+ if (!Number.isInteger(elementCount) || elementCount < 0) {
54
+ throw new Error(`Cannot create array schema with invalid element count: ${elementCount}.`);
55
+ }
56
+ arraySchema.elementCount = elementCount;
57
+ return arraySchema;
38
58
  }
39
59
  const WgslArrayImpl = {
40
- [$internal]: true,
41
- type: "array",
42
- toString() {
43
- return `arrayOf(${String(this.elementType)}, ${this.elementCount})`;
44
- }
60
+ [$internal]: true,
61
+ type: 'array',
62
+ toString() {
63
+ return `arrayOf(${String(this.elementType)}, ${this.elementCount})`;
64
+ },
45
65
  };
46
-
47
- //#endregion
48
- export { arrayOf };
package/data/atomic.d.ts CHANGED
@@ -1,7 +1,4 @@
1
- import { Atomic, I32, U32 } from "./wgslTypes.js";
2
-
3
- //#region src/data/atomic.d.ts
4
-
1
+ import type { Atomic, I32, U32 } from './wgslTypes.ts';
5
2
  /**
6
3
  * Marks a concrete integer scalar type schema (u32 or i32) as a WGSL atomic.
7
4
  *
@@ -11,6 +8,4 @@ import { Atomic, I32, U32 } from "./wgslTypes.js";
11
8
  *
12
9
  * @param data Underlying type schema.
13
10
  */
14
- declare function atomic<TSchema extends U32 | I32>(data: TSchema): Atomic<TSchema>;
15
- //#endregion
16
- export { atomic };
11
+ export declare function atomic<TSchema extends U32 | I32>(data: TSchema): Atomic<TSchema>;
package/data/atomic.js CHANGED
@@ -1,26 +1,29 @@
1
1
  import { $internal } from "../shared/symbols.js";
2
-
3
- //#region src/data/atomic.ts
2
+ import { $gpuRepr, $memIdent, $repr, $validStorageSchema, $validUniformSchema, $validVertexSchema, } from "../shared/symbols.js";
3
+ // ----------
4
+ // Public API
5
+ // ----------
4
6
  /**
5
- * Marks a concrete integer scalar type schema (u32 or i32) as a WGSL atomic.
6
- *
7
- * @example
8
- * const atomicU32 = d.atomic(d.u32);
9
- * const atomicI32 = d.atomic(d.i32);
10
- *
11
- * @param data Underlying type schema.
12
- */
13
- function atomic(data) {
14
- return new AtomicImpl(data);
7
+ * Marks a concrete integer scalar type schema (u32 or i32) as a WGSL atomic.
8
+ *
9
+ * @example
10
+ * const atomicU32 = d.atomic(d.u32);
11
+ * const atomicI32 = d.atomic(d.i32);
12
+ *
13
+ * @param data Underlying type schema.
14
+ */
15
+ export function atomic(data) {
16
+ return new AtomicImpl(data);
17
+ }
18
+ // --------------
19
+ // Implementation
20
+ // --------------
21
+ class AtomicImpl {
22
+ [$internal] = {};
23
+ type = 'atomic';
24
+ inner;
25
+ // ---
26
+ constructor(inner) {
27
+ this.inner = inner;
28
+ }
15
29
  }
16
- var AtomicImpl = class {
17
- [$internal] = {};
18
- type = "atomic";
19
- inner;
20
- constructor(inner) {
21
- this.inner = inner;
22
- }
23
- };
24
-
25
- //#endregion
26
- export { atomic };
@@ -1,12 +1,10 @@
1
- import { Align, AnyWgslData, BaseData, Builtin, Decorated, FlatInterpolatableData, FlatInterpolationType, Interpolate, Invariant, IsWgslData, Location, PerspectiveOrLinearInterpolatableData, PerspectiveOrLinearInterpolationType, Size, Vec4f } from "./wgslTypes.js";
2
- import { AnyData, AnyLooseData, IsLooseData, LooseDecorated, Undecorate } from "./dataTypes.js";
3
-
4
- //#region src/data/attributes.d.ts
5
- declare const builtinNames: readonly ["vertex_index", "instance_index", "clip_distances", "position", "front_facing", "frag_depth", "primitive_index", "sample_index", "sample_mask", "fragment", "local_invocation_id", "local_invocation_index", "global_invocation_id", "global_invocation_index", "workgroup_id", "workgroup_index", "num_workgroups", "subgroup_invocation_id", "subgroup_size", "subgroup_id", "num_subgroups"];
6
- type BuiltinName = (typeof builtinNames)[number];
7
- type AnyAttribute<AllowedBuiltins extends Builtin<BuiltinName> = Builtin<BuiltinName>> = Align<number> | Size<number> | Location | Interpolate | Invariant | AllowedBuiltins;
8
- type ExtractAttributes<T> = T extends {
9
- readonly attribs: unknown[];
1
+ import { type AnyData, type AnyLooseData, type IsLooseData, type LooseDecorated, type Undecorate } from './dataTypes.ts';
2
+ import { type Align, type AnyWgslData, type BaseData, type Builtin, type Decorated, type FlatInterpolatableData, type FlatInterpolationType, type Interpolate, type Invariant, type IsWgslData, type Location, type PerspectiveOrLinearInterpolatableData, type PerspectiveOrLinearInterpolationType, type Size, type Vec4f } from './wgslTypes.ts';
3
+ export declare const builtinNames: readonly ["vertex_index", "instance_index", "clip_distances", "position", "front_facing", "frag_depth", "primitive_index", "sample_index", "sample_mask", "fragment", "local_invocation_id", "local_invocation_index", "global_invocation_id", "global_invocation_index", "workgroup_id", "workgroup_index", "num_workgroups", "subgroup_invocation_id", "subgroup_size", "subgroup_id", "num_subgroups"];
4
+ export type BuiltinName = (typeof builtinNames)[number];
5
+ export type AnyAttribute<AllowedBuiltins extends Builtin<BuiltinName> = Builtin<BuiltinName>> = Align<number> | Size<number> | Location | Interpolate | Invariant | AllowedBuiltins;
6
+ export type ExtractAttributes<T> = T extends {
7
+ readonly attribs: unknown[];
10
8
  } ? T['attribs'] : [];
11
9
  /**
12
10
  * Decorates a data-type `TData` with an attribute `TAttrib`.
@@ -22,9 +20,10 @@ type ExtractAttributes<T> = T extends {
22
20
  * - else
23
21
  * - Wrap `TData` with `Decorated` and a single attribute `[TAttrib]`
24
22
  */
25
- type Decorate<TData extends BaseData, TAttrib extends AnyAttribute> = IsWgslData<TData> extends true ? Decorated<Undecorate<TData>, [TAttrib, ...ExtractAttributes<TData>]> : IsLooseData<TData> extends true ? LooseDecorated<Undecorate<TData>, [TAttrib, ...ExtractAttributes<TData>]> : never;
26
- type IsBuiltin<T> = ExtractAttributes<T>[number] extends [] ? false : ExtractAttributes<T>[number] extends Builtin<BuiltinName> ? true : false;
27
- type HasCustomLocation<T> = ExtractAttributes<T>[number] extends [] ? false : ExtractAttributes<T>[number] extends Location ? true : false;
23
+ export type Decorate<TData extends BaseData, TAttrib extends AnyAttribute> = IsWgslData<TData> extends true ? Decorated<Undecorate<TData>, [TAttrib, ...ExtractAttributes<TData>]> : IsLooseData<TData> extends true ? LooseDecorated<Undecorate<TData>, [TAttrib, ...ExtractAttributes<TData>]> : never;
24
+ export type IsBuiltin<T> = ExtractAttributes<T>[number] extends [] ? false : ExtractAttributes<T>[number] extends Builtin<BuiltinName> ? true : false;
25
+ export type HasCustomLocation<T> = ExtractAttributes<T>[number] extends [] ? false : ExtractAttributes<T>[number] extends Location ? true : false;
26
+ export declare function attribute(data: BaseData, attrib: AnyAttribute): Decorated | LooseDecorated;
28
27
  /**
29
28
  * Gives the wrapped data-type a custom byte alignment. Useful in order to
30
29
  * fulfill uniform alignment requirements.
@@ -39,7 +38,7 @@ type HasCustomLocation<T> = ExtractAttributes<T>[number] extends [] ? false : Ex
39
38
  * @param alignment The multiple of bytes this data should align itself to.
40
39
  * @param data The data-type to align.
41
40
  */
42
- declare function align<TAlign extends number, TData extends AnyData>(alignment: TAlign, data: TData): Decorate<TData, Align<TAlign>>;
41
+ export declare function align<TAlign extends number, TData extends AnyData>(alignment: TAlign, data: TData): Decorate<TData, Align<TAlign>>;
43
42
  /**
44
43
  * Adds padding bytes after the wrapped data-type, until the whole value takes up `size` bytes.
45
44
  *
@@ -52,7 +51,7 @@ declare function align<TAlign extends number, TData extends AnyData>(alignment:
52
51
  * @param size The amount of bytes that should be reserved for this data-type.
53
52
  * @param data The data-type to wrap.
54
53
  */
55
- declare function size<TSize extends number, TData extends AnyData>(size: TSize, data: TData): Decorate<TData, Size<TSize>>;
54
+ export declare function size<TSize extends number, TData extends AnyData>(size: TSize, data: TData): Decorate<TData, Size<TSize>>;
56
55
  /**
57
56
  * Assigns an explicit numeric location to a struct member or a parameter that has this type.
58
57
  *
@@ -66,7 +65,7 @@ declare function size<TSize extends number, TData extends AnyData>(size: TSize,
66
65
  * @param location The explicit numeric location.
67
66
  * @param data The data-type to wrap.
68
67
  */
69
- declare function location<TLocation extends number, TData extends BaseData>(location: TLocation, data: TData): Decorate<TData, Location<TLocation>>;
68
+ export declare function location<TLocation extends number, TData extends BaseData>(location: TLocation, data: TData): Decorate<TData, Location<TLocation>>;
70
69
  /**
71
70
  * Specifies how user-defined vertex shader output (fragment shader input)
72
71
  * must be interpolated.
@@ -82,7 +81,7 @@ declare function location<TLocation extends number, TData extends BaseData>(loca
82
81
  * @param interpolationType How data should be interpolated.
83
82
  * @param data The data-type to wrap.
84
83
  */
85
- declare function interpolate<TInterpolation extends PerspectiveOrLinearInterpolationType, TData extends PerspectiveOrLinearInterpolatableData>(interpolationType: TInterpolation, data: TData): Decorate<TData, Interpolate<TInterpolation>>;
84
+ export declare function interpolate<TInterpolation extends PerspectiveOrLinearInterpolationType, TData extends PerspectiveOrLinearInterpolatableData>(interpolationType: TInterpolation, data: TData): Decorate<TData, Interpolate<TInterpolation>>;
86
85
  /**
87
86
  * Specifies how user-defined vertex shader output (fragment shader input)
88
87
  * must be interpolated.
@@ -100,7 +99,7 @@ declare function interpolate<TInterpolation extends PerspectiveOrLinearInterpola
100
99
  * @param interpolationType How data should be interpolated.
101
100
  * @param data The data-type to wrap.
102
101
  */
103
- declare function interpolate<TInterpolation extends FlatInterpolationType, TData extends FlatInterpolatableData>(interpolationType: TInterpolation, data: TData): Decorate<TData, Interpolate<TInterpolation>>;
102
+ export declare function interpolate<TInterpolation extends FlatInterpolationType, TData extends FlatInterpolatableData>(interpolationType: TInterpolation, data: TData): Decorate<TData, Interpolate<TInterpolation>>;
104
103
  /**
105
104
  * Marks a position built-in output value as invariant in vertex shaders.
106
105
  * If the data and control flow match for two position outputs in different
@@ -115,7 +114,6 @@ declare function interpolate<TInterpolation extends FlatInterpolationType, TData
115
114
  *
116
115
  * @param data The position built-in data-type to mark as invariant.
117
116
  */
118
- declare function invariant(data: Decorated<Vec4f, [Builtin<'position'>]>): Decorated<Vec4f, [Builtin<'position'>, Invariant]>;
119
- declare function isBuiltin(value: unknown): value is Decorated<AnyWgslData, AnyAttribute[]> | LooseDecorated<AnyLooseData, AnyAttribute[]>;
120
- //#endregion
121
- export { AnyAttribute, Decorate, HasCustomLocation, IsBuiltin, align, interpolate, invariant, isBuiltin, location, size };
117
+ export declare function invariant(data: Decorated<Vec4f, [Builtin<'position'>]>): Decorated<Vec4f, [Builtin<'position'>, Invariant]>;
118
+ export declare function isBuiltin(value: unknown): value is Decorated<AnyWgslData, AnyAttribute[]> | LooseDecorated<AnyLooseData, AnyAttribute[]>;
119
+ export declare function getAttributesString<T extends BaseData>(field: T): string;