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,16 +1,14 @@
1
- import { BaseData } from "./wgslTypes.js";
2
- import { Infer } from "../shared/repr.js";
3
-
4
- //#region src/data/offsetUtils.d.ts
5
-
1
+ import type { BaseData } from './wgslTypes.ts';
2
+ import type { Infer } from '../shared/repr.ts';
3
+ export declare function createOffsetProxy<T extends BaseData>(schema: T, baseOffset?: number): unknown;
6
4
  /**
7
5
  * Interface containing information about the offset and the available contiguous after a selected primitive.
8
6
  */
9
- interface PrimitiveOffsetInfo {
10
- /** The byte offset of the primitive within the buffer. */
11
- offset: number;
12
- /** The number of contiguous bytes available from the offset. */
13
- contiguous: number;
7
+ export interface PrimitiveOffsetInfo {
8
+ /** The byte offset of the primitive within the buffer. */
9
+ offset: number;
10
+ /** The number of contiguous bytes available from the offset. */
11
+ contiguous: number;
14
12
  }
15
13
  /**
16
14
  * A function that retrieves offset and information for a specific primitive within a data schema.
@@ -29,6 +27,4 @@ interface PrimitiveOffsetInfo {
29
27
  * @param accessor - Optional function that accesses a specific element within the schema. If omitted, uses the root offset (0).
30
28
  * @returns An object containing the offset and contiguous byte information.
31
29
  */
32
- declare function memoryLayoutOf<T extends BaseData>(schema: T, accessor?: (proxy: Infer<T>) => unknown): PrimitiveOffsetInfo;
33
- //#endregion
34
- export { PrimitiveOffsetInfo, memoryLayoutOf };
30
+ export declare function memoryLayoutOf<T extends BaseData>(schema: T, accessor?: (proxy: Infer<T>) => unknown): PrimitiveOffsetInfo;
@@ -1,167 +1,227 @@
1
- import { isVec, isWgslArray, isWgslStruct } from "./wgslTypes.js";
2
- import { undecorate } from "./dataTypes.js";
3
- import { alignmentOf } from "./alignmentOf.js";
4
1
  import { roundUp } from "../mathUtils.js";
5
- import { sizeOf } from "./sizeOf.js";
2
+ import { alignmentOf } from "./alignmentOf.js";
6
3
  import { offsetsForProps } from "./offsets.js";
4
+ import { sizeOf } from "./sizeOf.js";
7
5
  import { isContiguous } from "./isContiguous.js";
8
6
  import { getLongestContiguousPrefix } from "./getLongestContiguousPrefix.js";
9
-
10
- //#region src/data/offsetUtils.ts
11
- const OFFSET_MARKER = Symbol("indirectOffset");
12
- const CONTIGUOUS_MARKER = Symbol("indirectContiguous");
7
+ import { isVec, isWgslArray, isWgslStruct } from "./wgslTypes.js";
8
+ import { undecorate } from "./dataTypes.js";
9
+ const OFFSET_MARKER = Symbol('indirectOffset');
10
+ const CONTIGUOUS_MARKER = Symbol('indirectContiguous');
13
11
  function isOffsetProxy(value) {
14
- return typeof value === "object" && value !== null && OFFSET_MARKER in value && CONTIGUOUS_MARKER in value;
12
+ return (typeof value === 'object' &&
13
+ value !== null &&
14
+ OFFSET_MARKER in value &&
15
+ CONTIGUOUS_MARKER in value);
15
16
  }
16
17
  function scalarNode(offset, contiguous) {
17
- return {
18
- [OFFSET_MARKER]: offset,
19
- [CONTIGUOUS_MARKER]: contiguous
20
- };
18
+ return { [OFFSET_MARKER]: offset, [CONTIGUOUS_MARKER]: contiguous };
21
19
  }
22
20
  function getMarker(target, prop) {
23
- if (prop === OFFSET_MARKER) return target[OFFSET_MARKER];
24
- if (prop === CONTIGUOUS_MARKER) return target[CONTIGUOUS_MARKER];
21
+ if (prop === OFFSET_MARKER) {
22
+ return target[OFFSET_MARKER];
23
+ }
24
+ if (prop === CONTIGUOUS_MARKER) {
25
+ return target[CONTIGUOUS_MARKER];
26
+ }
27
+ return undefined;
25
28
  }
26
29
  function makeProxy(schema, baseOffset, contiguous = sizeOf(schema)) {
27
- const unwrapped = undecorate(schema);
28
- const vecComponentCount = isVec(unwrapped) ? unwrapped.componentCount : void 0;
29
- if (vecComponentCount !== void 0) {
30
- const componentSize = sizeOf(unwrapped.primitive);
31
- return makeVecProxy(scalarNode(baseOffset, contiguous), componentSize, vecComponentCount);
32
- }
33
- if (isWgslStruct(unwrapped)) return makeStructProxy(unwrapped, scalarNode(baseOffset, contiguous));
34
- if (isWgslArray(unwrapped)) return makeArrayProxy(unwrapped, scalarNode(baseOffset, contiguous));
35
- return scalarNode(baseOffset, contiguous);
30
+ const unwrapped = undecorate(schema);
31
+ const vecComponentCount = isVec(unwrapped) ? unwrapped.componentCount : undefined;
32
+ if (vecComponentCount !== undefined) {
33
+ const componentSize = sizeOf(unwrapped.primitive);
34
+ return makeVecProxy(scalarNode(baseOffset, contiguous), componentSize, vecComponentCount);
35
+ }
36
+ if (isWgslStruct(unwrapped)) {
37
+ return makeStructProxy(unwrapped, scalarNode(baseOffset, contiguous));
38
+ }
39
+ if (isWgslArray(unwrapped)) {
40
+ return makeArrayProxy(unwrapped, scalarNode(baseOffset, contiguous));
41
+ }
42
+ return scalarNode(baseOffset, contiguous);
36
43
  }
37
- function createOffsetProxy(schema, baseOffset = 0) {
38
- return makeProxy(schema, baseOffset, sizeOf(schema));
44
+ export function createOffsetProxy(schema, baseOffset = 0) {
45
+ return makeProxy(schema, baseOffset, sizeOf(schema));
39
46
  }
40
47
  function makeVecProxy(target, componentSize, componentCount) {
41
- const baseOffset = target[OFFSET_MARKER];
42
- return new Proxy(target, { get(t, prop) {
43
- const marker = getMarker(t, prop);
44
- if (marker !== void 0) return marker;
45
- const idx = prop === "x" || prop === "0" ? 0 : prop === "y" || prop === "1" ? 1 : prop === "z" || prop === "2" ? 2 : prop === "w" || prop === "3" ? 3 : -1;
46
- if (idx < 0 || idx >= componentCount) return;
47
- const byteOffset = idx * componentSize;
48
- const contiguous = Math.max(0, t[CONTIGUOUS_MARKER] - byteOffset);
49
- return scalarNode(baseOffset + byteOffset, contiguous);
50
- } });
48
+ const baseOffset = target[OFFSET_MARKER];
49
+ return new Proxy(target, {
50
+ get(t, prop) {
51
+ const marker = getMarker(t, prop);
52
+ if (marker !== undefined) {
53
+ return marker;
54
+ }
55
+ const idx = prop === 'x' || prop === '0'
56
+ ? 0
57
+ : prop === 'y' || prop === '1'
58
+ ? 1
59
+ : prop === 'z' || prop === '2'
60
+ ? 2
61
+ : prop === 'w' || prop === '3'
62
+ ? 3
63
+ : -1;
64
+ if (idx < 0 || idx >= componentCount) {
65
+ return undefined;
66
+ }
67
+ const byteOffset = idx * componentSize;
68
+ const contiguous = Math.max(0, t[CONTIGUOUS_MARKER] - byteOffset);
69
+ return scalarNode(baseOffset + byteOffset, contiguous);
70
+ },
71
+ });
51
72
  }
52
73
  function makeArrayProxy(array, target) {
53
- const elementType = array.elementType;
54
- const elementSize = sizeOf(elementType);
55
- const stride = roundUp(elementSize, alignmentOf(elementType));
56
- const hasPadding = stride > elementSize;
57
- return new Proxy(target, { get(t, prop) {
58
- const marker = getMarker(t, prop);
59
- if (marker !== void 0) return marker;
60
- if (prop === "length") return array.elementCount;
61
- if (typeof prop !== "string") return;
62
- const index = Number(prop);
63
- if (!Number.isInteger(index) || index < 0 || index >= array.elementCount) return;
64
- const elementOffset = index * stride;
65
- const remainingFromHere = !isContiguous(elementType) ? elementSize + getLongestContiguousPrefix(elementType) : Math.max(0, t[CONTIGUOUS_MARKER] - elementOffset);
66
- const childContiguous = hasPadding ? Math.min(remainingFromHere, elementSize) : remainingFromHere;
67
- return makeProxy(elementType, t[OFFSET_MARKER] + elementOffset, childContiguous);
68
- } });
74
+ const elementType = array.elementType;
75
+ const elementSize = sizeOf(elementType);
76
+ const stride = roundUp(elementSize, alignmentOf(elementType));
77
+ const hasPadding = stride > elementSize;
78
+ return new Proxy(target, {
79
+ get(t, prop) {
80
+ const marker = getMarker(t, prop);
81
+ if (marker !== undefined) {
82
+ return marker;
83
+ }
84
+ if (prop === 'length') {
85
+ return array.elementCount;
86
+ }
87
+ if (typeof prop !== 'string') {
88
+ return undefined;
89
+ }
90
+ const index = Number(prop);
91
+ if (!Number.isInteger(index) || index < 0 || index >= array.elementCount) {
92
+ return undefined;
93
+ }
94
+ const elementOffset = index * stride;
95
+ const remainingFromHere = !isContiguous(elementType)
96
+ ? elementSize + getLongestContiguousPrefix(elementType) // it is too much, but we correct it later
97
+ : Math.max(0, t[CONTIGUOUS_MARKER] - elementOffset);
98
+ const childContiguous = hasPadding
99
+ ? Math.min(remainingFromHere, elementSize)
100
+ : remainingFromHere;
101
+ return makeProxy(elementType, t[OFFSET_MARKER] + elementOffset, childContiguous);
102
+ },
103
+ });
69
104
  }
70
105
  function makeStructProxy(struct, target) {
71
- const offsets = offsetsForProps(struct);
72
- const propTypes = struct.propTypes;
73
- const propNames = Object.keys(propTypes);
74
- const meta = /* @__PURE__ */ new Map();
75
- let runStart = 0;
76
- for (let i = 0; i < propNames.length; i++) {
77
- const name = propNames[i];
78
- if (!name) continue;
79
- const type = propTypes[name];
80
- if (!type) continue;
81
- const info = offsets[name];
82
- const padding = info.padding ?? 0;
83
- const typeContiguous = isContiguous(type);
84
- if (!(i === propNames.length - 1 || padding > 0 || !typeContiguous)) continue;
85
- const runEnd = info.offset + (typeContiguous ? info.size : getLongestContiguousPrefix(type));
86
- for (let j = runStart; j <= i; j++) {
87
- const runName = propNames[j];
88
- if (!runName) continue;
89
- const runInfo = offsets[runName];
90
- meta.set(runName, {
91
- offset: runInfo.offset,
92
- runEnd
93
- });
94
- }
95
- runStart = i + 1;
96
- }
97
- return new Proxy(target, { get(t, prop) {
98
- const marker = getMarker(t, prop);
99
- if (marker !== void 0) return marker;
100
- if (typeof prop !== "string") return;
101
- const m = meta.get(prop);
102
- if (!m) return;
103
- const remainingFromHere = Math.max(0, t[CONTIGUOUS_MARKER] - m.offset);
104
- const localLimit = Math.max(0, m.runEnd - m.offset);
105
- const propSchema = propTypes[prop];
106
- if (!propSchema) return;
107
- return makeProxy(propSchema, t[OFFSET_MARKER] + m.offset, sizeOf(struct) === m.runEnd ? remainingFromHere : localLimit);
108
- } });
106
+ const offsets = offsetsForProps(struct);
107
+ const propTypes = struct.propTypes;
108
+ const propNames = Object.keys(propTypes);
109
+ const meta = new Map();
110
+ let runStart = 0;
111
+ for (let i = 0; i < propNames.length; i++) {
112
+ const name = propNames[i];
113
+ if (!name) {
114
+ continue;
115
+ }
116
+ const type = propTypes[name];
117
+ if (!type) {
118
+ continue;
119
+ }
120
+ const info = offsets[name];
121
+ const padding = info.padding ?? 0;
122
+ const typeContiguous = isContiguous(type);
123
+ const isRunEnd = i === propNames.length - 1 || padding > 0 || !typeContiguous;
124
+ if (!isRunEnd) {
125
+ continue;
126
+ }
127
+ const runEnd = info.offset + (typeContiguous ? info.size : getLongestContiguousPrefix(type));
128
+ for (let j = runStart; j <= i; j++) {
129
+ const runName = propNames[j];
130
+ if (!runName) {
131
+ continue;
132
+ }
133
+ const runInfo = offsets[runName];
134
+ meta.set(runName, { offset: runInfo.offset, runEnd });
135
+ }
136
+ runStart = i + 1;
137
+ }
138
+ return new Proxy(target, {
139
+ get(t, prop) {
140
+ const marker = getMarker(t, prop);
141
+ if (marker !== undefined) {
142
+ return marker;
143
+ }
144
+ if (typeof prop !== 'string') {
145
+ return undefined;
146
+ }
147
+ const m = meta.get(prop);
148
+ if (!m) {
149
+ return undefined;
150
+ }
151
+ const remainingFromHere = Math.max(0, t[CONTIGUOUS_MARKER] - m.offset);
152
+ const localLimit = Math.max(0, m.runEnd - m.offset);
153
+ const propSchema = propTypes[prop];
154
+ if (!propSchema) {
155
+ return undefined;
156
+ }
157
+ return makeProxy(propSchema, t[OFFSET_MARKER] + m.offset, sizeOf(struct) === m.runEnd ? remainingFromHere : localLimit);
158
+ },
159
+ });
109
160
  }
110
161
  function getRootContiguous(schema) {
111
- const unwrapped = undecorate(schema);
112
- if (isWgslStruct(unwrapped)) {
113
- const offsets = offsetsForProps(unwrapped);
114
- const propTypes = unwrapped.propTypes;
115
- const propNames = Object.keys(propTypes);
116
- for (let i = 0; i < propNames.length; i++) {
117
- const name = propNames[i];
118
- if (!name) continue;
119
- const info = offsets[name];
120
- const padding = info.padding ?? 0;
121
- const runEnd = info.offset + info.size;
122
- if (i === propNames.length - 1 || padding > 0) return runEnd;
123
- }
124
- return 0;
125
- }
126
- if (isWgslArray(unwrapped)) {
127
- const elementType = unwrapped.elementType;
128
- const elementSize = sizeOf(elementType);
129
- const stride = roundUp(elementSize, alignmentOf(elementType));
130
- const totalSize = sizeOf(schema);
131
- if (!Number.isFinite(totalSize)) return elementSize;
132
- return stride > elementSize ? elementSize : totalSize;
133
- }
134
- return sizeOf(schema);
162
+ const unwrapped = undecorate(schema);
163
+ if (isWgslStruct(unwrapped)) {
164
+ const offsets = offsetsForProps(unwrapped);
165
+ const propTypes = unwrapped.propTypes;
166
+ const propNames = Object.keys(propTypes);
167
+ for (let i = 0; i < propNames.length; i++) {
168
+ const name = propNames[i];
169
+ if (!name) {
170
+ continue;
171
+ }
172
+ const info = offsets[name];
173
+ const padding = info.padding ?? 0;
174
+ const runEnd = info.offset + info.size;
175
+ const isRunEnd = i === propNames.length - 1 || padding > 0;
176
+ if (isRunEnd) {
177
+ return runEnd;
178
+ }
179
+ }
180
+ return 0;
181
+ }
182
+ if (isWgslArray(unwrapped)) {
183
+ const elementType = unwrapped.elementType;
184
+ const elementSize = sizeOf(elementType);
185
+ const stride = roundUp(elementSize, alignmentOf(elementType));
186
+ const totalSize = sizeOf(schema);
187
+ if (!Number.isFinite(totalSize)) {
188
+ return elementSize;
189
+ }
190
+ return stride > elementSize ? elementSize : totalSize;
191
+ }
192
+ return sizeOf(schema);
135
193
  }
136
194
  /**
137
- * A function that retrieves offset and information for a specific primitive within a data schema.
138
- * Example usage:
139
- * ```ts
140
- * const Boid = d.struct({
141
- * position: d.vec3f,
142
- * velocity: d.vec3f,
143
- * });
144
- * const memLayout = d.memoryLayoutOf(Boid, (b) => b.velocity.y);
145
- * console.log(memLayout.offset); // Byte offset of velocity.y within Boid (here 20 bytes)
146
- * console.log(memLayout.contiguous); // Contiguous bytes available from that offset (here 8 bytes)
147
- * ```
148
- *
149
- * @param schema - The data schema to analyze.
150
- * @param accessor - Optional function that accesses a specific element within the schema. If omitted, uses the root offset (0).
151
- * @returns An object containing the offset and contiguous byte information.
152
- */
153
- function memoryLayoutOf(schema, accessor) {
154
- if (!accessor) return {
155
- offset: 0,
156
- contiguous: getRootContiguous(schema)
157
- };
158
- const result = accessor(createOffsetProxy(schema));
159
- if (isOffsetProxy(result)) return {
160
- offset: result[OFFSET_MARKER],
161
- contiguous: result[CONTIGUOUS_MARKER]
162
- };
163
- throw new Error("memoryLayoutOf: accessor did not return a schema element. Make sure the accessor navigates to a field or element of the schema (e.g. `(s) => s.position.x`).");
195
+ * A function that retrieves offset and information for a specific primitive within a data schema.
196
+ * Example usage:
197
+ * ```ts
198
+ * const Boid = d.struct({
199
+ * position: d.vec3f,
200
+ * velocity: d.vec3f,
201
+ * });
202
+ * const memLayout = d.memoryLayoutOf(Boid, (b) => b.velocity.y);
203
+ * console.log(memLayout.offset); // Byte offset of velocity.y within Boid (here 20 bytes)
204
+ * console.log(memLayout.contiguous); // Contiguous bytes available from that offset (here 8 bytes)
205
+ * ```
206
+ *
207
+ * @param schema - The data schema to analyze.
208
+ * @param accessor - Optional function that accesses a specific element within the schema. If omitted, uses the root offset (0).
209
+ * @returns An object containing the offset and contiguous byte information.
210
+ */
211
+ export function memoryLayoutOf(schema, accessor) {
212
+ if (!accessor) {
213
+ return {
214
+ offset: 0,
215
+ contiguous: getRootContiguous(schema),
216
+ };
217
+ }
218
+ const proxy = createOffsetProxy(schema);
219
+ const result = accessor(proxy);
220
+ if (isOffsetProxy(result)) {
221
+ return {
222
+ offset: result[OFFSET_MARKER],
223
+ contiguous: result[CONTIGUOUS_MARKER],
224
+ };
225
+ }
226
+ throw new Error('memoryLayoutOf: accessor did not return a schema element. Make sure the accessor navigates to a field or element of the schema (e.g. `(s) => s.position.x`).');
164
227
  }
165
-
166
- //#endregion
167
- export { memoryLayoutOf };
@@ -0,0 +1,8 @@
1
+ import { type Unstruct } from './dataTypes.ts';
2
+ import type { WgslStruct } from './wgslTypes.ts';
3
+ export interface OffsetInfo {
4
+ offset: number;
5
+ size: number;
6
+ padding?: number | undefined;
7
+ }
8
+ export declare function offsetsForProps<T extends WgslStruct | Unstruct>(struct: T): Record<keyof T['propTypes'], OffsetInfo>;
package/data/offsets.js CHANGED
@@ -1,36 +1,36 @@
1
- import { isUnstruct } from "./dataTypes.js";
2
- import { alignmentOf, customAlignmentOf } from "./alignmentOf.js";
1
+ import { Measurer } from 'typed-binary';
3
2
  import { roundUp } from "../mathUtils.js";
3
+ import alignIO from "./alignIO.js";
4
+ import { alignmentOf, customAlignmentOf } from "./alignmentOf.js";
5
+ import { isUnstruct } from "./dataTypes.js";
4
6
  import { sizeOf } from "./sizeOf.js";
5
- import alignIO_default from "./alignIO.js";
6
- import { Measurer } from "typed-binary";
7
-
8
- //#region src/data/offsets.ts
9
- const cachedOffsets = /* @__PURE__ */ new WeakMap();
10
- function offsetsForProps(struct) {
11
- const cached = cachedOffsets.get(struct);
12
- if (cached) return cached;
13
- const measurer = new Measurer();
14
- const offsets = {};
15
- let lastEntry;
16
- for (const key in struct.propTypes) {
17
- const prop = struct.propTypes[key];
18
- if (prop === void 0) throw new Error(`Property ${key} is undefined in struct`);
19
- const beforeAlignment = measurer.size;
20
- alignIO_default(measurer, isUnstruct(struct) ? customAlignmentOf(prop) : alignmentOf(prop));
21
- if (lastEntry) lastEntry.padding = measurer.size - beforeAlignment;
22
- const propSize = sizeOf(prop);
23
- offsets[key] = {
24
- offset: measurer.size,
25
- size: propSize
26
- };
27
- lastEntry = offsets[key];
28
- measurer.add(propSize);
29
- }
30
- if (lastEntry) lastEntry.padding = roundUp(sizeOf(struct), alignmentOf(struct)) - measurer.size;
31
- cachedOffsets.set(struct, offsets);
32
- return offsets;
7
+ const cachedOffsets = new WeakMap();
8
+ export function offsetsForProps(struct) {
9
+ const cached = cachedOffsets.get(struct);
10
+ if (cached) {
11
+ return cached;
12
+ }
13
+ const measurer = new Measurer();
14
+ const offsets = {};
15
+ let lastEntry;
16
+ for (const key in struct.propTypes) {
17
+ const prop = struct.propTypes[key];
18
+ if (prop === undefined) {
19
+ throw new Error(`Property ${key} is undefined in struct`);
20
+ }
21
+ const beforeAlignment = measurer.size;
22
+ alignIO(measurer, isUnstruct(struct) ? customAlignmentOf(prop) : alignmentOf(prop));
23
+ if (lastEntry) {
24
+ lastEntry.padding = measurer.size - beforeAlignment;
25
+ }
26
+ const propSize = sizeOf(prop);
27
+ offsets[key] = { offset: measurer.size, size: propSize };
28
+ lastEntry = offsets[key];
29
+ measurer.add(propSize);
30
+ }
31
+ if (lastEntry) {
32
+ lastEntry.padding = roundUp(sizeOf(struct), alignmentOf(struct)) - measurer.size;
33
+ }
34
+ cachedOffsets.set(struct, offsets);
35
+ return offsets;
33
36
  }
34
-
35
- //#endregion
36
- export { offsetsForProps };
@@ -1,8 +1,13 @@
1
- import { BaseData } from "./wgslTypes.js";
2
- import { InferPatch } from "../shared/repr.js";
3
-
4
- //#region src/data/partialIO.d.ts
5
-
6
- declare function patchArrayBuffer<T extends BaseData>(buffer: ArrayBuffer, schema: T, data: InferPatch<T>): void;
7
- //#endregion
8
- export { patchArrayBuffer };
1
+ import type * as wgsl from './wgslTypes.ts';
2
+ import { type BaseData } from './wgslTypes.ts';
3
+ import type { InferPatch } from '../shared/repr.ts';
4
+ export interface WriteInstruction {
5
+ data: Uint8Array<ArrayBuffer>;
6
+ gpuOffset: number;
7
+ }
8
+ /**
9
+ * Converts `{idx, value}[]` sparse arrays into `Record<number, T>` format.
10
+ */
11
+ export declare function convertPartialToPatch(schema: wgsl.BaseData, data: unknown): unknown;
12
+ export declare function getPatchInstructions<TData extends wgsl.BaseData>(schema: TData, data: unknown, targetBuffer?: ArrayBuffer): WriteInstruction[];
13
+ export declare function patchArrayBuffer<T extends BaseData>(buffer: ArrayBuffer, schema: T, data: InferPatch<T>): void;