typegpu 0.11.8 → 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 +37 -38
  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 -0
  42. package/core/function/fnCore.js +148 -92
  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 +18 -20
  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 +90 -93
  85. package/core/resolve/externals.d.ts +25 -7
  86. package/core/resolve/externals.js +79 -62
  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 -55
  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 -454
  101. package/core/root/rootTypes.d.ts +461 -627
  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 -214
  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 -192
  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 -120
  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 +428 -398
  239. package/package.json +9 -3
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -624
  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 -100
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +18 -0
  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 +272 -193
  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 -747
  350. package/types.d.ts +287 -221
  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
package/data/dataIO.js CHANGED
@@ -1,602 +1,656 @@
1
- import { isWgslArray } from "./wgslTypes.js";
2
- import { getName } from "../shared/meta.js";
3
- import { vec2f, vec2h, vec2i, vec2u, vec3f, vec3h, vec3i, vec3u, vec4f, vec4h, vec4i, vec4u } from "./vector.js";
1
+ import { BufferReader, BufferWriter, getSystemEndianness, } from 'typed-binary';
2
+ import alignIO from "./alignIO.js";
4
3
  import { alignmentOf, customAlignmentOf } from "./alignmentOf.js";
5
- import { roundUp } from "../mathUtils.js";
6
- import { sizeOf } from "./sizeOf.js";
7
4
  import { mat2x2f, mat3x3f, mat4x4f } from "./matrix.js";
8
- import alignIO_default from "./alignIO.js";
5
+ import { sizeOf } from "./sizeOf.js";
6
+ import { vec2f, vec2h, vec2i, vec2u, vec3f, vec3h, vec3i, vec3u, vec4f, vec4h, vec4i, vec4u, } from "./vector.js";
7
+ import { isWgslArray } from "./wgslTypes.js";
9
8
  import { getCompiledWriter } from "./compiledIO.js";
10
- import { BufferReader, BufferWriter, getSystemEndianness } from "typed-binary";
11
-
12
- //#region src/data/dataIO.ts
9
+ import { getName } from "../shared/meta.js";
10
+ import { roundUp } from "../mathUtils.js";
11
+ import { logger } from "../tgpuLogger.js";
12
+ import { readFloat16, writeFloat16 } from "./float16Conversion.js";
13
13
  const dataWriters = {
14
- bool() {
15
- throw new Error("Booleans are not host-shareable");
16
- },
17
- f32(output, _schema, value) {
18
- output.writeFloat32(value);
19
- },
20
- f16(output, _schema, value) {
21
- output.writeFloat16(value);
22
- },
23
- i32(output, _schema, value) {
24
- output.writeInt32(value);
25
- },
26
- u32(output, _schema, value) {
27
- output.writeUint32(value);
28
- },
29
- u16(output, _schema, value) {
30
- output.writeUint16(value);
31
- },
32
- vec2f(output, _, value) {
33
- output.writeFloat32(value[0]);
34
- output.writeFloat32(value[1]);
35
- },
36
- vec2h(output, _, value) {
37
- output.writeFloat16(value[0]);
38
- output.writeFloat16(value[1]);
39
- },
40
- vec2i(output, _, value) {
41
- output.writeInt32(value[0]);
42
- output.writeInt32(value[1]);
43
- },
44
- vec2u(output, _, value) {
45
- output.writeUint32(value[0]);
46
- output.writeUint32(value[1]);
47
- },
48
- "vec2<bool>"() {
49
- throw new Error("Booleans are not host-shareable");
50
- },
51
- vec3f(output, _, value) {
52
- output.writeFloat32(value[0]);
53
- output.writeFloat32(value[1]);
54
- output.writeFloat32(value[2]);
55
- },
56
- vec3h(output, _, value) {
57
- output.writeFloat16(value[0]);
58
- output.writeFloat16(value[1]);
59
- output.writeFloat16(value[2]);
60
- },
61
- vec3i(output, _, value) {
62
- output.writeInt32(value[0]);
63
- output.writeInt32(value[1]);
64
- output.writeInt32(value[2]);
65
- },
66
- vec3u(output, _, value) {
67
- output.writeUint32(value[0]);
68
- output.writeUint32(value[1]);
69
- output.writeUint32(value[2]);
70
- },
71
- "vec3<bool>"() {
72
- throw new Error("Booleans are not host-shareable");
73
- },
74
- vec4f(output, _, value) {
75
- output.writeFloat32(value[0]);
76
- output.writeFloat32(value[1]);
77
- output.writeFloat32(value[2]);
78
- output.writeFloat32(value[3]);
79
- },
80
- vec4h(output, _, value) {
81
- output.writeFloat16(value[0]);
82
- output.writeFloat16(value[1]);
83
- output.writeFloat16(value[2]);
84
- output.writeFloat16(value[3]);
85
- },
86
- vec4i(output, _, value) {
87
- output.writeInt32(value[0]);
88
- output.writeInt32(value[1]);
89
- output.writeInt32(value[2]);
90
- output.writeInt32(value[3]);
91
- },
92
- vec4u(output, _, value) {
93
- output.writeUint32(value[0]);
94
- output.writeUint32(value[1]);
95
- output.writeUint32(value[2]);
96
- output.writeUint32(value[3]);
97
- },
98
- "vec4<bool>"() {
99
- throw new Error("Booleans are not host-shareable");
100
- },
101
- mat2x2f(output, _, value) {
102
- for (let i = 0; i < value.length; ++i) output.writeFloat32(value[i]);
103
- },
104
- mat3x3f(output, _, value) {
105
- for (let i = 0; i < value.length; ++i) output.writeFloat32(value[i]);
106
- },
107
- mat4x4f(output, _, value) {
108
- for (let i = 0; i < value.length; ++i) output.writeFloat32(value[i]);
109
- },
110
- struct(output, schema, value) {
111
- const alignment = alignmentOf(schema);
112
- alignIO_default(output, alignment);
113
- for (const [key, property] of Object.entries(schema.propTypes)) {
114
- alignIO_default(output, alignmentOf(property));
115
- writeData(output, property, value[key]);
116
- }
117
- alignIO_default(output, alignment);
118
- },
119
- array(output, schema, value) {
120
- if (schema.elementCount === 0) throw new Error("Cannot write using a runtime-sized schema.");
121
- const alignment = alignmentOf(schema);
122
- alignIO_default(output, alignment);
123
- const beginning = output.currentByteOffset;
124
- for (let i = 0; i < Math.min(schema.elementCount, value.length); i++) {
125
- alignIO_default(output, alignment);
126
- writeData(output, schema.elementType, value[i]);
127
- }
128
- output.seekTo(beginning + sizeOf(schema));
129
- },
130
- ptr() {
131
- throw new Error("Pointers are not host-shareable");
132
- },
133
- atomic(output, schema, value) {
134
- dataWriters[schema.inner.type]?.(output, schema, value);
135
- },
136
- decorated(output, schema, value) {
137
- alignIO_default(output, customAlignmentOf(schema));
138
- const beginning = output.currentByteOffset;
139
- dataWriters[schema.inner?.type]?.(output, schema.inner, value);
140
- output.seekTo(beginning + sizeOf(schema));
141
- },
142
- uint8(output, _, value) {
143
- output.writeUint8(value);
144
- },
145
- uint8x2(output, _, value) {
146
- output.writeUint8(value.x);
147
- output.writeUint8(value.y);
148
- },
149
- uint8x4(output, _, value) {
150
- output.writeUint8(value.x);
151
- output.writeUint8(value.y);
152
- output.writeUint8(value.z);
153
- output.writeUint8(value.w);
154
- },
155
- sint8(output, _, value) {
156
- output.writeInt8(value);
157
- },
158
- sint8x2(output, _, value) {
159
- output.writeInt8(value.x);
160
- output.writeInt8(value.y);
161
- },
162
- sint8x4(output, _, value) {
163
- output.writeInt8(value.x);
164
- output.writeInt8(value.y);
165
- output.writeInt8(value.z);
166
- output.writeInt8(value.w);
167
- },
168
- unorm8(output, _, value) {
169
- output.writeUint8(Math.round(value * 255));
170
- },
171
- unorm8x2(output, _, value) {
172
- output.writeUint8(Math.round(value.x * 255));
173
- output.writeUint8(Math.round(value.y * 255));
174
- },
175
- unorm8x4(output, _, value) {
176
- output.writeUint8(Math.round(value.x * 255));
177
- output.writeUint8(Math.round(value.y * 255));
178
- output.writeUint8(Math.round(value.z * 255));
179
- output.writeUint8(Math.round(value.w * 255));
180
- },
181
- snorm8(output, _, value) {
182
- output.writeInt8(Math.round(value * 127));
183
- },
184
- snorm8x2(output, _, value) {
185
- output.writeInt8(Math.round(value.x * 127));
186
- output.writeInt8(Math.round(value.y * 127));
187
- },
188
- snorm8x4(output, _, value) {
189
- output.writeInt8(Math.round(value.x * 127));
190
- output.writeInt8(Math.round(value.y * 127));
191
- output.writeInt8(Math.round(value.z * 127));
192
- output.writeInt8(Math.round(value.w * 127));
193
- },
194
- uint16(output, _, value) {
195
- output.writeUint16(value);
196
- },
197
- uint16x2(output, _, value) {
198
- output.writeUint16(value.x);
199
- output.writeUint16(value.y);
200
- },
201
- uint16x4(output, _, value) {
202
- output.writeUint16(value.x);
203
- output.writeUint16(value.y);
204
- output.writeUint16(value.z);
205
- output.writeUint16(value.w);
206
- },
207
- sint16(output, _, value) {
208
- output.writeInt16(value);
209
- },
210
- sint16x2(output, _, value) {
211
- output.writeInt16(value.x);
212
- output.writeInt16(value.y);
213
- },
214
- sint16x4(output, _, value) {
215
- output.writeInt16(value.x);
216
- output.writeInt16(value.y);
217
- output.writeInt16(value.z);
218
- output.writeInt16(value.w);
219
- },
220
- unorm16(output, _, value) {
221
- output.writeUint16(value * 65535);
222
- },
223
- unorm16x2(output, _, value) {
224
- output.writeUint16(value.x * 65535);
225
- output.writeUint16(value.y * 65535);
226
- },
227
- unorm16x4(output, _, value) {
228
- output.writeUint16(value.x * 65535);
229
- output.writeUint16(value.y * 65535);
230
- output.writeUint16(value.z * 65535);
231
- output.writeUint16(value.w * 65535);
232
- },
233
- snorm16(output, _, value) {
234
- output.writeInt16(Math.round(value * 32767));
235
- },
236
- snorm16x2(output, _, value) {
237
- output.writeInt16(Math.round(value.x * 32767));
238
- output.writeInt16(Math.round(value.y * 32767));
239
- },
240
- snorm16x4(output, _, value) {
241
- output.writeInt16(Math.round(value.x * 32767));
242
- output.writeInt16(Math.round(value.y * 32767));
243
- output.writeInt16(Math.round(value.z * 32767));
244
- output.writeInt16(Math.round(value.w * 32767));
245
- },
246
- float16(output, _, value) {
247
- output.writeFloat16(value);
248
- },
249
- float16x2(output, _, value) {
250
- output.writeFloat16(value.x);
251
- output.writeFloat16(value.y);
252
- },
253
- float16x4(output, _, value) {
254
- output.writeFloat16(value.x);
255
- output.writeFloat16(value.y);
256
- output.writeFloat16(value.z);
257
- output.writeFloat16(value.w);
258
- },
259
- float32(output, _, value) {
260
- output.writeFloat32(value);
261
- },
262
- float32x2(output, _, value) {
263
- output.writeFloat32(value.x);
264
- output.writeFloat32(value.y);
265
- },
266
- float32x3(output, _, value) {
267
- output.writeFloat32(value.x);
268
- output.writeFloat32(value.y);
269
- output.writeFloat32(value.z);
270
- },
271
- float32x4(output, _, value) {
272
- output.writeFloat32(value.x);
273
- output.writeFloat32(value.y);
274
- output.writeFloat32(value.z);
275
- output.writeFloat32(value.w);
276
- },
277
- uint32(output, _, value) {
278
- output.writeUint32(value);
279
- },
280
- uint32x2(output, _, value) {
281
- output.writeUint32(value.x);
282
- output.writeUint32(value.y);
283
- },
284
- uint32x3(output, _, value) {
285
- output.writeUint32(value.x);
286
- output.writeUint32(value.y);
287
- output.writeUint32(value.z);
288
- },
289
- uint32x4(output, _, value) {
290
- output.writeUint32(value.x);
291
- output.writeUint32(value.y);
292
- output.writeUint32(value.z);
293
- output.writeUint32(value.w);
294
- },
295
- sint32(output, _, value) {
296
- output.writeInt32(value);
297
- },
298
- sint32x2(output, _, value) {
299
- output.writeInt32(value.x);
300
- output.writeInt32(value.y);
301
- },
302
- sint32x3(output, _, value) {
303
- output.writeInt32(value.x);
304
- output.writeInt32(value.y);
305
- output.writeInt32(value.z);
306
- },
307
- sint32x4(output, _, value) {
308
- output.writeInt32(value.x);
309
- output.writeInt32(value.y);
310
- output.writeInt32(value.z);
311
- output.writeInt32(value.w);
312
- },
313
- "unorm10-10-10-2"(output, _, value) {
314
- let packed = 0;
315
- packed |= (value.x * 1023 & 1023) << 22;
316
- packed |= (value.y * 1023 & 1023) << 12;
317
- packed |= (value.z * 1023 & 1023) << 2;
318
- packed |= value.w * 3 & 3;
319
- output.writeUint32(packed);
320
- },
321
- "unorm8x4-bgra"(output, _, value) {
322
- output.writeUint8(value.z * 255);
323
- output.writeUint8(value.y * 255);
324
- output.writeUint8(value.x * 255);
325
- output.writeUint8(value.w * 255);
326
- },
327
- disarray(output, schema, value) {
328
- const alignment = alignmentOf(schema);
329
- alignIO_default(output, alignment);
330
- const beginning = output.currentByteOffset;
331
- for (let i = 0; i < Math.min(schema.elementCount, value.length); i++) {
332
- alignIO_default(output, alignment);
333
- dataWriters[schema.elementType?.type]?.(output, schema.elementType, value[i]);
334
- }
335
- output.seekTo(beginning + sizeOf(schema));
336
- },
337
- unstruct(output, schema, value) {
338
- const propTypes = schema.propTypes;
339
- for (const [key, property] of Object.entries(propTypes)) dataWriters[property.type]?.(output, property, value[key]);
340
- },
341
- "loose-decorated"(output, schema, value) {
342
- alignIO_default(output, customAlignmentOf(schema));
343
- const beginning = output.currentByteOffset;
344
- const writer = dataWriters[schema.inner?.type];
345
- writer?.(output, schema.inner, value);
346
- output.seekTo(beginning + sizeOf(schema));
347
- return value;
348
- }
14
+ bool() {
15
+ throw new Error('Booleans are not host-shareable');
16
+ },
17
+ f32(output, _schema, value) {
18
+ output.writeFloat32(value);
19
+ },
20
+ f16(output, _schema, value) {
21
+ writeFloat16(output, value);
22
+ },
23
+ i32(output, _schema, value) {
24
+ output.writeInt32(value);
25
+ },
26
+ u32(output, _schema, value) {
27
+ output.writeUint32(value);
28
+ },
29
+ u16(output, _schema, value) {
30
+ output.writeUint16(value);
31
+ },
32
+ vec2f(output, _, value) {
33
+ output.writeFloat32(value[0]);
34
+ output.writeFloat32(value[1]);
35
+ },
36
+ vec2h(output, _, value) {
37
+ writeFloat16(output, value[0]);
38
+ writeFloat16(output, value[1]);
39
+ },
40
+ vec2i(output, _, value) {
41
+ output.writeInt32(value[0]);
42
+ output.writeInt32(value[1]);
43
+ },
44
+ vec2u(output, _, value) {
45
+ output.writeUint32(value[0]);
46
+ output.writeUint32(value[1]);
47
+ },
48
+ 'vec2<bool>'() {
49
+ throw new Error('Booleans are not host-shareable');
50
+ },
51
+ vec3f(output, _, value) {
52
+ output.writeFloat32(value[0]);
53
+ output.writeFloat32(value[1]);
54
+ output.writeFloat32(value[2]);
55
+ },
56
+ vec3h(output, _, value) {
57
+ writeFloat16(output, value[0]);
58
+ writeFloat16(output, value[1]);
59
+ writeFloat16(output, value[2]);
60
+ },
61
+ vec3i(output, _, value) {
62
+ output.writeInt32(value[0]);
63
+ output.writeInt32(value[1]);
64
+ output.writeInt32(value[2]);
65
+ },
66
+ vec3u(output, _, value) {
67
+ output.writeUint32(value[0]);
68
+ output.writeUint32(value[1]);
69
+ output.writeUint32(value[2]);
70
+ },
71
+ 'vec3<bool>'() {
72
+ throw new Error('Booleans are not host-shareable');
73
+ },
74
+ vec4f(output, _, value) {
75
+ output.writeFloat32(value[0]);
76
+ output.writeFloat32(value[1]);
77
+ output.writeFloat32(value[2]);
78
+ output.writeFloat32(value[3]);
79
+ },
80
+ vec4h(output, _, value) {
81
+ writeFloat16(output, value[0]);
82
+ writeFloat16(output, value[1]);
83
+ writeFloat16(output, value[2]);
84
+ writeFloat16(output, value[3]);
85
+ },
86
+ vec4i(output, _, value) {
87
+ output.writeInt32(value[0]);
88
+ output.writeInt32(value[1]);
89
+ output.writeInt32(value[2]);
90
+ output.writeInt32(value[3]);
91
+ },
92
+ vec4u(output, _, value) {
93
+ output.writeUint32(value[0]);
94
+ output.writeUint32(value[1]);
95
+ output.writeUint32(value[2]);
96
+ output.writeUint32(value[3]);
97
+ },
98
+ 'vec4<bool>'() {
99
+ throw new Error('Booleans are not host-shareable');
100
+ },
101
+ mat2x2f(output, _, value) {
102
+ for (let i = 0; i < value.length; ++i) {
103
+ output.writeFloat32(value[i]);
104
+ }
105
+ },
106
+ mat3x3f(output, _, value) {
107
+ for (let i = 0; i < value.length; ++i) {
108
+ output.writeFloat32(value[i]);
109
+ }
110
+ },
111
+ mat4x4f(output, _, value) {
112
+ for (let i = 0; i < value.length; ++i) {
113
+ output.writeFloat32(value[i]);
114
+ }
115
+ },
116
+ struct(output, schema, value) {
117
+ const alignment = alignmentOf(schema);
118
+ alignIO(output, alignment);
119
+ for (const [key, property] of Object.entries(schema.propTypes)) {
120
+ alignIO(output, alignmentOf(property));
121
+ writeData(output, property, value[key]);
122
+ }
123
+ alignIO(output, alignment);
124
+ },
125
+ array(output, schema, value) {
126
+ if (schema.elementCount === 0) {
127
+ throw new Error('Cannot write using a runtime-sized schema.');
128
+ }
129
+ const alignment = alignmentOf(schema);
130
+ alignIO(output, alignment);
131
+ const beginning = output.currentByteOffset;
132
+ for (let i = 0; i < Math.min(schema.elementCount, value.length); i++) {
133
+ alignIO(output, alignment);
134
+ writeData(output, schema.elementType, value[i]);
135
+ }
136
+ output.seekTo(beginning + sizeOf(schema));
137
+ },
138
+ ptr() {
139
+ throw new Error('Pointers are not host-shareable');
140
+ },
141
+ atomic(output, schema, value) {
142
+ dataWriters[schema.inner.type]?.(output, schema, value);
143
+ },
144
+ decorated(output, schema, value) {
145
+ const alignment = customAlignmentOf(schema);
146
+ alignIO(output, alignment);
147
+ const beginning = output.currentByteOffset;
148
+ dataWriters[schema.inner?.type]?.(output, schema.inner, value);
149
+ output.seekTo(beginning + sizeOf(schema));
150
+ },
151
+ // Loose Types
152
+ uint8(output, _, value) {
153
+ output.writeUint8(value);
154
+ },
155
+ uint8x2(output, _, value) {
156
+ output.writeUint8(value.x);
157
+ output.writeUint8(value.y);
158
+ },
159
+ uint8x4(output, _, value) {
160
+ output.writeUint8(value.x);
161
+ output.writeUint8(value.y);
162
+ output.writeUint8(value.z);
163
+ output.writeUint8(value.w);
164
+ },
165
+ sint8(output, _, value) {
166
+ output.writeInt8(value);
167
+ },
168
+ sint8x2(output, _, value) {
169
+ output.writeInt8(value.x);
170
+ output.writeInt8(value.y);
171
+ },
172
+ sint8x4(output, _, value) {
173
+ output.writeInt8(value.x);
174
+ output.writeInt8(value.y);
175
+ output.writeInt8(value.z);
176
+ output.writeInt8(value.w);
177
+ },
178
+ unorm8(output, _, value) {
179
+ output.writeUint8(Math.round(value * 255));
180
+ },
181
+ unorm8x2(output, _, value) {
182
+ output.writeUint8(Math.round(value.x * 255));
183
+ output.writeUint8(Math.round(value.y * 255));
184
+ },
185
+ unorm8x4(output, _, value) {
186
+ output.writeUint8(Math.round(value.x * 255));
187
+ output.writeUint8(Math.round(value.y * 255));
188
+ output.writeUint8(Math.round(value.z * 255));
189
+ output.writeUint8(Math.round(value.w * 255));
190
+ },
191
+ snorm8(output, _, value) {
192
+ output.writeInt8(Math.round(value * 127));
193
+ },
194
+ snorm8x2(output, _, value) {
195
+ output.writeInt8(Math.round(value.x * 127));
196
+ output.writeInt8(Math.round(value.y * 127));
197
+ },
198
+ snorm8x4(output, _, value) {
199
+ output.writeInt8(Math.round(value.x * 127));
200
+ output.writeInt8(Math.round(value.y * 127));
201
+ output.writeInt8(Math.round(value.z * 127));
202
+ output.writeInt8(Math.round(value.w * 127));
203
+ },
204
+ uint16(output, _, value) {
205
+ output.writeUint16(value);
206
+ },
207
+ uint16x2(output, _, value) {
208
+ output.writeUint16(value.x);
209
+ output.writeUint16(value.y);
210
+ },
211
+ uint16x4(output, _, value) {
212
+ output.writeUint16(value.x);
213
+ output.writeUint16(value.y);
214
+ output.writeUint16(value.z);
215
+ output.writeUint16(value.w);
216
+ },
217
+ sint16(output, _, value) {
218
+ output.writeInt16(value);
219
+ },
220
+ sint16x2(output, _, value) {
221
+ output.writeInt16(value.x);
222
+ output.writeInt16(value.y);
223
+ },
224
+ sint16x4(output, _, value) {
225
+ output.writeInt16(value.x);
226
+ output.writeInt16(value.y);
227
+ output.writeInt16(value.z);
228
+ output.writeInt16(value.w);
229
+ },
230
+ unorm16(output, _, value) {
231
+ output.writeUint16(value * 65535);
232
+ },
233
+ unorm16x2(output, _, value) {
234
+ output.writeUint16(value.x * 65535);
235
+ output.writeUint16(value.y * 65535);
236
+ },
237
+ unorm16x4(output, _, value) {
238
+ output.writeUint16(value.x * 65535);
239
+ output.writeUint16(value.y * 65535);
240
+ output.writeUint16(value.z * 65535);
241
+ output.writeUint16(value.w * 65535);
242
+ },
243
+ snorm16(output, _, value) {
244
+ output.writeInt16(Math.round(value * 32767));
245
+ },
246
+ snorm16x2(output, _, value) {
247
+ output.writeInt16(Math.round(value.x * 32767));
248
+ output.writeInt16(Math.round(value.y * 32767));
249
+ },
250
+ snorm16x4(output, _, value) {
251
+ output.writeInt16(Math.round(value.x * 32767));
252
+ output.writeInt16(Math.round(value.y * 32767));
253
+ output.writeInt16(Math.round(value.z * 32767));
254
+ output.writeInt16(Math.round(value.w * 32767));
255
+ },
256
+ float16(output, _, value) {
257
+ writeFloat16(output, value);
258
+ },
259
+ float16x2(output, _, value) {
260
+ writeFloat16(output, value.x);
261
+ writeFloat16(output, value.y);
262
+ },
263
+ float16x4(output, _, value) {
264
+ writeFloat16(output, value.x);
265
+ writeFloat16(output, value.y);
266
+ writeFloat16(output, value.z);
267
+ writeFloat16(output, value.w);
268
+ },
269
+ float32(output, _, value) {
270
+ output.writeFloat32(value);
271
+ },
272
+ float32x2(output, _, value) {
273
+ output.writeFloat32(value.x);
274
+ output.writeFloat32(value.y);
275
+ },
276
+ float32x3(output, _, value) {
277
+ output.writeFloat32(value.x);
278
+ output.writeFloat32(value.y);
279
+ output.writeFloat32(value.z);
280
+ },
281
+ float32x4(output, _, value) {
282
+ output.writeFloat32(value.x);
283
+ output.writeFloat32(value.y);
284
+ output.writeFloat32(value.z);
285
+ output.writeFloat32(value.w);
286
+ },
287
+ uint32(output, _, value) {
288
+ output.writeUint32(value);
289
+ },
290
+ uint32x2(output, _, value) {
291
+ output.writeUint32(value.x);
292
+ output.writeUint32(value.y);
293
+ },
294
+ uint32x3(output, _, value) {
295
+ output.writeUint32(value.x);
296
+ output.writeUint32(value.y);
297
+ output.writeUint32(value.z);
298
+ },
299
+ uint32x4(output, _, value) {
300
+ output.writeUint32(value.x);
301
+ output.writeUint32(value.y);
302
+ output.writeUint32(value.z);
303
+ output.writeUint32(value.w);
304
+ },
305
+ sint32(output, _, value) {
306
+ output.writeInt32(value);
307
+ },
308
+ sint32x2(output, _, value) {
309
+ output.writeInt32(value.x);
310
+ output.writeInt32(value.y);
311
+ },
312
+ sint32x3(output, _, value) {
313
+ output.writeInt32(value.x);
314
+ output.writeInt32(value.y);
315
+ output.writeInt32(value.z);
316
+ },
317
+ sint32x4(output, _, value) {
318
+ output.writeInt32(value.x);
319
+ output.writeInt32(value.y);
320
+ output.writeInt32(value.z);
321
+ output.writeInt32(value.w);
322
+ },
323
+ 'unorm10-10-10-2'(output, _, value) {
324
+ let packed = 0;
325
+ packed |= ((value.x * 1023) & 1023) << 22; // r (10 bits)
326
+ packed |= ((value.y * 1023) & 1023) << 12; // g (10 bits)
327
+ packed |= ((value.z * 1023) & 1023) << 2; // b (10 bits)
328
+ packed |= (value.w * 3) & 3; // a (2 bits)
329
+ output.writeUint32(packed);
330
+ },
331
+ 'unorm8x4-bgra'(output, _, value) {
332
+ output.writeUint8(value.z * 255);
333
+ output.writeUint8(value.y * 255);
334
+ output.writeUint8(value.x * 255);
335
+ output.writeUint8(value.w * 255);
336
+ },
337
+ disarray(output, schema, value) {
338
+ const alignment = alignmentOf(schema);
339
+ alignIO(output, alignment);
340
+ const beginning = output.currentByteOffset;
341
+ for (let i = 0; i < Math.min(schema.elementCount, value.length); i++) {
342
+ alignIO(output, alignment);
343
+ dataWriters[schema.elementType?.type]?.(output, schema.elementType, value[i]);
344
+ }
345
+ output.seekTo(beginning + sizeOf(schema));
346
+ },
347
+ unstruct(output, schema, value) {
348
+ const propTypes = schema.propTypes;
349
+ for (const [key, property] of Object.entries(propTypes)) {
350
+ dataWriters[property.type]?.(output, property, value[key]);
351
+ }
352
+ },
353
+ 'loose-decorated'(output, schema, value) {
354
+ const alignment = customAlignmentOf(schema);
355
+ alignIO(output, alignment);
356
+ const beginning = output.currentByteOffset;
357
+ const writer = dataWriters[schema.inner?.type];
358
+ writer?.(output, schema.inner, value);
359
+ output.seekTo(beginning + sizeOf(schema));
360
+ return value;
361
+ },
362
+ // TODO: Move texture IO logic here after we expand repr to have in/out variants
349
363
  };
350
- function writeData(output, schema, value) {
351
- if (ArrayBuffer.isView(value)) {
352
- const src = value;
353
- const expected = sizeOf(schema);
354
- if (src.byteLength !== expected) console.warn(`TypedArray size mismatch: schema expects ${expected} bytes, got ${src.byteLength}. ` + (src.byteLength < expected ? "Data truncated." : "Excess ignored."));
355
- const start = output.currentByteOffset;
356
- output.writeSlice(new Uint8Array(src.buffer, src.byteOffset, Math.min(src.byteLength, expected)));
357
- output.seekTo(start + expected);
358
- return;
359
- }
360
- const writer = dataWriters[schema.type];
361
- if (!writer) throw new Error(`Cannot write data of type '${schema.type}'.`);
362
- writer(output, schema, value);
364
+ export function writeData(output, schema, value) {
365
+ if (ArrayBuffer.isView(value)) {
366
+ const src = value;
367
+ const expected = sizeOf(schema);
368
+ if (src.byteLength !== expected) {
369
+ logger.warn('suspicious', `TypedArray size mismatch: schema expects ${expected} bytes, got ${src.byteLength}. ` +
370
+ (src.byteLength < expected ? 'Data truncated.' : 'Excess ignored.'));
371
+ }
372
+ const start = output.currentByteOffset;
373
+ output.writeSlice(new Uint8Array(src.buffer, src.byteOffset, Math.min(src.byteLength, expected)));
374
+ output.seekTo(start + expected);
375
+ return;
376
+ }
377
+ const writer = dataWriters[schema.type];
378
+ if (!writer) {
379
+ throw new Error(`Cannot write data of type '${schema.type}'.`);
380
+ }
381
+ writer(output, schema, value);
363
382
  }
364
383
  const dataReaders = {
365
- bool() {
366
- throw new Error("Booleans are not host-shareable");
367
- },
368
- f32(input) {
369
- return input.readFloat32();
370
- },
371
- f16(input) {
372
- return input.readFloat16();
373
- },
374
- i32(input) {
375
- return input.readInt32();
376
- },
377
- u32(input) {
378
- return input.readUint32();
379
- },
380
- u16(input) {
381
- return input.readUint16();
382
- },
383
- vec2f(input) {
384
- return vec2f(input.readFloat32(), input.readFloat32());
385
- },
386
- vec3f(input) {
387
- return vec3f(input.readFloat32(), input.readFloat32(), input.readFloat32());
388
- },
389
- vec4f(input) {
390
- return vec4f(input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32());
391
- },
392
- vec2h(input) {
393
- return vec2h(input.readFloat16(), input.readFloat16());
394
- },
395
- vec3h(input) {
396
- return vec3h(input.readFloat16(), input.readFloat16(), input.readFloat16());
397
- },
398
- vec4h(input) {
399
- return vec4h(input.readFloat16(), input.readFloat16(), input.readFloat16(), input.readFloat16());
400
- },
401
- vec2i(input) {
402
- return vec2i(input.readInt32(), input.readInt32());
403
- },
404
- vec3i(input) {
405
- return vec3i(input.readInt32(), input.readInt32(), input.readInt32());
406
- },
407
- vec4i(input) {
408
- return vec4i(input.readInt32(), input.readInt32(), input.readInt32(), input.readInt32());
409
- },
410
- vec2u(input) {
411
- return vec2u(input.readUint32(), input.readUint32());
412
- },
413
- vec3u(input) {
414
- return vec3u(input.readUint32(), input.readUint32(), input.readUint32());
415
- },
416
- vec4u(input) {
417
- return vec4u(input.readUint32(), input.readUint32(), input.readUint32(), input.readUint32());
418
- },
419
- "vec2<bool>"() {
420
- throw new Error("Booleans are not host-shareable");
421
- },
422
- "vec3<bool>"() {
423
- throw new Error("Booleans are not host-shareable");
424
- },
425
- "vec4<bool>"() {
426
- throw new Error("Booleans are not host-shareable");
427
- },
428
- mat2x2f(input) {
429
- return mat2x2f(input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32());
430
- },
431
- mat3x3f(input) {
432
- const skipOneAfter = () => {
433
- const value = input.readFloat32();
434
- input.readFloat32();
435
- return value;
436
- };
437
- return mat3x3f(input.readFloat32(), input.readFloat32(), skipOneAfter(), input.readFloat32(), input.readFloat32(), skipOneAfter(), input.readFloat32(), input.readFloat32(), skipOneAfter());
438
- },
439
- mat4x4f(input) {
440
- return mat4x4f(input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32());
441
- },
442
- struct(input, schema) {
443
- const alignment = alignmentOf(schema);
444
- alignIO_default(input, alignment);
445
- const result = {};
446
- const propTypes = schema.propTypes;
447
- for (const [key, property] of Object.entries(propTypes)) {
448
- alignIO_default(input, alignmentOf(property));
449
- result[key] = readData(input, property);
450
- }
451
- alignIO_default(input, alignment);
452
- return result;
453
- },
454
- array(input, schema) {
455
- if (schema.elementCount === 0) throw new Error("Cannot read using a runtime-sized schema.");
456
- const alignment = alignmentOf(schema);
457
- const elements = [];
458
- for (let i = 0; i < schema.elementCount; i++) {
459
- alignIO_default(input, alignment);
460
- const elementType = schema.elementType;
461
- const value = readData(input, elementType);
462
- elements.push(value);
463
- }
464
- alignIO_default(input, alignment);
465
- return elements;
466
- },
467
- ptr() {
468
- throw new Error("Pointers are not host-shareable");
469
- },
470
- atomic(input, schema) {
471
- return readData(input, schema.inner);
472
- },
473
- decorated(input, schema) {
474
- alignIO_default(input, customAlignmentOf(schema));
475
- const beginning = input.currentByteOffset;
476
- const value = readData(input, schema.inner);
477
- input.seekTo(beginning + sizeOf(schema));
478
- return value;
479
- },
480
- uint8: (i) => i.readUint8(),
481
- uint8x2: (i) => vec2u(i.readUint8(), i.readUint8()),
482
- uint8x4: (i) => vec4u(i.readUint8(), i.readUint8(), i.readUint8(), i.readUint8()),
483
- sint8: (i) => i.readInt8(),
484
- sint8x2: (i) => {
485
- return vec2i(i.readInt8(), i.readInt8());
486
- },
487
- sint8x4: (i) => vec4i(i.readInt8(), i.readInt8(), i.readInt8(), i.readInt8()),
488
- unorm8: (i) => i.readUint8() / 255,
489
- unorm8x2: (i) => vec2f(i.readUint8() / 255, i.readUint8() / 255),
490
- unorm8x4: (i) => vec4f(i.readUint8() / 255, i.readUint8() / 255, i.readUint8() / 255, i.readUint8() / 255),
491
- snorm8: (i) => i.readInt8() / 127,
492
- snorm8x2: (i) => vec2f(i.readInt8() / 127, i.readInt8() / 127),
493
- snorm8x4: (i) => vec4f(i.readInt8() / 127, i.readInt8() / 127, i.readInt8() / 127, i.readInt8() / 127),
494
- uint16: (i) => i.readUint16(),
495
- uint16x2: (i) => vec2u(i.readUint16(), i.readUint16()),
496
- uint16x4: (i) => vec4u(i.readUint16(), i.readUint16(), i.readUint16(), i.readUint16()),
497
- sint16: (i) => i.readInt16(),
498
- sint16x2: (i) => vec2i(i.readInt16(), i.readInt16()),
499
- sint16x4: (i) => vec4i(i.readInt16(), i.readInt16(), i.readInt16(), i.readInt16()),
500
- unorm16: (i) => i.readUint16() / 65535,
501
- unorm16x2: (i) => vec2f(i.readUint16() / 65535, i.readUint16() / 65535),
502
- unorm16x4: (i) => vec4f(i.readUint16() / 65535, i.readUint16() / 65535, i.readUint16() / 65535, i.readUint16() / 65535),
503
- snorm16: (i) => i.readInt16() / 32767,
504
- snorm16x2: (i) => vec2f(i.readInt16() / 32767, i.readInt16() / 32767),
505
- snorm16x4: (i) => vec4f(i.readInt16() / 32767, i.readInt16() / 32767, i.readInt16() / 32767, i.readInt16() / 32767),
506
- float16(i) {
507
- return i.readFloat16();
508
- },
509
- float16x2: (i) => vec2f(i.readFloat16(), i.readFloat16()),
510
- float16x4: (i) => vec4f(i.readFloat16(), i.readFloat16(), i.readFloat16(), i.readFloat16()),
511
- float32: (i) => i.readFloat32(),
512
- float32x2: (i) => vec2f(i.readFloat32(), i.readFloat32()),
513
- float32x3: (i) => vec3f(i.readFloat32(), i.readFloat32(), i.readFloat32()),
514
- float32x4: (i) => vec4f(i.readFloat32(), i.readFloat32(), i.readFloat32(), i.readFloat32()),
515
- uint32: (i) => i.readUint32(),
516
- uint32x2: (i) => vec2u(i.readUint32(), i.readUint32()),
517
- uint32x3: (i) => vec3u(i.readUint32(), i.readUint32(), i.readUint32()),
518
- uint32x4: (i) => vec4u(i.readUint32(), i.readUint32(), i.readUint32(), i.readUint32()),
519
- sint32: (i) => i.readInt32(),
520
- sint32x2: (i) => vec2i(i.readInt32(), i.readInt32()),
521
- sint32x3: (i) => vec3i(i.readInt32(), i.readInt32(), i.readInt32()),
522
- sint32x4: (i) => vec4i(i.readInt32(), i.readInt32(), i.readInt32(), i.readInt32()),
523
- "unorm10-10-10-2"(i) {
524
- const packed = i.readUint32();
525
- return vec4f((packed >> 22) / 1023, (packed >> 12 & 1023) / 1023, (packed >> 2 & 1023) / 1023, (packed & 3) / 3);
526
- },
527
- "unorm8x4-bgra"(i) {
528
- const b = i.readByte() / 255;
529
- const g = i.readByte() / 255;
530
- return vec4f(i.readByte() / 255, g, b, i.readByte() / 255);
531
- },
532
- unstruct(input, schema) {
533
- const result = {};
534
- const propTypes = schema.propTypes;
535
- for (const [key, property] of Object.entries(propTypes)) result[key] = readData(input, property);
536
- return result;
537
- },
538
- disarray(input, schema) {
539
- const alignment = alignmentOf(schema);
540
- const elements = [];
541
- for (let i = 0; i < schema.elementCount; i++) {
542
- alignIO_default(input, alignment);
543
- elements.push(readData(input, schema.elementType));
544
- }
545
- alignIO_default(input, alignment);
546
- return elements;
547
- },
548
- "loose-decorated"(input, schema) {
549
- alignIO_default(input, customAlignmentOf(schema));
550
- const beginning = input.currentByteOffset;
551
- const value = readData(input, schema.inner);
552
- input.seekTo(beginning + sizeOf(schema));
553
- return value;
554
- }
384
+ bool() {
385
+ throw new Error('Booleans are not host-shareable');
386
+ },
387
+ f32(input) {
388
+ return input.readFloat32();
389
+ },
390
+ f16(input) {
391
+ return readFloat16(input);
392
+ },
393
+ i32(input) {
394
+ return input.readInt32();
395
+ },
396
+ u32(input) {
397
+ return input.readUint32();
398
+ },
399
+ u16(input) {
400
+ return input.readUint16();
401
+ },
402
+ vec2f(input) {
403
+ return vec2f(input.readFloat32(), input.readFloat32());
404
+ },
405
+ vec3f(input) {
406
+ return vec3f(input.readFloat32(), input.readFloat32(), input.readFloat32());
407
+ },
408
+ vec4f(input) {
409
+ return vec4f(input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32());
410
+ },
411
+ vec2h(input) {
412
+ return vec2h(readFloat16(input), readFloat16(input));
413
+ },
414
+ vec3h(input) {
415
+ return vec3h(readFloat16(input), readFloat16(input), readFloat16(input));
416
+ },
417
+ vec4h(input) {
418
+ return vec4h(readFloat16(input), readFloat16(input), readFloat16(input), readFloat16(input));
419
+ },
420
+ vec2i(input) {
421
+ return vec2i(input.readInt32(), input.readInt32());
422
+ },
423
+ vec3i(input) {
424
+ return vec3i(input.readInt32(), input.readInt32(), input.readInt32());
425
+ },
426
+ vec4i(input) {
427
+ return vec4i(input.readInt32(), input.readInt32(), input.readInt32(), input.readInt32());
428
+ },
429
+ vec2u(input) {
430
+ return vec2u(input.readUint32(), input.readUint32());
431
+ },
432
+ vec3u(input) {
433
+ return vec3u(input.readUint32(), input.readUint32(), input.readUint32());
434
+ },
435
+ vec4u(input) {
436
+ return vec4u(input.readUint32(), input.readUint32(), input.readUint32(), input.readUint32());
437
+ },
438
+ 'vec2<bool>'() {
439
+ throw new Error('Booleans are not host-shareable');
440
+ },
441
+ 'vec3<bool>'() {
442
+ throw new Error('Booleans are not host-shareable');
443
+ },
444
+ 'vec4<bool>'() {
445
+ throw new Error('Booleans are not host-shareable');
446
+ },
447
+ mat2x2f(input) {
448
+ return mat2x2f(input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32());
449
+ },
450
+ mat3x3f(input) {
451
+ const skipOneAfter = () => {
452
+ const value = input.readFloat32();
453
+ input.readFloat32(); // skipping;
454
+ return value;
455
+ };
456
+ return mat3x3f(input.readFloat32(), input.readFloat32(), skipOneAfter(),
457
+ //
458
+ input.readFloat32(), input.readFloat32(), skipOneAfter(),
459
+ //
460
+ input.readFloat32(), input.readFloat32(), skipOneAfter());
461
+ },
462
+ mat4x4f(input) {
463
+ return mat4x4f(input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(),
464
+ //
465
+ input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(),
466
+ //
467
+ input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32(),
468
+ //
469
+ input.readFloat32(), input.readFloat32(), input.readFloat32(), input.readFloat32());
470
+ },
471
+ struct(input, schema) {
472
+ const alignment = alignmentOf(schema);
473
+ alignIO(input, alignment);
474
+ const result = {};
475
+ const propTypes = schema.propTypes;
476
+ for (const [key, property] of Object.entries(propTypes)) {
477
+ alignIO(input, alignmentOf(property));
478
+ result[key] = readData(input, property);
479
+ }
480
+ alignIO(input, alignment);
481
+ return result;
482
+ },
483
+ array(input, schema) {
484
+ if (schema.elementCount === 0) {
485
+ throw new Error('Cannot read using a runtime-sized schema.');
486
+ }
487
+ const alignment = alignmentOf(schema);
488
+ const elements = [];
489
+ for (let i = 0; i < schema.elementCount; i++) {
490
+ alignIO(input, alignment);
491
+ const elementType = schema.elementType;
492
+ const value = readData(input, elementType);
493
+ elements.push(value);
494
+ }
495
+ alignIO(input, alignment);
496
+ return elements;
497
+ },
498
+ ptr() {
499
+ throw new Error('Pointers are not host-shareable');
500
+ },
501
+ atomic(input, schema) {
502
+ return readData(input, schema.inner);
503
+ },
504
+ decorated(input, schema) {
505
+ const alignment = customAlignmentOf(schema);
506
+ alignIO(input, alignment);
507
+ const beginning = input.currentByteOffset;
508
+ const value = readData(input, schema.inner);
509
+ input.seekTo(beginning + sizeOf(schema));
510
+ return value;
511
+ },
512
+ // Loose Types
513
+ uint8: (i) => i.readUint8(),
514
+ uint8x2: (i) => vec2u(i.readUint8(), i.readUint8()),
515
+ uint8x4: (i) => vec4u(i.readUint8(), i.readUint8(), i.readUint8(), i.readUint8()),
516
+ sint8: (i) => i.readInt8(),
517
+ sint8x2: (i) => {
518
+ return vec2i(i.readInt8(), i.readInt8());
519
+ },
520
+ sint8x4: (i) => vec4i(i.readInt8(), i.readInt8(), i.readInt8(), i.readInt8()),
521
+ unorm8: (i) => i.readUint8() / 255,
522
+ unorm8x2: (i) => vec2f(i.readUint8() / 255, i.readUint8() / 255),
523
+ unorm8x4: (i) => vec4f(i.readUint8() / 255, i.readUint8() / 255, i.readUint8() / 255, i.readUint8() / 255),
524
+ snorm8: (i) => i.readInt8() / 127,
525
+ snorm8x2: (i) => vec2f(i.readInt8() / 127, i.readInt8() / 127),
526
+ snorm8x4: (i) => vec4f(i.readInt8() / 127, i.readInt8() / 127, i.readInt8() / 127, i.readInt8() / 127),
527
+ uint16: (i) => i.readUint16(),
528
+ uint16x2: (i) => vec2u(i.readUint16(), i.readUint16()),
529
+ uint16x4: (i) => vec4u(i.readUint16(), i.readUint16(), i.readUint16(), i.readUint16()),
530
+ sint16: (i) => i.readInt16(),
531
+ sint16x2: (i) => vec2i(i.readInt16(), i.readInt16()),
532
+ sint16x4: (i) => vec4i(i.readInt16(), i.readInt16(), i.readInt16(), i.readInt16()),
533
+ unorm16: (i) => i.readUint16() / 65535,
534
+ unorm16x2: (i) => vec2f(i.readUint16() / 65535, i.readUint16() / 65535),
535
+ unorm16x4: (i) => vec4f(i.readUint16() / 65535, i.readUint16() / 65535, i.readUint16() / 65535, i.readUint16() / 65535),
536
+ snorm16: (i) => i.readInt16() / 32767,
537
+ snorm16x2: (i) => vec2f(i.readInt16() / 32767, i.readInt16() / 32767),
538
+ snorm16x4: (i) => vec4f(i.readInt16() / 32767, i.readInt16() / 32767, i.readInt16() / 32767, i.readInt16() / 32767),
539
+ float16(i) {
540
+ return readFloat16(i);
541
+ },
542
+ float16x2: (i) => vec2f(readFloat16(i), readFloat16(i)),
543
+ float16x4: (i) => vec4f(readFloat16(i), readFloat16(i), readFloat16(i), readFloat16(i)),
544
+ float32: (i) => i.readFloat32(),
545
+ float32x2: (i) => vec2f(i.readFloat32(), i.readFloat32()),
546
+ float32x3: (i) => vec3f(i.readFloat32(), i.readFloat32(), i.readFloat32()),
547
+ float32x4: (i) => vec4f(i.readFloat32(), i.readFloat32(), i.readFloat32(), i.readFloat32()),
548
+ uint32: (i) => i.readUint32(),
549
+ uint32x2: (i) => vec2u(i.readUint32(), i.readUint32()),
550
+ uint32x3: (i) => vec3u(i.readUint32(), i.readUint32(), i.readUint32()),
551
+ uint32x4: (i) => vec4u(i.readUint32(), i.readUint32(), i.readUint32(), i.readUint32()),
552
+ sint32: (i) => i.readInt32(),
553
+ sint32x2: (i) => vec2i(i.readInt32(), i.readInt32()),
554
+ sint32x3: (i) => vec3i(i.readInt32(), i.readInt32(), i.readInt32()),
555
+ sint32x4: (i) => vec4i(i.readInt32(), i.readInt32(), i.readInt32(), i.readInt32()),
556
+ 'unorm10-10-10-2'(i) {
557
+ const packed = i.readUint32();
558
+ const r = (packed >> 22) / 1023;
559
+ const g = ((packed >> 12) & 1023) / 1023;
560
+ const b = ((packed >> 2) & 1023) / 1023;
561
+ const a = (packed & 3) / 3;
562
+ return vec4f(r, g, b, a);
563
+ },
564
+ 'unorm8x4-bgra'(i) {
565
+ const b = i.readByte() / 255;
566
+ const g = i.readByte() / 255;
567
+ const r = i.readByte() / 255;
568
+ const a = i.readByte() / 255;
569
+ return vec4f(r, g, b, a);
570
+ },
571
+ unstruct(input, schema) {
572
+ const result = {};
573
+ const propTypes = schema.propTypes;
574
+ for (const [key, property] of Object.entries(propTypes)) {
575
+ result[key] = readData(input, property);
576
+ }
577
+ return result;
578
+ },
579
+ disarray(input, schema) {
580
+ const alignment = alignmentOf(schema);
581
+ const elements = [];
582
+ for (let i = 0; i < schema.elementCount; i++) {
583
+ alignIO(input, alignment);
584
+ elements.push(readData(input, schema.elementType));
585
+ }
586
+ alignIO(input, alignment);
587
+ return elements;
588
+ },
589
+ 'loose-decorated'(input, schema) {
590
+ alignIO(input, customAlignmentOf(schema));
591
+ const beginning = input.currentByteOffset;
592
+ const value = readData(input, schema.inner);
593
+ input.seekTo(beginning + sizeOf(schema));
594
+ return value;
595
+ },
596
+ // TODO: Move texture IO logic here after we expand repr to have in/out variants
555
597
  };
556
- function readData(input, schema) {
557
- const reader = dataReaders[schema.type];
558
- if (!reader) throw new Error(`Cannot read data of type '${schema.type}'.`);
559
- return reader(input, schema);
598
+ export function readData(input, schema) {
599
+ const reader = dataReaders[schema.type];
600
+ if (!reader) {
601
+ throw new Error(`Cannot read data of type '${schema.type}'.`);
602
+ }
603
+ return reader(input, schema);
560
604
  }
561
605
  const endianness = getSystemEndianness();
562
- function calculateOffsets(options, schema, data) {
563
- const bufferSize = sizeOf(schema);
564
- const startOffset = options?.startOffset ?? 0;
565
- let naturalSize = void 0;
566
- if (isWgslArray(schema) && Array.isArray(data)) naturalSize = data.length * roundUp(sizeOf(schema.elementType), alignmentOf(schema.elementType));
567
- else if (ArrayBuffer.isView(data) || data instanceof ArrayBuffer) naturalSize = data.byteLength;
568
- const naturalEndOffset = naturalSize !== void 0 ? Math.min(startOffset + naturalSize, bufferSize) : void 0;
569
- return {
570
- startOffset,
571
- endOffset: options?.endOffset ?? naturalEndOffset ?? bufferSize
572
- };
606
+ export function calculateOffsets(options, schema, data) {
607
+ const bufferSize = sizeOf(schema);
608
+ const startOffset = options?.startOffset ?? 0;
609
+ let naturalSize = undefined;
610
+ if (isWgslArray(schema) && Array.isArray(data)) {
611
+ const arrayData = data;
612
+ naturalSize =
613
+ arrayData.length * roundUp(sizeOf(schema.elementType), alignmentOf(schema.elementType));
614
+ }
615
+ else if (ArrayBuffer.isView(data) || data instanceof ArrayBuffer) {
616
+ naturalSize = data.byteLength;
617
+ }
618
+ const naturalEndOffset = naturalSize !== undefined ? Math.min(startOffset + naturalSize, bufferSize) : undefined;
619
+ const endOffset = options?.endOffset ?? naturalEndOffset ?? bufferSize;
620
+ return { startOffset, endOffset };
573
621
  }
574
- function writeToArrayBuffer(buffer, schema, data, options) {
575
- const { startOffset, endOffset } = calculateOffsets(options, schema, data);
576
- if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {
577
- const src = data instanceof ArrayBuffer ? new Uint8Array(data) : new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
578
- const regionSize = endOffset - startOffset;
579
- if (src.byteLength !== regionSize) console.warn(`Buffer size mismatch: expected ${regionSize} bytes, got ${src.byteLength}. ` + (src.byteLength < regionSize ? "Data truncated." : "Excess ignored."));
580
- const copyLen = Math.min(src.byteLength, regionSize);
581
- new Uint8Array(buffer).set(src.subarray(0, copyLen), startOffset);
582
- return;
583
- }
584
- const dataView = new DataView(buffer);
585
- const isLittleEndian = endianness === "little";
586
- const compiledWriter = getCompiledWriter(schema);
587
- if (compiledWriter) try {
588
- compiledWriter(dataView, startOffset, data, isLittleEndian, endOffset);
589
- return;
590
- } catch (error) {
591
- console.error(`Error when using compiled writer for data type '${schema.type}' (${getName(schema) ?? "unnamed"}) - this is likely a bug, please submit an issue at https://github.com/software-mansion/TypeGPU/issues\nUsing fallback writer instead.`, error);
592
- }
593
- const writer = new BufferWriter(buffer);
594
- writer.seekTo(startOffset);
595
- writeData(writer, schema, data);
622
+ export function writeToArrayBuffer(buffer, schema, data, options) {
623
+ const { startOffset, endOffset } = calculateOffsets(options, schema, data);
624
+ // Fast path: raw byte copy, user guarantees the padded layout
625
+ if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {
626
+ const src = data instanceof ArrayBuffer
627
+ ? new Uint8Array(data)
628
+ : new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
629
+ const regionSize = endOffset - startOffset;
630
+ if (src.byteLength !== regionSize) {
631
+ logger.warn('suspicious', `Buffer size mismatch: expected ${regionSize} bytes, got ${src.byteLength}. ` +
632
+ (src.byteLength < regionSize ? 'Data truncated.' : 'Excess ignored.'));
633
+ }
634
+ const copyLen = Math.min(src.byteLength, regionSize);
635
+ new Uint8Array(buffer).set(src.subarray(0, copyLen), startOffset);
636
+ return;
637
+ }
638
+ const dataView = new DataView(buffer);
639
+ const isLittleEndian = endianness === 'little';
640
+ const compiledWriter = getCompiledWriter(schema);
641
+ if (compiledWriter) {
642
+ try {
643
+ compiledWriter(dataView, startOffset, data, isLittleEndian, endOffset);
644
+ return;
645
+ }
646
+ catch (error) {
647
+ logger.warn('fallback', `Error when using compiled writer for data type '${schema.type}' (${getName(schema) ?? 'unnamed'}) - this is likely a bug, please submit an issue at https://github.com/software-mansion/TypeGPU/issues\nUsing fallback writer instead.`, error);
648
+ }
649
+ }
650
+ const writer = new BufferWriter(buffer);
651
+ writer.seekTo(startOffset);
652
+ writeData(writer, schema, data);
596
653
  }
597
- function readFromArrayBuffer(buffer, schema) {
598
- return readData(new BufferReader(buffer), schema);
654
+ export function readFromArrayBuffer(buffer, schema) {
655
+ return readData(new BufferReader(buffer), schema);
599
656
  }
600
-
601
- //#endregion
602
- export { calculateOffsets, readFromArrayBuffer, writeData, writeToArrayBuffer };