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,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 };