@meimu/mutracer 0.2.0 → 0.3.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 (372) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/README.md +3 -0
  5. package/THIRD_PARTY_NOTICES.md +18 -4
  6. package/dist/assets/bvh.worker.js +1 -1
  7. package/dist/mutracer.umd.js +9328 -7614
  8. package/docs/api.md +83 -35
  9. package/docs/caustics.md +80 -0
  10. package/docs/materials.md +9 -6
  11. package/docs/performance.md +7 -0
  12. package/docs/post-processing.md +62 -9
  13. package/docs/progressive-rendering.md +53 -9
  14. package/docs/sampling.md +4 -0
  15. package/docs/technical/acceleration.md +52 -0
  16. package/docs/technical/aovs.md +79 -0
  17. package/docs/technical/caustics.md +109 -0
  18. package/docs/technical/continuous-spectrum.md +122 -0
  19. package/docs/technical/display-upscale.md +82 -0
  20. package/docs/technical/openpbr.md +99 -0
  21. package/docs/technical/pbrt-import.md +168 -0
  22. package/docs/technical/tiling.md +74 -0
  23. package/docs/technical/webgl.md +53 -0
  24. package/docs/updates.md +3 -1
  25. package/docs/viewer-checklist.md +65 -0
  26. package/docs/viewer.md +18 -6
  27. package/lib/Display.d.ts +19 -5
  28. package/lib/Display.js +10 -7
  29. package/lib/Display.js.map +1 -1
  30. package/lib/Engine.d.ts +4 -1
  31. package/lib/Engine.js +77 -14
  32. package/lib/Engine.js.map +1 -1
  33. package/lib/Render.d.ts +81 -24
  34. package/lib/Render.js +201 -26
  35. package/lib/Render.js.map +1 -1
  36. package/lib/RenderLoop.d.ts +7 -3
  37. package/lib/RenderLoop.js +68 -44
  38. package/lib/RenderLoop.js.map +1 -1
  39. package/lib/main.d.ts +4 -2
  40. package/lib/main.js +1 -0
  41. package/lib/main.js.map +1 -1
  42. package/lib/oidn.d.ts +1 -1
  43. package/lib/renderer/AovPrimitiveCache.js +39 -8
  44. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  45. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  46. package/lib/renderer/DisplayPostProcess.js +51 -18
  47. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  48. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  49. package/lib/renderer/GPUTraceQueue.js +3 -1
  50. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  51. package/lib/renderer/MaterialData.js +7 -2
  52. package/lib/renderer/MaterialData.js.map +1 -1
  53. package/lib/renderer/RenderingPipeline.d.ts +11 -1
  54. package/lib/renderer/RenderingPipeline.js.map +1 -1
  55. package/lib/renderer/TileRender.d.ts +2 -2
  56. package/lib/renderer/TileRender.js +128 -7
  57. package/lib/renderer/TileRender.js.map +1 -1
  58. package/lib/renderer/WGPUAov.d.ts +6 -1
  59. package/lib/renderer/WGPUAov.js +108 -14
  60. package/lib/renderer/WGPUAov.js.map +1 -1
  61. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  62. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  63. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  64. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  65. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  66. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  67. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  68. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  69. package/lib/renderer/WGPUPhotonMap.js +191 -0
  70. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  71. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  72. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  73. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  74. package/lib/renderer/WGPURayTracePass.d.ts +65 -21
  75. package/lib/renderer/WGPURayTracePass.js +730 -409
  76. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  77. package/lib/renderer/WGPURenderingPipeline.js +110 -68
  78. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  79. package/lib/renderer/WebGLAov.js +3 -3
  80. package/lib/renderer/WebGLAov.js.map +1 -1
  81. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  82. package/lib/renderer/WebGLFullQuadPass.js +10 -0
  83. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  84. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  85. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  86. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  87. package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
  88. package/lib/renderer/WebGLRayTracePass.js +157 -116
  89. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  90. package/lib/renderer/WebGLRenderingPipeline.js +17 -14
  91. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  92. package/lib/renderer/WebGLSkyBaker.js +60 -60
  93. package/lib/renderer/accumulationTarget.d.ts +2 -1
  94. package/lib/renderer/accumulationTarget.js.map +1 -1
  95. package/lib/renderer/aov.d.ts +13 -1
  96. package/lib/renderer/aov.js +21 -2
  97. package/lib/renderer/aov.js.map +1 -1
  98. package/lib/renderer/aovDisplay.js +2 -2
  99. package/lib/renderer/aovDisplay.js.map +1 -1
  100. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  101. package/lib/renderer/binnedSahBvh.js +24 -17
  102. package/lib/renderer/binnedSahBvh.js.map +1 -1
  103. package/lib/renderer/bvhAccel.d.ts +3 -1
  104. package/lib/renderer/bvhAccel.js +36 -6
  105. package/lib/renderer/bvhAccel.js.map +1 -1
  106. package/lib/renderer/cameraUniform.d.ts +1 -1
  107. package/lib/renderer/cameraUniform.js +6 -2
  108. package/lib/renderer/cameraUniform.js.map +1 -1
  109. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  110. package/lib/renderer/causticDiagnostics.js +5 -0
  111. package/lib/renderer/causticDiagnostics.js.map +1 -0
  112. package/lib/renderer/causticEmission.d.ts +10 -0
  113. package/lib/renderer/causticEmission.js +40 -0
  114. package/lib/renderer/causticEmission.js.map +1 -0
  115. package/lib/renderer/causticUniform.d.ts +12 -0
  116. package/lib/renderer/causticUniform.js +22 -0
  117. package/lib/renderer/causticUniform.js.map +1 -0
  118. package/lib/renderer/caustics.d.ts +16 -0
  119. package/lib/renderer/caustics.js +93 -0
  120. package/lib/renderer/caustics.js.map +1 -0
  121. package/lib/renderer/compactVertices.d.ts +14 -0
  122. package/lib/renderer/compactVertices.js +124 -0
  123. package/lib/renderer/compactVertices.js.map +1 -0
  124. package/lib/renderer/easu.d.ts +11 -0
  125. package/lib/renderer/easu.js +156 -0
  126. package/lib/renderer/easu.js.map +1 -0
  127. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  128. package/lib/renderer/geometryUpdateState.js.map +1 -1
  129. package/lib/renderer/geometryUpdates.js +3 -2
  130. package/lib/renderer/geometryUpdates.js.map +1 -1
  131. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  132. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  133. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  134. package/lib/renderer/glsl/aovTrace.frag.js +45 -37
  135. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  136. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  137. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  138. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  139. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  140. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  141. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  142. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  143. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  144. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  145. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  146. package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
  147. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  148. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  149. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  150. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  151. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  152. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  153. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  154. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  155. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +70 -63
  156. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  157. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
  158. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  159. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  160. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +160 -118
  161. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  162. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  163. package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
  164. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  165. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  166. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  167. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  168. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  169. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  170. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  171. package/lib/renderer/glsl/depthQuery.frag.js +13 -7
  172. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  173. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  174. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  175. package/lib/renderer/glsl/rayTrace.frag.js +338 -252
  176. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  177. package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
  178. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  179. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  180. package/lib/renderer/gpuMemory.js +1 -1
  181. package/lib/renderer/gpuMemory.js.map +1 -1
  182. package/lib/renderer/lightSampling.d.ts +3 -2
  183. package/lib/renderer/lightSampling.js +14 -8
  184. package/lib/renderer/lightSampling.js.map +1 -1
  185. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  186. package/lib/renderer/openPbrEnergyLut.js +18 -1
  187. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  188. package/lib/renderer/pathLimits.d.ts +5 -4
  189. package/lib/renderer/pathLimits.js +6 -5
  190. package/lib/renderer/pathLimits.js.map +1 -1
  191. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  192. package/lib/renderer/prepareMeshBVH.js +5 -3
  193. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  194. package/lib/renderer/progressiveScheduler.js +5 -4
  195. package/lib/renderer/progressiveScheduler.js.map +1 -1
  196. package/lib/renderer/renderPipeline.d.ts +5 -0
  197. package/lib/renderer/renderPipeline.js +1 -0
  198. package/lib/renderer/renderPipeline.js.map +1 -1
  199. package/lib/renderer/researchTransport.d.ts +31 -0
  200. package/lib/renderer/researchTransport.js +5 -0
  201. package/lib/renderer/researchTransport.js.map +1 -0
  202. package/lib/renderer/sceneAssembly.d.ts +1 -1
  203. package/lib/renderer/sceneAssembly.js +4 -3
  204. package/lib/renderer/sceneAssembly.js.map +1 -1
  205. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  206. package/lib/renderer/sceneChangeDetector.js +3 -1
  207. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  208. package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
  209. package/lib/renderer/sceneLayoutSchema.js +3 -3
  210. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  211. package/lib/renderer/scenePreparation.d.ts +3 -2
  212. package/lib/renderer/scenePreparation.js +18 -2
  213. package/lib/renderer/scenePreparation.js.map +1 -1
  214. package/lib/renderer/scratchSampling.js +6 -6
  215. package/lib/renderer/spectrum.d.ts +21 -0
  216. package/lib/renderer/spectrum.js +154 -0
  217. package/lib/renderer/spectrum.js.map +1 -0
  218. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  219. package/lib/renderer/staticBvhPreparation.js +8 -2
  220. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  221. package/lib/renderer/surfaceHit.d.ts +10 -0
  222. package/lib/renderer/surfaceHit.js +22 -0
  223. package/lib/renderer/surfaceHit.js.map +1 -0
  224. package/lib/renderer/tangentRequirements.d.ts +2 -0
  225. package/lib/renderer/tangentRequirements.js +7 -0
  226. package/lib/renderer/tangentRequirements.js.map +1 -0
  227. package/lib/renderer/textureAtlas.d.ts +4 -0
  228. package/lib/renderer/textureAtlas.js +48 -2
  229. package/lib/renderer/textureAtlas.js.map +1 -1
  230. package/lib/renderer/webgl.js +4 -0
  231. package/lib/renderer/webgl.js.map +1 -1
  232. package/lib/renderer/webglLightSampling.d.ts +39 -0
  233. package/lib/renderer/webglLightSampling.js +15 -0
  234. package/lib/renderer/webglLightSampling.js.map +1 -0
  235. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  236. package/lib/renderer/webglVertexAttributes.js +44 -0
  237. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  238. package/lib/renderer/wgpuBindlessSource.js +3 -3
  239. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  240. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  241. package/lib/renderer/wgpuSceneUniform.js +2 -2
  242. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  243. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  244. package/lib/renderer/wgpuShaderSource.js +3 -1
  245. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  246. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  247. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  248. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  249. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  250. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  251. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  252. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  253. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  254. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  256. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  257. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  258. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  259. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  260. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  261. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  262. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  263. package/lib/renderer/wgsl/causticLight.compute.js +539 -0
  264. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  265. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  266. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  267. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  268. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  269. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  270. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  271. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  272. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  273. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  274. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  275. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  276. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  277. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  278. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  279. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  280. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
  281. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  282. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  283. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
  284. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  285. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  286. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
  287. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  288. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
  289. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  290. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  291. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -1
  292. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
  293. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  294. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  295. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  296. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  297. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  298. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +228 -189
  299. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  300. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  301. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  302. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  303. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  304. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +88 -92
  305. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  306. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  307. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  308. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  309. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  310. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  311. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  312. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  313. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  314. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  315. package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
  316. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  317. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  318. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  319. package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
  320. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  321. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  322. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  323. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  324. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  325. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  326. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  327. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  328. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  329. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  330. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  331. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  332. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  333. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  334. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  335. package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
  336. package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
  337. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  338. package/lib/scene/MaterialState.d.ts +2 -2
  339. package/lib/scene/MaterialState.js +2 -2
  340. package/lib/scene/MaterialState.js.map +1 -1
  341. package/lib/scene/Scene.js.map +1 -1
  342. package/lib/settings/render.d.ts +22 -0
  343. package/lib/settings/render.js +2 -0
  344. package/lib/settings/render.js.map +1 -1
  345. package/lib/util/fromTHREE.js +23 -16
  346. package/lib/util/fromTHREE.js.map +1 -1
  347. package/lib/version.d.ts +1 -1
  348. package/lib/version.js +1 -1
  349. package/lib/version.js.map +1 -1
  350. package/llms.txt +2 -1
  351. package/package.json +7 -4
  352. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  353. package/lib/oidnBundledWeights.cdn.js +0 -5
  354. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  355. package/lib/renderer/bvh.worker.d.ts +0 -1
  356. package/lib/renderer/bvh.worker.js +0 -16
  357. package/lib/renderer/bvh.worker.js.map +0 -1
  358. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  359. package/lib/renderer/bvhWorkerBuild.js +0 -17
  360. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  361. package/lib/renderer/lightCore.d.ts +0 -12
  362. package/lib/renderer/lightCore.js +0 -13
  363. package/lib/renderer/lightCore.js.map +0 -1
  364. package/lib/renderer/materialCore.d.ts +0 -8
  365. package/lib/renderer/materialCore.js +0 -9
  366. package/lib/renderer/materialCore.js.map +0 -1
  367. package/lib/scene/PixelTexture.d.ts +0 -6
  368. package/lib/scene/PixelTexture.js +0 -10
  369. package/lib/scene/PixelTexture.js.map +0 -1
  370. package/lib/util/studioLighting.d.ts +0 -18
  371. package/lib/util/studioLighting.js +0 -36
  372. package/lib/util/studioLighting.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TileRender.js","sourceRoot":"","sources":["../../src/renderer/TileRender.ts"],"names":[],"mappings":"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","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { clamp } from './util.js';\n\n// TileRender is based on the concept of a compute shader's work group.\n\n// Path tracing the scene can be very slow (<1 fps).\n// This overworks the GPU and tends to lock up the OS, making it unresponsive.\n\n// To fix this, we can split the screen into smaller tiles, and sample the scene one tile at a time\n// The tile size is set such that each tile takes approximately a constant amount of time to render.\n\n// Since the render time of a tile is dependent on the device, we find the desired tile dimensions by measuring\n// the time it takes to render an arbitrarily-set tile size and adjusting the size according to the benchmark.\n\nexport function makeTileRender(gl?: WebGL2RenderingContext) {\n let desiredMsPerTile = 21;\n let maxNumTiles = Infinity;\n\n let currentTile = -1;\n let numTiles = 1;\n let numSamples = 1;\n\n let tileWidth: number;\n let tileHeight: number;\n\n let columns: number;\n let rows: number;\n\n let width = 0;\n let height = 0;\n\n let totalElapsedMs = 0;\n let timedTiles = 0;\n\n // initial number of pixels per rendered tile\n // based on correlation between system performance and max supported render buffer size\n // adjusted dynamically according to system performance\n let pixelsPerTile = gl ? pixelsPerTileEstimate(gl) : 600000;\n\n function reset() {\n currentTile = -1;\n totalElapsedMs = 0;\n timedTiles = 0;\n }\n\n function setSize(w: number, h: number) {\n width = w;\n height = h;\n reset();\n calcTileDimensions();\n }\n\n function calcTileDimensions() {\n const maxWidth = 3000;\n const aspectRatio = width / height;\n\n // quantize the width of the tile so that it evenly divides the entire window\n tileWidth = Math.ceil(\n maxWidth /\n Math.max(\n Math.round(maxWidth / Math.sqrt(pixelsPerTile * aspectRatio)),\n 1\n )\n );\n tileHeight = Math.ceil(tileWidth / aspectRatio);\n\n if (tileWidth > width && tileHeight > height) {\n columns = 1;\n rows = 1;\n numTiles = 1;\n\n numSamples =\n Math.round(tileWidth / width) * Math.round(tileHeight / height);\n } else {\n numSamples = 1;\n\n columns = Math.ceil(width / tileWidth);\n rows = Math.ceil(height / tileHeight);\n numTiles = columns * rows;\n }\n\n if (numTiles > maxNumTiles) {\n // TODO maxNumTiles is not exact value.\n numTiles = maxNumTiles;\n columns = Math.ceil(Math.sqrt(numTiles));\n rows = Math.ceil(numTiles / columns);\n numTiles = columns * rows;\n tileWidth = Math.ceil(width / columns);\n tileHeight = Math.ceil(height / rows);\n }\n }\n\n function updatePixelsPerTile() {\n const msPerTile = totalElapsedMs / timedTiles;\n\n const error = desiredMsPerTile - msPerTile;\n\n // tweak to find balance. higher = faster convergence, lower = less fluctuations to microstutters\n const strength = 5000;\n\n // sqrt prevents massive fluctuations in pixelsPerTile for the occasional stutter\n pixelsPerTile += strength * Math.sign(error) * Math.sqrt(Math.abs(error));\n pixelsPerTile = Math.max(pixelsPerTile, 8192);\n }\n\n function nextTile(elapsedFrameMs?: number) {\n // The supplied time belongs to the previous tile. After a reset it may\n // instead describe scene preparation, compilation, or the previous view.\n if (\n currentTile >= 0 && elapsedFrameMs != null &&\n Number.isFinite(elapsedFrameMs) && elapsedFrameMs > 0\n ) {\n totalElapsedMs += elapsedFrameMs;\n timedTiles++;\n }\n currentTile++;\n\n if (currentTile % numTiles === 0) {\n if (timedTiles) {\n updatePixelsPerTile();\n calcTileDimensions();\n }\n\n totalElapsedMs = 0;\n timedTiles = 0;\n currentTile = 0;\n }\n\n const isLastTile = currentTile === numTiles - 1;\n\n const x = currentTile % columns;\n const y = Math.floor(currentTile / columns) % rows;\n\n return {\n xIndex: x,\n yIndex: y,\n columns,\n rows,\n x: x * tileWidth,\n y: y * tileHeight,\n tileWidth,\n tileHeight,\n isFirstTile: currentTile === 0,\n isLastTile,\n samplesPerFrame: numSamples\n };\n }\n\n return {\n nextTile,\n reset,\n setSize,\n setMaxTiles(maxTiles: number) {\n maxNumTiles = maxTiles;\n },\n setDesiredMsPerTile(time: number) {\n desiredMsPerTile = time;\n },\n getDesiredMsPerTile() {\n return desiredMsPerTile;\n }\n };\n}\n\nfunction getPredictResult(\n width: number,\n height: number,\n lastTraceTime: number,\n expectFrameTime: number,\n tilePixels: number[],\n maxNumTiles: number\n) {\n const maxTileSize = [width, height];\n const rawCount = lastTraceTime > 0 ? expectFrameTime / lastTraceTime : 1;\n // GPU cost is not perfectly linear with tile area: tiny probes include fixed\n // dispatch overhead, while very large tiles can hit cache and divergence\n // cliffs. Limit each update to 2x per dimension so prediction converges in a\n // few samples without jumping from the probe straight to a blocking 4K tile.\n const count = clamp(rawCount, 0.25, 4);\n\n const wScale = Math.sqrt(count);\n const hScale = count / wScale;\n\n let newTileWidth = Math.ceil(wScale * tilePixels[0]);\n let newTileHeight = Math.ceil(hScale * tilePixels[1]);\n\n let samplesPerFrame = 1;\n if (newTileWidth > maxTileSize[0] * 2) {\n samplesPerFrame *= Math.floor(newTileWidth / maxTileSize[0]);\n }\n newTileWidth = Math.min(newTileWidth, maxTileSize[0]);\n if (newTileHeight > maxTileSize[1] * 2) {\n samplesPerFrame *= Math.floor(newTileHeight / maxTileSize[1]);\n }\n newTileHeight = Math.min(newTileHeight, maxTileSize[1]);\n\n let newColumns = Math.round(width / newTileWidth);\n let newRows = Math.round(height / newTileHeight);\n\n newTileWidth = Math.ceil(width / newColumns);\n newTileHeight = Math.ceil(height / newRows);\n\n let newNumTiles = newRows * newColumns;\n\n if (newNumTiles > maxNumTiles) {\n newNumTiles = maxNumTiles;\n newColumns = Math.ceil(Math.sqrt(newNumTiles));\n newRows = Math.ceil(newNumTiles / newColumns);\n newNumTiles = newColumns * newRows;\n newTileWidth = Math.ceil(width / newColumns);\n newTileHeight = Math.ceil(height / newRows);\n }\n\n return {\n tileWidth: newTileWidth,\n tileHeight: newTileHeight,\n columns: newColumns,\n rows: newRows,\n numTiles: newNumTiles,\n samplesPerFrame\n };\n}\n\n// A 64x64 probe is dominated by dispatch and timestamp overhead on modern\n// GPUs. At 4K it also leads to an extremely conservative first prediction.\n// Use a still-small but representative amount of work, shaped like the frame.\nconst initialProbePixels = 262144;\n\nfunction getInitialProbeSize(width: number, height: number) {\n const aspectRatio = width > 0 && height > 0 ? width / height : 1;\n return [\n Math.min(width, Math.max(1, Math.round(Math.sqrt(initialProbePixels * aspectRatio)))),\n Math.min(height, Math.max(1, Math.round(Math.sqrt(initialProbePixels / aspectRatio))))\n ];\n}\n\nexport function makeTileRenderWithPredict() {\n let numTiles = 1;\n let currentTile = -1;\n let lastTraceTime = -1;\n // Several offline samples can be submitted before a timing callback runs.\n // Consume each measurement once so stale feedback cannot repeatedly shrink tiles.\n let timingRevision = 0;\n let appliedTimingRevision = -1;\n let lastFrameTotalTraceTime = 0;\n let lastFrameTraceTimeValidCount = 0;\n let tilePixels = [64, 64];\n let width = 0;\n let height = 0;\n let expectFrameTime = 0;\n\n // Calcualate\n let tileWidth = 0;\n let tileHeight = 0;\n let samplesPerFrame = 1;\n let columns = 0;\n let rows = 0;\n\n let maxNumTiles = Infinity;\n\n function nextTile() {\n currentTile++;\n const avgTileTime =\n lastFrameTraceTimeValidCount > 0\n ? lastFrameTotalTraceTime / lastFrameTraceTimeValidCount\n : lastTraceTime;\n\n if (currentTile % numTiles === 0) {\n currentTile = 0;\n }\n\n if (currentTile === 0 && timingRevision !== appliedTimingRevision) {\n appliedTimingRevision = timingRevision;\n const result = getPredictResult(\n width,\n height,\n avgTileTime,\n expectFrameTime,\n lastTraceTime >= 0 ? tilePixels : getInitialProbeSize(width, height),\n maxNumTiles\n );\n\n lastFrameTotalTraceTime = 0;\n lastFrameTraceTimeValidCount = 0;\n tileWidth = result.tileWidth;\n tileHeight = result.tileHeight;\n columns = result.columns;\n rows = result.rows;\n numTiles = result.numTiles;\n samplesPerFrame = result.samplesPerFrame;\n }\n\n const x = currentTile % columns;\n const y = Math.floor(currentTile / columns) % rows;\n const isLastTile = currentTile === numTiles - 1;\n\n tilePixels = [tileWidth, tileHeight];\n\n return {\n xIndex: x,\n yIndex: y,\n columns,\n rows,\n x: x * tileWidth,\n y: y * tileHeight,\n tileWidth,\n tileHeight,\n isFirstTile: currentTile === 0,\n isLastTile,\n samplesPerFrame\n };\n }\n\n return {\n nextTile,\n reset() {\n currentTile = -1;\n },\n setSize(w: number, h: number) {\n if (width !== w || height !== h) timingRevision++;\n width = w;\n height = h;\n },\n setMaxTiles(maxTiles: number) {\n if (maxNumTiles !== maxTiles) timingRevision++;\n maxNumTiles = maxTiles;\n },\n setDesiredMsPerTile(time: number) {\n if (expectFrameTime !== time) timingRevision++;\n expectFrameTime = time;\n },\n needsUpdatePredicting() {\n timingRevision++;\n lastTraceTime = -1;\n lastFrameTotalTraceTime = 0;\n lastFrameTraceTimeValidCount = 0;\n },\n setLastTraceTime(time: number) {\n timingRevision++;\n lastTraceTime = time;\n lastFrameTraceTimeValidCount++;\n lastFrameTotalTraceTime += time;\n },\n getLastTraceTime() {\n return lastTraceTime;\n },\n getDesiredMsPerTile() {\n return expectFrameTime;\n }\n };\n}\n\n\nfunction pixelsPerTileEstimate(gl: WebGL2RenderingContext) {\n const maxRenderbufferSize = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);\n\n if (maxRenderbufferSize <= 8192) {\n return 200000;\n } else {\n // 16K render targets are common on current desktop/integrated GPUs. The\n // old 400K seed unnecessarily split even 720p into several tiles and took\n // dozens of samples to grow to a full-frame tile.\n return 1000000;\n }\n}\n"]}
1
+ {"version":3,"file":"TileRender.js","sourceRoot":"","sources":["../../src/renderer/TileRender.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,uEAAuE;AAEvE,oDAAoD;AACpD,8EAA8E;AAE9E,mGAAmG;AACnG,oGAAoG;AAEpG,+GAA+G;AAC/G,8GAA8G;AAE9G,MAAM,UAAU,cAAc,CAAC,EAA2B;IACxD,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,WAAW,GAAG,QAAQ,CAAC;IAE3B,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,IAAI,SAAiB,CAAC;IACtB,IAAI,UAAkB,CAAC;IAEvB,IAAI,OAAe,CAAC;IACpB,IAAI,IAAY,CAAC;IAEjB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,6CAA6C;IAC7C,uFAAuF;IACvF,uDAAuD;IACvD,IAAI,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE5D,SAAS,KAAK;QACZ,WAAW,GAAG,CAAC,CAAC,CAAC;QACjB,cAAc,GAAG,CAAC,CAAC;QACnB,UAAU,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,SAAS,OAAO,CAAC,CAAS,EAAE,CAAS;QACnC,KAAK,GAAG,CAAC,CAAC;QACV,MAAM,GAAG,CAAC,CAAC;QACX,KAAK,EAAE,CAAC;QACR,kBAAkB,EAAE,CAAC;IACvB,CAAC;IAED,SAAS,kBAAkB;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC;QACtB,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;QAEnC,6EAA6E;QAC7E,SAAS,GAAG,IAAI,CAAC,IAAI,CACnB,QAAQ;YACN,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC,EAC7D,CAAC,CACF,CACJ,CAAC;QACF,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;QAEhD,IAAI,SAAS,GAAG,KAAK,IAAI,UAAU,GAAG,MAAM,EAAE,CAAC;YAC7C,OAAO,GAAG,CAAC,CAAC;YACZ,IAAI,GAAG,CAAC,CAAC;YACT,QAAQ,GAAG,CAAC,CAAC;YAEb,UAAU;gBACR,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,CAAC,CAAC;YAEf,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;YACvC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;YACtC,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC3B,uCAAuC;YACvC,QAAQ,GAAG,WAAW,CAAC;YACvB,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC;YACrC,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;YAC1B,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC;YACvC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,SAAS,mBAAmB;QAC1B,MAAM,SAAS,GAAG,cAAc,GAAG,UAAU,CAAC;QAE9C,MAAM,KAAK,GAAG,gBAAgB,GAAG,SAAS,CAAC;QAE3C,iGAAiG;QACjG,MAAM,QAAQ,GAAG,IAAI,CAAC;QAEtB,iFAAiF;QACjF,aAAa,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1E,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,SAAS,QAAQ,CAAC,cAAuB;QACvC,uEAAuE;QACvE,yEAAyE;QACzE,IACE,WAAW,IAAI,CAAC,IAAI,cAAc,IAAI,IAAI;YAC1C,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,EACrD,CAAC;YACD,cAAc,IAAI,cAAc,CAAC;YACjC,UAAU,EAAE,CAAC;QACf,CAAC;QACD,WAAW,EAAE,CAAC;QAEd,IAAI,WAAW,GAAG,QAAQ,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,UAAU,EAAE,CAAC;gBACf,mBAAmB,EAAE,CAAC;gBACtB,kBAAkB,EAAE,CAAC;YACvB,CAAC;YAED,cAAc,GAAG,CAAC,CAAC;YACnB,UAAU,GAAG,CAAC,CAAC;YACf,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,KAAK,QAAQ,GAAG,CAAC,CAAC;QAEhD,MAAM,CAAC,GAAG,WAAW,GAAG,OAAO,CAAC;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;QAEnD,OAAO;YACL,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,OAAO;YACP,IAAI;YACJ,CAAC,EAAE,CAAC,GAAG,SAAS;YAChB,CAAC,EAAE,CAAC,GAAG,UAAU;YACjB,SAAS;YACT,UAAU;YACV,WAAW,EAAE,WAAW,KAAK,CAAC;YAC9B,UAAU;YACV,eAAe,EAAE,UAAU;SAC5B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,KAAK;QACL,OAAO;QACP,WAAW,CAAC,QAAgB;YAC1B,WAAW,GAAG,QAAQ,CAAC;QACzB,CAAC;QACD,mBAAmB,CAAC,IAAY;YAC9B,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;QACD,mBAAmB;YACjB,OAAO,gBAAgB,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAa,EACb,MAAc,EACd,aAAqB,EACrB,eAAuB,EACvB,UAAoB,EACpB,WAAmB,EACnB,eAAuB,EACvB,qBAA+B;IAE/B,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,6EAA6E;IAC7E,yEAAyE;IACzE,6EAA6E;IAC7E,6EAA6E;IAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IAE9B,IAAI,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAExD,uEAAuE;IACvE,2EAA2E;IAC3E,yEAAyE;IACzE,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAClC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EACpC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzE,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC;IAClD,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;IAEjD,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC;IAC7C,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IAE5C,IAAI,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;IAEvC,IAAI,WAAW,GAAG,WAAW,EAAE,CAAC;QAC9B,WAAW,GAAG,WAAW,CAAC;QAC1B,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/C,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC;QAC9C,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;QACnC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC;QAC7C,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,UAAU,EAAE,aAAa;QACzB,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,WAAW;QACrB,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,2EAA2E;AAC3E,8EAA8E;AAC9E,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,SAAS,mBAAmB,CAAC,KAAa,EAAE,MAAc;IACxD,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO;QACL,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;KACvF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,gFAAgF;AAChF,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,4EAA4E;AAC5E,8EAA8E;AAC9E,MAAM,yBAAyB,GAAG,GAAG,CAAC;AACtC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AACxC,0EAA0E;AAC1E,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,SAAS,yBAAyB,CAChC,KAAa,EAAE,MAAc,EAAE,OAAe,EAAE,UAAkB,EAClE,eAAuB,EAAE,WAAmB,EAAE,eAAuB;IAErE,MAAM,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;IAClE,2EAA2E;IAC3E,wEAAwE;IACxE,MAAM,QAAQ,GAAG,OAAO,GAAG,yBAAyB;QAClD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,yBAAyB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC;IAC9D,IAAI,MAAkE,CAAC;IACvE,IAAI,UAAyB,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,SAAqC,EAAE,IAAmB,EAAE,EAAE,CAC5E,CAAC,IAAI,IAAI,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;QACrC,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;YAC7B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,CAAC;QAC/C,IAAI,IAAI,GAAG,OAAO;YAAE,SAAS;QAC7B,MAAM,KAAK,GAAG,OAAO,GAAG,IAAI,EAAE,SAAS,GAAG,EAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC;QACjE,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;YAAE,MAAM,GAAG,SAAS,CAAC;QAClD,MAAM,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;QAC1C,MAAM,UAAU,GAAG,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC;QAClE,IAAI,MAAM,IAAI,yBAAyB,IAAI,UAAU,IAAI,qBAAqB;YAC5E,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC;YAAE,UAAU,GAAG,SAAS,CAAC;IAC1D,CAAC;IACD,2EAA2E;IAC3E,6EAA6E;IAC7E,IAAI,EAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAC,GAAG,CAAC,UAAU,IAAI,MAAM,CAAE,CAAC;IAC/D,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC3B,yEAAyE;QACzE,QAAQ,GAAG,WAAW,CAAC;QACvB,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC;QACrC,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;IAC5B,CAAC;IACD,OAAO,EAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACpE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,eAAe,EAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,eAAe,GAAG,CAAC;IAC3D,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;IACvB,0EAA0E;IAC1E,kFAAkF;IAClF,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,qBAAqB,GAAG,CAAC,CAAC,CAAC;IAC/B,IAAI,uBAAuB,GAAG,CAAC,CAAC;IAChC,IAAI,4BAA4B,GAAG,CAAC,CAAC;IACrC,IAAI,UAAU,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,aAAa;IACb,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,IAAI,WAAW,GAAG,QAAQ,CAAC;IAC3B,sEAAsE;IACtE,oEAAoE;IACpE,IAAI,UAAmF,CAAC;IACxF,IAAI,qBAAqB,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,IAAI,eAAyD,CAAC;IAC9D,IAAI,gBAAiE,CAAC;IAEtE,SAAS,uBAAuB;QAC9B,UAAU,GAAG,SAAS,CAAC;QACvB,qBAAqB,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,eAAe,GAAG,SAAS,CAAC;QAC5B,gBAAgB,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,SAAS,QAAQ;QACf,WAAW,EAAE,CAAC;QACd,MAAM,WAAW,GACf,4BAA4B,GAAG,CAAC;YAC9B,CAAC,CAAC,uBAAuB,GAAG,4BAA4B;YACxD,CAAC,CAAC,aAAa,CAAC;QAEpB,IAAI,WAAW,GAAG,QAAQ,KAAK,CAAC,EAAE,CAAC;YACjC,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,WAAW,KAAK,CAAC,IAAI,cAAc,KAAK,qBAAqB,EAAE,CAAC;YAClE,qBAAqB,GAAG,cAAc,CAAC;YACvC,MAAM,QAAQ,GAAG,4BAA4B,GAAG,CAAC,CAAC;YAClD,IAAI,QAA2B,CAAC;YAChC,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBACtD,qEAAqE;gBACrE,oEAAoE;gBACpE,IAAI,WAAW,GAAG,eAAe,GAAG,GAAG;oBACrC,WAAW,GAAG,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;oBAC9D,QAAQ,GAAG,UAAU,CAAC;oBACtB,qBAAqB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC9E,CAAC;gBACD,UAAU,GAAG,SAAS,CAAC;YACzB,CAAC;YACD,IAAI,MAAM,GAAG,QAAQ,EAAE,IAAI,IAAI,gBAAgB,CAC7C,KAAK,EACL,MAAM,EACN,WAAW,EACX,eAAe,EACf,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,EACpE,WAAW,EACX,eAAe,EACf,qBAAqB,CACtB,CAAC;YACF,IAAI,QAAQ,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC7D,sEAAsE;gBACtE,mEAAmE;gBACnE,MAAM,KAAK,GAAG,EAAC,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAC,CAAC;gBACnE,IAAI,eAAe,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC;oBAChE,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;oBACxF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;oBAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;wBAC/D,KAAK,IAAI,eAAe,GAAG,2BAA2B,EAAE,CAAC;wBACzD,gBAAgB,GAAG,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EACtE,eAAe,EAAE,WAAW,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;oBAC1D,CAAC;gBACH,CAAC;gBACD,eAAe,GAAG,KAAK,CAAC;YAC1B,CAAC;YACD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,qEAAqE;gBACrE,uEAAuE;gBACvE,4EAA4E;gBAC5E,MAAM,GAAG,EAAC,GAAG,gBAAgB,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAC,CAAC;gBACxE,UAAU,GAAG,SAAS,CAAC;YACzB,CAAC;YACD,IAAI,CAAC,gBAAgB,IAAI,CAAC,QAAQ,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC;gBAC7E,UAAU,GAAG;oBACX,IAAI,EAAE,EAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAC;oBACvE,IAAI,EAAE,WAAW;iBAClB,CAAC;YACJ,CAAC;YAED,uBAAuB,GAAG,CAAC,CAAC;YAC5B,4BAA4B,GAAG,CAAC,CAAC;YACjC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YAC7B,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YAC/B,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YACzB,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACnB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC3B,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC3C,CAAC;QAED,MAAM,CAAC,GAAG,WAAW,GAAG,OAAO,CAAC;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;QACnD,MAAM,UAAU,GAAG,WAAW,KAAK,QAAQ,GAAG,CAAC,CAAC;QAEhD,UAAU,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAErC,OAAO;YACL,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,OAAO;YACP,IAAI;YACJ,CAAC,EAAE,CAAC,GAAG,SAAS;YAChB,CAAC,EAAE,CAAC,GAAG,UAAU;YACjB,SAAS;YACT,UAAU;YACV,WAAW,EAAE,WAAW,KAAK,CAAC;YAC9B,UAAU;YACV,eAAe;SAChB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,KAAK;YACH,WAAW,GAAG,CAAC,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,CAAS,EAAE,CAAS;YAC1B,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,cAAc,EAAE,CAAC;gBACjB,uBAAuB,EAAE,CAAC;gBAC1B,aAAa,GAAG,CAAC,CAAC,CAAC;gBACnB,uBAAuB,GAAG,CAAC,CAAC;gBAC5B,4BAA4B,GAAG,CAAC,CAAC;YACnC,CAAC;YACD,KAAK,GAAG,CAAC,CAAC;YACV,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;QACD,WAAW,CAAC,QAAgB;YAC1B,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7B,cAAc,EAAE,CAAC;gBACjB,uBAAuB,EAAE,CAAC;YAC5B,CAAC;YACD,WAAW,GAAG,QAAQ,CAAC;QACzB,CAAC;QACD,mBAAmB,CAAC,IAAY;YAC9B,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;gBAC7B,cAAc,EAAE,CAAC;gBACjB,uBAAuB,EAAE,CAAC;YAC5B,CAAC;YACD,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,qBAAqB;YACnB,uBAAuB,EAAE,CAAC;YAC1B,cAAc,EAAE,CAAC;YACjB,aAAa,GAAG,CAAC,CAAC,CAAC;YACnB,uBAAuB,GAAG,CAAC,CAAC;YAC5B,4BAA4B,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,gBAAgB,CAAC,IAAY,EAAE,YAAY,GAAG,OAAO,EAAE,SAAS,GAAG,IAAI;YACrE,sEAAsE;YACtE,8DAA8D;YAC9D,IAAI,YAAY,KAAK,OAAO,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;gBAAE,OAAO;YAClG,cAAc,EAAE,CAAC;YACjB,aAAa,GAAG,IAAI,CAAC;YACrB,4BAA4B,EAAE,CAAC;YAC/B,uBAAuB,IAAI,IAAI,CAAC;QAClC,CAAC;QACD,gBAAgB;YACd,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,mBAAmB;YACjB,OAAO,eAAe,CAAC;QACzB,CAAC;KACF,CAAC;AACJ,CAAC;AAGD,SAAS,qBAAqB,CAAC,EAA0B;IACvD,MAAM,mBAAmB,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC;IAEtE,IAAI,mBAAmB,IAAI,IAAI,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,wEAAwE;QACxE,0EAA0E;QAC1E,kDAAkD;QAClD,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { clamp } from './util.js';\n\n// TileRender is based on the concept of a compute shader's work group.\n\n// Path tracing the scene can be very slow (<1 fps).\n// This overworks the GPU and tends to lock up the OS, making it unresponsive.\n\n// To fix this, we can split the screen into smaller tiles, and sample the scene one tile at a time\n// The tile size is set such that each tile takes approximately a constant amount of time to render.\n\n// Since the render time of a tile is dependent on the device, we find the desired tile dimensions by measuring\n// the time it takes to render an arbitrarily-set tile size and adjusting the size according to the benchmark.\n\nexport function makeTileRender(gl?: WebGL2RenderingContext) {\n let desiredMsPerTile = 21;\n let maxNumTiles = Infinity;\n\n let currentTile = -1;\n let numTiles = 1;\n let numSamples = 1;\n\n let tileWidth: number;\n let tileHeight: number;\n\n let columns: number;\n let rows: number;\n\n let width = 0;\n let height = 0;\n\n let totalElapsedMs = 0;\n let timedTiles = 0;\n\n // initial number of pixels per rendered tile\n // based on correlation between system performance and max supported render buffer size\n // adjusted dynamically according to system performance\n let pixelsPerTile = gl ? pixelsPerTileEstimate(gl) : 600000;\n\n function reset() {\n currentTile = -1;\n totalElapsedMs = 0;\n timedTiles = 0;\n }\n\n function setSize(w: number, h: number) {\n width = w;\n height = h;\n reset();\n calcTileDimensions();\n }\n\n function calcTileDimensions() {\n const maxWidth = 3000;\n const aspectRatio = width / height;\n\n // quantize the width of the tile so that it evenly divides the entire window\n tileWidth = Math.ceil(\n maxWidth /\n Math.max(\n Math.round(maxWidth / Math.sqrt(pixelsPerTile * aspectRatio)),\n 1\n )\n );\n tileHeight = Math.ceil(tileWidth / aspectRatio);\n\n if (tileWidth > width && tileHeight > height) {\n columns = 1;\n rows = 1;\n numTiles = 1;\n\n numSamples =\n Math.round(tileWidth / width) * Math.round(tileHeight / height);\n } else {\n numSamples = 1;\n\n columns = Math.ceil(width / tileWidth);\n rows = Math.ceil(height / tileHeight);\n numTiles = columns * rows;\n }\n\n if (numTiles > maxNumTiles) {\n // TODO maxNumTiles is not exact value.\n numTiles = maxNumTiles;\n columns = Math.ceil(Math.sqrt(numTiles));\n rows = Math.ceil(numTiles / columns);\n numTiles = columns * rows;\n tileWidth = Math.ceil(width / columns);\n tileHeight = Math.ceil(height / rows);\n }\n }\n\n function updatePixelsPerTile() {\n const msPerTile = totalElapsedMs / timedTiles;\n\n const error = desiredMsPerTile - msPerTile;\n\n // tweak to find balance. higher = faster convergence, lower = less fluctuations to microstutters\n const strength = 5000;\n\n // sqrt prevents massive fluctuations in pixelsPerTile for the occasional stutter\n pixelsPerTile += strength * Math.sign(error) * Math.sqrt(Math.abs(error));\n pixelsPerTile = Math.max(pixelsPerTile, 8192);\n }\n\n function nextTile(elapsedFrameMs?: number) {\n // The supplied time belongs to the previous tile. After a reset it may\n // instead describe scene preparation, compilation, or the previous view.\n if (\n currentTile >= 0 && elapsedFrameMs != null &&\n Number.isFinite(elapsedFrameMs) && elapsedFrameMs > 0\n ) {\n totalElapsedMs += elapsedFrameMs;\n timedTiles++;\n }\n currentTile++;\n\n if (currentTile % numTiles === 0) {\n if (timedTiles) {\n updatePixelsPerTile();\n calcTileDimensions();\n }\n\n totalElapsedMs = 0;\n timedTiles = 0;\n currentTile = 0;\n }\n\n const isLastTile = currentTile === numTiles - 1;\n\n const x = currentTile % columns;\n const y = Math.floor(currentTile / columns) % rows;\n\n return {\n xIndex: x,\n yIndex: y,\n columns,\n rows,\n x: x * tileWidth,\n y: y * tileHeight,\n tileWidth,\n tileHeight,\n isFirstTile: currentTile === 0,\n isLastTile,\n samplesPerFrame: numSamples\n };\n }\n\n return {\n nextTile,\n reset,\n setSize,\n setMaxTiles(maxTiles: number) {\n maxNumTiles = maxTiles;\n },\n setDesiredMsPerTile(time: number) {\n desiredMsPerTile = time;\n },\n getDesiredMsPerTile() {\n return desiredMsPerTile;\n }\n };\n}\n\nfunction getPredictResult(\n width: number,\n height: number,\n lastTraceTime: number,\n expectFrameTime: number,\n tilePixels: number[],\n maxNumTiles: number,\n minimumTileSize: number,\n minimumPredictionSize: number[]\n) {\n const maxTileSize = [width, height];\n const rawCount = lastTraceTime > 0 ? expectFrameTime / lastTraceTime : 1;\n // GPU cost is not perfectly linear with tile area: tiny probes include fixed\n // dispatch overhead, while very large tiles can hit cache and divergence\n // cliffs. Limit each update to 2x per dimension so prediction converges in a\n // few samples without jumping from the probe straight to a blocking 4K tile.\n const count = clamp(rawCount, 0.25, 4);\n\n const wScale = Math.sqrt(count);\n const hScale = count / wScale;\n\n let newTileWidth = Math.ceil(wScale * tilePixels[0]);\n let newTileHeight = Math.ceil(hScale * tilePixels[1]);\n\n let samplesPerFrame = 1;\n if (newTileWidth > maxTileSize[0] * 2) {\n samplesPerFrame *= Math.floor(newTileWidth / maxTileSize[0]);\n }\n newTileWidth = Math.min(newTileWidth, maxTileSize[0]);\n if (newTileHeight > maxTileSize[1] * 2) {\n samplesPerFrame *= Math.floor(newTileHeight / maxTileSize[1]);\n }\n newTileHeight = Math.min(newTileHeight, maxTileSize[1]);\n\n // A compute dispatch still occupies a whole workgroup when fewer lanes\n // are active. Splitting below that footprint repeats the fixed kernel cost\n // and can make timestamp feedback progressively slow down a tiny render.\n newTileWidth = Math.max(newTileWidth,\n Math.min(width, Math.max(minimumTileSize, minimumPredictionSize[0])));\n newTileHeight = Math.max(newTileHeight,\n Math.min(height, Math.max(minimumTileSize, minimumPredictionSize[1])));\n\n let newColumns = Math.round(width / newTileWidth);\n let newRows = Math.round(height / newTileHeight);\n\n newTileWidth = Math.ceil(width / newColumns);\n newTileHeight = Math.ceil(height / newRows);\n\n let newNumTiles = newRows * newColumns;\n\n if (newNumTiles > maxNumTiles) {\n newNumTiles = maxNumTiles;\n newColumns = Math.ceil(Math.sqrt(newNumTiles));\n newRows = Math.ceil(newNumTiles / newColumns);\n newNumTiles = newColumns * newRows;\n newTileWidth = Math.ceil(width / newColumns);\n newTileHeight = Math.ceil(height / newRows);\n }\n\n return {\n tileWidth: newTileWidth,\n tileHeight: newTileHeight,\n columns: newColumns,\n rows: newRows,\n numTiles: newNumTiles,\n samplesPerFrame\n };\n}\n\n// A 64x64 probe is dominated by dispatch and timestamp overhead on modern\n// GPUs. At 4K it also leads to an extremely conservative first prediction.\n// Use a still-small but representative amount of work, shaped like the frame.\nconst initialProbePixels = 262144;\n\nfunction getInitialProbeSize(width: number, height: number) {\n const aspectRatio = width > 0 && height > 0 ? width / height : 1;\n return [\n Math.min(width, Math.max(1, Math.round(Math.sqrt(initialProbePixels * aspectRatio)))),\n Math.min(height, Math.max(1, Math.round(Math.sqrt(initialProbePixels / aspectRatio))))\n ];\n}\n\n// Keep repeated kernel/longest-path cost below one fifth of the sample where\n// possible. If that conflicts with responsiveness, prioritize the tile ceiling.\nconst maximumFixedCostShare = 0.2;\n// A throughput-oriented ceiling still leaves over 5x margin below a 2s TDR.\n// This is a prediction, not a guarantee for unusually expensive sample paths.\nconst maximumUnattainableTileMs = 350;\nconst unattainableBudgetTolerance = 1.1;\n// Nearby grids amplify timestamp noise when extrapolating to zero pixels.\nconst minimumAffineAreaChange = 0.2;\n\nfunction getUnattainableBudgetGrid(\n width: number, height: number, fixedMs: number, msPerPixel: number,\n minimumTileSize: number, maxNumTiles: number, samplesPerFrame: number\n) {\n const areaCost = msPerPixel * width * height;\n const maxColumns = Math.max(1, Math.floor(width / minimumTileSize));\n const maxRows = Math.max(1, Math.floor(height / minimumTileSize));\n // If the fixed cost alone exceeds the ceiling, no subdivision can meet it.\n // Avoid multiplying an unavoidable stall by an ever-growing tile count.\n const required = fixedMs < maximumUnattainableTileMs\n ? Math.ceil(areaCost / (maximumUnattainableTileMs - fixedMs)) : 1;\n const minimumTiles = clamp(required, 1, maxColumns * maxRows);\n let fewest: {columns: number; rows: number; count: number} | undefined;\n let withinBoth: typeof fewest;\n const better = (candidate: NonNullable<typeof fewest>, best: typeof fewest) =>\n !best || candidate.count < best.count ||\n (candidate.count === best.count &&\n Math.abs(candidate.columns - candidate.rows) < Math.abs(best.columns - best.rows));\n for (let columns = 1; columns <= Math.min(maxColumns, minimumTiles); columns++) {\n const rows = Math.ceil(minimumTiles / columns);\n if (rows > maxRows) continue;\n const count = columns * rows, candidate = {columns, rows, count};\n if (better(candidate, fewest)) fewest = candidate;\n const tileMs = fixedMs + areaCost / count;\n const fixedShare = count * fixedMs / (count * fixedMs + areaCost);\n if (tileMs <= maximumUnattainableTileMs && fixedShare <= maximumFixedCostShare &&\n better(candidate, withinBoth)) withinBoth = candidate;\n }\n // Fewer tiles also minimize fixed cost. If even the fewest grid that meets\n // the ceiling exceeds the share limit, no grid can satisfy both constraints.\n let {columns, rows, count: numTiles} = (withinBoth ?? fewest)!;\n if (numTiles > maxNumTiles) {\n // Preserve the existing rectangular rounding of the public maxTiles cap.\n numTiles = maxNumTiles;\n columns = Math.ceil(Math.sqrt(numTiles));\n rows = Math.ceil(numTiles / columns);\n numTiles = columns * rows;\n }\n return {columns, rows, numTiles, tileWidth: Math.ceil(width / columns),\n tileHeight: Math.ceil(height / rows), samplesPerFrame};\n}\n\nexport function makeTileRenderWithPredict(minimumTileSize = 1) {\n let numTiles = 1;\n let currentTile = -1;\n let lastTraceTime = -1;\n // Several offline samples can be submitted before a timing callback runs.\n // Consume each measurement once so stale feedback cannot repeatedly shrink tiles.\n let timingRevision = 0;\n let appliedTimingRevision = -1;\n let lastFrameTotalTraceTime = 0;\n let lastFrameTraceTimeValidCount = 0;\n let tilePixels = [64, 64];\n let width = 0;\n let height = 0;\n let expectFrameTime = 0;\n\n // Calcualate\n let tileWidth = 0;\n let tileHeight = 0;\n let samplesPerFrame = 1;\n let columns = 0;\n let rows = 0;\n\n let maxNumTiles = Infinity;\n // Validate a refinement against the grid that motivated it. A smaller\n // dispatch can retain most of the longest path / fixed kernel cost.\n let refinement: { grid: ReturnType<typeof getPredictResult>; time: number } | undefined;\n let minimumPredictionSize = [0, 0];\n let lastMeasurement: {area: number; time: number} | undefined;\n let unattainableGrid: ReturnType<typeof getPredictResult> | undefined;\n\n function clearPredictionEvidence() {\n refinement = undefined;\n minimumPredictionSize = [0, 0];\n lastMeasurement = undefined;\n unattainableGrid = undefined;\n }\n\n function nextTile() {\n currentTile++;\n const avgTileTime =\n lastFrameTraceTimeValidCount > 0\n ? lastFrameTotalTraceTime / lastFrameTraceTimeValidCount\n : lastTraceTime;\n\n if (currentTile % numTiles === 0) {\n currentTile = 0;\n }\n\n if (currentTile === 0 && timingRevision !== appliedTimingRevision) {\n appliedTimingRevision = timingRevision;\n const measured = lastFrameTraceTimeValidCount > 0;\n let rollback: typeof refinement;\n if (measured && refinement) {\n const areaRatio = refinement.grid.numTiles / numTiles;\n // Require at least half of the area-proportional improvement, unless\n // the new tile already fits the budget (with 10% timing tolerance).\n if (avgTileTime > expectFrameTime * 1.1 &&\n avgTileTime > refinement.time * (1 - (1 - areaRatio) * 0.5)) {\n rollback = refinement;\n minimumPredictionSize = [rollback.grid.tileWidth, rollback.grid.tileHeight];\n }\n refinement = undefined;\n }\n let result = rollback?.grid ?? getPredictResult(\n width,\n height,\n avgTileTime,\n expectFrameTime,\n lastTraceTime >= 0 ? tilePixels : getInitialProbeSize(width, height),\n maxNumTiles,\n minimumTileSize,\n minimumPredictionSize\n );\n if (measured && columns > 0 && rows > 0 && !unattainableGrid) {\n // Use nominal covered area, rather than ceil-rounded dispatch bounds:\n // the interleaved grid covers every pixel exactly once per sample.\n const point = {area: width * height / numTiles, time: avgTileTime};\n if (lastMeasurement && Math.abs(point.area - lastMeasurement.area) >=\n minimumAffineAreaChange * Math.max(point.area, lastMeasurement.area)) {\n const slope = (point.time - lastMeasurement.time) / (point.area - lastMeasurement.area);\n const fixed = point.time - slope * point.area;\n if (Number.isFinite(slope) && slope > 0 && Number.isFinite(fixed) &&\n fixed >= expectFrameTime * unattainableBudgetTolerance) {\n unattainableGrid = getUnattainableBudgetGrid(width, height, fixed, slope,\n minimumTileSize, maxNumTiles, result.samplesPerFrame);\n }\n }\n lastMeasurement = point;\n }\n if (unattainableGrid) {\n // Retain the decision until explicit invalidation. Re-fitting on its\n // own probe/target grids can alternate counts as path costs fluctuate.\n // Keep the original samplesPerFrame calculation independent of this policy.\n result = {...unattainableGrid, samplesPerFrame: result.samplesPerFrame};\n refinement = undefined;\n }\n if (!unattainableGrid && !rollback && measured && result.numTiles > numTiles) {\n refinement = {\n grid: {tileWidth, tileHeight, columns, rows, numTiles, samplesPerFrame},\n time: avgTileTime\n };\n }\n\n lastFrameTotalTraceTime = 0;\n lastFrameTraceTimeValidCount = 0;\n tileWidth = result.tileWidth;\n tileHeight = result.tileHeight;\n columns = result.columns;\n rows = result.rows;\n numTiles = result.numTiles;\n samplesPerFrame = result.samplesPerFrame;\n }\n\n const x = currentTile % columns;\n const y = Math.floor(currentTile / columns) % rows;\n const isLastTile = currentTile === numTiles - 1;\n\n tilePixels = [tileWidth, tileHeight];\n\n return {\n xIndex: x,\n yIndex: y,\n columns,\n rows,\n x: x * tileWidth,\n y: y * tileHeight,\n tileWidth,\n tileHeight,\n isFirstTile: currentTile === 0,\n isLastTile,\n samplesPerFrame\n };\n }\n\n return {\n nextTile,\n reset() {\n currentTile = -1;\n },\n setSize(w: number, h: number) {\n if (width !== w || height !== h) {\n timingRevision++;\n clearPredictionEvidence();\n lastTraceTime = -1;\n lastFrameTotalTraceTime = 0;\n lastFrameTraceTimeValidCount = 0;\n }\n width = w;\n height = h;\n },\n setMaxTiles(maxTiles: number) {\n if (maxNumTiles !== maxTiles) {\n timingRevision++;\n clearPredictionEvidence();\n }\n maxNumTiles = maxTiles;\n },\n setDesiredMsPerTile(time: number) {\n if (expectFrameTime !== time) {\n timingRevision++;\n clearPredictionEvidence();\n }\n expectFrameTime = time;\n },\n needsUpdatePredicting() {\n clearPredictionEvidence();\n timingRevision++;\n lastTraceTime = -1;\n lastFrameTotalTraceTime = 0;\n lastFrameTraceTimeValidCount = 0;\n },\n setLastTraceTime(time: number, timedColumns = columns, timedRows = rows) {\n // A timestamp can arrive after the next sample changed the grid. Only\n // compare measurements of the grid currently being evaluated.\n if (timedColumns !== columns || timedRows !== rows || !Number.isFinite(time) || time <= 0) return;\n timingRevision++;\n lastTraceTime = time;\n lastFrameTraceTimeValidCount++;\n lastFrameTotalTraceTime += time;\n },\n getLastTraceTime() {\n return lastTraceTime;\n },\n getDesiredMsPerTile() {\n return expectFrameTime;\n }\n };\n}\n\n\nfunction pixelsPerTileEstimate(gl: WebGL2RenderingContext) {\n const maxRenderbufferSize = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);\n\n if (maxRenderbufferSize <= 8192) {\n return 200000;\n } else {\n // 16K render targets are common on current desktop/integrated GPUs. The\n // old 400K seed unnecessarily split even 720p into several tiles and took\n // dozens of samples to grow to a full-frame tile.\n return 1000000;\n }\n}\n"]}
@@ -8,6 +8,9 @@ export declare class WGPUAov {
8
8
  height: number;
9
9
  samples: number;
10
10
  centerReady: boolean;
11
+ compact: boolean;
12
+ private revision;
13
+ private readonly borrowed;
11
14
  accumulation?: GPUBuffer;
12
15
  center?: GPUBuffer;
13
16
  previousCenter?: GPUBuffer;
@@ -23,13 +26,15 @@ export declare class WGPUAov {
23
26
  private readonly snapshotLeases;
24
27
  private readonly snapshotBuffers;
25
28
  constructor(device: GPUDevice);
29
+ private resolveCode;
26
30
  reset(): void;
27
- resize(width: number, height: number): void;
31
+ resize(width: number, height: number, compact?: boolean): void;
28
32
  setScene(words: Uint32Array, primitiveIds?: Uint32Array): void;
29
33
  get bytes(): number;
30
34
  snapshot(kinds: readonly AovKind[]): Partial<Record<AovKind, GPUBuffer>>;
31
35
  releaseSnapshot(buffers: Partial<Record<AovKind, GPUBuffer>>): void;
32
36
  visualize(kind: AovKind, options: AovDisplayOptions, linear: boolean): GPUTexture;
37
+ texture(kind: 'depth' | 'diffuseColor' | 'specularColor'): GPUTexture | undefined;
33
38
  read(kind: AovKind): Promise<{
34
39
  width: number;
35
40
  height: number;
@@ -1,7 +1,12 @@
1
+ import { textureBytes } from './gpuMemory.js';
2
+ import { compactAovResolveCode } from './wgsl/aovCompact.wgsl.js';
3
+ import { aovBorrowDepthShader, aovBorrowReflectanceShader } from './wgsl/aovResolve.wgsl.js';
1
4
  import { aovDisplayShader } from './wgsl/aovDisplay.wgsl.js';
2
5
  import { packAovDisplay } from './aovDisplay.js';
3
6
  import { aovSnapshotShader, aovSnapshotBinding, AOV_SNAPSHOT_BATCH_SIZE } from './wgsl/aovSnapshot.wgsl.js';
4
- import { AovHistory, AOV_KINDS, AOV_LAYOUT, aovMask } from './aov.js';
7
+ import { AovHistory, AOV_KINDS, AOV_LAYOUT, aovLaneKind, aovMask } from './aov.js';
8
+ /** @internal Content revision of each borrowed AOV texture; changes whenever it is re-resolved. */
9
+ export const borrowedAovRevision = new WeakMap();
5
10
  /** One target's optional AOV allocations and accepted frame history. */
6
11
  export class WGPUAov {
7
12
  device;
@@ -10,6 +15,9 @@ export class WGPUAov {
10
15
  height = 0;
11
16
  samples = 0;
12
17
  centerReady = false;
18
+ compact = false;
19
+ revision = 0;
20
+ borrowed = new Map();
13
21
  accumulation;
14
22
  center;
15
23
  previousCenter;
@@ -27,8 +35,12 @@ export class WGPUAov {
27
35
  constructor(device) {
28
36
  this.device = device;
29
37
  }
38
+ resolveCode(code) {
39
+ return this.compact ? compactAovResolveCode(code) : code;
40
+ }
30
41
  reset() {
31
- if (this.centerReady && this.center && this.previousCenter) {
42
+ this.revision++;
43
+ if (!this.compact && this.centerReady && this.center && this.previousCenter) {
32
44
  const encoder = this.device.createCommandEncoder();
33
45
  encoder.copyBufferToBuffer(this.center, 0, this.previousCenter, 0, this.center.size);
34
46
  this.device.queue.submit([encoder.finish()]);
@@ -37,20 +49,23 @@ export class WGPUAov {
37
49
  this.centerReady = false;
38
50
  this.frame = undefined;
39
51
  }
40
- resize(width, height) {
41
- if (width === this.width && height === this.height)
52
+ resize(width, height, compact = false) {
53
+ if (width === this.width && height === this.height && compact === this.compact)
42
54
  return;
43
- if (width * height * AOV_LAYOUT.accumulatedBytes > this.device.limits.maxStorageBufferBindingSize || width * height * AOV_LAYOUT.accumulatedBytes > this.device.limits.maxBufferSize)
55
+ const stride = compact ? 24 : AOV_LAYOUT.accumulatedBytes;
56
+ if (width * height * stride > this.device.limits.maxStorageBufferBindingSize || width * height * stride > this.device.limits.maxBufferSize)
44
57
  throw new RangeError('AOV accumulation exceeds device buffer limits');
45
58
  this.dispose();
46
59
  this.history.clear();
47
60
  this.reset();
48
61
  this.width = width;
49
62
  this.height = height;
63
+ this.compact = compact;
64
+ this.displayPipeline = undefined;
50
65
  const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;
51
- this.accumulation = this.device.createBuffer({ label: 'AOV accumulation', size: width * height * AOV_LAYOUT.accumulatedBytes, usage });
52
- this.previousCenter = this.device.createBuffer({ label: 'Previous AOV center', size: width * height * AOV_LAYOUT.centerBytes, usage });
53
- this.center = this.device.createBuffer({ label: 'AOV center', size: width * height * AOV_LAYOUT.centerBytes, usage });
66
+ this.accumulation = this.device.createBuffer({ label: 'AOV accumulation', size: width * height * stride, usage });
67
+ this.previousCenter = this.device.createBuffer({ label: 'Previous AOV center', size: compact ? 32 : width * height * AOV_LAYOUT.centerBytes, usage });
68
+ this.center = this.device.createBuffer({ label: 'AOV center', size: compact ? 32 : width * height * AOV_LAYOUT.centerBytes, usage });
54
69
  }
55
70
  setScene(words, primitiveIds) {
56
71
  const bytes = words.byteLength + (primitiveIds?.byteLength ?? 0);
@@ -72,7 +87,7 @@ export class WGPUAov {
72
87
  this.scenePrimitives = primitiveIds;
73
88
  this.scenePrimitiveOffset = words.byteLength;
74
89
  }
75
- get bytes() { return (this.accumulation?.size ?? 0) + (this.center?.size ?? 0) + (this.previousCenter?.size ?? 0) + (this.scene?.size ?? 0) + (this.displayTexture ? this.width * this.height * 8 : 0) + [...this.snapshotBuffers].reduce((bytes, buffer) => bytes + buffer.size, 0); }
90
+ get bytes() { return (this.accumulation?.size ?? 0) + (this.center?.size ?? 0) + (this.previousCenter?.size ?? 0) + (this.scene?.size ?? 0) + (this.displayTexture ? this.width * this.height * 8 : 0) + [...this.borrowed.values()].reduce((bytes, entry) => bytes + textureBytes(entry.image), 0) + [...this.snapshotBuffers].reduce((bytes, buffer) => bytes + buffer.size, 0); }
76
91
  snapshot(kinds) {
77
92
  if (!this.accumulation || !this.center || !this.samples)
78
93
  throw new Error('AOV output is not ready');
@@ -81,11 +96,11 @@ export class WGPUAov {
81
96
  const unique = AOV_KINDS.filter(kind => kinds.includes(kind));
82
97
  const batches = [];
83
98
  for (let offset = 0; offset < unique.length; offset += AOV_SNAPSHOT_BATCH_SIZE) {
84
- const batch = unique.slice(offset, offset + AOV_SNAPSHOT_BATCH_SIZE), key = batch.join(',');
99
+ const batch = unique.slice(offset, offset + AOV_SNAPSHOT_BATCH_SIZE), key = `${this.compact}:${batch.join(',')}`;
85
100
  let pipeline = this.resolvePipelines.get(key);
86
101
  if (!pipeline) {
87
102
  pipeline = device.createComputePipeline({ label: 'AOV snapshot', layout: 'auto',
88
- compute: { module: device.createShaderModule({ code: aovSnapshotShader(batch) }), entryPoint: 'main' } });
103
+ compute: { module: device.createShaderModule({ code: this.resolveCode(aovSnapshotShader(batch)) }), entryPoint: 'main', ...(this.compact ? { constants: { AOV_COMPACT: 1 } } : {}) } });
89
104
  this.resolvePipelines.set(key, pipeline);
90
105
  }
91
106
  batches.push({ kinds: batch, pipeline });
@@ -160,7 +175,7 @@ export class WGPUAov {
160
175
  if (!this.accumulation || !this.center || !this.samples)
161
176
  throw new Error('AOV output is not ready');
162
177
  const device = this.device;
163
- this.displayPipeline ??= device.createComputePipeline({ label: 'AOV visualization', layout: 'auto', compute: { module: device.createShaderModule({ code: aovDisplayShader('rgba16float') }), entryPoint: 'main' } });
178
+ this.displayPipeline ??= device.createComputePipeline({ label: 'AOV visualization', layout: 'auto', compute: { module: device.createShaderModule({ code: this.resolveCode(aovDisplayShader('rgba16float')) }), entryPoint: 'main', ...(this.compact ? { constants: { AOV_COMPACT: 1 } } : {}) } });
164
179
  if (!this.displayTexture || this.displayTexture.width !== this.width || this.displayTexture.height !== this.height) {
165
180
  this.displayTexture?.destroy();
166
181
  this.displayTexture = device.createTexture({ label: 'AOV display image', size: [this.width, this.height], format: 'rgba16float', usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC });
@@ -179,7 +194,84 @@ export class WGPUAov {
179
194
  parameters.destroy();
180
195
  return this.displayTexture;
181
196
  }
197
+ texture(kind) {
198
+ if (!this.samples || !this.accumulation || !this.center)
199
+ return;
200
+ const device = this.device;
201
+ let entry = this.borrowed.get(kind);
202
+ if (!entry) {
203
+ // Reflectance in [0,1] is stored sRGB-encoded in 8 bits (decoded on load), halving its memory
204
+ // with fine steps for dark albedo; depth keeps float32 precision.
205
+ const depth = kind === 'depth', format = depth ? 'rg32float' : 'rgba8unorm-srgb';
206
+ const constants = this.compact ? { constants: { AOV_COMPACT: 1 } } : {};
207
+ let pipeline;
208
+ if (depth) {
209
+ pipeline = device.createComputePipeline({ label: `Borrow ${kind}`, layout: 'auto', compute: {
210
+ module: device.createShaderModule({ code: this.resolveCode(aovBorrowDepthShader) }), entryPoint: 'main', ...constants
211
+ } });
212
+ }
213
+ else {
214
+ const module = device.createShaderModule({ code: this.resolveCode(aovBorrowReflectanceShader) });
215
+ pipeline = device.createRenderPipeline({ label: `Borrow ${kind}`, layout: 'auto', vertex: { module, entryPoint: 'vertex', ...constants },
216
+ fragment: { module, entryPoint: 'fragment', targets: [{ format }], ...constants } });
217
+ }
218
+ const image = device.createTexture({ label: `Borrow ${kind}`, size: [this.width, this.height], format,
219
+ usage: (depth ? GPUTextureUsage.STORAGE_BINDING : GPUTextureUsage.RENDER_ATTACHMENT) | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC });
220
+ entry = { image, pipeline, samples: -1, revision: -1 };
221
+ this.borrowed.set(kind, entry);
222
+ }
223
+ if (entry.samples !== this.samples || entry.revision !== this.revision) {
224
+ const parameters = device.createBuffer({ size: 16, usage: GPUBufferUsage.UNIFORM, mappedAtCreation: true });
225
+ new Uint32Array(parameters.getMappedRange()).set([this.width, this.height, this.samples, aovLaneKind(kind)]);
226
+ parameters.unmap();
227
+ const encoder = device.createCommandEncoder();
228
+ const entries = [{ binding: 0, resource: { buffer: this.accumulation } }, { binding: 1, resource: { buffer: this.center } }, { binding: 3, resource: { buffer: parameters } }];
229
+ if (kind === 'depth') {
230
+ const pipeline = entry.pipeline;
231
+ const group = device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [...entries, { binding: 2, resource: entry.image.createView() }] });
232
+ const pass = encoder.beginComputePass({ label: `Resolve ${kind}` });
233
+ pass.setPipeline(pipeline);
234
+ pass.setBindGroup(0, group);
235
+ pass.dispatchWorkgroups(Math.ceil(this.width / 8), Math.ceil(this.height / 8));
236
+ pass.end();
237
+ }
238
+ else {
239
+ const pipeline = entry.pipeline;
240
+ const group = device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries });
241
+ const pass = encoder.beginRenderPass({ label: `Resolve ${kind}`, colorAttachments: [{ view: entry.image.createView(), loadOp: 'clear', storeOp: 'store' }] });
242
+ pass.setPipeline(pipeline);
243
+ pass.setBindGroup(0, group);
244
+ pass.draw(3);
245
+ pass.end();
246
+ }
247
+ device.queue.submit([encoder.finish()]);
248
+ parameters.destroy();
249
+ entry.samples = this.samples;
250
+ entry.revision = this.revision;
251
+ borrowedAovRevision.set(entry.image, (borrowedAovRevision.get(entry.image) ?? 0) + 1);
252
+ }
253
+ return entry.image;
254
+ }
182
255
  async read(kind) {
256
+ if (this.compact) {
257
+ const buffers = this.snapshot([kind]), source = buffers[kind];
258
+ const staging = this.device.createBuffer({ size: source.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST });
259
+ try {
260
+ const encoder = this.device.createCommandEncoder();
261
+ encoder.copyBufferToBuffer(source, 0, staging, 0, source.size);
262
+ this.device.queue.submit([encoder.finish()]);
263
+ await staging.mapAsync(GPUMapMode.READ);
264
+ return { width: this.width, height: this.height, data: new Float32Array(staging.getMappedRange().slice(0)) };
265
+ }
266
+ finally {
267
+ if (staging.mapState === 'mapped')
268
+ staging.unmap();
269
+ staging.destroy();
270
+ this.snapshotLeases.delete(source);
271
+ this.snapshotBuffers.delete(source);
272
+ source.destroy();
273
+ }
274
+ }
183
275
  const center = kind === 'id' || kind === 'motion';
184
276
  const source = center ? this.center : this.accumulation;
185
277
  const staging = this.device.createBuffer({ size: source.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST });
@@ -208,7 +300,7 @@ export class WGPUAov {
208
300
  else if (kind === 'roughness')
209
301
  data.set([f[o + 1] * inv, f[o + 2] * inv, f[o + 3] * inv, coverage], target);
210
302
  else {
211
- const offset = kind === 'diffuseAlbedo' ? o + 8 : o + 12, valid = f[offset + 3];
303
+ const offset = aovLaneKind(kind) === 3 ? o + 8 : o + 12, valid = f[offset + 3];
212
304
  const scale = valid > 0 ? 1 / valid : 0;
213
305
  data.set([f[offset] * scale, f[offset + 1] * scale, f[offset + 2] * scale, valid / Math.max(1, this.samples)], target);
214
306
  }
@@ -223,6 +315,8 @@ export class WGPUAov {
223
315
  }
224
316
  }
225
317
  dispose() {
318
+ const borrowed = [...this.borrowed.values()];
319
+ this.borrowed.clear();
226
320
  const texture = this.displayTexture;
227
321
  this.displayTexture = undefined;
228
322
  this.scenePrimitives = undefined;
@@ -233,7 +327,7 @@ export class WGPUAov {
233
327
  pooled.forEach(buffer => this.snapshotBuffers.delete(buffer));
234
328
  const buffers = [this.accumulation, this.center, this.scene, this.previousCenter, ...pooled];
235
329
  this.accumulation = this.center = this.scene = this.previousCenter = undefined;
236
- void this.device.queue.onSubmittedWorkDone().catch(() => undefined).then(() => { texture?.destroy(); buffers.forEach(buffer => buffer?.destroy()); });
330
+ void this.device.queue.onSubmittedWorkDone().catch(() => undefined).then(() => { borrowed.forEach(entry => entry.image.destroy()); texture?.destroy(); buffers.forEach(buffer => buffer?.destroy()); });
237
331
  }
238
332
  }
239
333
  //# sourceMappingURL=WGPUAov.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WGPUAov.js","sourceRoot":"","sources":["../../src/renderer/WGPUAov.ts"],"names":[],"mappings":"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","sourcesContent":["import {aovDisplayShader} from './wgsl/aovDisplay.wgsl.js';\nimport {packAovDisplay, type AovDisplayOptions} from './aovDisplay.js';\nimport {aovSnapshotShader, aovSnapshotBinding, AOV_SNAPSHOT_BATCH_SIZE} from './wgsl/aovSnapshot.wgsl.js';\nimport {AovHistory, AOV_KINDS, AOV_LAYOUT, aovMask, type AovKind, type AovFrameSnapshot} from './aov.js';\n/** One target's optional AOV allocations and accepted frame history. */\nexport class WGPUAov {\n readonly history = new AovHistory();\n width = 0; height = 0; samples = 0; centerReady = false;\n accumulation?: GPUBuffer; center?: GPUBuffer; previousCenter?: GPUBuffer; scene?: GPUBuffer;\n frame?: AovFrameSnapshot;\n private displayPipeline?: GPUComputePipeline;\n private displayTexture?: GPUTexture;\n private readonly resolvePipelines = new Map<string, GPUComputePipeline>();\n private scenePrimitives?: Uint32Array;\n private scenePrimitiveOffset = 0;\n private snapshotGeneration = 0;\n private readonly snapshotPool = new Map<AovKind, GPUBuffer>();\n private readonly snapshotLeases = new WeakMap<GPUBuffer, {kind: AovKind; generation: number}>();\n private readonly snapshotBuffers = new Set<GPUBuffer>();\n constructor(readonly device: GPUDevice) {}\n reset() {\n if (this.centerReady && this.center && this.previousCenter) {\n const encoder=this.device.createCommandEncoder();encoder.copyBufferToBuffer(this.center,0,this.previousCenter,0,this.center.size);this.device.queue.submit([encoder.finish()]);\n }\n this.samples = 0; this.centerReady = false; this.frame = undefined; }\n resize(width: number, height: number) {\n if (width === this.width && height === this.height) return;\n if (width*height*AOV_LAYOUT.accumulatedBytes>this.device.limits.maxStorageBufferBindingSize || width*height*AOV_LAYOUT.accumulatedBytes>this.device.limits.maxBufferSize) throw new RangeError('AOV accumulation exceeds device buffer limits');\n this.dispose(); this.history.clear(); this.reset(); this.width = width; this.height = height;\n const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n this.accumulation = this.device.createBuffer({label: 'AOV accumulation', size: width * height * AOV_LAYOUT.accumulatedBytes, usage});\n this.previousCenter = this.device.createBuffer({label: 'Previous AOV center', size: width*height*AOV_LAYOUT.centerBytes, usage});\n this.center = this.device.createBuffer({label: 'AOV center', size: width * height * AOV_LAYOUT.centerBytes, usage});\n }\n setScene(words: Uint32Array, primitiveIds?: Uint32Array) {\n const bytes = words.byteLength + (primitiveIds?.byteLength ?? 0);\n if (bytes > this.device.limits.maxStorageBufferBindingSize) throw new RangeError('AOV scene metadata exceeds device storage binding limit');\n let replaced = false;\n if (!this.scene || this.scene.size < bytes) {\n this.scene?.destroy();\n this.scene = this.device.createBuffer({label: 'AOV identities/history', size: Math.max(16, bytes), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST});\n replaced = true;\n }\n this.device.queue.writeBuffer(this.scene, 0, words);\n // Primitive-cache arrays are immutable. Camera, material and rigid edits\n // update only the prefix; topology/storage replacements change the tail's\n // identity, and instance/material counts can move its byte offset.\n if (primitiveIds && (replaced || this.scenePrimitives !== primitiveIds || this.scenePrimitiveOffset !== words.byteLength)) {\n this.device.queue.writeBuffer(this.scene, words.byteLength, primitiveIds);\n }\n this.scenePrimitives = primitiveIds; this.scenePrimitiveOffset = words.byteLength;\n }\n get bytes() { return (this.accumulation?.size ?? 0) + (this.center?.size ?? 0) + (this.previousCenter?.size ?? 0) + (this.scene?.size ?? 0) + (this.displayTexture ? this.width*this.height*8 : 0) + [...this.snapshotBuffers].reduce((bytes, buffer) => bytes + buffer.size, 0); }\n snapshot(kinds: readonly AovKind[]): Partial<Record<AovKind,GPUBuffer>> {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device = this.device;\n aovMask(kinds);\n const unique = AOV_KINDS.filter(kind => kinds.includes(kind));\n const batches: {kinds: AovKind[]; pipeline: GPUComputePipeline}[] = [];\n for (let offset = 0; offset < unique.length; offset += AOV_SNAPSHOT_BATCH_SIZE) {\n const batch = unique.slice(offset, offset + AOV_SNAPSHOT_BATCH_SIZE), key = batch.join(',');\n let pipeline = this.resolvePipelines.get(key);\n if (!pipeline) {\n pipeline = device.createComputePipeline({label: 'AOV snapshot', layout: 'auto',\n compute: {module: device.createShaderModule({code: aovSnapshotShader(batch)}), entryPoint: 'main'}});\n this.resolvePipelines.set(key, pipeline);\n }\n batches.push({kinds: batch, pipeline});\n }\n const buffers: Partial<Record<AovKind, GPUBuffer>> = {};\n if (!batches.length) return buffers;\n const parameters = device.createBuffer({size: 16, usage: GPUBufferUsage.UNIFORM, mappedAtCreation: true});\n new Uint32Array(parameters.getMappedRange()).set([this.width, this.height, this.samples, 0]); parameters.unmap();\n try {\n const encoder = device.createCommandEncoder({label: 'AOV snapshot'}), pass = encoder.beginComputePass();\n for (const {kinds: batch, pipeline} of batches) {\n const entries: GPUBindGroupEntry[] = [\n {binding: 0, resource: {buffer: this.accumulation}},\n {binding: 1, resource: {buffer: this.center}},\n {binding: 3, resource: {buffer: parameters}}\n ];\n batch.forEach((kind, index) => {\n const buffer = this.snapshotPool.get(kind) ?? device.createBuffer({label: `Custom ${kind} input`, size: this.width * this.height * 16,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST});\n this.snapshotPool.delete(kind);\n this.snapshotLeases.set(buffer, {kind, generation: this.snapshotGeneration});\n this.snapshotBuffers.add(buffer);\n buffers[kind] = buffer;\n entries.push({binding: aovSnapshotBinding(index), resource: {buffer}});\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, device.createBindGroup({layout: pipeline.getBindGroupLayout(0), entries}));\n pass.dispatchWorkgroups(Math.ceil(this.width / 8), Math.ceil(this.height / 8));\n }\n pass.end(); device.queue.submit([encoder.finish()]);\n return buffers;\n } catch (error) {\n // Nothing was submitted, so these unfinished outputs can be retired now.\n Object.values(buffers).forEach(buffer => {\n if (buffer) {this.snapshotLeases.delete(buffer); this.snapshotBuffers.delete(buffer); buffer.destroy();}\n });\n throw error;\n } finally { parameters.destroy(); }\n }\n // Call only after the consumer and its queued GPU work have finished. Each\n // in-flight denoiser owns separate outputs, including cancelled jobs whose\n // callbacks have not settled. Keep at most one reusable buffer per kind.\n releaseSnapshot(buffers: Partial<Record<AovKind, GPUBuffer>>) {\n for (const buffer of Object.values(buffers)) {\n if (!buffer) continue;\n const lease = this.snapshotLeases.get(buffer);\n if (!lease) continue;\n this.snapshotLeases.delete(buffer);\n if (lease.generation === this.snapshotGeneration && !this.snapshotPool.has(lease.kind)) {\n this.snapshotPool.set(lease.kind, buffer);\n } else { this.snapshotBuffers.delete(buffer); buffer.destroy(); }\n }\n }\n visualize(kind: AovKind, options: AovDisplayOptions, linear: boolean): GPUTexture {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device=this.device;\n this.displayPipeline ??= device.createComputePipeline({label:'AOV visualization',layout:'auto',compute:{module:device.createShaderModule({code:aovDisplayShader('rgba16float')}),entryPoint:'main'}});\n if(!this.displayTexture || this.displayTexture.width!==this.width || this.displayTexture.height!==this.height){\n this.displayTexture?.destroy();\n this.displayTexture=device.createTexture({label:'AOV display image',size:[this.width,this.height],format:'rgba16float',usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC});\n }\n const words=packAovDisplay(this.width,this.height,this.samples,kind,options,linear);\n const parameters=device.createBuffer({size:48,usage:GPUBufferUsage.UNIFORM,mappedAtCreation:true});new Uint32Array(parameters.getMappedRange()).set(words);parameters.unmap();\n const group=device.createBindGroup({layout:this.displayPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.accumulation}},{binding:1,resource:{buffer:this.center}},{binding:2,resource:this.displayTexture.createView()},{binding:3,resource:{buffer:parameters}}]});\n const encoder=device.createCommandEncoder(),pass=encoder.beginComputePass();pass.setPipeline(this.displayPipeline);pass.setBindGroup(0,group);pass.dispatchWorkgroups(Math.ceil(this.width/8),Math.ceil(this.height/8));pass.end();device.queue.submit([encoder.finish()]);parameters.destroy();\n return this.displayTexture;\n }\n async read(kind: AovKind) {\n const center = kind === 'id' || kind === 'motion';\n const source = center ? this.center! : this.accumulation!;\n const staging = this.device.createBuffer({size: source.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n try {\n const encoder = this.device.createCommandEncoder(); encoder.copyBufferToBuffer(source, 0, staging, 0, source.size);\n this.device.queue.submit([encoder.finish()]); await staging.mapAsync(GPUMapMode.READ);\n const f = new Float32Array(staging.getMappedRange()), u = new Uint32Array(f.buffer);\n const data = kind === 'id' ? new Uint32Array(this.width*this.height*4) : new Float32Array(this.width*this.height*4);\n for (let y = 0; y < this.height; y++) for (let x = 0; x < this.width; x++) {\n const target = (y * this.width + x) * 4;\n // Tracing uses OpenGL camera coordinates; API images are top row first.\n const pixel = ((this.height-1-y)*this.width+x), o = pixel * (center ? 8 : 16);\n if (kind === 'id') data.set(u.subarray(o, o+4), target);\n else if (kind === 'motion') data.set([f[o+4],f[o+5],0,f[o+7]], target);\n else {\n const hits = f[o+7], coverage = hits / Math.max(1, this.samples), inv = hits > 0 ? 1 / hits : 0;\n if (kind === 'depth') data.set([f[o]*inv, 0, 0, coverage], target);\n else if (kind === 'position') data.set([f[o+4]*inv, f[o+5]*inv, f[o+6]*inv, coverage], target);\n else if (kind === 'roughness') data.set([f[o+1]*inv, f[o+2]*inv, f[o+3]*inv, coverage], target);\n else { const offset = kind === 'diffuseAlbedo' ? o+8 : o+12, valid = f[offset+3];\n const scale = valid > 0 ? 1/valid : 0;\n data.set([f[offset]*scale, f[offset+1]*scale, f[offset+2]*scale, valid / Math.max(1,this.samples)], target); }\n }\n }\n return {width: this.width, height: this.height, data};\n } finally { if (staging.mapState === 'mapped') staging.unmap(); staging.destroy(); }\n }\n dispose() {\n const texture=this.displayTexture;this.displayTexture=undefined;\n this.scenePrimitives = undefined; this.scenePrimitiveOffset = 0;\n this.snapshotGeneration++;\n const pooled = [...this.snapshotPool.values()]; this.snapshotPool.clear();\n pooled.forEach(buffer => this.snapshotBuffers.delete(buffer));\n const buffers=[this.accumulation,this.center,this.scene,this.previousCenter,...pooled];\n this.accumulation=this.center=this.scene=this.previousCenter=undefined;\n void this.device.queue.onSubmittedWorkDone().catch(()=>undefined).then(()=>{texture?.destroy();buffers.forEach(buffer=>buffer?.destroy());});\n }\n}\n"]}
1
+ {"version":3,"file":"WGPUAov.js","sourceRoot":"","sources":["../../src/renderer/WGPUAov.ts"],"names":[],"mappings":"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","sourcesContent":["import {textureBytes} from './gpuMemory.js';\nimport {compactAovResolveCode} from './wgsl/aovCompact.wgsl.js';\nimport {aovBorrowDepthShader, aovBorrowReflectanceShader} from './wgsl/aovResolve.wgsl.js';\nimport {aovDisplayShader} from './wgsl/aovDisplay.wgsl.js';\nimport {packAovDisplay, type AovDisplayOptions} from './aovDisplay.js';\nimport {aovSnapshotShader, aovSnapshotBinding, AOV_SNAPSHOT_BATCH_SIZE} from './wgsl/aovSnapshot.wgsl.js';\nimport {AovHistory, AOV_KINDS, AOV_LAYOUT, aovLaneKind, aovMask, type AovKind, type AovFrameSnapshot} from './aov.js';\n/** @internal Content revision of each borrowed AOV texture; changes whenever it is re-resolved. */\nexport const borrowedAovRevision = new WeakMap<GPUTexture, number>();\n/** One target's optional AOV allocations and accepted frame history. */\nexport class WGPUAov {\n readonly history = new AovHistory();\n width = 0; height = 0; samples = 0; centerReady = false; compact = false;\n private revision = 0;\n private readonly borrowed = new Map<AovKind, {image: GPUTexture; pipeline: GPUComputePipeline | GPURenderPipeline; samples: number; revision: number}>();\n accumulation?: GPUBuffer; center?: GPUBuffer; previousCenter?: GPUBuffer; scene?: GPUBuffer;\n frame?: AovFrameSnapshot;\n private displayPipeline?: GPUComputePipeline;\n private displayTexture?: GPUTexture;\n private readonly resolvePipelines = new Map<string, GPUComputePipeline>();\n private scenePrimitives?: Uint32Array;\n private scenePrimitiveOffset = 0;\n private snapshotGeneration = 0;\n private readonly snapshotPool = new Map<AovKind, GPUBuffer>();\n private readonly snapshotLeases = new WeakMap<GPUBuffer, {kind: AovKind; generation: number}>();\n private readonly snapshotBuffers = new Set<GPUBuffer>();\n constructor(readonly device: GPUDevice) {}\n private resolveCode(code: string) {\n return this.compact ? compactAovResolveCode(code) : code;\n }\n reset() {\n this.revision++;\n if (!this.compact && this.centerReady && this.center && this.previousCenter) {\n const encoder=this.device.createCommandEncoder();encoder.copyBufferToBuffer(this.center,0,this.previousCenter,0,this.center.size);this.device.queue.submit([encoder.finish()]);\n }\n this.samples = 0; this.centerReady = false; this.frame = undefined; }\n resize(width: number, height: number, compact = false) {\n if (width === this.width && height === this.height && compact === this.compact) return;\n const stride = compact ? 24 : AOV_LAYOUT.accumulatedBytes;\n if (width*height*stride>this.device.limits.maxStorageBufferBindingSize || width*height*stride>this.device.limits.maxBufferSize) throw new RangeError('AOV accumulation exceeds device buffer limits');\n this.dispose(); this.history.clear(); this.reset(); this.width = width; this.height = height; this.compact = compact; this.displayPipeline = undefined;\n const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n this.accumulation = this.device.createBuffer({label: 'AOV accumulation', size: width * height * stride, usage});\n this.previousCenter = this.device.createBuffer({label: 'Previous AOV center', size: compact ? 32 : width*height*AOV_LAYOUT.centerBytes, usage});\n this.center = this.device.createBuffer({label: 'AOV center', size: compact ? 32 : width * height * AOV_LAYOUT.centerBytes, usage});\n }\n setScene(words: Uint32Array, primitiveIds?: Uint32Array) {\n const bytes = words.byteLength + (primitiveIds?.byteLength ?? 0);\n if (bytes > this.device.limits.maxStorageBufferBindingSize) throw new RangeError('AOV scene metadata exceeds device storage binding limit');\n let replaced = false;\n if (!this.scene || this.scene.size < bytes) {\n this.scene?.destroy();\n this.scene = this.device.createBuffer({label: 'AOV identities/history', size: Math.max(16, bytes), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST});\n replaced = true;\n }\n this.device.queue.writeBuffer(this.scene, 0, words);\n // Primitive-cache arrays are immutable. Camera, material and rigid edits\n // update only the prefix; topology/storage replacements change the tail's\n // identity, and instance/material counts can move its byte offset.\n if (primitiveIds && (replaced || this.scenePrimitives !== primitiveIds || this.scenePrimitiveOffset !== words.byteLength)) {\n this.device.queue.writeBuffer(this.scene, words.byteLength, primitiveIds);\n }\n this.scenePrimitives = primitiveIds; this.scenePrimitiveOffset = words.byteLength;\n }\n get bytes() { return (this.accumulation?.size ?? 0) + (this.center?.size ?? 0) + (this.previousCenter?.size ?? 0) + (this.scene?.size ?? 0) + (this.displayTexture ? this.width*this.height*8 : 0) + [...this.borrowed.values()].reduce((bytes, entry) => bytes + textureBytes(entry.image), 0) + [...this.snapshotBuffers].reduce((bytes, buffer) => bytes + buffer.size, 0); }\n snapshot(kinds: readonly AovKind[]): Partial<Record<AovKind,GPUBuffer>> {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device = this.device;\n aovMask(kinds);\n const unique = AOV_KINDS.filter(kind => kinds.includes(kind));\n const batches: {kinds: AovKind[]; pipeline: GPUComputePipeline}[] = [];\n for (let offset = 0; offset < unique.length; offset += AOV_SNAPSHOT_BATCH_SIZE) {\n const batch = unique.slice(offset, offset + AOV_SNAPSHOT_BATCH_SIZE), key = `${this.compact}:${batch.join(',')}`;\n let pipeline = this.resolvePipelines.get(key);\n if (!pipeline) {\n pipeline = device.createComputePipeline({label: 'AOV snapshot', layout: 'auto',\n compute: {module: device.createShaderModule({code: this.resolveCode(aovSnapshotShader(batch))}), entryPoint: 'main', ...(this.compact ? {constants: {AOV_COMPACT: 1}} : {})}});\n this.resolvePipelines.set(key, pipeline);\n }\n batches.push({kinds: batch, pipeline});\n }\n const buffers: Partial<Record<AovKind, GPUBuffer>> = {};\n if (!batches.length) return buffers;\n const parameters = device.createBuffer({size: 16, usage: GPUBufferUsage.UNIFORM, mappedAtCreation: true});\n new Uint32Array(parameters.getMappedRange()).set([this.width, this.height, this.samples, 0]); parameters.unmap();\n try {\n const encoder = device.createCommandEncoder({label: 'AOV snapshot'}), pass = encoder.beginComputePass();\n for (const {kinds: batch, pipeline} of batches) {\n const entries: GPUBindGroupEntry[] = [\n {binding: 0, resource: {buffer: this.accumulation}},\n {binding: 1, resource: {buffer: this.center}},\n {binding: 3, resource: {buffer: parameters}}\n ];\n batch.forEach((kind, index) => {\n const buffer = this.snapshotPool.get(kind) ?? device.createBuffer({label: `Custom ${kind} input`, size: this.width * this.height * 16,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST});\n this.snapshotPool.delete(kind);\n this.snapshotLeases.set(buffer, {kind, generation: this.snapshotGeneration});\n this.snapshotBuffers.add(buffer);\n buffers[kind] = buffer;\n entries.push({binding: aovSnapshotBinding(index), resource: {buffer}});\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, device.createBindGroup({layout: pipeline.getBindGroupLayout(0), entries}));\n pass.dispatchWorkgroups(Math.ceil(this.width / 8), Math.ceil(this.height / 8));\n }\n pass.end(); device.queue.submit([encoder.finish()]);\n return buffers;\n } catch (error) {\n // Nothing was submitted, so these unfinished outputs can be retired now.\n Object.values(buffers).forEach(buffer => {\n if (buffer) {this.snapshotLeases.delete(buffer); this.snapshotBuffers.delete(buffer); buffer.destroy();}\n });\n throw error;\n } finally { parameters.destroy(); }\n }\n // Call only after the consumer and its queued GPU work have finished. Each\n // in-flight denoiser owns separate outputs, including cancelled jobs whose\n // callbacks have not settled. Keep at most one reusable buffer per kind.\n releaseSnapshot(buffers: Partial<Record<AovKind, GPUBuffer>>) {\n for (const buffer of Object.values(buffers)) {\n if (!buffer) continue;\n const lease = this.snapshotLeases.get(buffer);\n if (!lease) continue;\n this.snapshotLeases.delete(buffer);\n if (lease.generation === this.snapshotGeneration && !this.snapshotPool.has(lease.kind)) {\n this.snapshotPool.set(lease.kind, buffer);\n } else { this.snapshotBuffers.delete(buffer); buffer.destroy(); }\n }\n }\n visualize(kind: AovKind, options: AovDisplayOptions, linear: boolean): GPUTexture {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device=this.device;\n this.displayPipeline ??= device.createComputePipeline({label:'AOV visualization',layout:'auto',compute:{module:device.createShaderModule({code:this.resolveCode(aovDisplayShader('rgba16float'))}),entryPoint:'main',...(this.compact ? {constants:{AOV_COMPACT:1}} : {})}});\n if(!this.displayTexture || this.displayTexture.width!==this.width || this.displayTexture.height!==this.height){\n this.displayTexture?.destroy();\n this.displayTexture=device.createTexture({label:'AOV display image',size:[this.width,this.height],format:'rgba16float',usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC});\n }\n const words=packAovDisplay(this.width,this.height,this.samples,kind,options,linear);\n const parameters=device.createBuffer({size:48,usage:GPUBufferUsage.UNIFORM,mappedAtCreation:true});new Uint32Array(parameters.getMappedRange()).set(words);parameters.unmap();\n const group=device.createBindGroup({layout:this.displayPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.accumulation}},{binding:1,resource:{buffer:this.center}},{binding:2,resource:this.displayTexture.createView()},{binding:3,resource:{buffer:parameters}}]});\n const encoder=device.createCommandEncoder(),pass=encoder.beginComputePass();pass.setPipeline(this.displayPipeline);pass.setBindGroup(0,group);pass.dispatchWorkgroups(Math.ceil(this.width/8),Math.ceil(this.height/8));pass.end();device.queue.submit([encoder.finish()]);parameters.destroy();\n return this.displayTexture;\n }\n texture(kind: 'depth' | 'diffuseColor' | 'specularColor'): GPUTexture | undefined {\n if (!this.samples || !this.accumulation || !this.center) return;\n const device = this.device;\n let entry = this.borrowed.get(kind);\n if (!entry) {\n // Reflectance in [0,1] is stored sRGB-encoded in 8 bits (decoded on load), halving its memory\n // with fine steps for dark albedo; depth keeps float32 precision.\n const depth = kind === 'depth', format: GPUTextureFormat = depth ? 'rg32float' : 'rgba8unorm-srgb';\n const constants = this.compact ? {constants: {AOV_COMPACT: 1}} : {};\n let pipeline: GPUComputePipeline | GPURenderPipeline;\n if (depth) {\n pipeline = device.createComputePipeline({label: `Borrow ${kind}`, layout: 'auto', compute: {\n module: device.createShaderModule({code:this.resolveCode(aovBorrowDepthShader)}), entryPoint: 'main', ...constants}});\n } else {\n const module = device.createShaderModule({code:this.resolveCode(aovBorrowReflectanceShader)});\n pipeline = device.createRenderPipeline({label: `Borrow ${kind}`, layout: 'auto', vertex: {module, entryPoint: 'vertex', ...constants},\n fragment: {module, entryPoint: 'fragment', targets: [{format}], ...constants}});\n }\n const image = device.createTexture({label: `Borrow ${kind}`, size: [this.width,this.height], format,\n usage: (depth ? GPUTextureUsage.STORAGE_BINDING : GPUTextureUsage.RENDER_ATTACHMENT) | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC});\n entry = {image, pipeline, samples: -1, revision: -1}; this.borrowed.set(kind, entry);\n }\n if (entry.samples !== this.samples || entry.revision !== this.revision) {\n const parameters = device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM,mappedAtCreation:true});\n new Uint32Array(parameters.getMappedRange()).set([this.width,this.height,this.samples,aovLaneKind(kind)]); parameters.unmap();\n const encoder = device.createCommandEncoder();\n const entries: GPUBindGroupEntry[] = [{binding:0,resource:{buffer:this.accumulation}},{binding:1,resource:{buffer:this.center}},{binding:3,resource:{buffer:parameters}}];\n if (kind === 'depth') {\n const pipeline = entry.pipeline as GPUComputePipeline;\n const group = device.createBindGroup({layout:pipeline.getBindGroupLayout(0),entries:[...entries,{binding:2,resource:entry.image.createView()}]});\n const pass = encoder.beginComputePass({label:`Resolve ${kind}`});\n pass.setPipeline(pipeline);pass.setBindGroup(0,group);pass.dispatchWorkgroups(Math.ceil(this.width/8),Math.ceil(this.height/8));pass.end();\n } else {\n const pipeline = entry.pipeline as GPURenderPipeline;\n const group = device.createBindGroup({layout:pipeline.getBindGroupLayout(0),entries});\n const pass = encoder.beginRenderPass({label:`Resolve ${kind}`,colorAttachments:[{view:entry.image.createView(),loadOp:'clear',storeOp:'store'}]});\n pass.setPipeline(pipeline);pass.setBindGroup(0,group);pass.draw(3);pass.end();\n }\n device.queue.submit([encoder.finish()]);parameters.destroy();entry.samples=this.samples;entry.revision=this.revision;\n borrowedAovRevision.set(entry.image, (borrowedAovRevision.get(entry.image) ?? 0) + 1);\n }\n return entry.image;\n }\n async read(kind: AovKind) {\n if (this.compact) {\n const buffers = this.snapshot([kind]), source = buffers[kind]!;\n const staging = this.device.createBuffer({size: source.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n try {\n const encoder = this.device.createCommandEncoder();encoder.copyBufferToBuffer(source,0,staging,0,source.size);\n this.device.queue.submit([encoder.finish()]);await staging.mapAsync(GPUMapMode.READ);\n return {width:this.width,height:this.height,data:new Float32Array(staging.getMappedRange().slice(0))};\n } finally {\n if(staging.mapState==='mapped')staging.unmap();staging.destroy();\n this.snapshotLeases.delete(source);this.snapshotBuffers.delete(source);source.destroy();\n }\n }\n const center = kind === 'id' || kind === 'motion';\n const source = center ? this.center! : this.accumulation!;\n const staging = this.device.createBuffer({size: source.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n try {\n const encoder = this.device.createCommandEncoder(); encoder.copyBufferToBuffer(source, 0, staging, 0, source.size);\n this.device.queue.submit([encoder.finish()]); await staging.mapAsync(GPUMapMode.READ);\n const f = new Float32Array(staging.getMappedRange()), u = new Uint32Array(f.buffer);\n const data = kind === 'id' ? new Uint32Array(this.width*this.height*4) : new Float32Array(this.width*this.height*4);\n for (let y = 0; y < this.height; y++) for (let x = 0; x < this.width; x++) {\n const target = (y * this.width + x) * 4;\n // Tracing uses OpenGL camera coordinates; API images are top row first.\n const pixel = ((this.height-1-y)*this.width+x), o = pixel * (center ? 8 : 16);\n if (kind === 'id') data.set(u.subarray(o, o+4), target);\n else if (kind === 'motion') data.set([f[o+4],f[o+5],0,f[o+7]], target);\n else {\n const hits = f[o+7], coverage = hits / Math.max(1, this.samples), inv = hits > 0 ? 1 / hits : 0;\n if (kind === 'depth') data.set([f[o]*inv, 0, 0, coverage], target);\n else if (kind === 'position') data.set([f[o+4]*inv, f[o+5]*inv, f[o+6]*inv, coverage], target);\n else if (kind === 'roughness') data.set([f[o+1]*inv, f[o+2]*inv, f[o+3]*inv, coverage], target);\n else { const offset = aovLaneKind(kind) === 3 ? o+8 : o+12, valid = f[offset+3];\n const scale = valid > 0 ? 1/valid : 0;\n data.set([f[offset]*scale, f[offset+1]*scale, f[offset+2]*scale, valid / Math.max(1,this.samples)], target); }\n }\n }\n return {width: this.width, height: this.height, data};\n } finally { if (staging.mapState === 'mapped') staging.unmap(); staging.destroy(); }\n }\n dispose() {\n const borrowed = [...this.borrowed.values()];this.borrowed.clear();\n const texture=this.displayTexture;this.displayTexture=undefined;\n this.scenePrimitives = undefined; this.scenePrimitiveOffset = 0;\n this.snapshotGeneration++;\n const pooled = [...this.snapshotPool.values()]; this.snapshotPool.clear();\n pooled.forEach(buffer => this.snapshotBuffers.delete(buffer));\n const buffers=[this.accumulation,this.center,this.scene,this.previousCenter,...pooled];\n this.accumulation=this.center=this.scene=this.previousCenter=undefined;\n void this.device.queue.onSubmittedWorkDone().catch(()=>undefined).then(()=>{borrowed.forEach(entry=>entry.image.destroy());texture?.destroy();buffers.forEach(buffer=>buffer?.destroy());});\n }\n}\n"]}
@@ -1,4 +1,9 @@
1
1
  import { createCanvas } from '../util/canvas.js';
2
+ // A canvas returns the same context to every engine, and engine disposal defers
3
+ // releasing its surface until submitted GPU work finishes. Only the surface that
4
+ // configured the context last may unconfigure it, so a later engine on the same
5
+ // canvas keeps presenting.
6
+ const owners = new WeakMap();
2
7
  /** One canvas surface; composing or exporting an image never reconfigures it. */
3
8
  export class WGPUCanvasSurface {
4
9
  device;
@@ -11,6 +16,7 @@ export class WGPUCanvasSurface {
11
16
  this.standardFormat = standardFormat;
12
17
  this.context = canvas.getContext('webgpu');
13
18
  this.context.configure({ device, format: standardFormat, alphaMode: 'premultiplied' });
19
+ owners.set(this.context, this);
14
20
  }
15
21
  get format() { return this.hdr ? 'rgba16float' : this.standardFormat; }
16
22
  get supportsHDR() {
@@ -43,6 +49,11 @@ export class WGPUCanvasSurface {
43
49
  ? { device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: { mode: 'extended' } }
44
50
  : { device: this.device, format: this.standardFormat, alphaMode: 'premultiplied' });
45
51
  }
46
- dispose() { this.context.unconfigure?.(); }
52
+ dispose() {
53
+ if (owners.get(this.context) !== this)
54
+ return;
55
+ owners.delete(this.context);
56
+ this.context.unconfigure?.();
57
+ }
47
58
  }
48
59
  //# sourceMappingURL=WGPUCanvasSurface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WGPUCanvasSurface.js","sourceRoot":"","sources":["../../src/renderer/WGPUCanvasSurface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAG/C,iFAAiF;AACjF,MAAM,OAAO,iBAAiB;IAI8C;IAAoC;IAHrG,OAAO,CAAqB;IACrC,GAAG,GAAG,KAAK,CAAC;IACJ,aAAa,CAAW;IAChC,YAAY,MAA2C,EAAmB,MAAiB,EAAmB,cAAgC;QAApE,WAAM,GAAN,MAAM,CAAW;QAAmB,mBAAc,GAAd,cAAc,CAAkB;QAC5I,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAwB,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAC,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,MAAM,KAAI,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,aAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA,CAAC;IAC9E,IAAI,WAAW;QACb,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC;QAChE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,KAAK,GAA8B,IAAI,CAAC;QAC5C,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,EAAE,CAAC,UAAU,CAAC,QAAQ,CAA8B,CAAC;YACzE,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YACzB,KAAK,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,EAAC,IAAI,EAAE,UAAU,EAAC,EAAqB,CAAC,CAAC;YACnK,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,MAAM,KAAK,aAAa,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,KAAK,UAAU,CAAC;QACrG,CAAC;QAAC,MAAM,CAAC;YAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAAA,CAAC;gBAC7B,CAAC;YAAA,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QAAA,CAAC;QACjC,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,SAAS,CAAC,OAAgB;QACxB,MAAM,MAAM,GAAG,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC;QAC3C,IAAI,MAAM,KAAK,IAAI,CAAC,GAAG;YAAE,OAAO;QAChC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM;YAC3B,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,EAAC,IAAI,EAAE,UAAU,EAAC,EAAqB;YACnJ,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,eAAe,EAAC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA,CAAC;CAC1C","sourcesContent":["import {createCanvas} from '../util/canvas.js';\ntype HDRConfiguration = GPUCanvasConfiguration & {toneMapping: {mode: 'extended'}};\ntype InspectableContext = GPUCanvasContext & {getConfiguration?: () => GPUCanvasConfiguration & {toneMapping?: {mode?: string}}};\n/** One canvas surface; composing or exporting an image never reconfigures it. */\nexport class WGPUCanvasSurface {\n readonly context: InspectableContext;\n hdr = false;\n private compatibleHDR?: boolean;\n constructor(canvas: HTMLCanvasElement | OffscreenCanvas, private readonly device: GPUDevice, private readonly standardFormat: GPUTextureFormat) {\n this.context = canvas.getContext('webgpu')! as InspectableContext;\n this.context.configure({device, format: standardFormat, alphaMode: 'premultiplied'});\n }\n get format() {return this.hdr ? 'rgba16float' as const : this.standardFormat;}\n get supportsHDR() {\n if (this.compatibleHDR !== undefined) return this.compatibleHDR;\n this.compatibleHDR = false;\n let probe: InspectableContext | null = null;\n try {\n probe = createCanvas().getContext('webgpu') as InspectableContext | null;\n if (!probe) return false;\n probe.configure({device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: {mode: 'extended'}} as HDRConfiguration);\n const applied = probe.getConfiguration?.();\n this.compatibleHDR = applied?.format === 'rgba16float' && applied.toneMapping?.mode === 'extended';\n } catch {this.compatibleHDR = false;}\n finally {probe?.unconfigure?.();}\n return this.compatibleHDR;\n }\n configure(enabled: boolean) {\n const active = enabled && this.supportsHDR;\n if (active === this.hdr) return;\n this.hdr = active;\n this.context.configure(active\n ? {device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: {mode: 'extended'}} as HDRConfiguration\n : {device: this.device, format: this.standardFormat, alphaMode: 'premultiplied'});\n }\n dispose() {this.context.unconfigure?.();}\n}\n"]}
1
+ {"version":3,"file":"WGPUCanvasSurface.js","sourceRoot":"","sources":["../../src/renderer/WGPUCanvasSurface.ts"],"names":[],"mappings":"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","sourcesContent":["import {createCanvas} from '../util/canvas.js';\ntype HDRConfiguration = GPUCanvasConfiguration & {toneMapping: {mode: 'extended'}};\ntype InspectableContext = GPUCanvasContext & {getConfiguration?: () => GPUCanvasConfiguration & {toneMapping?: {mode?: string}}};\n// A canvas returns the same context to every engine, and engine disposal defers\n// releasing its surface until submitted GPU work finishes. Only the surface that\n// configured the context last may unconfigure it, so a later engine on the same\n// canvas keeps presenting.\nconst owners = new WeakMap<GPUCanvasContext, WGPUCanvasSurface>();\n/** One canvas surface; composing or exporting an image never reconfigures it. */\nexport class WGPUCanvasSurface {\n readonly context: InspectableContext;\n hdr = false;\n private compatibleHDR?: boolean;\n constructor(canvas: HTMLCanvasElement | OffscreenCanvas, private readonly device: GPUDevice, private readonly standardFormat: GPUTextureFormat) {\n this.context = canvas.getContext('webgpu')! as InspectableContext;\n this.context.configure({device, format: standardFormat, alphaMode: 'premultiplied'});\n owners.set(this.context, this);\n }\n get format() {return this.hdr ? 'rgba16float' as const : this.standardFormat;}\n get supportsHDR() {\n if (this.compatibleHDR !== undefined) return this.compatibleHDR;\n this.compatibleHDR = false;\n let probe: InspectableContext | null = null;\n try {\n probe = createCanvas().getContext('webgpu') as InspectableContext | null;\n if (!probe) return false;\n probe.configure({device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: {mode: 'extended'}} as HDRConfiguration);\n const applied = probe.getConfiguration?.();\n this.compatibleHDR = applied?.format === 'rgba16float' && applied.toneMapping?.mode === 'extended';\n } catch {this.compatibleHDR = false;}\n finally {probe?.unconfigure?.();}\n return this.compatibleHDR;\n }\n configure(enabled: boolean) {\n const active = enabled && this.supportsHDR;\n if (active === this.hdr) return;\n this.hdr = active;\n this.context.configure(active\n ? {device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: {mode: 'extended'}} as HDRConfiguration\n : {device: this.device, format: this.standardFormat, alphaMode: 'premultiplied'});\n }\n dispose() {\n if (owners.get(this.context) !== this) return;\n owners.delete(this.context);\n this.context.unconfigure?.();\n }\n}\n"]}