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,231 +1,247 @@
1
- import { isAtomic, isDecorated, isMat, isMat2x2f, isMat3x3f, isVec, isVecBool, isWgslArray, isWgslStruct } from "./wgslTypes.js";
2
- import { isDisarray, isUnstruct } from "./dataTypes.js";
3
- import { formatToWGSLType, isPackedData } from "./vertexFormatData.js";
4
- import { alignmentOf } from "./alignmentOf.js";
5
1
  import { roundUp } from "../mathUtils.js";
6
- import { sizeOf } from "./sizeOf.js";
2
+ import { logger } from "../tgpuLogger.js";
3
+ import { alignmentOf } from "./alignmentOf.js";
4
+ import { isDisarray, isUnstruct } from "./dataTypes.js";
7
5
  import { offsetsForProps } from "./offsets.js";
8
-
9
- //#region src/data/compiledIO.ts
10
- const EVAL_ALLOWED_IN_ENV = (() => {
11
- try {
12
- new Function("return true");
13
- return true;
14
- } catch {
15
- return false;
16
- }
6
+ import { sizeOf } from "./sizeOf.js";
7
+ import { formatToWGSLType, isPackedData } from "./vertexFormatData.js";
8
+ import * as wgsl from "./wgslTypes.js";
9
+ export const EVAL_ALLOWED_IN_ENV = (() => {
10
+ try {
11
+ // oxlint-disable-next-line typescript-eslint/no-implied-eval typescript-eslint/no-new
12
+ new Function('return true');
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
17
18
  })();
18
- const compiledWriters = /* @__PURE__ */ new WeakMap();
19
+ const compiledWriters = new WeakMap();
20
+ let didWarnAboutEvalFallback = false;
19
21
  const typeToPrimitive = {
20
- u32: "u32",
21
- vec2u: "u32",
22
- vec3u: "u32",
23
- vec4u: "u32",
24
- u16: "u16",
25
- i32: "i32",
26
- vec2i: "i32",
27
- vec3i: "i32",
28
- vec4i: "i32",
29
- f32: "f32",
30
- vec2f: "f32",
31
- vec3f: "f32",
32
- vec4f: "f32",
33
- f16: "f16",
34
- vec2h: "f16",
35
- vec3h: "f16",
36
- vec4h: "f16",
37
- mat2x2f: "f32",
38
- mat3x3f: "f32",
39
- mat4x4f: "f32"
22
+ u32: 'u32',
23
+ vec2u: 'u32',
24
+ vec3u: 'u32',
25
+ vec4u: 'u32',
26
+ u16: 'u16',
27
+ i32: 'i32',
28
+ vec2i: 'i32',
29
+ vec3i: 'i32',
30
+ vec4i: 'i32',
31
+ f32: 'f32',
32
+ vec2f: 'f32',
33
+ vec3f: 'f32',
34
+ vec4f: 'f32',
35
+ f16: 'f16',
36
+ vec2h: 'f16',
37
+ vec3h: 'f16',
38
+ vec4h: 'f16',
39
+ mat2x2f: 'f32',
40
+ mat3x3f: 'f32',
41
+ mat4x4f: 'f32',
40
42
  };
41
43
  const vertexFormatToPrimitive = {
42
- uint8: "u8",
43
- uint8x2: "u8",
44
- uint8x4: "u8",
45
- sint8: "i8",
46
- sint8x2: "i8",
47
- sint8x4: "i8",
48
- unorm8: "u8",
49
- unorm8x2: "u8",
50
- unorm8x4: "u8",
51
- snorm8: "i8",
52
- snorm8x2: "i8",
53
- snorm8x4: "i8",
54
- uint16: "u16",
55
- uint16x2: "u16",
56
- uint16x4: "u16",
57
- sint16: "i16",
58
- sint16x2: "i16",
59
- sint16x4: "i16",
60
- unorm16: "u16",
61
- unorm16x2: "u16",
62
- unorm16x4: "u16",
63
- snorm16: "i16",
64
- snorm16x2: "i16",
65
- snorm16x4: "i16",
66
- float16: "f16",
67
- float16x2: "f16",
68
- float16x4: "f16",
69
- float32: "f32",
70
- float32x2: "f32",
71
- float32x3: "f32",
72
- float32x4: "f32",
73
- uint32: "u32",
74
- uint32x2: "u32",
75
- uint32x3: "u32",
76
- uint32x4: "u32",
77
- sint32: "i32",
78
- sint32x2: "i32",
79
- sint32x3: "i32",
80
- sint32x4: "i32"
44
+ uint8: 'u8',
45
+ uint8x2: 'u8',
46
+ uint8x4: 'u8',
47
+ sint8: 'i8',
48
+ sint8x2: 'i8',
49
+ sint8x4: 'i8',
50
+ unorm8: 'u8',
51
+ unorm8x2: 'u8',
52
+ unorm8x4: 'u8',
53
+ snorm8: 'i8',
54
+ snorm8x2: 'i8',
55
+ snorm8x4: 'i8',
56
+ uint16: 'u16',
57
+ uint16x2: 'u16',
58
+ uint16x4: 'u16',
59
+ sint16: 'i16',
60
+ sint16x2: 'i16',
61
+ sint16x4: 'i16',
62
+ unorm16: 'u16',
63
+ unorm16x2: 'u16',
64
+ unorm16x4: 'u16',
65
+ snorm16: 'i16',
66
+ snorm16x2: 'i16',
67
+ snorm16x4: 'i16',
68
+ float16: 'f16',
69
+ float16x2: 'f16',
70
+ float16x4: 'f16',
71
+ float32: 'f32',
72
+ float32x2: 'f32',
73
+ float32x3: 'f32',
74
+ float32x4: 'f32',
75
+ uint32: 'u32',
76
+ uint32x2: 'u32',
77
+ uint32x3: 'u32',
78
+ uint32x4: 'u32',
79
+ sint32: 'i32',
80
+ sint32x2: 'i32',
81
+ sint32x3: 'i32',
82
+ sint32x4: 'i32',
81
83
  };
82
84
  const primitiveToWriteFunction = {
83
- u32: "setUint32",
84
- i32: "setInt32",
85
- f32: "setFloat32",
86
- u16: "setUint16",
87
- i16: "setInt16",
88
- f16: "setFloat16",
89
- u8: "setUint8",
90
- i8: "setInt8"
85
+ u32: 'setUint32',
86
+ i32: 'setInt32',
87
+ f32: 'setFloat32',
88
+ u16: 'setUint16',
89
+ i16: 'setInt16',
90
+ f16: 'setFloat16',
91
+ u8: 'setUint8',
92
+ i8: 'setInt8',
91
93
  };
92
94
  /**
93
- * @privateRemarks
94
- * based on the `Channel Formats` table https://www.w3.org/TR/WGSL/#texel-formats
95
- */
95
+ * @privateRemarks
96
+ * based on the `Channel Formats` table https://www.w3.org/TR/WGSL/#texel-formats
97
+ */
96
98
  const vertexFormatValueTransform = {
97
- unorm8: (value) => `Math.round(${value} * 255)`,
98
- unorm8x2: (value) => `Math.round(${value} * 255)`,
99
- unorm8x4: (value) => `Math.round(${value} * 255)`,
100
- snorm8: (value) => `Math.round(${value} * 127)`,
101
- snorm8x2: (value) => `Math.round(${value} * 127)`,
102
- snorm8x4: (value) => `Math.round(${value} * 127)`,
103
- unorm16: (value) => `Math.round(${value} * 65535)`,
104
- unorm16x2: (value) => `Math.round(${value} * 65535)`,
105
- unorm16x4: (value) => `Math.round(${value} * 65535)`,
106
- snorm16: (value) => `Math.round(${value} * 32767)`,
107
- snorm16x2: (value) => `Math.round(${value} * 32767)`,
108
- snorm16x4: (value) => `Math.round(${value} * 32767)`
99
+ unorm8: (value) => `Math.round(${value} * 255)`,
100
+ unorm8x2: (value) => `Math.round(${value} * 255)`,
101
+ unorm8x4: (value) => `Math.round(${value} * 255)`,
102
+ snorm8: (value) => `Math.round(${value} * 127)`,
103
+ snorm8x2: (value) => `Math.round(${value} * 127)`,
104
+ snorm8x4: (value) => `Math.round(${value} * 127)`,
105
+ unorm16: (value) => `Math.round(${value} * 65535)`,
106
+ unorm16x2: (value) => `Math.round(${value} * 65535)`,
107
+ unorm16x4: (value) => `Math.round(${value} * 65535)`,
108
+ snorm16: (value) => `Math.round(${value} * 32767)`,
109
+ snorm16x2: (value) => `Math.round(${value} * 32767)`,
110
+ snorm16x4: (value) => `Math.round(${value} * 32767)`,
109
111
  };
110
112
  const specialPackedFormats = {
111
- "unorm10-10-10-2": {
112
- writeFunction: "setUint32",
113
- generator: (offsetExpr, valueExpr) => `output.setUint32(${offsetExpr}, ((${valueExpr}.x*1023&0x3FF)<<22)|((${valueExpr}.y*1023&0x3FF)<<12)|((${valueExpr}.z*1023&0x3FF)<<2)|(${valueExpr}.w*3&3), littleEndian);\n`
114
- },
115
- "unorm8x4-bgra": {
116
- writeFunction: "setUint8",
117
- generator: (offsetExpr, valueExpr) => {
118
- return [
119
- "z",
120
- "y",
121
- "x",
122
- "w"
123
- ].map((c, idx) => `output.setUint8((${offsetExpr} + ${idx}), Math.round(${valueExpr}.${c} * 255), littleEndian);\n`).join("");
124
- }
125
- }
113
+ 'unorm10-10-10-2': {
114
+ writeFunction: 'setUint32',
115
+ generator: (offsetExpr, valueExpr) => `output.setUint32(${offsetExpr}, ((${valueExpr}.x*1023&0x3FF)<<22)|((${valueExpr}.y*1023&0x3FF)<<12)|((${valueExpr}.z*1023&0x3FF)<<2)|(${valueExpr}.w*3&3), littleEndian);\n`,
116
+ },
117
+ 'unorm8x4-bgra': {
118
+ writeFunction: 'setUint8',
119
+ generator: (offsetExpr, valueExpr) => {
120
+ const bgraComponents = ['z', 'y', 'x', 'w'];
121
+ return bgraComponents
122
+ .map((c, idx) => `output.setUint8((${offsetExpr} + ${idx}), Math.round(${valueExpr}.${c} * 255), littleEndian);\n`)
123
+ .join('');
124
+ },
125
+ },
126
126
  };
127
- function buildWriter(node, offsetExpr, valueExpr, depth = 0, partial = false) {
128
- const emitWrite = (writeFunc, addr, value) => partial ? `if (${addr} < endOffset) { output.${writeFunc}(${addr}, ${value}, littleEndian); }\n` : `output.${writeFunc}(${addr}, ${value}, littleEndian);\n`;
129
- const emitBlock = (addr, block) => partial ? `if (${addr} < endOffset) {\n${block}}\n` : block;
130
- function go(node$1, offsetExpr$1, valueExpr$1, depth$1) {
131
- const loopVar = [
132
- "i",
133
- "j",
134
- "k"
135
- ][depth$1] || `i${depth$1}`;
136
- if (isAtomic(node$1) || isDecorated(node$1)) return go(node$1.inner, offsetExpr$1, valueExpr$1, depth$1);
137
- if (isWgslStruct(node$1) || isUnstruct(node$1)) return Object.entries(offsetsForProps(node$1)).map(([key, propOffset]) => {
138
- const subSchema = node$1.propTypes[key];
139
- return subSchema ? go(subSchema, `(${offsetExpr$1} + ${propOffset.offset})`, `${valueExpr$1}.${key}`, depth$1) : "";
140
- }).join("");
141
- if (isWgslArray(node$1) || isDisarray(node$1)) {
142
- if (node$1.elementCount === 0) throw new Error("Cannot write using a runtime-sized schema.");
143
- const elementSize = roundUp(sizeOf(node$1.elementType), alignmentOf(node$1));
144
- const totalSize = node$1.elementCount * elementSize;
145
- const copyLen = partial ? `Math.min(${valueExpr$1}.byteLength, Math.max(0, endOffset - (${offsetExpr$1})))` : `Math.min(${valueExpr$1}.byteLength, ${totalSize})`;
146
- let code = `if (ArrayBuffer.isView(${valueExpr$1})) {\n`;
147
- code += ` new Uint8Array(output.buffer).set(new Uint8Array(${valueExpr$1}.buffer, ${valueExpr$1}.byteOffset, ${copyLen}), output.byteOffset + (${offsetExpr$1}));\n`;
148
- code += `} else {\n`;
149
- code += `for (let ${loopVar} = 0; ${loopVar} < ${node$1.elementCount}; ${loopVar}++) {\n`;
150
- if (partial) code += `if ((${offsetExpr$1} + ${loopVar} * ${elementSize}) >= endOffset) return;\n`;
151
- code += go(node$1.elementType, `(${offsetExpr$1} + ${loopVar} * ${elementSize})`, `${valueExpr$1}[${loopVar}]`, depth$1 + 1);
152
- code += "}\n";
153
- code += "}\n";
154
- return code;
155
- }
156
- if (isVec(node$1)) {
157
- if (isVecBool(node$1)) throw new Error("Compiled writers do not support boolean vectors");
158
- const primitive$1 = typeToPrimitive[node$1.type];
159
- const componentSize = sizeOf(node$1.primitive);
160
- const writeFunc = primitiveToWriteFunction[primitive$1];
161
- return Array.from({ length: node$1.componentCount }, (_, i) => emitWrite(writeFunc, `(${offsetExpr$1} + ${i * componentSize})`, `${valueExpr$1}[${i}]`)).join("");
162
- }
163
- if (isMat(node$1)) {
164
- const writeFunc = primitiveToWriteFunction[typeToPrimitive[node$1.type]];
165
- const matSize = isMat2x2f(node$1) ? 2 : isMat3x3f(node$1) ? 3 : 4;
166
- const rowStride = roundUp(matSize * 4, 8);
167
- const components = [
168
- "x",
169
- "y",
170
- "z",
171
- "w"
172
- ];
173
- const wgslElementStride = rowStride / 4;
174
- return Array.from({ length: matSize * matSize }, (_, idx) => {
175
- const col = Math.floor(idx / matSize);
176
- const row = idx % matSize;
177
- const packedIndex = col * matSize + row;
178
- const wgslIndex = col * wgslElementStride + row;
179
- return emitWrite(writeFunc, `(${offsetExpr$1} + ${col * rowStride + row * 4})`, `ArrayBuffer.isView(${valueExpr$1}) ? ${valueExpr$1}[${wgslIndex}] : Array.isArray(${valueExpr$1}) ? ${valueExpr$1}[${packedIndex}] : ${valueExpr$1}.columns[${col}].${components[row]}`);
180
- }).join("");
181
- }
182
- if (isPackedData(node$1)) {
183
- const formatName = node$1.type;
184
- if (formatName in specialPackedFormats) {
185
- const handler = specialPackedFormats[formatName];
186
- return emitBlock(`(${offsetExpr$1})`, handler.generator(offsetExpr$1, valueExpr$1));
187
- }
188
- const primitive$1 = vertexFormatToPrimitive[formatName];
189
- const writeFunc = primitiveToWriteFunction[primitive$1];
190
- const wgslType = formatToWGSLType[formatName];
191
- const componentCount = isVec(wgslType) ? wgslType.componentCount : 1;
192
- const componentSize = primitive$1 === "u8" || primitive$1 === "i8" ? 1 : primitive$1 === "u16" || primitive$1 === "i16" || primitive$1 === "f16" ? 2 : 4;
193
- const components = [
194
- "x",
195
- "y",
196
- "z",
197
- "w"
198
- ];
199
- const transform = vertexFormatValueTransform[formatName];
200
- return Array.from({ length: componentCount }, (_, idx) => {
201
- const accessor = componentCount === 1 ? valueExpr$1 : `${valueExpr$1}.${components[idx]}`;
202
- const value = transform ? transform(accessor) : accessor;
203
- return emitWrite(writeFunc, `(${offsetExpr$1} + ${idx * componentSize})`, value);
204
- }).join("");
205
- }
206
- if (!Object.hasOwn(typeToPrimitive, node$1.type)) throw new Error(`Primitive ${node$1.type} is unsupported by compiled writer`);
207
- const primitive = typeToPrimitive[node$1.type];
208
- return emitWrite(primitiveToWriteFunction[primitive], offsetExpr$1, valueExpr$1);
209
- }
210
- return go(node, offsetExpr, valueExpr, depth);
127
+ export function buildWriter(node, offsetExpr, valueExpr, depth = 0, partial = false) {
128
+ const emitWrite = (writeFunc, addr, value) => partial
129
+ ? `if (${addr} < endOffset) { output.${writeFunc}(${addr}, ${value}, littleEndian); }\n`
130
+ : `output.${writeFunc}(${addr}, ${value}, littleEndian);\n`;
131
+ const emitBlock = (addr, block) => partial ? `if (${addr} < endOffset) {\n${block}}\n` : block;
132
+ function go(node, offsetExpr, valueExpr, depth) {
133
+ const loopVar = ['i', 'j', 'k'][depth] || `i${depth}`;
134
+ if (wgsl.isAtomic(node) || wgsl.isDecorated(node)) {
135
+ return go(node.inner, offsetExpr, valueExpr, depth);
136
+ }
137
+ if (wgsl.isWgslStruct(node) || isUnstruct(node)) {
138
+ return Object.entries(offsetsForProps(node))
139
+ .map(([key, propOffset]) => {
140
+ const subSchema = node.propTypes[key];
141
+ return subSchema
142
+ ? go(subSchema, `(${offsetExpr} + ${propOffset.offset})`, `${valueExpr}.${key}`, depth)
143
+ : '';
144
+ })
145
+ .join('');
146
+ }
147
+ if (wgsl.isWgslArray(node) || isDisarray(node)) {
148
+ if (node.elementCount === 0) {
149
+ throw new Error('Cannot write using a runtime-sized schema.');
150
+ }
151
+ const elementSize = roundUp(sizeOf(node.elementType), alignmentOf(node));
152
+ const totalSize = node.elementCount * elementSize;
153
+ const copyLen = partial
154
+ ? `Math.min(${valueExpr}.byteLength, Math.max(0, endOffset - (${offsetExpr})))`
155
+ : `Math.min(${valueExpr}.byteLength, ${totalSize})`;
156
+ let code = `if (ArrayBuffer.isView(${valueExpr})) {\n`;
157
+ code += ` new Uint8Array(output.buffer).set(new Uint8Array(${valueExpr}.buffer, ${valueExpr}.byteOffset, ${copyLen}), output.byteOffset + (${offsetExpr}));\n`;
158
+ code += `} else {\n`;
159
+ code += `for (let ${loopVar} = 0; ${loopVar} < ${node.elementCount}; ${loopVar}++) {\n`;
160
+ if (partial) {
161
+ code += `if ((${offsetExpr} + ${loopVar} * ${elementSize}) >= endOffset) return;\n`;
162
+ }
163
+ code += go(node.elementType, `(${offsetExpr} + ${loopVar} * ${elementSize})`, `${valueExpr}[${loopVar}]`, depth + 1);
164
+ code += '}\n';
165
+ code += '}\n';
166
+ return code;
167
+ }
168
+ if (wgsl.isVec(node)) {
169
+ if (wgsl.isVecBool(node)) {
170
+ throw new Error('Compiled writers do not support boolean vectors');
171
+ }
172
+ const primitive = typeToPrimitive[node.type];
173
+ const componentSize = sizeOf(node.primitive);
174
+ const writeFunc = primitiveToWriteFunction[primitive];
175
+ return Array.from({ length: node.componentCount }, (_, i) => emitWrite(writeFunc, `(${offsetExpr} + ${i * componentSize})`, `${valueExpr}[${i}]`)).join('');
176
+ }
177
+ if (wgsl.isMat(node)) {
178
+ const primitive = typeToPrimitive[node.type];
179
+ const writeFunc = primitiveToWriteFunction[primitive];
180
+ const matSize = wgsl.isMat2x2f(node) ? 2 : wgsl.isMat3x3f(node) ? 3 : 4;
181
+ const rowStride = roundUp(matSize * 4, 8);
182
+ const components = ['x', 'y', 'z', 'w'];
183
+ const wgslElementStride = rowStride / 4;
184
+ return Array.from({ length: matSize * matSize }, (_, idx) => {
185
+ const col = Math.floor(idx / matSize);
186
+ const row = idx % matSize;
187
+ const packedIndex = col * matSize + row;
188
+ const wgslIndex = col * wgslElementStride + row;
189
+ return emitWrite(writeFunc, `(${offsetExpr} + ${col * rowStride + row * 4})`, `ArrayBuffer.isView(${valueExpr}) ? ${valueExpr}[${wgslIndex}] : Array.isArray(${valueExpr}) ? ${valueExpr}[${packedIndex}] : ${valueExpr}.columns[${col}].${components[row]}`);
190
+ }).join('');
191
+ }
192
+ if (isPackedData(node)) {
193
+ const formatName = node.type;
194
+ if (formatName in specialPackedFormats) {
195
+ const handler = specialPackedFormats[formatName];
196
+ return emitBlock(`(${offsetExpr})`, handler.generator(offsetExpr, valueExpr));
197
+ }
198
+ const primitive = vertexFormatToPrimitive[formatName];
199
+ const writeFunc = primitiveToWriteFunction[primitive];
200
+ const wgslType = formatToWGSLType[formatName];
201
+ const componentCount = wgsl.isVec(wgslType) ? wgslType.componentCount : 1;
202
+ const componentSize = primitive === 'u8' || primitive === 'i8'
203
+ ? 1
204
+ : primitive === 'u16' || primitive === 'i16' || primitive === 'f16'
205
+ ? 2
206
+ : 4;
207
+ const components = ['x', 'y', 'z', 'w'];
208
+ const transform = vertexFormatValueTransform[formatName];
209
+ return Array.from({ length: componentCount }, (_, idx) => {
210
+ const accessor = componentCount === 1 ? valueExpr : `${valueExpr}.${components[idx]}`;
211
+ const value = transform ? transform(accessor) : accessor;
212
+ return emitWrite(writeFunc, `(${offsetExpr} + ${idx * componentSize})`, value);
213
+ }).join('');
214
+ }
215
+ if (!Object.hasOwn(typeToPrimitive, node.type)) {
216
+ throw new Error(`Primitive ${node.type} is unsupported by compiled writer`);
217
+ }
218
+ const primitive = typeToPrimitive[node.type];
219
+ return emitWrite(primitiveToWriteFunction[primitive], offsetExpr, valueExpr);
220
+ }
221
+ return go(node, offsetExpr, valueExpr, depth);
211
222
  }
212
- function getCompiledWriter(schema) {
213
- if (!EVAL_ALLOWED_IN_ENV) {
214
- console.warn("This environment does not allow eval - using default writer as fallback");
215
- return;
216
- }
217
- const cached = compiledWriters.get(schema);
218
- if (cached) return cached;
219
- try {
220
- const fullBody = buildWriter(schema, "offset", "value", 0, false);
221
- const body = `if (offset > 0 || endOffset < output.byteLength) {\n${buildWriter(schema, "offset", "value", 0, true)}} else {\n${fullBody}}\n`;
222
- const fn = new Function("output", "offset", "value", "littleEndian=true", "endOffset=output.byteLength", body);
223
- compiledWriters.set(schema, fn);
224
- return fn;
225
- } catch (error) {
226
- console.warn(`Failed to compile writer for schema: ${schema}\nReason: ${error instanceof Error ? error.message : String(error)}\nFalling back to default writer`);
227
- }
223
+ export function getCompiledWriter(schema) {
224
+ if (!EVAL_ALLOWED_IN_ENV) {
225
+ if (!didWarnAboutEvalFallback) {
226
+ logger.warn('fallback', 'This environment does not allow eval - using default writer as fallback');
227
+ didWarnAboutEvalFallback = true;
228
+ }
229
+ return undefined;
230
+ }
231
+ const cached = compiledWriters.get(schema);
232
+ if (cached) {
233
+ return cached;
234
+ }
235
+ try {
236
+ const fullBody = buildWriter(schema, 'offset', 'value', 0, false);
237
+ const partialBody = buildWriter(schema, 'offset', 'value', 0, true);
238
+ const body = `if (offset > 0 || endOffset < output.byteLength) {\n${partialBody}} else {\n${fullBody}}\n`;
239
+ // oxlint-disable-next-line typescript-eslint/no-implied-eval
240
+ const fn = new Function('output', 'offset', 'value', 'littleEndian=true', 'endOffset=output.byteLength', body);
241
+ compiledWriters.set(schema, fn);
242
+ return fn;
243
+ }
244
+ catch (error) {
245
+ logger.warn('fallback', `Failed to compile writer for schema: ${schema}\nReason: ${error instanceof Error ? error.message : String(error)}\nFalling back to default writer`);
246
+ }
228
247
  }
229
-
230
- //#endregion
231
- export { getCompiledWriter };
package/data/dataIO.d.ts CHANGED
@@ -1,11 +1,13 @@
1
- import { BufferWriteOptions } from "../core/buffer/buffer.js";
2
- import { BaseData } from "./wgslTypes.js";
3
- import { Infer, InferInput } from "../shared/repr.js";
4
- import "typed-binary";
5
-
6
- //#region src/data/dataIO.d.ts
7
-
8
- declare function writeToArrayBuffer<T extends BaseData>(buffer: ArrayBuffer, schema: T, data: InferInput<T> | ArrayBuffer, options?: BufferWriteOptions): void;
9
- declare function readFromArrayBuffer<T extends BaseData>(buffer: ArrayBuffer, schema: T): Infer<T>;
10
- //#endregion
11
- export { readFromArrayBuffer, writeToArrayBuffer };
1
+ import { type ISerialInput, type ISerialOutput } from 'typed-binary';
2
+ import type { Infer, InferInput } from '../shared/repr.ts';
3
+ import type * as wgsl from './wgslTypes.ts';
4
+ import { type BaseData } from './wgslTypes.ts';
5
+ import type { BufferWriteOptions } from '../core/buffer/buffer.ts';
6
+ export declare function writeData<TData extends wgsl.BaseData>(output: ISerialOutput, schema: TData, value: Infer<TData>): void;
7
+ export declare function readData<TData extends wgsl.BaseData>(input: ISerialInput, schema: TData): Infer<TData>;
8
+ export declare function calculateOffsets<T extends BaseData>(options: BufferWriteOptions | undefined, schema: T, data: InferInput<T> | ArrayBuffer): {
9
+ startOffset: number;
10
+ endOffset: number;
11
+ };
12
+ export declare function writeToArrayBuffer<T extends BaseData>(buffer: ArrayBuffer, schema: T, data: InferInput<T> | ArrayBuffer, options?: BufferWriteOptions): void;
13
+ export declare function readFromArrayBuffer<T extends BaseData>(buffer: ArrayBuffer, schema: T): Infer<T>;