typegpu 0.11.9 → 0.12.0

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 (362) hide show
  1. package/builtin.d.ts +51 -53
  2. package/builtin.js +30 -34
  3. package/common/fullScreenTriangle.d.ts +2 -10
  4. package/common/fullScreenTriangle.js +20 -28
  5. package/common/index.d.ts +2 -9
  6. package/common/index.js +3 -12
  7. package/common/writeSoA.d.ts +11 -12
  8. package/common/writeSoA.js +88 -76
  9. package/core/buffer/buffer.d.ts +79 -62
  10. package/core/buffer/buffer.js +279 -205
  11. package/core/buffer/bufferBinding.d.ts +71 -0
  12. package/core/buffer/bufferBinding.js +154 -0
  13. package/core/buffer/bufferUsage.d.ts +14 -45
  14. package/core/buffer/bufferUsage.js +1 -171
  15. package/core/buffer/laidOutBuffer.d.ts +25 -0
  16. package/core/buffer/laidOutBuffer.js +55 -0
  17. package/core/commandEncoder/attachments.d.ts +125 -0
  18. package/core/commandEncoder/attachments.js +29 -0
  19. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  20. package/core/commandEncoder/commandEncoder.js +56 -0
  21. package/core/commandEncoder/computePass.d.ts +58 -0
  22. package/core/commandEncoder/computePass.js +63 -0
  23. package/core/commandEncoder/renderPass.d.ts +121 -0
  24. package/core/commandEncoder/renderPass.js +196 -0
  25. package/core/constant/tgpuConstant.d.ts +26 -26
  26. package/core/constant/tgpuConstant.js +76 -65
  27. package/core/declare/tgpuDeclare.d.ts +3 -6
  28. package/core/declare/tgpuDeclare.js +36 -36
  29. package/core/function/autoIO.d.ts +61 -33
  30. package/core/function/autoIO.js +68 -73
  31. package/core/function/comptime.d.ts +11 -13
  32. package/core/function/comptime.js +60 -52
  33. package/core/function/createCallableSchema.d.ts +16 -0
  34. package/core/function/createCallableSchema.js +50 -40
  35. package/core/function/dualImpl.d.ts +44 -0
  36. package/core/function/dualImpl.js +71 -50
  37. package/core/function/entryInputRouter.d.ts +26 -0
  38. package/core/function/entryInputRouter.js +31 -33
  39. package/core/function/extractArgs.d.ts +38 -0
  40. package/core/function/extractArgs.js +202 -200
  41. package/core/function/fnCore.d.ts +44 -5
  42. package/core/function/fnCore.js +148 -93
  43. package/core/function/fnTypes.d.ts +31 -29
  44. package/core/function/fnTypes.js +1 -0
  45. package/core/function/ioSchema.d.ts +12 -10
  46. package/core/function/ioSchema.js +65 -47
  47. package/core/function/shelllessImpl.d.ts +9 -12
  48. package/core/function/shelllessImpl.js +17 -22
  49. package/core/function/templateUtils.d.ts +2 -0
  50. package/core/function/templateUtils.js +9 -8
  51. package/core/function/tgpuComputeFn.d.ts +26 -28
  52. package/core/function/tgpuComputeFn.js +47 -48
  53. package/core/function/tgpuFn.d.ts +34 -37
  54. package/core/function/tgpuFn.js +179 -153
  55. package/core/function/tgpuFragmentFn.d.ts +52 -53
  56. package/core/function/tgpuFragmentFn.js +63 -56
  57. package/core/function/tgpuVertexFn.d.ts +36 -39
  58. package/core/function/tgpuVertexFn.js +56 -53
  59. package/core/pipeline/computePipeline.d.ts +141 -53
  60. package/core/pipeline/computePipeline.js +291 -225
  61. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  62. package/core/pipeline/connectAttachmentToShader.js +25 -22
  63. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  64. package/core/pipeline/connectTargetsToShader.js +29 -27
  65. package/core/pipeline/drawState.d.ts +52 -0
  66. package/core/pipeline/drawState.js +225 -0
  67. package/core/pipeline/limitsOverflow.d.ts +2 -0
  68. package/core/pipeline/limitsOverflow.js +13 -10
  69. package/core/pipeline/performanceTracker.d.ts +14 -0
  70. package/core/pipeline/performanceTracker.js +34 -0
  71. package/core/pipeline/pipelineUtils.d.ts +18 -0
  72. package/core/pipeline/pipelineUtils.js +54 -25
  73. package/core/pipeline/priors.d.ts +1 -0
  74. package/core/pipeline/priors.js +12 -0
  75. package/core/pipeline/renderPipeline.d.ts +246 -261
  76. package/core/pipeline/renderPipeline.js +487 -480
  77. package/core/pipeline/timeable.d.ts +28 -18
  78. package/core/pipeline/timeable.js +90 -52
  79. package/core/pipeline/typeGuards.d.ts +17 -0
  80. package/core/pipeline/typeGuards.js +52 -22
  81. package/core/querySet/querySet.d.ts +26 -21
  82. package/core/querySet/querySet.js +127 -103
  83. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  85. package/core/resolve/externals.d.ts +25 -8
  86. package/core/resolve/externals.js +78 -54
  87. package/core/resolve/namespace.d.ts +22 -25
  88. package/core/resolve/namespace.js +16 -21
  89. package/core/resolve/resolvableString.d.ts +7 -0
  90. package/core/resolve/resolvableString.js +13 -0
  91. package/core/resolve/resolveData.d.ts +10 -0
  92. package/core/resolve/resolveData.js +162 -121
  93. package/core/resolve/stitch.d.ts +8 -0
  94. package/core/resolve/stitch.js +23 -21
  95. package/core/resolve/tgpuResolve.d.ts +55 -53
  96. package/core/resolve/tgpuResolve.js +106 -53
  97. package/core/root/configurableImpl.d.ts +10 -0
  98. package/core/root/configurableImpl.js +17 -19
  99. package/core/root/init.d.ts +76 -38
  100. package/core/root/init.js +346 -455
  101. package/core/root/rootTypes.d.ts +461 -636
  102. package/core/root/rootTypes.js +1 -0
  103. package/core/sampler/sampler.d.ts +50 -31
  104. package/core/sampler/sampler.js +120 -113
  105. package/core/simulate/tgpuSimulate.d.ts +9 -12
  106. package/core/simulate/tgpuSimulate.js +68 -71
  107. package/core/slot/accessor.d.ts +36 -13
  108. package/core/slot/accessor.js +138 -91
  109. package/core/slot/internalSlots.d.ts +2 -0
  110. package/core/slot/internalSlots.js +1 -6
  111. package/core/slot/lazy.d.ts +2 -6
  112. package/core/slot/lazy.js +71 -39
  113. package/core/slot/slot.d.ts +2 -6
  114. package/core/slot/slot.js +45 -38
  115. package/core/slot/slotTypes.d.ts +78 -80
  116. package/core/slot/slotTypes.js +11 -16
  117. package/core/texture/externalTexture.d.ts +20 -11
  118. package/core/texture/externalTexture.js +46 -46
  119. package/core/texture/texture.d.ts +152 -97
  120. package/core/texture/texture.js +407 -314
  121. package/core/texture/textureFormats.d.ts +42 -23
  122. package/core/texture/textureFormats.js +104 -75
  123. package/core/texture/textureProps.d.ts +7 -10
  124. package/core/texture/textureProps.js +1 -0
  125. package/core/texture/textureUtils.d.ts +8 -0
  126. package/core/texture/textureUtils.js +185 -179
  127. package/core/texture/usageExtension.d.ts +21 -18
  128. package/core/texture/usageExtension.js +13 -17
  129. package/core/unroll/tgpuUnroll.d.ts +20 -19
  130. package/core/unroll/tgpuUnroll.js +82 -91
  131. package/core/valueProxyUtils.d.ts +3 -0
  132. package/core/valueProxyUtils.js +52 -41
  133. package/core/variable/tgpuVariable.d.ts +26 -27
  134. package/core/variable/tgpuVariable.js +93 -96
  135. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  136. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  137. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  138. package/core/vertexLayout/vertexAttribute.js +1 -0
  139. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  140. package/core/vertexLayout/vertexLayout.js +130 -99
  141. package/core/whitespaces.d.ts +2 -0
  142. package/core/whitespaces.js +16 -0
  143. package/data/alignIO.d.ts +7 -0
  144. package/data/alignIO.js +13 -13
  145. package/data/alignmentOf.d.ts +5 -8
  146. package/data/alignmentOf.js +90 -75
  147. package/data/array.d.ts +6 -9
  148. package/data/array.js +48 -40
  149. package/data/atomic.d.ts +2 -7
  150. package/data/atomic.js +26 -23
  151. package/data/attributes.d.ts +19 -21
  152. package/data/attributes.js +192 -132
  153. package/data/autoStruct.d.ts +36 -3
  154. package/data/autoStruct.js +84 -81
  155. package/data/compiledIO.d.ts +5 -0
  156. package/data/compiledIO.js +231 -215
  157. package/data/dataIO.d.ts +13 -11
  158. package/data/dataIO.js +643 -589
  159. package/data/dataTypes.d.ts +83 -65
  160. package/data/dataTypes.js +66 -68
  161. package/data/deepEqual.d.ts +2 -7
  162. package/data/deepEqual.js +80 -55
  163. package/data/disarray.d.ts +6 -10
  164. package/data/disarray.js +52 -46
  165. package/data/float16Conversion.d.ts +4 -0
  166. package/data/float16Conversion.js +7 -0
  167. package/data/getLongestContiguousPrefix.d.ts +4 -8
  168. package/data/getLongestContiguousPrefix.js +6 -11
  169. package/data/index.d.ts +30 -31
  170. package/data/index.js +39 -172
  171. package/data/instanceToSchema.d.ts +24 -27
  172. package/data/instanceToSchema.js +1 -0
  173. package/data/isContiguous.d.ts +4 -8
  174. package/data/isContiguous.js +6 -11
  175. package/data/matrix.d.ts +21 -21
  176. package/data/matrix.js +513 -505
  177. package/data/numberOps.d.ts +6 -0
  178. package/data/numberOps.js +26 -20
  179. package/data/numeric.d.ts +21 -12
  180. package/data/numeric.js +287 -197
  181. package/data/offsetUtils.d.ts +9 -13
  182. package/data/offsetUtils.js +204 -144
  183. package/data/offsets.d.ts +8 -0
  184. package/data/offsets.js +33 -33
  185. package/data/partialIO.d.ts +13 -8
  186. package/data/partialIO.js +124 -113
  187. package/data/ptr.d.ts +12 -12
  188. package/data/ptr.js +42 -44
  189. package/data/ref.d.ts +40 -27
  190. package/data/ref.js +125 -95
  191. package/data/sampler.d.ts +99 -101
  192. package/data/sampler.js +17 -21
  193. package/data/schemaCallWrapper.d.ts +19 -0
  194. package/data/schemaCallWrapper.js +31 -26
  195. package/data/schemaMemoryLayout.d.ts +8 -0
  196. package/data/schemaMemoryLayout.js +213 -185
  197. package/data/sizeOf.d.ts +4 -8
  198. package/data/sizeOf.js +6 -11
  199. package/data/snippet.d.ts +96 -20
  200. package/data/snippet.js +75 -86
  201. package/data/struct.d.ts +4 -7
  202. package/data/struct.js +51 -39
  203. package/data/texture.d.ts +253 -250
  204. package/data/texture.js +238 -200
  205. package/data/unstruct.d.ts +2 -7
  206. package/data/unstruct.js +43 -37
  207. package/data/vector.d.ts +33 -21
  208. package/data/vector.js +234 -221
  209. package/data/vectorImpl.d.ts +231 -0
  210. package/data/vectorImpl.js +563 -515
  211. package/data/vectorOps.d.ts +63 -0
  212. package/data/vectorOps.js +642 -630
  213. package/data/vertexFormatData.d.ts +181 -184
  214. package/data/vertexFormatData.js +104 -106
  215. package/data/wgslTypes.d.ts +665 -600
  216. package/data/wgslTypes.js +220 -198
  217. package/errors.d.ts +50 -24
  218. package/errors.js +146 -126
  219. package/execMode.d.ts +16 -0
  220. package/execMode.js +47 -40
  221. package/extension.d.ts +13 -8
  222. package/extension.js +10 -16
  223. package/getGPUValue.d.ts +1 -0
  224. package/getGPUValue.js +2 -7
  225. package/index.d.ts +28 -68
  226. package/index.js +8 -28
  227. package/indexNamedExports.d.ts +69 -42
  228. package/indexNamedExports.js +25 -0
  229. package/internal.d.ts +16 -0
  230. package/internal.js +12 -0
  231. package/mathUtils.d.ts +5 -0
  232. package/mathUtils.js +7 -11
  233. package/memo.d.ts +11 -0
  234. package/memo.js +20 -22
  235. package/minify.d.ts +5 -0
  236. package/minify.js +93 -0
  237. package/nameUtils.d.ts +29 -0
  238. package/nameUtils.js +427 -394
  239. package/package.json +5 -1
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -629
  242. package/serial/registry.d.ts +15 -0
  243. package/serial/registry.js +106 -0
  244. package/serial/restore.d.ts +49 -0
  245. package/serial/restore.js +68 -0
  246. package/serial/schema.d.ts +58 -0
  247. package/serial/schema.js +209 -0
  248. package/serial/types.d.ts +5 -0
  249. package/serial/types.js +1 -0
  250. package/shared/env.d.ts +9 -0
  251. package/shared/env.js +9 -12
  252. package/shared/generators.d.ts +4 -0
  253. package/shared/generators.js +10 -12
  254. package/shared/meta.d.ts +29 -14
  255. package/shared/meta.js +71 -55
  256. package/shared/normalizeMetadata.d.ts +32 -27
  257. package/shared/normalizeMetadata.js +23 -36
  258. package/shared/repr.d.ts +73 -55
  259. package/shared/repr.js +1 -0
  260. package/shared/soul.d.ts +17 -0
  261. package/shared/soul.js +1 -0
  262. package/shared/stringify.d.ts +2 -0
  263. package/shared/stringify.js +29 -20
  264. package/shared/symbols.d.ts +26 -20
  265. package/shared/symbols.js +79 -79
  266. package/shared/tseynit.d.ts +2 -0
  267. package/shared/tseynit.js +160 -75
  268. package/shared/utilityTypes.d.ts +30 -14
  269. package/shared/utilityTypes.js +2 -6
  270. package/shared/vertexFormat.d.ts +41 -43
  271. package/shared/vertexFormat.js +59 -62
  272. package/std/array.d.ts +2 -7
  273. package/std/array.js +18 -23
  274. package/std/atomic.d.ts +14 -18
  275. package/std/atomic.js +96 -95
  276. package/std/bitcast.d.ts +193 -10
  277. package/std/bitcast.js +309 -39
  278. package/std/boolean.d.ts +19 -33
  279. package/std/boolean.js +296 -288
  280. package/std/copy.d.ts +2 -7
  281. package/std/copy.js +27 -24
  282. package/std/derivative.d.ts +11 -15
  283. package/std/derivative.js +56 -79
  284. package/std/discard.d.ts +1 -6
  285. package/std/discard.js +7 -14
  286. package/std/environment.d.ts +19 -14
  287. package/std/environment.js +71 -51
  288. package/std/extensions.d.ts +2 -8
  289. package/std/extensions.js +10 -11
  290. package/std/index.d.ts +20 -24
  291. package/std/index.js +32 -187
  292. package/std/matrix.d.ts +6 -12
  293. package/std/matrix.js +60 -69
  294. package/std/numeric.d.ts +143 -146
  295. package/std/numeric.js +858 -749
  296. package/std/operators.d.ts +19 -27
  297. package/std/operators.js +227 -193
  298. package/std/packing.d.ts +5 -11
  299. package/std/packing.js +67 -75
  300. package/std/range.d.ts +6 -11
  301. package/std/range.js +48 -36
  302. package/std/subgroup.d.ts +33 -37
  303. package/std/subgroup.js +180 -217
  304. package/std/texture.d.ts +70 -38
  305. package/std/texture.js +176 -172
  306. package/taskQueue.d.ts +6 -0
  307. package/taskQueue.js +30 -0
  308. package/tgpu.d.ts +16 -0
  309. package/tgpu.js +17 -44
  310. package/tgpuBindGroupLayout.d.ts +132 -152
  311. package/tgpuBindGroupLayout.js +346 -268
  312. package/tgpuLogger.d.ts +34 -0
  313. package/tgpuLogger.js +63 -0
  314. package/tgpuUnstable.d.ts +16 -22
  315. package/tgpuUnstable.js +13 -35
  316. package/tgsl/accessIndex.d.ts +2 -0
  317. package/tgsl/accessIndex.js +76 -33
  318. package/tgsl/accessProp.d.ts +2 -0
  319. package/tgsl/accessProp.js +142 -101
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +13 -15
  322. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  323. package/tgsl/consoleLog/deserializers.js +119 -103
  324. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  325. package/tgsl/consoleLog/logGenerator.js +85 -80
  326. package/tgsl/consoleLog/serializers.d.ts +21 -0
  327. package/tgsl/consoleLog/serializers.js +119 -100
  328. package/tgsl/consoleLog/types.d.ts +40 -39
  329. package/tgsl/consoleLog/types.js +1 -0
  330. package/tgsl/conversion.d.ts +33 -0
  331. package/tgsl/conversion.js +271 -216
  332. package/tgsl/forOfUtils.d.ts +15 -0
  333. package/tgsl/forOfUtils.js +85 -70
  334. package/tgsl/generationHelpers.d.ts +22 -39
  335. package/tgsl/generationHelpers.js +85 -58
  336. package/tgsl/infixDispatch.d.ts +70 -0
  337. package/tgsl/infixDispatch.js +48 -46
  338. package/tgsl/jsPolyfills.d.ts +16 -19
  339. package/tgsl/jsPolyfills.js +44 -42
  340. package/tgsl/makeDereferenceable.d.ts +48 -0
  341. package/tgsl/makeDereferenceable.js +86 -0
  342. package/tgsl/makeResolvable.d.ts +22 -0
  343. package/tgsl/makeResolvable.js +33 -0
  344. package/tgsl/shaderGenerator.d.ts +77 -17
  345. package/tgsl/shaderGenerator.js +1 -0
  346. package/tgsl/shellless.d.ts +6 -9
  347. package/tgsl/shellless.js +73 -43
  348. package/tgsl/wgslGenerator.d.ts +66 -59
  349. package/tgsl/wgslGenerator.js +1344 -760
  350. package/types.d.ts +287 -222
  351. package/types.js +61 -44
  352. package/unwrapper.d.ts +31 -26
  353. package/unwrapper.js +1 -0
  354. package/wgslExtensions.d.ts +3 -5
  355. package/wgslExtensions.js +12 -16
  356. package/_virtual/rolldown_runtime.js +0 -13
  357. package/core/buffer/bufferShorthand.d.ts +0 -50
  358. package/core/buffer/bufferShorthand.js +0 -55
  359. package/core/pipeline/applyPipelineState.js +0 -37
  360. package/package.js +0 -5
  361. package/tgsl/shaderGenerator_members.d.ts +0 -33
  362. 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;