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,28 +1,22 @@
1
1
  import { getEffectiveSampleTypes, getTextureFormatInfo } from "./textureFormats.js";
2
-
3
- //#region src/core/texture/textureUtils.ts
4
- function getImageSourceDimensions(source) {
5
- const { videoWidth, videoHeight } = source;
6
- if (videoWidth && videoHeight) return {
7
- width: videoWidth,
8
- height: videoHeight
9
- };
10
- const { naturalWidth, naturalHeight } = source;
11
- if (naturalWidth && naturalHeight) return {
12
- width: naturalWidth,
13
- height: naturalHeight
14
- };
15
- const { codedWidth, codedHeight } = source;
16
- if (codedWidth && codedHeight) return {
17
- width: codedWidth,
18
- height: codedHeight
19
- };
20
- const { width, height } = source;
21
- if (width && height) return {
22
- width,
23
- height
24
- };
25
- throw new Error("Cannot determine dimensions of the provided image source.");
2
+ export function getImageSourceDimensions(source) {
3
+ const { videoWidth, videoHeight } = source;
4
+ if (videoWidth && videoHeight) {
5
+ return { width: videoWidth, height: videoHeight };
6
+ }
7
+ const { naturalWidth, naturalHeight } = source;
8
+ if (naturalWidth && naturalHeight) {
9
+ return { width: naturalWidth, height: naturalHeight };
10
+ }
11
+ const { codedWidth, codedHeight } = source;
12
+ if (codedWidth && codedHeight) {
13
+ return { width: codedWidth, height: codedHeight };
14
+ }
15
+ const { width, height } = source;
16
+ if (width && height) {
17
+ return { width, height };
18
+ }
19
+ throw new Error('Cannot determine dimensions of the provided image source.');
26
20
  }
27
21
  const FULLSCREEN_VERTEX_SHADER = `
28
22
  struct VertexOutput {
@@ -56,169 +50,181 @@ fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {
56
50
  let a = textureGather(3, src, samp, uv);
57
51
  return vec4f(dot(r, vec4f(0.25)), dot(g, vec4f(0.25)), dot(b, vec4f(0.25)), dot(a, vec4f(0.25)));
58
52
  }`;
59
- const blitCache = /* @__PURE__ */ new WeakMap();
53
+ const blitCache = new WeakMap();
60
54
  function getOrCreateDeviceCache(device) {
61
- let cache = blitCache.get(device);
62
- if (!cache) {
63
- cache = {
64
- vertexModule: device.createShaderModule({ code: FULLSCREEN_VERTEX_SHADER }),
65
- filterableResources: /* @__PURE__ */ new Map(),
66
- layoutResources: /* @__PURE__ */ new Map()
67
- };
68
- blitCache.set(device, cache);
69
- }
70
- return cache;
55
+ let cache = blitCache.get(device);
56
+ if (!cache) {
57
+ cache = {
58
+ vertexModule: device.createShaderModule({
59
+ code: FULLSCREEN_VERTEX_SHADER,
60
+ }),
61
+ filterableResources: new Map(),
62
+ layoutResources: new Map(),
63
+ };
64
+ blitCache.set(device, cache);
65
+ }
66
+ return cache;
71
67
  }
72
68
  function getBlitResources(device, filterable, sampleType) {
73
- const cache = getOrCreateDeviceCache(device);
74
- let filterableRes = cache.filterableResources.get(filterable);
75
- if (!filterableRes) {
76
- filterableRes = {
77
- fragmentModule: device.createShaderModule({ code: filterable ? SAMPLE_FRAGMENT_SHADER : GATHER_FRAGMENT_SHADER }),
78
- sampler: device.createSampler(filterable ? {
79
- magFilter: "linear",
80
- minFilter: "linear"
81
- } : {})
82
- };
83
- cache.filterableResources.set(filterable, filterableRes);
84
- }
85
- const layoutKey = `${filterable}:${sampleType}`;
86
- let layoutRes = cache.layoutResources.get(layoutKey);
87
- if (!layoutRes) {
88
- const bindGroupLayout = device.createBindGroupLayout({ entries: [{
89
- binding: 0,
90
- visibility: GPUShaderStage.FRAGMENT,
91
- texture: { sampleType }
92
- }, {
93
- binding: 1,
94
- visibility: GPUShaderStage.FRAGMENT,
95
- sampler: { type: filterable ? "filtering" : "non-filtering" }
96
- }] });
97
- layoutRes = {
98
- bindGroupLayout,
99
- pipelineLayout: device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout] })
100
- };
101
- cache.layoutResources.set(layoutKey, layoutRes);
102
- }
103
- return {
104
- vertexModule: cache.vertexModule,
105
- ...filterableRes,
106
- ...layoutRes
107
- };
69
+ const cache = getOrCreateDeviceCache(device);
70
+ let filterableRes = cache.filterableResources.get(filterable);
71
+ if (!filterableRes) {
72
+ filterableRes = {
73
+ fragmentModule: device.createShaderModule({
74
+ code: filterable ? SAMPLE_FRAGMENT_SHADER : GATHER_FRAGMENT_SHADER,
75
+ }),
76
+ sampler: device.createSampler(filterable ? { magFilter: 'linear', minFilter: 'linear' } : {}),
77
+ };
78
+ cache.filterableResources.set(filterable, filterableRes);
79
+ }
80
+ const layoutKey = `${filterable}:${sampleType}`;
81
+ let layoutRes = cache.layoutResources.get(layoutKey);
82
+ if (!layoutRes) {
83
+ const bindGroupLayout = device.createBindGroupLayout({
84
+ entries: [
85
+ {
86
+ binding: 0,
87
+ visibility: GPUShaderStage.FRAGMENT,
88
+ texture: { sampleType },
89
+ },
90
+ {
91
+ binding: 1,
92
+ visibility: GPUShaderStage.FRAGMENT,
93
+ sampler: { type: filterable ? 'filtering' : 'non-filtering' },
94
+ },
95
+ ],
96
+ });
97
+ layoutRes = {
98
+ bindGroupLayout,
99
+ pipelineLayout: device.createPipelineLayout({
100
+ bindGroupLayouts: [bindGroupLayout],
101
+ }),
102
+ };
103
+ cache.layoutResources.set(layoutKey, layoutRes);
104
+ }
105
+ return {
106
+ vertexModule: cache.vertexModule,
107
+ ...filterableRes,
108
+ ...layoutRes,
109
+ };
108
110
  }
109
111
  function blit(options) {
110
- const { device, source, destination, format, filterable, sampleType } = options;
111
- const resources = getBlitResources(device, filterable, sampleType);
112
- const pipeline = device.createRenderPipeline({
113
- layout: resources.pipelineLayout,
114
- vertex: { module: resources.vertexModule },
115
- fragment: {
116
- module: resources.fragmentModule,
117
- targets: [{ format }]
118
- },
119
- primitive: { topology: "triangle-list" }
120
- });
121
- const bindGroup = device.createBindGroup({
122
- layout: resources.bindGroupLayout,
123
- entries: [{
124
- binding: 0,
125
- resource: source
126
- }, {
127
- binding: 1,
128
- resource: resources.sampler
129
- }]
130
- });
131
- const ownEncoder = !options.encoder;
132
- const encoder = options.encoder ?? device.createCommandEncoder();
133
- const pass = encoder.beginRenderPass({ colorAttachments: [{
134
- view: destination,
135
- loadOp: "clear",
136
- storeOp: "store"
137
- }] });
138
- pass.setPipeline(pipeline);
139
- pass.setBindGroup(0, bindGroup);
140
- pass.draw(3);
141
- pass.end();
142
- if (ownEncoder) device.queue.submit([encoder.finish()]);
112
+ const { device, source, destination, format, filterable, sampleType } = options;
113
+ const resources = getBlitResources(device, filterable, sampleType);
114
+ const pipeline = device.createRenderPipeline({
115
+ layout: resources.pipelineLayout,
116
+ vertex: { module: resources.vertexModule },
117
+ fragment: { module: resources.fragmentModule, targets: [{ format }] },
118
+ primitive: { topology: 'triangle-list' },
119
+ });
120
+ const bindGroup = device.createBindGroup({
121
+ layout: resources.bindGroupLayout,
122
+ entries: [
123
+ { binding: 0, resource: source },
124
+ { binding: 1, resource: resources.sampler },
125
+ ],
126
+ });
127
+ const ownEncoder = !options.encoder;
128
+ const encoder = options.encoder ?? device.createCommandEncoder();
129
+ const pass = encoder.beginRenderPass({
130
+ colorAttachments: [
131
+ {
132
+ view: destination,
133
+ loadOp: 'clear',
134
+ storeOp: 'store',
135
+ },
136
+ ],
137
+ });
138
+ pass.setPipeline(pipeline);
139
+ pass.setBindGroup(0, bindGroup);
140
+ pass.draw(3);
141
+ pass.end();
142
+ if (ownEncoder) {
143
+ device.queue.submit([encoder.finish()]);
144
+ }
143
145
  }
144
- function clearTextureUtilsCache(device) {
145
- blitCache.delete(device);
146
+ export function clearTextureUtilsCache(device) {
147
+ blitCache.delete(device);
146
148
  }
147
149
  function validateBlitFormat(device, format, operation) {
148
- const info = getTextureFormatInfo(format);
149
- const effectiveSampleTypes = getEffectiveSampleTypes(device, format);
150
- const isFloat = effectiveSampleTypes.includes("float");
151
- const isUnfilterableFloat = effectiveSampleTypes.includes("unfilterable-float");
152
- if (!isFloat && !isUnfilterableFloat) throw new Error(`Cannot ${operation} for format '${format}': only float formats are supported.`);
153
- if (!info.canRenderAttachment) throw new Error(`Cannot ${operation} for format '${format}': format does not support render attachments.`);
154
- return {
155
- filterable: isFloat,
156
- sampleType: isFloat ? "float" : "unfilterable-float"
157
- };
150
+ const info = getTextureFormatInfo(format);
151
+ const effectiveSampleTypes = getEffectiveSampleTypes(device, format);
152
+ const isFloat = effectiveSampleTypes.includes('float');
153
+ const isUnfilterableFloat = effectiveSampleTypes.includes('unfilterable-float');
154
+ if (!isFloat && !isUnfilterableFloat) {
155
+ throw new Error(`Cannot ${operation} for format '${format}': only float formats are supported.`);
156
+ }
157
+ if (!info.canRenderAttachment) {
158
+ throw new Error(`Cannot ${operation} for format '${format}': format does not support render attachments.`);
159
+ }
160
+ return {
161
+ filterable: isFloat,
162
+ sampleType: isFloat ? 'float' : 'unfilterable-float',
163
+ };
158
164
  }
159
- function generateTextureMipmaps(device, texture, baseMipLevel = 0, mipLevels) {
160
- if (texture.dimension !== "2d") throw new Error("Mipmap generation only supports 2D textures.");
161
- const { filterable, sampleType } = validateBlitFormat(device, texture.format, "generate mipmaps");
162
- const levels = mipLevels ?? texture.mipLevelCount - baseMipLevel;
163
- for (let layer = 0; layer < texture.depthOrArrayLayers; layer++) for (let mip = baseMipLevel; mip < baseMipLevel + levels - 1; mip++) {
164
- const viewOptions = (level) => ({
165
- dimension: "2d",
166
- baseMipLevel: level,
167
- mipLevelCount: 1,
168
- baseArrayLayer: layer,
169
- arrayLayerCount: 1
170
- });
171
- blit({
172
- device,
173
- source: texture.createView(viewOptions(mip)),
174
- destination: texture.createView(viewOptions(mip + 1)),
175
- format: texture.format,
176
- filterable,
177
- sampleType
178
- });
179
- }
165
+ export function generateTextureMipmaps(device, texture, baseMipLevel = 0, mipLevels) {
166
+ if (texture.dimension !== '2d') {
167
+ throw new Error('Mipmap generation only supports 2D textures.');
168
+ }
169
+ const { filterable, sampleType } = validateBlitFormat(device, texture.format, 'generate mipmaps');
170
+ const levels = mipLevels ?? texture.mipLevelCount - baseMipLevel;
171
+ for (let layer = 0; layer < texture.depthOrArrayLayers; layer++) {
172
+ for (let mip = baseMipLevel; mip < baseMipLevel + levels - 1; mip++) {
173
+ const viewOptions = (level) => ({
174
+ dimension: '2d',
175
+ baseMipLevel: level,
176
+ mipLevelCount: 1,
177
+ baseArrayLayer: layer,
178
+ arrayLayerCount: 1,
179
+ });
180
+ blit({
181
+ device,
182
+ source: texture.createView(viewOptions(mip)),
183
+ destination: texture.createView(viewOptions(mip + 1)),
184
+ format: texture.format,
185
+ filterable,
186
+ sampleType,
187
+ });
188
+ }
189
+ }
180
190
  }
181
- function resampleImage(device, targetTexture, image, layer = 0) {
182
- if (targetTexture.dimension !== "2d") throw new Error("Resampling only supports 2D textures.");
183
- const { filterable } = validateBlitFormat(device, targetTexture.format, "resample");
184
- const { width, height } = getImageSourceDimensions(image);
185
- const inputTexture = device.createTexture({
186
- size: [width, height],
187
- format: "rgba8unorm",
188
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT
189
- });
190
- device.queue.copyExternalImageToTexture({ source: image }, { texture: inputTexture }, [width, height]);
191
- const renderTexture = device.createTexture({
192
- size: [targetTexture.width, targetTexture.height],
193
- format: targetTexture.format,
194
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC
195
- });
196
- const encoder = device.createCommandEncoder();
197
- blit({
198
- device,
199
- source: inputTexture.createView(),
200
- destination: renderTexture.createView(),
201
- format: targetTexture.format,
202
- filterable,
203
- sampleType: "float",
204
- encoder
205
- });
206
- encoder.copyTextureToTexture({ texture: renderTexture }, {
207
- texture: targetTexture,
208
- origin: {
209
- x: 0,
210
- y: 0,
211
- z: layer
212
- }
213
- }, {
214
- width: targetTexture.width,
215
- height: targetTexture.height,
216
- depthOrArrayLayers: 1
217
- });
218
- device.queue.submit([encoder.finish()]);
219
- inputTexture.destroy();
220
- renderTexture.destroy();
191
+ export function resampleImage(device, targetTexture, image, layer = 0) {
192
+ if (targetTexture.dimension !== '2d') {
193
+ throw new Error('Resampling only supports 2D textures.');
194
+ }
195
+ const { filterable } = validateBlitFormat(device, targetTexture.format, 'resample');
196
+ const { width, height } = getImageSourceDimensions(image);
197
+ const inputTexture = device.createTexture({
198
+ size: [width, height],
199
+ format: 'rgba8unorm',
200
+ usage: GPUTextureUsage.TEXTURE_BINDING |
201
+ GPUTextureUsage.COPY_DST |
202
+ GPUTextureUsage.RENDER_ATTACHMENT,
203
+ });
204
+ device.queue.copyExternalImageToTexture({ source: image }, {
205
+ texture: inputTexture,
206
+ }, [width, height]);
207
+ const renderTexture = device.createTexture({
208
+ size: [targetTexture.width, targetTexture.height],
209
+ format: targetTexture.format,
210
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
211
+ });
212
+ const encoder = device.createCommandEncoder();
213
+ blit({
214
+ device,
215
+ source: inputTexture.createView(),
216
+ destination: renderTexture.createView(),
217
+ format: targetTexture.format,
218
+ filterable,
219
+ sampleType: 'float', // Input is always rgba8unorm which is filterable
220
+ encoder,
221
+ });
222
+ encoder.copyTextureToTexture({ texture: renderTexture }, { texture: targetTexture, origin: { x: 0, y: 0, z: layer } }, {
223
+ width: targetTexture.width,
224
+ height: targetTexture.height,
225
+ depthOrArrayLayers: 1,
226
+ });
227
+ device.queue.submit([encoder.finish()]);
228
+ inputTexture.destroy();
229
+ renderTexture.destroy();
221
230
  }
222
-
223
- //#endregion
224
- export { clearTextureUtilsCache, generateTextureMipmaps, getImageSourceDimensions, resampleImage };
@@ -1,21 +1,24 @@
1
- import { StorageFlag } from "../../extension.js";
2
- import { TextureProps } from "./textureProps.js";
3
- import { StorageTextureFormats } from "./textureFormats.js";
4
-
5
- //#region src/core/texture/usageExtension.d.ts
6
- interface SampledFlag {
7
- usableAsSampled: true;
1
+ import type { StorageFlag } from '../../extension.ts';
2
+ import type { StorageTextureFormats } from './textureFormats.ts';
3
+ import type { TextureProps } from './textureProps.ts';
4
+ export interface SampledFlag {
5
+ usableAsSampled: true;
8
6
  }
9
- interface RenderFlag {
10
- usableAsRender: true;
7
+ export interface RenderFlag {
8
+ usableAsRender: true;
11
9
  }
12
- type LiteralToExtensionMap = {
13
- storage: StorageFlag;
14
- sampled: SampledFlag;
15
- render: RenderFlag;
10
+ export type LiteralToExtensionMap = {
11
+ storage: StorageFlag;
12
+ sampled: SampledFlag;
13
+ render: RenderFlag;
14
+ transient: RenderFlag;
16
15
  };
17
- type AllowedUsages<TProps extends TextureProps> = 'sampled' | 'render' | (TProps['format'] extends StorageTextureFormats ? 'storage' : never);
18
- declare function isUsableAsSampled<T>(value: T): value is T & SampledFlag;
19
- declare function isUsableAsRender<T>(value: T): value is T & RenderFlag;
20
- //#endregion
21
- export { AllowedUsages, LiteralToExtensionMap, RenderFlag, SampledFlag, isUsableAsRender, isUsableAsSampled };
16
+ export type AllowedUsages<TProps extends TextureProps> = 'sampled' | 'render' | 'transient' | (TProps['format'] extends StorageTextureFormats ? 'storage' : never);
17
+ export declare function isUsableAsSampled<T>(value: T): value is T & SampledFlag;
18
+ export declare function isUsableAsRender<T>(value: T): value is T & RenderFlag;
19
+ /**
20
+ * @category Errors
21
+ */
22
+ export declare class NotSampledError extends Error {
23
+ constructor(value: object);
24
+ }
@@ -1,21 +1,17 @@
1
1
  import { getName } from "../../shared/meta.js";
2
-
3
- //#region src/core/texture/usageExtension.ts
4
- function isUsableAsSampled(value) {
5
- return !!value?.usableAsSampled;
2
+ export function isUsableAsSampled(value) {
3
+ return !!value?.usableAsSampled;
6
4
  }
7
- function isUsableAsRender(value) {
8
- return !!value?.usableAsRender;
5
+ export function isUsableAsRender(value) {
6
+ return !!value?.usableAsRender;
9
7
  }
10
8
  /**
11
- * @category Errors
12
- */
13
- var NotSampledError = class NotSampledError extends Error {
14
- constructor(value) {
15
- super(`Resource '${getName(value) ?? "<unnamed>"}' cannot be bound as 'sampled'. Use .$usage('sampled') to allow it.`);
16
- Object.setPrototypeOf(this, NotSampledError.prototype);
17
- }
18
- };
19
-
20
- //#endregion
21
- export { NotSampledError, isUsableAsRender, isUsableAsSampled };
9
+ * @category Errors
10
+ */
11
+ export class NotSampledError extends Error {
12
+ constructor(value) {
13
+ super(`Resource '${getName(value) ?? '<unnamed>'}' cannot be bound as 'sampled'. Use .$usage('sampled') to allow it.`);
14
+ // Set the prototype explicitly.
15
+ Object.setPrototypeOf(this, NotSampledError.prototype);
16
+ }
17
+ }
@@ -1,9 +1,17 @@
1
- import { $internal } from "../../shared/symbols.js";
2
- import "../../data/snippet.js";
3
- import { GPUCallable } from "../../types.js";
4
-
5
- //#region src/core/unroll/tgpuUnroll.d.ts
6
-
1
+ import { $internal, $resolve } from '../../shared/symbols.ts';
2
+ import { type ResolvedSnippet, type Snippet } from '../../data/snippet.ts';
3
+ import type { ResolutionCtx, SelfResolvable } from '../../types.ts';
4
+ /**
5
+ * The result of calling `tgpu.unroll(...)`. The code responsible for
6
+ * generating shader code can check if the value of a snippet is
7
+ * an instance of `UnrollableIterable`, and act accordingly.
8
+ */
9
+ export declare class UnrollableIterable implements SelfResolvable {
10
+ readonly [$internal] = true;
11
+ readonly snippet: Snippet;
12
+ constructor(snippet: Snippet);
13
+ [$resolve](ctx: ResolutionCtx): ResolvedSnippet;
14
+ }
7
15
  /**
8
16
  * Marks an iterable to be unrolled by the shader generator when used in a for loop.
9
17
  *
@@ -48,23 +56,16 @@ import { GPUCallable } from "../../types.js";
48
56
  * fn fbm(pos: vec3f) -> f32 {
49
57
  * var sum = 0f;
50
58
  * // unrolled iteration #0
51
- * {
52
- * sum += noise3d(pos * 1.4f) * 1f;
53
- * }
59
+ * sum += noise3d(pos * 1.4f) * 1f;
54
60
  * // unrolled iteration #1
55
- * {
56
- * sum += noise3d(pos * 2.8f) * 0.5f;
57
- * }
61
+ * sum += noise3d(pos * 2.8f) * 0.5f;
58
62
  * // unrolled iteration #2
59
- * {
60
- * sum += noise3d(pos * 5.6f) * 0.25f;
61
- * }
63
+ * sum += noise3d(pos * 5.6f) * 0.25f;
64
+ * // ---
62
65
  * return sum;
63
66
  * }
64
67
  * ```
65
68
  */
66
- declare const unroll: (<T extends Iterable<unknown>>(iterable: T) => T) & GPUCallable<[iterable: Iterable<unknown>]> & {
67
- [$internal]: true;
69
+ export declare const unroll: (<T extends Iterable<unknown>>(iterable: T) => T) & import("../../types.ts").GPUCallable<[iterable: Iterable<unknown>]> & {
70
+ [$internal]: true;
68
71
  };
69
- //#endregion
70
- export { unroll };