typegpu 0.11.9 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/builtin.d.ts +51 -53
  2. package/builtin.js +30 -34
  3. package/common/fullScreenTriangle.d.ts +2 -10
  4. package/common/fullScreenTriangle.js +20 -28
  5. package/common/index.d.ts +2 -9
  6. package/common/index.js +3 -12
  7. package/common/writeSoA.d.ts +11 -12
  8. package/common/writeSoA.js +88 -76
  9. package/core/buffer/buffer.d.ts +79 -62
  10. package/core/buffer/buffer.js +279 -205
  11. package/core/buffer/bufferBinding.d.ts +71 -0
  12. package/core/buffer/bufferBinding.js +154 -0
  13. package/core/buffer/bufferUsage.d.ts +14 -45
  14. package/core/buffer/bufferUsage.js +1 -171
  15. package/core/buffer/laidOutBuffer.d.ts +25 -0
  16. package/core/buffer/laidOutBuffer.js +55 -0
  17. package/core/commandEncoder/attachments.d.ts +125 -0
  18. package/core/commandEncoder/attachments.js +29 -0
  19. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  20. package/core/commandEncoder/commandEncoder.js +56 -0
  21. package/core/commandEncoder/computePass.d.ts +58 -0
  22. package/core/commandEncoder/computePass.js +63 -0
  23. package/core/commandEncoder/renderPass.d.ts +121 -0
  24. package/core/commandEncoder/renderPass.js +196 -0
  25. package/core/constant/tgpuConstant.d.ts +26 -26
  26. package/core/constant/tgpuConstant.js +76 -65
  27. package/core/declare/tgpuDeclare.d.ts +3 -6
  28. package/core/declare/tgpuDeclare.js +36 -36
  29. package/core/function/autoIO.d.ts +61 -33
  30. package/core/function/autoIO.js +68 -73
  31. package/core/function/comptime.d.ts +11 -13
  32. package/core/function/comptime.js +60 -52
  33. package/core/function/createCallableSchema.d.ts +16 -0
  34. package/core/function/createCallableSchema.js +50 -40
  35. package/core/function/dualImpl.d.ts +44 -0
  36. package/core/function/dualImpl.js +71 -50
  37. package/core/function/entryInputRouter.d.ts +26 -0
  38. package/core/function/entryInputRouter.js +31 -33
  39. package/core/function/extractArgs.d.ts +38 -0
  40. package/core/function/extractArgs.js +202 -200
  41. package/core/function/fnCore.d.ts +44 -5
  42. package/core/function/fnCore.js +148 -93
  43. package/core/function/fnTypes.d.ts +31 -29
  44. package/core/function/fnTypes.js +1 -0
  45. package/core/function/ioSchema.d.ts +12 -10
  46. package/core/function/ioSchema.js +65 -47
  47. package/core/function/shelllessImpl.d.ts +9 -12
  48. package/core/function/shelllessImpl.js +17 -22
  49. package/core/function/templateUtils.d.ts +2 -0
  50. package/core/function/templateUtils.js +9 -8
  51. package/core/function/tgpuComputeFn.d.ts +26 -28
  52. package/core/function/tgpuComputeFn.js +47 -48
  53. package/core/function/tgpuFn.d.ts +34 -37
  54. package/core/function/tgpuFn.js +179 -153
  55. package/core/function/tgpuFragmentFn.d.ts +52 -53
  56. package/core/function/tgpuFragmentFn.js +63 -56
  57. package/core/function/tgpuVertexFn.d.ts +36 -39
  58. package/core/function/tgpuVertexFn.js +56 -53
  59. package/core/pipeline/computePipeline.d.ts +141 -53
  60. package/core/pipeline/computePipeline.js +291 -225
  61. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  62. package/core/pipeline/connectAttachmentToShader.js +25 -22
  63. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  64. package/core/pipeline/connectTargetsToShader.js +29 -27
  65. package/core/pipeline/drawState.d.ts +52 -0
  66. package/core/pipeline/drawState.js +225 -0
  67. package/core/pipeline/limitsOverflow.d.ts +2 -0
  68. package/core/pipeline/limitsOverflow.js +13 -10
  69. package/core/pipeline/performanceTracker.d.ts +14 -0
  70. package/core/pipeline/performanceTracker.js +34 -0
  71. package/core/pipeline/pipelineUtils.d.ts +18 -0
  72. package/core/pipeline/pipelineUtils.js +54 -25
  73. package/core/pipeline/priors.d.ts +1 -0
  74. package/core/pipeline/priors.js +12 -0
  75. package/core/pipeline/renderPipeline.d.ts +246 -261
  76. package/core/pipeline/renderPipeline.js +487 -480
  77. package/core/pipeline/timeable.d.ts +28 -18
  78. package/core/pipeline/timeable.js +90 -52
  79. package/core/pipeline/typeGuards.d.ts +17 -0
  80. package/core/pipeline/typeGuards.js +52 -22
  81. package/core/querySet/querySet.d.ts +26 -21
  82. package/core/querySet/querySet.js +127 -103
  83. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  85. package/core/resolve/externals.d.ts +25 -8
  86. package/core/resolve/externals.js +78 -54
  87. package/core/resolve/namespace.d.ts +22 -25
  88. package/core/resolve/namespace.js +16 -21
  89. package/core/resolve/resolvableString.d.ts +7 -0
  90. package/core/resolve/resolvableString.js +13 -0
  91. package/core/resolve/resolveData.d.ts +10 -0
  92. package/core/resolve/resolveData.js +162 -121
  93. package/core/resolve/stitch.d.ts +8 -0
  94. package/core/resolve/stitch.js +23 -21
  95. package/core/resolve/tgpuResolve.d.ts +55 -53
  96. package/core/resolve/tgpuResolve.js +106 -53
  97. package/core/root/configurableImpl.d.ts +10 -0
  98. package/core/root/configurableImpl.js +17 -19
  99. package/core/root/init.d.ts +76 -38
  100. package/core/root/init.js +346 -455
  101. package/core/root/rootTypes.d.ts +461 -636
  102. package/core/root/rootTypes.js +1 -0
  103. package/core/sampler/sampler.d.ts +50 -31
  104. package/core/sampler/sampler.js +120 -113
  105. package/core/simulate/tgpuSimulate.d.ts +9 -12
  106. package/core/simulate/tgpuSimulate.js +68 -71
  107. package/core/slot/accessor.d.ts +36 -13
  108. package/core/slot/accessor.js +138 -91
  109. package/core/slot/internalSlots.d.ts +2 -0
  110. package/core/slot/internalSlots.js +1 -6
  111. package/core/slot/lazy.d.ts +2 -6
  112. package/core/slot/lazy.js +71 -39
  113. package/core/slot/slot.d.ts +2 -6
  114. package/core/slot/slot.js +45 -38
  115. package/core/slot/slotTypes.d.ts +78 -80
  116. package/core/slot/slotTypes.js +11 -16
  117. package/core/texture/externalTexture.d.ts +20 -11
  118. package/core/texture/externalTexture.js +46 -46
  119. package/core/texture/texture.d.ts +152 -97
  120. package/core/texture/texture.js +407 -314
  121. package/core/texture/textureFormats.d.ts +42 -23
  122. package/core/texture/textureFormats.js +104 -75
  123. package/core/texture/textureProps.d.ts +7 -10
  124. package/core/texture/textureProps.js +1 -0
  125. package/core/texture/textureUtils.d.ts +8 -0
  126. package/core/texture/textureUtils.js +185 -179
  127. package/core/texture/usageExtension.d.ts +21 -18
  128. package/core/texture/usageExtension.js +13 -17
  129. package/core/unroll/tgpuUnroll.d.ts +20 -19
  130. package/core/unroll/tgpuUnroll.js +82 -91
  131. package/core/valueProxyUtils.d.ts +3 -0
  132. package/core/valueProxyUtils.js +52 -41
  133. package/core/variable/tgpuVariable.d.ts +26 -27
  134. package/core/variable/tgpuVariable.js +93 -96
  135. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  136. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  137. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  138. package/core/vertexLayout/vertexAttribute.js +1 -0
  139. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  140. package/core/vertexLayout/vertexLayout.js +130 -99
  141. package/core/whitespaces.d.ts +2 -0
  142. package/core/whitespaces.js +16 -0
  143. package/data/alignIO.d.ts +7 -0
  144. package/data/alignIO.js +13 -13
  145. package/data/alignmentOf.d.ts +5 -8
  146. package/data/alignmentOf.js +90 -75
  147. package/data/array.d.ts +6 -9
  148. package/data/array.js +48 -40
  149. package/data/atomic.d.ts +2 -7
  150. package/data/atomic.js +26 -23
  151. package/data/attributes.d.ts +19 -21
  152. package/data/attributes.js +192 -132
  153. package/data/autoStruct.d.ts +36 -3
  154. package/data/autoStruct.js +84 -81
  155. package/data/compiledIO.d.ts +5 -0
  156. package/data/compiledIO.js +231 -215
  157. package/data/dataIO.d.ts +13 -11
  158. package/data/dataIO.js +643 -589
  159. package/data/dataTypes.d.ts +83 -65
  160. package/data/dataTypes.js +66 -68
  161. package/data/deepEqual.d.ts +2 -7
  162. package/data/deepEqual.js +80 -55
  163. package/data/disarray.d.ts +6 -10
  164. package/data/disarray.js +52 -46
  165. package/data/float16Conversion.d.ts +4 -0
  166. package/data/float16Conversion.js +7 -0
  167. package/data/getLongestContiguousPrefix.d.ts +4 -8
  168. package/data/getLongestContiguousPrefix.js +6 -11
  169. package/data/index.d.ts +30 -31
  170. package/data/index.js +39 -172
  171. package/data/instanceToSchema.d.ts +24 -27
  172. package/data/instanceToSchema.js +1 -0
  173. package/data/isContiguous.d.ts +4 -8
  174. package/data/isContiguous.js +6 -11
  175. package/data/matrix.d.ts +21 -21
  176. package/data/matrix.js +513 -505
  177. package/data/numberOps.d.ts +6 -0
  178. package/data/numberOps.js +26 -20
  179. package/data/numeric.d.ts +21 -12
  180. package/data/numeric.js +287 -197
  181. package/data/offsetUtils.d.ts +9 -13
  182. package/data/offsetUtils.js +204 -144
  183. package/data/offsets.d.ts +8 -0
  184. package/data/offsets.js +33 -33
  185. package/data/partialIO.d.ts +13 -8
  186. package/data/partialIO.js +124 -113
  187. package/data/ptr.d.ts +12 -12
  188. package/data/ptr.js +42 -44
  189. package/data/ref.d.ts +40 -27
  190. package/data/ref.js +125 -95
  191. package/data/sampler.d.ts +99 -101
  192. package/data/sampler.js +17 -21
  193. package/data/schemaCallWrapper.d.ts +19 -0
  194. package/data/schemaCallWrapper.js +31 -26
  195. package/data/schemaMemoryLayout.d.ts +8 -0
  196. package/data/schemaMemoryLayout.js +213 -185
  197. package/data/sizeOf.d.ts +4 -8
  198. package/data/sizeOf.js +6 -11
  199. package/data/snippet.d.ts +96 -20
  200. package/data/snippet.js +75 -86
  201. package/data/struct.d.ts +4 -7
  202. package/data/struct.js +51 -39
  203. package/data/texture.d.ts +253 -250
  204. package/data/texture.js +238 -200
  205. package/data/unstruct.d.ts +2 -7
  206. package/data/unstruct.js +43 -37
  207. package/data/vector.d.ts +33 -21
  208. package/data/vector.js +234 -221
  209. package/data/vectorImpl.d.ts +231 -0
  210. package/data/vectorImpl.js +563 -515
  211. package/data/vectorOps.d.ts +63 -0
  212. package/data/vectorOps.js +642 -630
  213. package/data/vertexFormatData.d.ts +181 -184
  214. package/data/vertexFormatData.js +104 -106
  215. package/data/wgslTypes.d.ts +665 -600
  216. package/data/wgslTypes.js +220 -198
  217. package/errors.d.ts +50 -24
  218. package/errors.js +146 -126
  219. package/execMode.d.ts +16 -0
  220. package/execMode.js +47 -40
  221. package/extension.d.ts +13 -8
  222. package/extension.js +10 -16
  223. package/getGPUValue.d.ts +1 -0
  224. package/getGPUValue.js +2 -7
  225. package/index.d.ts +28 -68
  226. package/index.js +8 -28
  227. package/indexNamedExports.d.ts +69 -42
  228. package/indexNamedExports.js +25 -0
  229. package/internal.d.ts +16 -0
  230. package/internal.js +12 -0
  231. package/mathUtils.d.ts +5 -0
  232. package/mathUtils.js +7 -11
  233. package/memo.d.ts +11 -0
  234. package/memo.js +20 -22
  235. package/minify.d.ts +5 -0
  236. package/minify.js +93 -0
  237. package/nameUtils.d.ts +29 -0
  238. package/nameUtils.js +427 -394
  239. package/package.json +5 -1
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -629
  242. package/serial/registry.d.ts +15 -0
  243. package/serial/registry.js +106 -0
  244. package/serial/restore.d.ts +49 -0
  245. package/serial/restore.js +68 -0
  246. package/serial/schema.d.ts +58 -0
  247. package/serial/schema.js +209 -0
  248. package/serial/types.d.ts +5 -0
  249. package/serial/types.js +1 -0
  250. package/shared/env.d.ts +9 -0
  251. package/shared/env.js +9 -12
  252. package/shared/generators.d.ts +4 -0
  253. package/shared/generators.js +10 -12
  254. package/shared/meta.d.ts +29 -14
  255. package/shared/meta.js +71 -55
  256. package/shared/normalizeMetadata.d.ts +32 -27
  257. package/shared/normalizeMetadata.js +23 -36
  258. package/shared/repr.d.ts +73 -55
  259. package/shared/repr.js +1 -0
  260. package/shared/soul.d.ts +17 -0
  261. package/shared/soul.js +1 -0
  262. package/shared/stringify.d.ts +2 -0
  263. package/shared/stringify.js +29 -20
  264. package/shared/symbols.d.ts +26 -20
  265. package/shared/symbols.js +79 -79
  266. package/shared/tseynit.d.ts +2 -0
  267. package/shared/tseynit.js +160 -75
  268. package/shared/utilityTypes.d.ts +30 -14
  269. package/shared/utilityTypes.js +2 -6
  270. package/shared/vertexFormat.d.ts +41 -43
  271. package/shared/vertexFormat.js +59 -62
  272. package/std/array.d.ts +2 -7
  273. package/std/array.js +18 -23
  274. package/std/atomic.d.ts +14 -18
  275. package/std/atomic.js +96 -95
  276. package/std/bitcast.d.ts +193 -10
  277. package/std/bitcast.js +309 -39
  278. package/std/boolean.d.ts +19 -33
  279. package/std/boolean.js +296 -288
  280. package/std/copy.d.ts +2 -7
  281. package/std/copy.js +27 -24
  282. package/std/derivative.d.ts +11 -15
  283. package/std/derivative.js +56 -79
  284. package/std/discard.d.ts +1 -6
  285. package/std/discard.js +7 -14
  286. package/std/environment.d.ts +19 -14
  287. package/std/environment.js +71 -51
  288. package/std/extensions.d.ts +2 -8
  289. package/std/extensions.js +10 -11
  290. package/std/index.d.ts +20 -24
  291. package/std/index.js +32 -187
  292. package/std/matrix.d.ts +6 -12
  293. package/std/matrix.js +60 -69
  294. package/std/numeric.d.ts +143 -146
  295. package/std/numeric.js +858 -749
  296. package/std/operators.d.ts +19 -27
  297. package/std/operators.js +227 -193
  298. package/std/packing.d.ts +5 -11
  299. package/std/packing.js +67 -75
  300. package/std/range.d.ts +6 -11
  301. package/std/range.js +48 -36
  302. package/std/subgroup.d.ts +33 -37
  303. package/std/subgroup.js +180 -217
  304. package/std/texture.d.ts +70 -38
  305. package/std/texture.js +176 -172
  306. package/taskQueue.d.ts +6 -0
  307. package/taskQueue.js +30 -0
  308. package/tgpu.d.ts +16 -0
  309. package/tgpu.js +17 -44
  310. package/tgpuBindGroupLayout.d.ts +132 -152
  311. package/tgpuBindGroupLayout.js +346 -268
  312. package/tgpuLogger.d.ts +34 -0
  313. package/tgpuLogger.js +63 -0
  314. package/tgpuUnstable.d.ts +16 -22
  315. package/tgpuUnstable.js +13 -35
  316. package/tgsl/accessIndex.d.ts +2 -0
  317. package/tgsl/accessIndex.js +76 -33
  318. package/tgsl/accessProp.d.ts +2 -0
  319. package/tgsl/accessProp.js +142 -101
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +13 -15
  322. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  323. package/tgsl/consoleLog/deserializers.js +119 -103
  324. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  325. package/tgsl/consoleLog/logGenerator.js +85 -80
  326. package/tgsl/consoleLog/serializers.d.ts +21 -0
  327. package/tgsl/consoleLog/serializers.js +119 -100
  328. package/tgsl/consoleLog/types.d.ts +40 -39
  329. package/tgsl/consoleLog/types.js +1 -0
  330. package/tgsl/conversion.d.ts +33 -0
  331. package/tgsl/conversion.js +271 -216
  332. package/tgsl/forOfUtils.d.ts +15 -0
  333. package/tgsl/forOfUtils.js +85 -70
  334. package/tgsl/generationHelpers.d.ts +22 -39
  335. package/tgsl/generationHelpers.js +85 -58
  336. package/tgsl/infixDispatch.d.ts +70 -0
  337. package/tgsl/infixDispatch.js +48 -46
  338. package/tgsl/jsPolyfills.d.ts +16 -19
  339. package/tgsl/jsPolyfills.js +44 -42
  340. package/tgsl/makeDereferenceable.d.ts +48 -0
  341. package/tgsl/makeDereferenceable.js +86 -0
  342. package/tgsl/makeResolvable.d.ts +22 -0
  343. package/tgsl/makeResolvable.js +33 -0
  344. package/tgsl/shaderGenerator.d.ts +77 -17
  345. package/tgsl/shaderGenerator.js +1 -0
  346. package/tgsl/shellless.d.ts +6 -9
  347. package/tgsl/shellless.js +73 -43
  348. package/tgsl/wgslGenerator.d.ts +66 -59
  349. package/tgsl/wgslGenerator.js +1344 -760
  350. package/types.d.ts +287 -222
  351. package/types.js +61 -44
  352. package/unwrapper.d.ts +31 -26
  353. package/unwrapper.js +1 -0
  354. package/wgslExtensions.d.ts +3 -5
  355. package/wgslExtensions.js +12 -16
  356. package/_virtual/rolldown_runtime.js +0 -13
  357. package/core/buffer/bufferShorthand.d.ts +0 -50
  358. package/core/buffer/bufferShorthand.js +0 -55
  359. package/core/pipeline/applyPipelineState.js +0 -37
  360. package/package.js +0 -5
  361. package/tgsl/shaderGenerator_members.d.ts +0 -33
  362. package/tgsl/shaderGenerator_members.js +0 -12
@@ -1,82 +1,99 @@
1
- import { TgpuNamable } from "../../shared/meta.js";
2
- import { $internal } from "../../shared/symbols.js";
3
- import { Prettify, UnionToIntersection } from "../../shared/utilityTypes.js";
4
- import { StorageFlag } from "../../extension.js";
5
- import { TgpuBufferMutable, TgpuBufferReadonly, TgpuBufferUniform, TgpuFixedBufferUsage } from "./bufferUsage.js";
6
- import "../root/rootTypes.js";
7
- import { BaseData } from "../../data/wgslTypes.js";
8
- import { Infer, InferInput, InferPartial, InferPatch, IsValidIndexSchema, IsValidStorageSchema, IsValidUniformSchema, IsValidVertexSchema, MemIdentity } from "../../shared/repr.js";
9
- import "../../data/dataTypes.js";
10
-
11
- //#region src/core/buffer/buffer.d.ts
12
- interface UniformFlag {
13
- usableAsUniform: true;
1
+ import type { AnyData } from '../../data/dataTypes.ts';
2
+ import type { BaseData } from '../../data/wgslTypes.ts';
3
+ import type { StorageFlag } from '../../extension.ts';
4
+ import type { TgpuNamable } from '../../shared/meta.ts';
5
+ import type { Infer, InferInput, InferPatch, InferPartial, IsValidIndexSchema, IsValidStorageSchema, IsValidUniformSchema, IsValidVertexSchema, MemIdentity } from '../../shared/repr.ts';
6
+ import type { TgpuDeviceOwningSoul } from '../../shared/soul.ts';
7
+ import { $internal, $soul } from '../../shared/symbols.ts';
8
+ import type { Prettify, UnionToIntersection } from '../../shared/utilityTypes.ts';
9
+ import type { TgpuCommandEncoder } from '../commandEncoder/commandEncoder.ts';
10
+ import type { ExperimentalTgpuRoot } from '../root/rootTypes.ts';
11
+ import { type TgpuMutable, type TgpuReadonly, type TgpuUniform } from './bufferBinding.ts';
12
+ export interface UniformFlag {
13
+ usableAsUniform: true;
14
14
  }
15
15
  /**
16
16
  * @deprecated Use UniformFlag instead.
17
17
  */
18
- type Uniform = UniformFlag;
19
- interface VertexFlag {
20
- usableAsVertex: true;
18
+ export type Uniform = UniformFlag;
19
+ export interface VertexFlag {
20
+ usableAsVertex: true;
21
21
  }
22
- interface IndexFlag {
23
- usableAsIndex: true;
22
+ export interface IndexFlag {
23
+ usableAsIndex: true;
24
24
  }
25
- interface IndirectFlag {
26
- usableAsIndirect: true;
25
+ export interface IndirectFlag {
26
+ usableAsIndirect: true;
27
27
  }
28
28
  /**
29
29
  * @deprecated Use VertexFlag instead.
30
30
  */
31
- type Vertex = VertexFlag;
32
- type UsageLiteral = 'uniform' | 'storage' | 'vertex' | 'index' | 'indirect';
31
+ export type Vertex = VertexFlag;
32
+ export type TgpuStorageBuffer<T extends BaseData> = TgpuBuffer<T> & StorageFlag;
33
+ export type TgpuUniformBuffer<T extends BaseData> = TgpuBuffer<T> & UniformFlag;
34
+ export type TgpuVertexBuffer<T extends BaseData> = TgpuBuffer<T> & VertexFlag;
35
+ export type TgpuIndexBuffer<T extends BaseData> = TgpuBuffer<T> & IndexFlag;
36
+ export type UsageLiteral = 'uniform' | 'storage' | 'vertex' | 'index' | 'indirect';
37
+ export interface TgpuBufferSoul<TData extends BaseData = BaseData> extends TgpuDeviceOwningSoul<'buffer', GPUBuffer> {
38
+ readonly dataType: TData;
39
+ flags: GPUBufferUsageFlags;
40
+ readonly usages: UsageLiteral[];
41
+ }
33
42
  type LiteralToUsageType<T extends UsageLiteral> = T extends 'uniform' ? UniformFlag : T extends 'storage' ? StorageFlag : T extends 'vertex' ? VertexFlag : T extends 'index' ? IndexFlag : T extends 'indirect' ? IndirectFlag : never;
34
43
  type ViewUsages<TBuffer extends TgpuBuffer<BaseData>> = (boolean extends TBuffer['usableAsUniform'] ? never : 'uniform') | (boolean extends TBuffer['usableAsStorage'] ? never : 'readonly' | 'mutable');
35
- type UsageTypeToBufferUsage<TData extends BaseData> = {
36
- uniform: TgpuBufferUniform<TData> & TgpuFixedBufferUsage<TData>;
37
- mutable: TgpuBufferMutable<TData> & TgpuFixedBufferUsage<TData>;
38
- readonly: TgpuBufferReadonly<TData> & TgpuFixedBufferUsage<TData>;
44
+ type UsageTypeToBufferBinding<TData extends BaseData> = {
45
+ uniform: TgpuUniform<TData>;
46
+ mutable: TgpuMutable<TData>;
47
+ readonly: TgpuReadonly<TData>;
39
48
  };
40
49
  /**
41
50
  * Done as an object to later Prettify it
42
51
  */
43
52
  type InnerValidUsagesFor<T> = {
44
- usage: (IsValidStorageSchema<T> extends true ? 'storage' : never) | (IsValidUniformSchema<T> extends true ? 'uniform' : never) | (IsValidVertexSchema<T> extends true ? 'vertex' : never) | (IsValidIndexSchema<T> extends true ? 'index' : never) | 'indirect';
53
+ usage: (IsValidStorageSchema<T> extends true ? 'storage' : never) | (IsValidUniformSchema<T> extends true ? 'uniform' : never) | (IsValidVertexSchema<T> extends true ? 'vertex' : never) | (IsValidIndexSchema<T> extends true ? 'index' : never) | 'indirect';
45
54
  };
46
- type ValidUsagesFor<T> = InnerValidUsagesFor<T>['usage'];
47
- type BufferWriteOptions = {
48
- startOffset?: number;
49
- endOffset?: number;
55
+ export type ValidUsagesFor<T> = InnerValidUsagesFor<T>['usage'];
56
+ export type BufferWriteOptions = {
57
+ startOffset?: number;
58
+ endOffset?: number;
50
59
  };
51
- interface TgpuBuffer<TData extends BaseData> extends TgpuNamable {
52
- readonly [$internal]: true;
53
- readonly resourceType: 'buffer';
54
- readonly dataType: TData;
55
- readonly initial?: InferInput<TData> | undefined;
56
- readonly arrayBuffer: ArrayBuffer;
57
- readonly buffer: GPUBuffer;
58
- readonly destroyed: boolean;
59
- usableAsUniform: boolean;
60
- usableAsStorage: boolean;
61
- usableAsVertex: boolean;
62
- usableAsIndex: boolean;
63
- usableAsIndirect: boolean;
64
- $usage<T extends [Prettify<InnerValidUsagesFor<TData>>['usage'], ...Prettify<InnerValidUsagesFor<TData>>['usage'][]]>(...usages: T): this & UnionToIntersection<LiteralToUsageType<T[number]>>;
65
- $addFlags(flags: GPUBufferUsageFlags): this;
66
- as<T extends ViewUsages<this>>(usage: T): UsageTypeToBufferUsage<TData>[T];
67
- compileWriter(): void;
68
- write(data: InferInput<TData>, options?: BufferWriteOptions): void;
69
- write(data: ArrayBuffer, options?: BufferWriteOptions): void;
70
- /** @deprecated Use {@link patch} instead. */
71
- writePartial(data: InferPartial<TData>): void;
72
- patch(data: InferPatch<TData>): void;
73
- clear(): void;
74
- copyFrom(srcBuffer: TgpuBuffer<MemIdentity<TData>>): void;
75
- read(): Promise<Infer<TData>>;
76
- destroy(): void;
77
- toString(): string;
60
+ export type BufferInitCallback<TData extends BaseData> = (buffer: TgpuBuffer<TData>) => void;
61
+ export type BufferInitialData<TData extends BaseData> = InferInput<TData> | BufferInitCallback<TData>;
62
+ export interface TgpuBuffer<TData extends BaseData> extends TgpuNamable {
63
+ readonly [$internal]: {
64
+ readonly root: ExperimentalTgpuRoot;
65
+ readonly materialize: () => GPUBuffer;
66
+ };
67
+ readonly [$soul]: TgpuBufferSoul<TData>;
68
+ readonly resourceType: 'buffer';
69
+ readonly dataType: TData;
70
+ readonly initial?: InferInput<TData> | undefined;
71
+ readonly arrayBuffer: ArrayBuffer;
72
+ readonly buffer: GPUBuffer;
73
+ readonly destroyed: boolean;
74
+ usableAsUniform: boolean;
75
+ usableAsStorage: boolean;
76
+ usableAsVertex: boolean;
77
+ usableAsIndex: boolean;
78
+ usableAsIndirect: boolean;
79
+ $usage<T extends [
80
+ Prettify<InnerValidUsagesFor<TData>>['usage'],
81
+ ...Prettify<InnerValidUsagesFor<TData>>['usage'][]
82
+ ]>(...usages: T): this & UnionToIntersection<LiteralToUsageType<T[number]>>;
83
+ $addFlags(flags: GPUBufferUsageFlags): this;
84
+ as<T extends ViewUsages<this>>(usage: T): UsageTypeToBufferBinding<TData>[T];
85
+ compileWriter(): void;
86
+ write(data: InferInput<TData>, options?: BufferWriteOptions): void;
87
+ write(data: ArrayBuffer, options?: BufferWriteOptions): void;
88
+ /** @deprecated Use {@link patch} instead. */
89
+ writePartial(data: InferPartial<TData>): void;
90
+ patch(data: InferPatch<TData>): void;
91
+ clear(encoder?: TgpuCommandEncoder): void;
92
+ copyFrom(srcBuffer: TgpuBuffer<MemIdentity<TData>>, encoder?: TgpuCommandEncoder): void;
93
+ read(): Promise<Infer<TData>>;
94
+ destroy(): void;
95
+ toString(): string;
78
96
  }
79
- declare function isBuffer(value: unknown): value is TgpuBuffer<BaseData>;
80
- declare function isUsableAsVertex<T extends TgpuBuffer<BaseData>>(buffer: T): buffer is T & VertexFlag;
81
- //#endregion
82
- export { BufferWriteOptions, IndexFlag, IndirectFlag, TgpuBuffer, Uniform, UniformFlag, ValidUsagesFor, Vertex, VertexFlag, isBuffer, isUsableAsVertex };
97
+ export declare function INTERNAL_createBuffer<TData extends AnyData>(group: ExperimentalTgpuRoot, typeSchema: TData, initialOrBuffer?: BufferInitialData<TData> | GPUBuffer): TgpuBuffer<TData>;
98
+ export declare function INTERNAL_applyBufferUsages(buffer: TgpuBuffer<BaseData>, usages: UsageLiteral[]): void;
99
+ export {};
@@ -1,212 +1,286 @@
1
- import { $internal } from "../../shared/symbols.js";
1
+ import { getCompiledWriter } from "../../data/compiledIO.js";
2
+ import { convertPartialToPatch, getPatchInstructions } from "../../data/partialIO.js";
3
+ import { sizeOf } from "../../data/sizeOf.js";
2
4
  import { isWgslData } from "../../data/wgslTypes.js";
3
5
  import { getName, setName } from "../../shared/meta.js";
6
+ import { $internal, $soul } from "../../shared/symbols.js";
4
7
  import { isGPUBuffer } from "../../types.js";
5
- import { sizeOf } from "../../data/sizeOf.js";
6
- import { getCompiledWriter } from "../../data/compiledIO.js";
7
8
  import { calculateOffsets, readFromArrayBuffer, writeToArrayBuffer } from "../../data/dataIO.js";
8
- import { convertPartialToPatch, getPatchInstructions, patchArrayBuffer } from "../../data/partialIO.js";
9
- import { mutable, readonly, uniform } from "./bufferUsage.js";
10
-
11
- //#region src/core/buffer/buffer.ts
12
- const usageToUsageConstructor = {
13
- uniform,
14
- mutable,
15
- readonly
16
- };
17
- function INTERNAL_createBuffer(group, typeSchema, initialOrBuffer) {
18
- if (!isWgslData(typeSchema)) return new TgpuBufferImpl(group, typeSchema, initialOrBuffer, ["storage", "uniform"]);
19
- return new TgpuBufferImpl(group, typeSchema, initialOrBuffer);
9
+ import { patchArrayBuffer } from "../../data/partialIO.js";
10
+ import { mutable, readonly, uniform, } from "./bufferBinding.js";
11
+ const usageToUsageConstructor = { uniform, mutable, readonly };
12
+ export function INTERNAL_createBuffer(group, typeSchema, initialOrBuffer) {
13
+ if (!isWgslData(typeSchema)) {
14
+ return new TgpuBufferImpl(group, typeSchema, initialOrBuffer, ['storage', 'uniform']);
15
+ }
16
+ return new TgpuBufferImpl(group, typeSchema, initialOrBuffer);
20
17
  }
21
- function isBuffer(value) {
22
- return value.resourceType === "buffer";
18
+ export function INTERNAL_applyBufferUsages(buffer, usages) {
19
+ if (usages.length > 0) {
20
+ buffer.$usage(...usages);
21
+ }
23
22
  }
24
- function isUsableAsVertex(buffer) {
25
- return !!buffer.usableAsVertex;
23
+ // --------------
24
+ // Implementation
25
+ // --------------
26
+ class TgpuBufferImpl {
27
+ [$internal];
28
+ [$soul];
29
+ resourceType = 'buffer';
30
+ #ownBuffer;
31
+ #destroyed = false;
32
+ #internalBuffer;
33
+ get #hostBuffer() {
34
+ return (this.#internalBuffer ??= new ArrayBuffer(sizeOf(this.dataType)));
35
+ }
36
+ #mappedRange;
37
+ #initialCallback;
38
+ #disallowedUsages;
39
+ initial;
40
+ usableAsUniform = false;
41
+ usableAsStorage = false;
42
+ usableAsVertex = false;
43
+ usableAsIndex = false;
44
+ usableAsIndirect = false;
45
+ constructor(root, dataType, initialOrBuffer, disallowedUsages) {
46
+ this[$soul] = {
47
+ type: 'buffer',
48
+ device: root.device,
49
+ dataType,
50
+ flags: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC,
51
+ usages: [],
52
+ raw: undefined,
53
+ label: undefined,
54
+ };
55
+ this.#disallowedUsages = disallowedUsages;
56
+ if (isGPUBuffer(initialOrBuffer)) {
57
+ this.#ownBuffer = false;
58
+ this[$soul].raw = initialOrBuffer;
59
+ }
60
+ else {
61
+ this.#ownBuffer = true;
62
+ if (typeof initialOrBuffer === 'function') {
63
+ this.#initialCallback = initialOrBuffer;
64
+ }
65
+ else {
66
+ this.initial = initialOrBuffer;
67
+ }
68
+ }
69
+ this[$internal] = {
70
+ root,
71
+ materialize: () => {
72
+ if (this.#destroyed) {
73
+ throw new Error('This buffer has been destroyed');
74
+ }
75
+ const soul = this[$soul];
76
+ if (!soul.raw) {
77
+ soul.raw = soul.device.createBuffer({
78
+ size: sizeOf(soul.dataType),
79
+ usage: soul.flags,
80
+ mappedAtCreation: !!this.initial || !!this.#initialCallback,
81
+ label: getName(this) ?? '<unnamed>',
82
+ });
83
+ if (this.initial || this.#initialCallback) {
84
+ if (this.#initialCallback) {
85
+ this.#initialCallback(this);
86
+ }
87
+ else if (this.initial) {
88
+ writeToArrayBuffer(this.#getMappedRange(), this.dataType, this.initial);
89
+ }
90
+ this.#unmapBuffer();
91
+ }
92
+ }
93
+ return soul.raw;
94
+ },
95
+ };
96
+ }
97
+ get dataType() {
98
+ return this[$soul].dataType;
99
+ }
100
+ get flags() {
101
+ return this[$soul].flags;
102
+ }
103
+ set flags(value) {
104
+ this[$soul].flags = value;
105
+ }
106
+ get buffer() {
107
+ return this[$internal].materialize();
108
+ }
109
+ get destroyed() {
110
+ return this.#destroyed;
111
+ }
112
+ get arrayBuffer() {
113
+ const gpuBuffer = this.buffer;
114
+ if (gpuBuffer.mapState === 'mapped') {
115
+ return this.#getMappedRange();
116
+ }
117
+ return this.#hostBuffer;
118
+ }
119
+ #getMappedRange() {
120
+ const raw = this[$soul].raw;
121
+ if (!raw || raw.mapState !== 'mapped') {
122
+ throw new Error('Buffer is not mapped.');
123
+ }
124
+ this.#mappedRange ??= raw.getMappedRange();
125
+ return this.#mappedRange;
126
+ }
127
+ #unmapBuffer() {
128
+ const raw = this[$soul].raw;
129
+ if (!raw || raw.mapState !== 'mapped') {
130
+ return;
131
+ }
132
+ this.#mappedRange = undefined;
133
+ raw.unmap();
134
+ }
135
+ $name(label) {
136
+ setName(this, label);
137
+ const raw = this[$soul].raw;
138
+ if (raw) {
139
+ raw.label = label;
140
+ }
141
+ return this;
142
+ }
143
+ $usage(...usages) {
144
+ for (const usage of usages) {
145
+ if (this.#disallowedUsages?.includes(usage)) {
146
+ throw new Error(`Buffer of type ${this.dataType.type} cannot be used as ${usage}`);
147
+ }
148
+ this.flags |= usage === 'uniform' ? GPUBufferUsage.UNIFORM : 0;
149
+ this.flags |= usage === 'storage' ? GPUBufferUsage.STORAGE : 0;
150
+ this.flags |= usage === 'vertex' ? GPUBufferUsage.VERTEX : 0;
151
+ this.flags |= usage === 'index' ? GPUBufferUsage.INDEX : 0;
152
+ this.flags |= usage === 'indirect' ? GPUBufferUsage.INDIRECT : 0;
153
+ this.usableAsUniform = this.usableAsUniform || usage === 'uniform';
154
+ this.usableAsStorage = this.usableAsStorage || usage === 'storage';
155
+ this.usableAsVertex = this.usableAsVertex || usage === 'vertex';
156
+ this.usableAsIndex = this.usableAsIndex || usage === 'index';
157
+ this.usableAsIndirect = this.usableAsIndirect || usage === 'indirect';
158
+ if (!this[$soul].usages.includes(usage)) {
159
+ this[$soul].usages.push(usage);
160
+ }
161
+ }
162
+ return this;
163
+ }
164
+ $addFlags(flags) {
165
+ if (!this.#ownBuffer) {
166
+ throw new Error('Cannot add flags to a buffer that is not managed by TypeGPU.');
167
+ }
168
+ if (flags & GPUBufferUsage.MAP_READ) {
169
+ this.flags = GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ;
170
+ return this;
171
+ }
172
+ if (flags & GPUBufferUsage.MAP_WRITE) {
173
+ this.flags = GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE;
174
+ return this;
175
+ }
176
+ this.flags |= flags;
177
+ return this;
178
+ }
179
+ compileWriter() {
180
+ getCompiledWriter(this.dataType);
181
+ }
182
+ write(data, options) {
183
+ const gpuBuffer = this.buffer;
184
+ if (gpuBuffer.mapState === 'mapped') {
185
+ const mapped = this.#getMappedRange();
186
+ if (data instanceof ArrayBuffer && data === mapped) {
187
+ // The caller already wrote data directly into the mapped range
188
+ // via arrayBuffer. Nothing to do here
189
+ return;
190
+ }
191
+ writeToArrayBuffer(mapped, this.dataType, data, options);
192
+ return;
193
+ }
194
+ // If the caller already wrote directly into #hostBuffer via
195
+ // arrayBuffer, skip the redundant copy, the data is already in place.
196
+ if (!(data instanceof ArrayBuffer && data === this.#hostBuffer)) {
197
+ writeToArrayBuffer(this.#hostBuffer, this.dataType, data, options);
198
+ }
199
+ const { startOffset, endOffset } = calculateOffsets(options, this.dataType, data);
200
+ const size = endOffset - startOffset;
201
+ this[$soul].device.queue.writeBuffer(gpuBuffer, startOffset, this.#hostBuffer, startOffset, size);
202
+ }
203
+ /** @deprecated Use {@link patch} instead. */
204
+ writePartial(data) {
205
+ this.patch(convertPartialToPatch(this.dataType, data));
206
+ }
207
+ patch(data) {
208
+ const gpuBuffer = this.buffer;
209
+ if (gpuBuffer.mapState === 'mapped') {
210
+ patchArrayBuffer(this.#getMappedRange(), this.dataType, data);
211
+ }
212
+ else {
213
+ const instructions = getPatchInstructions(this.dataType, data, this.#hostBuffer);
214
+ for (const { data, gpuOffset } of instructions) {
215
+ this[$soul].device.queue.writeBuffer(gpuBuffer, gpuOffset, data);
216
+ }
217
+ }
218
+ }
219
+ clear(encoder) {
220
+ const gpuBuffer = this.buffer;
221
+ if (encoder) {
222
+ encoder[$internal].rawEncoder.clearBuffer(gpuBuffer);
223
+ return;
224
+ }
225
+ if (gpuBuffer.mapState === 'mapped') {
226
+ new Uint8Array(this.#getMappedRange()).fill(0);
227
+ return;
228
+ }
229
+ const rawEncoder = this[$soul].device.createCommandEncoder();
230
+ rawEncoder.clearBuffer(gpuBuffer);
231
+ this[$soul].device.queue.submit([rawEncoder.finish()]);
232
+ }
233
+ copyFrom(srcBuffer, encoder) {
234
+ if (this.buffer.mapState === 'mapped') {
235
+ throw new Error('Cannot copy to a mapped buffer.');
236
+ }
237
+ const size = sizeOf(this.dataType);
238
+ if (encoder) {
239
+ encoder[$internal].rawEncoder.copyBufferToBuffer(srcBuffer.buffer, 0, this.buffer, 0, size);
240
+ return;
241
+ }
242
+ const rawEncoder = this[$soul].device.createCommandEncoder();
243
+ rawEncoder.copyBufferToBuffer(srcBuffer.buffer, 0, this.buffer, 0, size);
244
+ this[$soul].device.queue.submit([rawEncoder.finish()]);
245
+ }
246
+ async read() {
247
+ const gpuBuffer = this.buffer;
248
+ if (gpuBuffer.mapState === 'mapped') {
249
+ return readFromArrayBuffer(this.#getMappedRange(), this.dataType);
250
+ }
251
+ if (gpuBuffer.usage & GPUBufferUsage.MAP_READ) {
252
+ await gpuBuffer.mapAsync(GPUMapMode.READ);
253
+ const res = readFromArrayBuffer(this.#getMappedRange(), this.dataType);
254
+ this.#unmapBuffer();
255
+ return res;
256
+ }
257
+ const stagingBuffer = this[$soul].device.createBuffer({
258
+ size: sizeOf(this.dataType),
259
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
260
+ });
261
+ const commandEncoder = this[$soul].device.createCommandEncoder();
262
+ commandEncoder.copyBufferToBuffer(gpuBuffer, 0, stagingBuffer, 0, sizeOf(this.dataType));
263
+ this[$soul].device.queue.submit([commandEncoder.finish()]);
264
+ await stagingBuffer.mapAsync(GPUMapMode.READ, 0, sizeOf(this.dataType));
265
+ const res = readFromArrayBuffer(stagingBuffer.getMappedRange(), this.dataType);
266
+ stagingBuffer.unmap();
267
+ stagingBuffer.destroy();
268
+ return res;
269
+ }
270
+ as(usage) {
271
+ return usageToUsageConstructor[usage](this);
272
+ }
273
+ destroy() {
274
+ if (this.#destroyed) {
275
+ return;
276
+ }
277
+ this.#destroyed = true;
278
+ this.#mappedRange = undefined;
279
+ if (this.#ownBuffer) {
280
+ this[$soul].raw?.destroy();
281
+ }
282
+ }
283
+ toString() {
284
+ return `buffer:${getName(this) ?? '<unnamed>'}`;
285
+ }
26
286
  }
27
- var TgpuBufferImpl = class {
28
- [$internal] = true;
29
- resourceType = "buffer";
30
- flags = GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;
31
- dataType;
32
- #device;
33
- #buffer = null;
34
- #ownBuffer;
35
- #destroyed = false;
36
- #internalBuffer;
37
- get #hostBuffer() {
38
- return this.#internalBuffer ??= new ArrayBuffer(sizeOf(this.dataType));
39
- }
40
- #mappedRange;
41
- #initialCallback;
42
- #disallowedUsages;
43
- initial;
44
- usableAsUniform = false;
45
- usableAsStorage = false;
46
- usableAsVertex = false;
47
- usableAsIndex = false;
48
- usableAsIndirect = false;
49
- constructor(root, dataType, initialOrBuffer, disallowedUsages) {
50
- this.dataType = dataType;
51
- this.#disallowedUsages = disallowedUsages;
52
- this.#device = root.device;
53
- if (isGPUBuffer(initialOrBuffer)) {
54
- this.#ownBuffer = false;
55
- this.#buffer = initialOrBuffer;
56
- } else {
57
- this.#ownBuffer = true;
58
- if (typeof initialOrBuffer === "function") this.#initialCallback = initialOrBuffer;
59
- else this.initial = initialOrBuffer;
60
- }
61
- }
62
- get buffer() {
63
- if (this.#destroyed) throw new Error("This buffer has been destroyed");
64
- if (!this.#buffer) {
65
- this.#buffer = this.#device.createBuffer({
66
- size: sizeOf(this.dataType),
67
- usage: this.flags,
68
- mappedAtCreation: !!this.initial || !!this.#initialCallback,
69
- label: getName(this) ?? "<unnamed>"
70
- });
71
- if (this.initial || this.#initialCallback) {
72
- if (this.#initialCallback) this.#initialCallback(this);
73
- else if (this.initial) writeToArrayBuffer(this.#getMappedRange(), this.dataType, this.initial);
74
- this.#unmapBuffer();
75
- }
76
- }
77
- return this.#buffer;
78
- }
79
- get destroyed() {
80
- return this.#destroyed;
81
- }
82
- get arrayBuffer() {
83
- if (this.buffer.mapState === "mapped") return this.#getMappedRange();
84
- return this.#hostBuffer;
85
- }
86
- #getMappedRange() {
87
- if (!this.#buffer || this.#buffer.mapState !== "mapped") throw new Error("Buffer is not mapped.");
88
- this.#mappedRange ??= this.#buffer.getMappedRange();
89
- return this.#mappedRange;
90
- }
91
- #unmapBuffer() {
92
- if (!this.#buffer || this.#buffer.mapState !== "mapped") return;
93
- this.#mappedRange = void 0;
94
- this.#buffer.unmap();
95
- }
96
- $name(label) {
97
- setName(this, label);
98
- if (this.#buffer) this.#buffer.label = label;
99
- return this;
100
- }
101
- $usage(...usages) {
102
- for (const usage of usages) {
103
- if (this.#disallowedUsages?.includes(usage)) throw new Error(`Buffer of type ${this.dataType.type} cannot be used as ${usage}`);
104
- this.flags |= usage === "uniform" ? GPUBufferUsage.UNIFORM : 0;
105
- this.flags |= usage === "storage" ? GPUBufferUsage.STORAGE : 0;
106
- this.flags |= usage === "vertex" ? GPUBufferUsage.VERTEX : 0;
107
- this.flags |= usage === "index" ? GPUBufferUsage.INDEX : 0;
108
- this.flags |= usage === "indirect" ? GPUBufferUsage.INDIRECT : 0;
109
- this.usableAsUniform = this.usableAsUniform || usage === "uniform";
110
- this.usableAsStorage = this.usableAsStorage || usage === "storage";
111
- this.usableAsVertex = this.usableAsVertex || usage === "vertex";
112
- this.usableAsIndex = this.usableAsIndex || usage === "index";
113
- this.usableAsIndirect = this.usableAsIndirect || usage === "indirect";
114
- }
115
- return this;
116
- }
117
- $addFlags(flags) {
118
- if (!this.#ownBuffer) throw new Error("Cannot add flags to a buffer that is not managed by TypeGPU.");
119
- if (flags & GPUBufferUsage.MAP_READ) {
120
- this.flags = GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ;
121
- return this;
122
- }
123
- if (flags & GPUBufferUsage.MAP_WRITE) {
124
- this.flags = GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE;
125
- return this;
126
- }
127
- this.flags |= flags;
128
- return this;
129
- }
130
- compileWriter() {
131
- getCompiledWriter(this.dataType);
132
- }
133
- write(data, options) {
134
- const gpuBuffer = this.buffer;
135
- if (gpuBuffer.mapState === "mapped") {
136
- const mapped = this.#getMappedRange();
137
- if (data instanceof ArrayBuffer && data === mapped) return;
138
- writeToArrayBuffer(mapped, this.dataType, data, options);
139
- return;
140
- }
141
- if (!(data instanceof ArrayBuffer && data === this.#hostBuffer)) writeToArrayBuffer(this.#hostBuffer, this.dataType, data, options);
142
- const { startOffset, endOffset } = calculateOffsets(options, this.dataType, data);
143
- const size = endOffset - startOffset;
144
- this.#device.queue.writeBuffer(gpuBuffer, startOffset, this.#hostBuffer, startOffset, size);
145
- }
146
- /** @deprecated Use {@link patch} instead. */
147
- writePartial(data) {
148
- this.patch(convertPartialToPatch(this.dataType, data));
149
- }
150
- patch(data) {
151
- const gpuBuffer = this.buffer;
152
- if (gpuBuffer.mapState === "mapped") patchArrayBuffer(this.#getMappedRange(), this.dataType, data);
153
- else {
154
- const instructions = getPatchInstructions(this.dataType, data, this.#hostBuffer);
155
- for (const { data: data$1, gpuOffset } of instructions) this.#device.queue.writeBuffer(gpuBuffer, gpuOffset, data$1);
156
- }
157
- }
158
- clear() {
159
- const gpuBuffer = this.buffer;
160
- if (gpuBuffer.mapState === "mapped") {
161
- new Uint8Array(this.#getMappedRange()).fill(0);
162
- return;
163
- }
164
- const encoder = this.#device.createCommandEncoder();
165
- encoder.clearBuffer(gpuBuffer);
166
- this.#device.queue.submit([encoder.finish()]);
167
- }
168
- copyFrom(srcBuffer) {
169
- if (this.buffer.mapState === "mapped") throw new Error("Cannot copy to a mapped buffer.");
170
- const size = sizeOf(this.dataType);
171
- const encoder = this.#device.createCommandEncoder();
172
- encoder.copyBufferToBuffer(srcBuffer.buffer, 0, this.buffer, 0, size);
173
- this.#device.queue.submit([encoder.finish()]);
174
- }
175
- async read() {
176
- const gpuBuffer = this.buffer;
177
- if (gpuBuffer.mapState === "mapped") return readFromArrayBuffer(this.#getMappedRange(), this.dataType);
178
- if (gpuBuffer.usage & GPUBufferUsage.MAP_READ) {
179
- await gpuBuffer.mapAsync(GPUMapMode.READ);
180
- const res$1 = readFromArrayBuffer(this.#getMappedRange(), this.dataType);
181
- this.#unmapBuffer();
182
- return res$1;
183
- }
184
- const stagingBuffer = this.#device.createBuffer({
185
- size: sizeOf(this.dataType),
186
- usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
187
- });
188
- const commandEncoder = this.#device.createCommandEncoder();
189
- commandEncoder.copyBufferToBuffer(gpuBuffer, 0, stagingBuffer, 0, sizeOf(this.dataType));
190
- this.#device.queue.submit([commandEncoder.finish()]);
191
- await stagingBuffer.mapAsync(GPUMapMode.READ, 0, sizeOf(this.dataType));
192
- const res = readFromArrayBuffer(stagingBuffer.getMappedRange(), this.dataType);
193
- stagingBuffer.unmap();
194
- stagingBuffer.destroy();
195
- return res;
196
- }
197
- as(usage) {
198
- return usageToUsageConstructor[usage]?.(this);
199
- }
200
- destroy() {
201
- if (this.#destroyed) return;
202
- this.#destroyed = true;
203
- this.#mappedRange = void 0;
204
- if (this.#ownBuffer) this.#buffer?.destroy();
205
- }
206
- toString() {
207
- return `buffer:${getName(this) ?? "<unnamed>"}`;
208
- }
209
- };
210
-
211
- //#endregion
212
- export { INTERNAL_createBuffer, isBuffer, isUsableAsVertex };