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,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,290 @@
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
+ import { warnIfNotUniformAligned } from "../pipeline/webgpuLimitations.js";
12
+ const usageToUsageConstructor = { uniform, mutable, readonly };
13
+ export function INTERNAL_createBuffer(group, typeSchema, initialOrBuffer) {
14
+ if (!isWgslData(typeSchema)) {
15
+ return new TgpuBufferImpl(group, typeSchema, initialOrBuffer, ['storage', 'uniform']);
16
+ }
17
+ return new TgpuBufferImpl(group, typeSchema, initialOrBuffer);
20
18
  }
21
- function isBuffer(value) {
22
- return value.resourceType === "buffer";
19
+ export function INTERNAL_applyBufferUsages(buffer, usages) {
20
+ if (usages.length > 0) {
21
+ buffer.$usage(...usages);
22
+ }
23
23
  }
24
- function isUsableAsVertex(buffer) {
25
- return !!buffer.usableAsVertex;
24
+ // --------------
25
+ // Implementation
26
+ // --------------
27
+ class TgpuBufferImpl {
28
+ [$internal];
29
+ [$soul];
30
+ resourceType = 'buffer';
31
+ #ownBuffer;
32
+ #destroyed = false;
33
+ #internalBuffer;
34
+ get #hostBuffer() {
35
+ return (this.#internalBuffer ??= new ArrayBuffer(sizeOf(this.dataType)));
36
+ }
37
+ #mappedRange;
38
+ #initialCallback;
39
+ #disallowedUsages;
40
+ initial;
41
+ usableAsUniform = false;
42
+ usableAsStorage = false;
43
+ usableAsVertex = false;
44
+ usableAsIndex = false;
45
+ usableAsIndirect = false;
46
+ constructor(root, dataType, initialOrBuffer, disallowedUsages) {
47
+ this[$soul] = {
48
+ type: 'buffer',
49
+ device: root.device,
50
+ dataType,
51
+ flags: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC,
52
+ usages: [],
53
+ raw: undefined,
54
+ label: undefined,
55
+ };
56
+ this.#disallowedUsages = disallowedUsages;
57
+ if (isGPUBuffer(initialOrBuffer)) {
58
+ this.#ownBuffer = false;
59
+ this[$soul].raw = initialOrBuffer;
60
+ }
61
+ else {
62
+ this.#ownBuffer = true;
63
+ if (typeof initialOrBuffer === 'function') {
64
+ this.#initialCallback = initialOrBuffer;
65
+ }
66
+ else {
67
+ this.initial = initialOrBuffer;
68
+ }
69
+ }
70
+ this[$internal] = {
71
+ root,
72
+ materialize: () => {
73
+ if (this.#destroyed) {
74
+ throw new Error('This buffer has been destroyed');
75
+ }
76
+ const soul = this[$soul];
77
+ if (!soul.raw) {
78
+ soul.raw = soul.device.createBuffer({
79
+ size: sizeOf(soul.dataType),
80
+ usage: soul.flags,
81
+ mappedAtCreation: !!this.initial || !!this.#initialCallback,
82
+ label: getName(this) ?? '<unnamed>',
83
+ });
84
+ if (this.initial || this.#initialCallback) {
85
+ if (this.#initialCallback) {
86
+ this.#initialCallback(this);
87
+ }
88
+ else if (this.initial) {
89
+ writeToArrayBuffer(this.#getMappedRange(), this.dataType, this.initial);
90
+ }
91
+ this.#unmapBuffer();
92
+ }
93
+ }
94
+ return soul.raw;
95
+ },
96
+ };
97
+ }
98
+ get dataType() {
99
+ return this[$soul].dataType;
100
+ }
101
+ get flags() {
102
+ return this[$soul].flags;
103
+ }
104
+ set flags(value) {
105
+ this[$soul].flags = value;
106
+ }
107
+ get buffer() {
108
+ return this[$internal].materialize();
109
+ }
110
+ get destroyed() {
111
+ return this.#destroyed;
112
+ }
113
+ get arrayBuffer() {
114
+ const gpuBuffer = this.buffer;
115
+ if (gpuBuffer.mapState === 'mapped') {
116
+ return this.#getMappedRange();
117
+ }
118
+ return this.#hostBuffer;
119
+ }
120
+ #getMappedRange() {
121
+ const raw = this[$soul].raw;
122
+ if (!raw || raw.mapState !== 'mapped') {
123
+ throw new Error('Buffer is not mapped.');
124
+ }
125
+ this.#mappedRange ??= raw.getMappedRange();
126
+ return this.#mappedRange;
127
+ }
128
+ #unmapBuffer() {
129
+ const raw = this[$soul].raw;
130
+ if (!raw || raw.mapState !== 'mapped') {
131
+ return;
132
+ }
133
+ this.#mappedRange = undefined;
134
+ raw.unmap();
135
+ }
136
+ $name(label) {
137
+ setName(this, label);
138
+ const raw = this[$soul].raw;
139
+ if (raw) {
140
+ raw.label = label;
141
+ }
142
+ return this;
143
+ }
144
+ $usage(...usages) {
145
+ for (const usage of usages) {
146
+ if (this.#disallowedUsages?.includes(usage)) {
147
+ throw new Error(`Buffer of type ${this.dataType.type} cannot be used as ${usage}`);
148
+ }
149
+ if (usage === 'uniform') {
150
+ warnIfNotUniformAligned(this.dataType);
151
+ }
152
+ this.flags |= usage === 'uniform' ? GPUBufferUsage.UNIFORM : 0;
153
+ this.flags |= usage === 'storage' ? GPUBufferUsage.STORAGE : 0;
154
+ this.flags |= usage === 'vertex' ? GPUBufferUsage.VERTEX : 0;
155
+ this.flags |= usage === 'index' ? GPUBufferUsage.INDEX : 0;
156
+ this.flags |= usage === 'indirect' ? GPUBufferUsage.INDIRECT : 0;
157
+ this.usableAsUniform = this.usableAsUniform || usage === 'uniform';
158
+ this.usableAsStorage = this.usableAsStorage || usage === 'storage';
159
+ this.usableAsVertex = this.usableAsVertex || usage === 'vertex';
160
+ this.usableAsIndex = this.usableAsIndex || usage === 'index';
161
+ this.usableAsIndirect = this.usableAsIndirect || usage === 'indirect';
162
+ if (!this[$soul].usages.includes(usage)) {
163
+ this[$soul].usages.push(usage);
164
+ }
165
+ }
166
+ return this;
167
+ }
168
+ $addFlags(flags) {
169
+ if (!this.#ownBuffer) {
170
+ throw new Error('Cannot add flags to a buffer that is not managed by TypeGPU.');
171
+ }
172
+ if (flags & GPUBufferUsage.MAP_READ) {
173
+ this.flags = GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ;
174
+ return this;
175
+ }
176
+ if (flags & GPUBufferUsage.MAP_WRITE) {
177
+ this.flags = GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE;
178
+ return this;
179
+ }
180
+ this.flags |= flags;
181
+ return this;
182
+ }
183
+ compileWriter() {
184
+ getCompiledWriter(this.dataType);
185
+ }
186
+ write(data, options) {
187
+ const gpuBuffer = this.buffer;
188
+ if (gpuBuffer.mapState === 'mapped') {
189
+ const mapped = this.#getMappedRange();
190
+ if (data instanceof ArrayBuffer && data === mapped) {
191
+ // The caller already wrote data directly into the mapped range
192
+ // via arrayBuffer. Nothing to do here
193
+ return;
194
+ }
195
+ writeToArrayBuffer(mapped, this.dataType, data, options);
196
+ return;
197
+ }
198
+ // If the caller already wrote directly into #hostBuffer via
199
+ // arrayBuffer, skip the redundant copy, the data is already in place.
200
+ if (!(data instanceof ArrayBuffer && data === this.#hostBuffer)) {
201
+ writeToArrayBuffer(this.#hostBuffer, this.dataType, data, options);
202
+ }
203
+ const { startOffset, endOffset } = calculateOffsets(options, this.dataType, data);
204
+ const size = endOffset - startOffset;
205
+ this[$soul].device.queue.writeBuffer(gpuBuffer, startOffset, this.#hostBuffer, startOffset, size);
206
+ }
207
+ /** @deprecated Use {@link patch} instead. */
208
+ writePartial(data) {
209
+ this.patch(convertPartialToPatch(this.dataType, data));
210
+ }
211
+ patch(data) {
212
+ const gpuBuffer = this.buffer;
213
+ if (gpuBuffer.mapState === 'mapped') {
214
+ patchArrayBuffer(this.#getMappedRange(), this.dataType, data);
215
+ }
216
+ else {
217
+ const instructions = getPatchInstructions(this.dataType, data, this.#hostBuffer);
218
+ for (const { data, gpuOffset } of instructions) {
219
+ this[$soul].device.queue.writeBuffer(gpuBuffer, gpuOffset, data);
220
+ }
221
+ }
222
+ }
223
+ clear(encoder) {
224
+ const gpuBuffer = this.buffer;
225
+ if (encoder) {
226
+ encoder[$internal].rawEncoder.clearBuffer(gpuBuffer);
227
+ return;
228
+ }
229
+ if (gpuBuffer.mapState === 'mapped') {
230
+ new Uint8Array(this.#getMappedRange()).fill(0);
231
+ return;
232
+ }
233
+ const rawEncoder = this[$soul].device.createCommandEncoder();
234
+ rawEncoder.clearBuffer(gpuBuffer);
235
+ this[$soul].device.queue.submit([rawEncoder.finish()]);
236
+ }
237
+ copyFrom(srcBuffer, encoder) {
238
+ if (this.buffer.mapState === 'mapped') {
239
+ throw new Error('Cannot copy to a mapped buffer.');
240
+ }
241
+ const size = sizeOf(this.dataType);
242
+ if (encoder) {
243
+ encoder[$internal].rawEncoder.copyBufferToBuffer(srcBuffer.buffer, 0, this.buffer, 0, size);
244
+ return;
245
+ }
246
+ const rawEncoder = this[$soul].device.createCommandEncoder();
247
+ rawEncoder.copyBufferToBuffer(srcBuffer.buffer, 0, this.buffer, 0, size);
248
+ this[$soul].device.queue.submit([rawEncoder.finish()]);
249
+ }
250
+ async read() {
251
+ const gpuBuffer = this.buffer;
252
+ if (gpuBuffer.mapState === 'mapped') {
253
+ return readFromArrayBuffer(this.#getMappedRange(), this.dataType);
254
+ }
255
+ if (gpuBuffer.usage & GPUBufferUsage.MAP_READ) {
256
+ await gpuBuffer.mapAsync(GPUMapMode.READ);
257
+ const res = readFromArrayBuffer(this.#getMappedRange(), this.dataType);
258
+ this.#unmapBuffer();
259
+ return res;
260
+ }
261
+ const stagingBuffer = this[$soul].device.createBuffer({
262
+ size: sizeOf(this.dataType),
263
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
264
+ });
265
+ const commandEncoder = this[$soul].device.createCommandEncoder();
266
+ commandEncoder.copyBufferToBuffer(gpuBuffer, 0, stagingBuffer, 0, sizeOf(this.dataType));
267
+ this[$soul].device.queue.submit([commandEncoder.finish()]);
268
+ await stagingBuffer.mapAsync(GPUMapMode.READ, 0, sizeOf(this.dataType));
269
+ const res = readFromArrayBuffer(stagingBuffer.getMappedRange(), this.dataType);
270
+ stagingBuffer.unmap();
271
+ stagingBuffer.destroy();
272
+ return res;
273
+ }
274
+ as(usage) {
275
+ return usageToUsageConstructor[usage](this);
276
+ }
277
+ destroy() {
278
+ if (this.#destroyed) {
279
+ return;
280
+ }
281
+ this.#destroyed = true;
282
+ this.#mappedRange = undefined;
283
+ if (this.#ownBuffer) {
284
+ this[$soul].raw?.destroy();
285
+ }
286
+ }
287
+ toString() {
288
+ return `buffer:${getName(this) ?? '<unnamed>'}`;
289
+ }
26
290
  }
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 };