@meimu/mutracer 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
  4. package/LICENSES/GlMatrix-MIT.txt +19 -0
  5. package/LICENSES/KinoBloom-MIT.txt +21 -0
  6. package/LICENSES/OIDNWeb-MIT.txt +21 -0
  7. package/LICENSES/Octicons-MIT.txt +21 -0
  8. package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
  9. package/LICENSES/TinyBVH-MIT.txt +21 -0
  10. package/LICENSES/WebGPUUtils-MIT.txt +21 -0
  11. package/LICENSES/ZetaRay-MIT.txt +21 -0
  12. package/README.md +195 -2
  13. package/THIRD_PARTY_NOTICES.md +160 -0
  14. package/dist/assets/bvh.worker.js +1 -0
  15. package/dist/mutracer.umd.js +14352 -0
  16. package/docs/api.md +394 -0
  17. package/docs/bvh.md +141 -0
  18. package/docs/denoising.md +301 -0
  19. package/docs/getting-started.md +308 -0
  20. package/docs/materials.md +281 -0
  21. package/docs/performance.md +85 -0
  22. package/docs/post-processing.md +87 -0
  23. package/docs/progressive-rendering.md +144 -0
  24. package/docs/sampling.md +40 -0
  25. package/docs/threejs.md +273 -0
  26. package/docs/todo.md +61 -0
  27. package/docs/updates.md +208 -0
  28. package/lib/Display.d.ts +72 -0
  29. package/lib/Display.js +121 -0
  30. package/lib/Display.js.map +1 -0
  31. package/lib/Engine.d.ts +161 -0
  32. package/lib/Engine.js +681 -0
  33. package/lib/Engine.js.map +1 -0
  34. package/lib/Render.d.ts +256 -0
  35. package/lib/Render.js +671 -0
  36. package/lib/Render.js.map +1 -0
  37. package/lib/RenderLoop.d.ts +76 -0
  38. package/lib/RenderLoop.js +204 -0
  39. package/lib/RenderLoop.js.map +1 -0
  40. package/lib/Sync.d.ts +19 -0
  41. package/lib/Sync.js +19 -0
  42. package/lib/Sync.js.map +1 -0
  43. package/lib/constants.d.ts +2 -0
  44. package/lib/constants.js +3 -0
  45. package/lib/constants.js.map +1 -0
  46. package/lib/main.d.ts +56 -0
  47. package/lib/main.js +43 -0
  48. package/lib/main.js.map +1 -0
  49. package/lib/math.d.ts +23 -0
  50. package/lib/math.js +56 -0
  51. package/lib/math.js.map +1 -0
  52. package/lib/oidn.d.ts +45 -0
  53. package/lib/oidn.js +42 -0
  54. package/lib/oidn.js.map +1 -0
  55. package/lib/oidnBundledWeights.cdn.d.ts +2 -0
  56. package/lib/oidnBundledWeights.cdn.js +5 -0
  57. package/lib/oidnBundledWeights.cdn.js.map +1 -0
  58. package/lib/oidnBundledWeights.d.ts +2 -0
  59. package/lib/oidnBundledWeights.js +4 -0
  60. package/lib/oidnBundledWeights.js.map +1 -0
  61. package/lib/renderer/DisplayPostProcess.d.ts +14 -0
  62. package/lib/renderer/DisplayPostProcess.js +41 -0
  63. package/lib/renderer/DisplayPostProcess.js.map +1 -0
  64. package/lib/renderer/MaterialTable.d.ts +119 -0
  65. package/lib/renderer/MaterialTable.js +550 -0
  66. package/lib/renderer/MaterialTable.js.map +1 -0
  67. package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
  68. package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
  69. package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
  70. package/lib/renderer/RenderingPipeline.d.ts +232 -0
  71. package/lib/renderer/RenderingPipeline.js +18 -0
  72. package/lib/renderer/RenderingPipeline.js.map +1 -0
  73. package/lib/renderer/ScratchPool.d.ts +13 -0
  74. package/lib/renderer/ScratchPool.js +21 -0
  75. package/lib/renderer/ScratchPool.js.map +1 -0
  76. package/lib/renderer/TileRender.d.ts +44 -0
  77. package/lib/renderer/TileRender.js +283 -0
  78. package/lib/renderer/TileRender.js.map +1 -0
  79. package/lib/renderer/WGPUBloomPass.d.ts +17 -0
  80. package/lib/renderer/WGPUBloomPass.js +243 -0
  81. package/lib/renderer/WGPUBloomPass.js.map +1 -0
  82. package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
  83. package/lib/renderer/WGPUCanvasSurface.js +48 -0
  84. package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
  85. package/lib/renderer/WGPUComputePass.d.ts +73 -0
  86. package/lib/renderer/WGPUComputePass.js +317 -0
  87. package/lib/renderer/WGPUComputePass.js.map +1 -0
  88. package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
  89. package/lib/renderer/WGPUFullQuadPass.js +389 -0
  90. package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
  91. package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
  92. package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
  93. package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
  94. package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
  95. package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
  96. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
  97. package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
  98. package/lib/renderer/WGPURayTraceOutput.js +368 -0
  99. package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
  100. package/lib/renderer/WGPURayTracePass.d.ts +284 -0
  101. package/lib/renderer/WGPURayTracePass.js +2323 -0
  102. package/lib/renderer/WGPURayTracePass.js.map +1 -0
  103. package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
  104. package/lib/renderer/WGPURenderingPipeline.js +1446 -0
  105. package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
  106. package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
  107. package/lib/renderer/WGPUSceneFeatures.js +20 -0
  108. package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
  109. package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
  110. package/lib/renderer/WGPUScratchBuffer.js +21 -0
  111. package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
  112. package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
  113. package/lib/renderer/WGPUScratchTexture.js +27 -0
  114. package/lib/renderer/WGPUScratchTexture.js.map +1 -0
  115. package/lib/renderer/WGPUShaderCache.d.ts +26 -0
  116. package/lib/renderer/WGPUShaderCache.js +103 -0
  117. package/lib/renderer/WGPUShaderCache.js.map +1 -0
  118. package/lib/renderer/WebGLBloomPass.d.ts +18 -0
  119. package/lib/renderer/WebGLBloomPass.js +113 -0
  120. package/lib/renderer/WebGLBloomPass.js.map +1 -0
  121. package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
  122. package/lib/renderer/WebGLFullQuadPass.js +208 -0
  123. package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
  124. package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
  125. package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
  126. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
  127. package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
  128. package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
  129. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
  130. package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
  131. package/lib/renderer/WebGLRayTracePass.js +845 -0
  132. package/lib/renderer/WebGLRayTracePass.js.map +1 -0
  133. package/lib/renderer/WebGLReadback.d.ts +4 -0
  134. package/lib/renderer/WebGLReadback.js +75 -0
  135. package/lib/renderer/WebGLReadback.js.map +1 -0
  136. package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
  137. package/lib/renderer/WebGLRenderingPipeline.js +510 -0
  138. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
  139. package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
  140. package/lib/renderer/WebGLScratchCopy.js +27 -0
  141. package/lib/renderer/WebGLScratchCopy.js.map +1 -0
  142. package/lib/renderer/accumulationTarget.d.ts +26 -0
  143. package/lib/renderer/accumulationTarget.js +2 -0
  144. package/lib/renderer/accumulationTarget.js.map +1 -0
  145. package/lib/renderer/binnedSahBvh.d.ts +31 -0
  146. package/lib/renderer/binnedSahBvh.js +263 -0
  147. package/lib/renderer/binnedSahBvh.js.map +1 -0
  148. package/lib/renderer/bvh.worker.d.ts +1 -0
  149. package/lib/renderer/bvh.worker.js +16 -0
  150. package/lib/renderer/bvh.worker.js.map +1 -0
  151. package/lib/renderer/bvhAccel.d.ts +81 -0
  152. package/lib/renderer/bvhAccel.js +621 -0
  153. package/lib/renderer/bvhAccel.js.map +1 -0
  154. package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
  155. package/lib/renderer/bvhWorkerBuild.js +17 -0
  156. package/lib/renderer/bvhWorkerBuild.js.map +1 -0
  157. package/lib/renderer/bvhWorkerClient.d.ts +57 -0
  158. package/lib/renderer/bvhWorkerClient.js +166 -0
  159. package/lib/renderer/bvhWorkerClient.js.map +1 -0
  160. package/lib/renderer/cameraLens.d.ts +5 -0
  161. package/lib/renderer/cameraLens.js +15 -0
  162. package/lib/renderer/cameraLens.js.map +1 -0
  163. package/lib/renderer/cameraSnapshot.d.ts +3 -0
  164. package/lib/renderer/cameraSnapshot.js +7 -0
  165. package/lib/renderer/cameraSnapshot.js.map +1 -0
  166. package/lib/renderer/committedScene.d.ts +13 -0
  167. package/lib/renderer/committedScene.js +121 -0
  168. package/lib/renderer/committedScene.js.map +1 -0
  169. package/lib/renderer/dataTextureUtil.d.ts +32 -0
  170. package/lib/renderer/dataTextureUtil.js +46 -0
  171. package/lib/renderer/dataTextureUtil.js.map +1 -0
  172. package/lib/renderer/denoiser.d.ts +65 -0
  173. package/lib/renderer/denoiser.js +2 -0
  174. package/lib/renderer/denoiser.js.map +1 -0
  175. package/lib/renderer/depthQuery.d.ts +14 -0
  176. package/lib/renderer/depthQuery.js +14 -0
  177. package/lib/renderer/depthQuery.js.map +1 -0
  178. package/lib/renderer/deviceRequirements.d.ts +23 -0
  179. package/lib/renderer/deviceRequirements.js +50 -0
  180. package/lib/renderer/deviceRequirements.js.map +1 -0
  181. package/lib/renderer/envMapCreation.d.ts +10 -0
  182. package/lib/renderer/envMapCreation.js +96 -0
  183. package/lib/renderer/envMapCreation.js.map +1 -0
  184. package/lib/renderer/envMapDistribution.d.ts +9 -0
  185. package/lib/renderer/envMapDistribution.js +107 -0
  186. package/lib/renderer/envMapDistribution.js.map +1 -0
  187. package/lib/renderer/float16.d.ts +1 -0
  188. package/lib/renderer/float16.js +19 -0
  189. package/lib/renderer/float16.js.map +1 -0
  190. package/lib/renderer/geometryBvh.d.ts +11 -0
  191. package/lib/renderer/geometryBvh.js +24 -0
  192. package/lib/renderer/geometryBvh.js.map +1 -0
  193. package/lib/renderer/geometryUpdates.d.ts +28 -0
  194. package/lib/renderer/geometryUpdates.js +131 -0
  195. package/lib/renderer/geometryUpdates.js.map +1 -0
  196. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
  198. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
  200. package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
  201. package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
  205. package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
  207. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
  209. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
  210. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
  211. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
  212. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
  213. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
  214. package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
  215. package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
  216. package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
  217. package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
  218. package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
  219. package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
  220. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
  221. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
  222. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
  223. package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
  224. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
  225. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
  226. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
  227. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
  228. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
  229. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
  230. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
  231. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
  232. package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
  233. package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
  234. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
  235. package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
  236. package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
  237. package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
  238. package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
  239. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
  240. package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
  241. package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
  242. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
  243. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
  244. package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
  245. package/lib/renderer/glsl/depthQuery.frag.js +55 -0
  246. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
  247. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
  248. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
  249. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
  250. package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
  251. package/lib/renderer/glsl/rayTrace.frag.js +619 -0
  252. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
  253. package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
  254. package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
  255. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
  256. package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
  257. package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
  258. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
  259. package/lib/renderer/gpuMemory.d.ts +2 -0
  260. package/lib/renderer/gpuMemory.js +10 -0
  261. package/lib/renderer/gpuMemory.js.map +1 -0
  262. package/lib/renderer/halton.d.ts +1 -0
  263. package/lib/renderer/halton.js +15 -0
  264. package/lib/renderer/halton.js.map +1 -0
  265. package/lib/renderer/jnlm.d.ts +85 -0
  266. package/lib/renderer/jnlm.js +87 -0
  267. package/lib/renderer/jnlm.js.map +1 -0
  268. package/lib/renderer/lightSampling.d.ts +75 -0
  269. package/lib/renderer/lightSampling.js +305 -0
  270. package/lib/renderer/lightSampling.js.map +1 -0
  271. package/lib/renderer/lightsUtil.d.ts +26 -0
  272. package/lib/renderer/lightsUtil.js +154 -0
  273. package/lib/renderer/lightsUtil.js.map +1 -0
  274. package/lib/renderer/materialChanges.d.ts +13 -0
  275. package/lib/renderer/materialChanges.js +59 -0
  276. package/lib/renderer/materialChanges.js.map +1 -0
  277. package/lib/renderer/materialComparison.generated.d.ts +5 -0
  278. package/lib/renderer/materialComparison.generated.js +655 -0
  279. package/lib/renderer/materialComparison.generated.js.map +1 -0
  280. package/lib/renderer/materialConstants.d.ts +6 -0
  281. package/lib/renderer/materialConstants.js +3 -0
  282. package/lib/renderer/materialConstants.js.map +1 -0
  283. package/lib/renderer/materialEmission.d.ts +9 -0
  284. package/lib/renderer/materialEmission.js +21 -0
  285. package/lib/renderer/materialEmission.js.map +1 -0
  286. package/lib/renderer/materialIndices.d.ts +7 -0
  287. package/lib/renderer/materialIndices.js +34 -0
  288. package/lib/renderer/materialIndices.js.map +1 -0
  289. package/lib/renderer/materialLayout.d.ts +102 -0
  290. package/lib/renderer/materialLayout.js +189 -0
  291. package/lib/renderer/materialLayout.js.map +1 -0
  292. package/lib/renderer/materialTextureSlots.d.ts +537 -0
  293. package/lib/renderer/materialTextureSlots.js +219 -0
  294. package/lib/renderer/materialTextureSlots.js.map +1 -0
  295. package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
  296. package/lib/renderer/mergeMeshesToGeometry.js +236 -0
  297. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
  298. package/lib/renderer/meshInstances.d.ts +23 -0
  299. package/lib/renderer/meshInstances.js +66 -0
  300. package/lib/renderer/meshInstances.js.map +1 -0
  301. package/lib/renderer/meshMembership.d.ts +10 -0
  302. package/lib/renderer/meshMembership.js +72 -0
  303. package/lib/renderer/meshMembership.js.map +1 -0
  304. package/lib/renderer/oidnNetwork.d.ts +20 -0
  305. package/lib/renderer/oidnNetwork.js +123 -0
  306. package/lib/renderer/oidnNetwork.js.map +1 -0
  307. package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
  308. package/lib/renderer/openPbrEnergyLut.js +965 -0
  309. package/lib/renderer/openPbrEnergyLut.js.map +1 -0
  310. package/lib/renderer/pathLimits.d.ts +4 -0
  311. package/lib/renderer/pathLimits.js +7 -0
  312. package/lib/renderer/pathLimits.js.map +1 -0
  313. package/lib/renderer/prepareMeshBVH.d.ts +110 -0
  314. package/lib/renderer/prepareMeshBVH.js +857 -0
  315. package/lib/renderer/prepareMeshBVH.js.map +1 -0
  316. package/lib/renderer/progressiveScheduler.d.ts +11 -0
  317. package/lib/renderer/progressiveScheduler.js +19 -0
  318. package/lib/renderer/progressiveScheduler.js.map +1 -0
  319. package/lib/renderer/renderPipeline.d.ts +57 -0
  320. package/lib/renderer/renderPipeline.js +49 -0
  321. package/lib/renderer/renderPipeline.js.map +1 -0
  322. package/lib/renderer/sampling.d.ts +10 -0
  323. package/lib/renderer/sampling.js +28 -0
  324. package/lib/renderer/sampling.js.map +1 -0
  325. package/lib/renderer/sceneChangeDetector.d.ts +29 -0
  326. package/lib/renderer/sceneChangeDetector.js +232 -0
  327. package/lib/renderer/sceneChangeDetector.js.map +1 -0
  328. package/lib/renderer/sceneLightChanges.d.ts +14 -0
  329. package/lib/renderer/sceneLightChanges.js +34 -0
  330. package/lib/renderer/sceneLightChanges.js.map +1 -0
  331. package/lib/renderer/scratchSampling.d.ts +3 -0
  332. package/lib/renderer/scratchSampling.js +39 -0
  333. package/lib/renderer/scratchSampling.js.map +1 -0
  334. package/lib/renderer/shader.d.ts +37 -0
  335. package/lib/renderer/shader.js +41 -0
  336. package/lib/renderer/shader.js.map +1 -0
  337. package/lib/renderer/staticBvhPreparation.d.ts +24 -0
  338. package/lib/renderer/staticBvhPreparation.js +116 -0
  339. package/lib/renderer/staticBvhPreparation.js.map +1 -0
  340. package/lib/renderer/textureRegion.d.ts +8 -0
  341. package/lib/renderer/textureRegion.js +9 -0
  342. package/lib/renderer/textureRegion.js.map +1 -0
  343. package/lib/renderer/texturesFromMaterials.d.ts +6 -0
  344. package/lib/renderer/texturesFromMaterials.js +37 -0
  345. package/lib/renderer/texturesFromMaterials.js.map +1 -0
  346. package/lib/renderer/util.d.ts +17 -0
  347. package/lib/renderer/util.js +56 -0
  348. package/lib/renderer/util.js.map +1 -0
  349. package/lib/renderer/webgl.d.ts +131 -0
  350. package/lib/renderer/webgl.js +586 -0
  351. package/lib/renderer/webgl.js.map +1 -0
  352. package/lib/renderer/webglShaders.d.ts +4 -0
  353. package/lib/renderer/webglShaders.js +41 -0
  354. package/lib/renderer/webglShaders.js.map +1 -0
  355. package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
  356. package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
  357. package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
  358. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
  359. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
  360. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
  361. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
  362. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
  363. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
  364. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
  365. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
  366. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
  367. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
  368. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
  369. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
  370. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
  371. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
  372. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
  373. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
  374. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
  375. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
  376. package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
  377. package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
  378. package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
  379. package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
  380. package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
  381. package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
  382. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
  383. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
  384. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
  385. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
  386. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
  387. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
  388. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
  389. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
  390. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
  391. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
  392. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
  393. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
  394. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
  395. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
  396. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
  397. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
  398. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
  399. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
  400. package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
  401. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
  402. package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
  403. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
  404. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
  405. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
  406. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
  407. package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
  408. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
  409. package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
  410. package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
  411. package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
  412. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
  413. package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
  414. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
  415. package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
  416. package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
  417. package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
  418. package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
  419. package/lib/renderer/wgsl/rayTrace.compute.js +923 -0
  420. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
  421. package/lib/scene/AmbientLight.d.ts +17 -0
  422. package/lib/scene/AmbientLight.js +15 -0
  423. package/lib/scene/AmbientLight.js.map +1 -0
  424. package/lib/scene/Camera.d.ts +78 -0
  425. package/lib/scene/Camera.js +111 -0
  426. package/lib/scene/Camera.js.map +1 -0
  427. package/lib/scene/DirectionalLight.d.ts +18 -0
  428. package/lib/scene/DirectionalLight.js +17 -0
  429. package/lib/scene/DirectionalLight.js.map +1 -0
  430. package/lib/scene/EnvironmentLight.d.ts +14 -0
  431. package/lib/scene/EnvironmentLight.js +14 -0
  432. package/lib/scene/EnvironmentLight.js.map +1 -0
  433. package/lib/scene/Geometry.d.ts +87 -0
  434. package/lib/scene/Geometry.js +108 -0
  435. package/lib/scene/Geometry.js.map +1 -0
  436. package/lib/scene/IESProfile.d.ts +19 -0
  437. package/lib/scene/IESProfile.js +165 -0
  438. package/lib/scene/IESProfile.js.map +1 -0
  439. package/lib/scene/InstancedMesh.d.ts +43 -0
  440. package/lib/scene/InstancedMesh.js +79 -0
  441. package/lib/scene/InstancedMesh.js.map +1 -0
  442. package/lib/scene/Mesh.d.ts +14 -0
  443. package/lib/scene/Mesh.js +17 -0
  444. package/lib/scene/Mesh.js.map +1 -0
  445. package/lib/scene/OpenPBRMaterial.d.ts +224 -0
  446. package/lib/scene/OpenPBRMaterial.js +240 -0
  447. package/lib/scene/OpenPBRMaterial.js.map +1 -0
  448. package/lib/scene/RectLight.d.ts +31 -0
  449. package/lib/scene/RectLight.js +26 -0
  450. package/lib/scene/RectLight.js.map +1 -0
  451. package/lib/scene/Scene.d.ts +55 -0
  452. package/lib/scene/Scene.js +2 -0
  453. package/lib/scene/Scene.js.map +1 -0
  454. package/lib/scene/SceneNode.d.ts +16 -0
  455. package/lib/scene/SceneNode.js +33 -0
  456. package/lib/scene/SceneNode.js.map +1 -0
  457. package/lib/scene/SphereLight.d.ts +22 -0
  458. package/lib/scene/SphereLight.js +20 -0
  459. package/lib/scene/SphereLight.js.map +1 -0
  460. package/lib/scene/SpotLight.d.ts +35 -0
  461. package/lib/scene/SpotLight.js +29 -0
  462. package/lib/scene/SpotLight.js.map +1 -0
  463. package/lib/scene/Texture.d.ts +38 -0
  464. package/lib/scene/Texture.js +37 -0
  465. package/lib/scene/Texture.js.map +1 -0
  466. package/lib/scene/anisotropyParameters.d.ts +1 -0
  467. package/lib/scene/anisotropyParameters.js +13 -0
  468. package/lib/scene/anisotropyParameters.js.map +1 -0
  469. package/lib/scene/geometryChanges.d.ts +5 -0
  470. package/lib/scene/geometryChanges.js +18 -0
  471. package/lib/scene/geometryChanges.js.map +1 -0
  472. package/lib/scene/materialTextureNames.d.ts +2 -0
  473. package/lib/scene/materialTextureNames.js +9 -0
  474. package/lib/scene/materialTextureNames.js.map +1 -0
  475. package/lib/scene/openPbrSchema.d.ts +400 -0
  476. package/lib/scene/openPbrSchema.js +149 -0
  477. package/lib/scene/openPbrSchema.js.map +1 -0
  478. package/lib/scene/thinFilmParameters.d.ts +4 -0
  479. package/lib/scene/thinFilmParameters.js +12 -0
  480. package/lib/scene/thinFilmParameters.js.map +1 -0
  481. package/lib/settings/display.d.ts +118 -0
  482. package/lib/settings/display.js +34 -0
  483. package/lib/settings/display.js.map +1 -0
  484. package/lib/settings/engine.d.ts +37 -0
  485. package/lib/settings/engine.js +26 -0
  486. package/lib/settings/engine.js.map +1 -0
  487. package/lib/settings/render.d.ts +178 -0
  488. package/lib/settings/render.js +36 -0
  489. package/lib/settings/render.js.map +1 -0
  490. package/lib/tinybvh/LICENSE +21 -0
  491. package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
  492. package/lib/tinybvh/TinyBvhBuilder.js +211 -0
  493. package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
  494. package/lib/tinybvh/tinybvh.wasm +0 -0
  495. package/lib/types.d.ts +13 -0
  496. package/lib/types.js +2 -0
  497. package/lib/types.js.map +1 -0
  498. package/lib/util/canvas.d.ts +2 -0
  499. package/lib/util/canvas.js +13 -0
  500. package/lib/util/canvas.js.map +1 -0
  501. package/lib/util/commonGeometry.d.ts +15 -0
  502. package/lib/util/commonGeometry.js +240 -0
  503. package/lib/util/commonGeometry.js.map +1 -0
  504. package/lib/util/events.d.ts +7 -0
  505. package/lib/util/events.js +23 -0
  506. package/lib/util/events.js.map +1 -0
  507. package/lib/util/frame.d.ts +2 -0
  508. package/lib/util/frame.js +10 -0
  509. package/lib/util/frame.js.map +1 -0
  510. package/lib/util/fromTHREE.d.ts +100 -0
  511. package/lib/util/fromTHREE.js +1063 -0
  512. package/lib/util/fromTHREE.js.map +1 -0
  513. package/lib/util/geometry.d.ts +13 -0
  514. package/lib/util/geometry.js +292 -0
  515. package/lib/util/geometry.js.map +1 -0
  516. package/lib/util/loadRGBE.d.ts +7 -0
  517. package/lib/util/loadRGBE.js +168 -0
  518. package/lib/util/loadRGBE.js.map +1 -0
  519. package/lib/util/math.d.ts +8 -0
  520. package/lib/util/math.js +64 -0
  521. package/lib/util/math.js.map +1 -0
  522. package/lib/util/mesh.d.ts +7 -0
  523. package/lib/util/mesh.js +20 -0
  524. package/lib/util/mesh.js.map +1 -0
  525. package/lib/util/threeDeformation.d.ts +20 -0
  526. package/lib/util/threeDeformation.js +218 -0
  527. package/lib/util/threeDeformation.js.map +1 -0
  528. package/lib/version.d.ts +2 -0
  529. package/lib/version.js +3 -0
  530. package/lib/version.js.map +1 -0
  531. package/llms.txt +62 -0
  532. package/oidn/weights/LICENSE.txt +202 -0
  533. package/oidn/weights/README.md +43 -0
  534. package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
  535. package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
  536. package/package.json +124 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WGPURenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WGPURenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import {DisplayPostProcess} from './DisplayPostProcess.js';\nimport {customDenoiseLayersMain, customDenoiseCoverageMain} from './wgsl/customDenoise.wgsl.js';\nimport { WGPUCanvasSurface } from './WGPUCanvasSurface.js';\nimport { WGPUScratchBuffer } from './WGPUScratchBuffer.js';\nimport { WGPUScratchTexture } from './WGPUScratchTexture.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport { textureBytes } from './gpuMemory.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\n// 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 { SceneBackground } from '../scene/Scene.js';\nimport Camera from '../scene/Camera.js';\n\nimport { WGPUFullQuadPass } from './WGPUFullQuadPass.js';\nimport WGPURayTracePass from './WGPURayTracePass.js';\nimport {\n composeMain,\n composeDefine,\n compositeDenoiseOutputMain,\n compositeDenoiseDisplayMain,\n linearToSrgbDefine\n} from './wgsl/compose.frag.wgsl.js';\nimport halton from './halton.js';\nimport { makeTileRender, makeTileRenderWithPredict } from './TileRender.js';\nimport { ToneMappingParams } from './RenderingPipeline.js';\nimport { DisplayChannel } from './RenderingPipeline.js';\nimport { ColorRGB } from '../types.js';\nimport { WGPURayTraceOutputPass } from './WGPURayTraceOutput.js';\nimport { vec3 } from '../math.js';\n\nimport WGPUBloomPass from './WGPUBloomPass.js';\nimport { WGPUComputePass } from './WGPUComputePass.js';\nimport WGPUHDRPeakMeter from './WGPUHDRPeakMeter.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport type { DenoiserHandle, OIDNWeb, OIDNWebGPUData, OIDNWebGPUOutputData } from './denoiser.js';\nimport { WGPUJNLMDenoisePass } from './WGPUJNLMDenoiser.js';\n\nexport const oidnAlbedoSrgbEncodeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nlet raw = textureLoad(in_albedo, vec2u(globalId.xy), 0);\nlet linear = clamp(raw.rgb, vec3f(0.0), vec3f(1.0));\nlet encoded = select(\n 1.055 * pow(linear, vec3f(1.0 / 2.4)) - 0.055,\n 12.92 * linear,\n linear <= vec3f(0.0031308)\n);\nout_albedo[index] = vec4f(encoded, raw.a);\n`;\n\nexport const oidnAlbedoSrgbDecodeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nlet filtered = in_albedo[index];\nlet encoded = clamp(filtered.rgb, vec3f(0.0), vec3f(1.0));\nlet linear = select(\n pow((encoded + 0.055) / 1.055, vec3f(2.4)),\n encoded / 12.92,\n encoded <= vec3f(0.04045)\n);\nvar result = linear;\nlet surfaceCoverage = textureLoad(in_rawAlbedo, vec2i(globalId.xy), 0).a;\nif (preserveSurfaceTexture != 0u) {\n // Primary albedo retains the accumulated surface texture. Do not ask the\n // auxiliary network to reconstruct its high-frequency texture.\n // Retain its filtered result across normal/coverage discontinuities.\n let pixel = vec2i(globalId.xy);\n let center = textureLoad(in_rawNormal, pixel, 0);\n let n = normalize(center.rgb * 2.0 - 1.0 + vec3f(1e-8));\n var discontinuity = 0.0;\n for (var y = -1; y <= 1; y++) {\n for (var x = -1; x <= 1; x++) {\n let neighbor = textureLoad(in_rawNormal,\n clamp(pixel + vec2i(x, y), vec2i(0), imageSize - 1), 0);\n let nn = normalize(neighbor.rgb * 2.0 - 1.0 + vec3f(1e-8));\n discontinuity = max(discontinuity,\n max(1.0 - dot(n, nn), abs(center.a - neighbor.a)));\n }\n }\n let edgeWeight = smoothstep(0.02, 0.1, discontinuity);\n let raw = clamp(textureLoad(in_rawAlbedo, pixel, 0).rgb,\n vec3f(0.0), vec3f(1.0));\n result = mix(raw, linear, edgeWeight);\n}\nout_albedo[index] = vec4f(result, surfaceCoverage);\n`;\n\nexport const oidnNormalSanitizeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nout_normal[index] = vec4f(clamp(in_normal[index].rgb, vec3f(0.0), vec3f(1.0)), 1.0);\n`;\n\nexport interface WGPURenderingPipelineOptions {\n presentationFormat?: GPUTextureFormat;\n}\n\nfunction createTimeQuery(device: GPUDevice) {\n try {\n const querySet = device.createQuerySet({\n type: 'timestamp',\n count: 2\n });\n const resolveBuffer = device.createBuffer({\n size: querySet.count * 8,\n usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC\n });\n const resultBuffer = device.createBuffer({\n size: resolveBuffer.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n });\n return {\n querySet,\n resolveBuffer,\n resultBuffer\n };\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\nfunction makeWGPUAccumulationTarget(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n device: GPUDevice,\n rayTracePass: WGPURayTracePass,\n surface: WGPUCanvasSurface,\n scratch: ScratchPool,\n customJobs: Set<Promise<unknown>>\n) {\n let sampleRenderedCallback: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void = () => { };\n\n let allowMultipleSamplesPerFrame = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let lastGpuTraceTiming:\n | {\n tileTimeMs: number;\n tileTimePerSampleMs?: number;\n estimatedFullFrameTimeMs: number;\n tileCount: number;\n }\n | undefined;\n let diagnosticsReadbackPromise: Promise<void> = Promise.resolve();\n\n let isFirstFrame = true;\n let disposed = false;\n\n let needsUpdatePredicting = true;\n let isPredictingFrame = false;\n\n let renderWidth = 0;\n let renderHeight = 0;\n let screenWidth = 0;\n let screenHeight = 0;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let pendingFlatBackground = [0, 0, 0, 0];\n let resolvedFlatBackground = [0, 0, 0, 0];\n let presentationTexture: GPUTexture | undefined;\n let presentationDenoised = false;\n const displayPostProcess = new DisplayPostProcess(device);\n let denoiseValid = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\n\n let exposure = 1;\n let toneMappingMode = 0;\n let contrast = 1;\n let saturation = 1;\n let temperature = 0;\n let tint = 0;\n let vignette = 0;\n let hdrOutputRequested = false;\n let hdrOutputActive = false;\n let output: DisplayChannel = 'final';\n let shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n\n let denoisedBuffer: GPUBuffer | undefined;\n let denoisedTexture: GPUTexture | undefined;\n let denoisedDisplayLinear = false;\n let denoisedHDR = false;\n let activeCustomController: AbortController | undefined;\n let jnlmPass: WGPUJNLMDenoisePass | undefined;\n let denoiseGeneration = 0;\n let preserveDenoisedOutput = false;\n\n let activeOidnPhase:\n | {\n abort: () => void;\n finish: () => void;\n }\n | undefined;\n\n function cancelDenoise() {\n activeCustomController?.abort(); activeCustomController = undefined;\n denoiseGeneration++;\n const activePhase = activeOidnPhase;\n activeOidnPhase = undefined;\n if (activePhase) {\n try {\n activePhase.abort();\n } finally {\n activePhase.finish();\n }\n }\n }\n\n function runOIDNPhase(\n generation: number,\n execute: (\n finish: () => void,\n fail: (reason: unknown) => void\n ) => () => void\n ): Promise<void> {\n if (generation !== denoiseGeneration) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n let settled = false;\n let phase:\n | {\n abort: () => void;\n finish: () => void;\n }\n | undefined;\n const finish = () => {\n if (settled) return;\n settled = true;\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n resolve();\n };\n const fail = (reason: unknown) => {\n if (settled) return;\n settled = true;\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n reject(reason);\n };\n\n try {\n const abort = execute(finish, fail);\n phase = { abort, finish };\n if (settled) return;\n if (generation !== denoiseGeneration) {\n abort();\n finish();\n return;\n }\n activeOidnPhase = phase;\n } catch (error) {\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n settled = true;\n reject(error);\n }\n });\n }\n\n const ctx = surface.context;\n\n const timeQuery = device.features.has('timestamp-query')\n ? scratch.get('trace timing', () => {\n const query = createTimeQuery(device);\n return {\nquery, getMemoryBytes: () => query ? query.resolveBuffer.size + query.resultBuffer.size : 0,\n dispose() { query?.querySet.destroy(); query?.resolveBuffer.destroy(); query?.resultBuffer.destroy(); }\n};\n }).query\n : undefined;\n const tileRender = makeTileRender();\n const tileRenderWithPredict = timeQuery ? makeTileRenderWithPredict() : undefined;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRenderWithPredict?.setDesiredMsPerTile(maxTimePerTile);\n\n function invalidateTilePrediction() {\n tileTimingGeneration++;\n tileRenderWithPredict?.needsUpdatePredicting();\n lastGpuTraceTiming = undefined;\n // A changed render configuration needs fresh timing. Refresh\n // its estimator without submitting a hidden probe in that mode.\n needsUpdatePredicting = offlineSamplesPerBatch === 0;\n isPredictingFrame = false;\n }\n\n const zero = scratch.get('empty texture', () => {\n const texture = device.createTexture({ label: 'Shared empty image', size: { width: 1, height: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING });\n return { texture, getMemoryBytes: () => 4, dispose: () => texture.destroy() };\n }).texture;\n const rayTraceOutputPass = new WGPURayTraceOutputPass(device, zero);\n const getFrameInput = (label: 'color' | 'albedo' | 'normal' | 'shadowCatcher' | 'foreground' | 'catcherBackground') =>\n rayTraceOutputPass.getOutput(label);\n let bloomPass: WGPUBloomPass | undefined;\n\n // Primary misses on a flat colour background are blank: they add the\n // background radiance but no surface hit, and the normalized colour divides\n // by hits only. Raw readback restores the per-sample average, as on WebGL.\n // Fully blank pixels are already divided by the sample count.\n const rawOutputPass = scratch.get('rawOutputPass', () => new WGPUFullQuadPass('raw output', device, {\n textureWillBeRead: true,\n inputs: ['colorTex', 'coverageTex'],\n outputs: ['color'],\n uniforms: [{ label: 'flatBackgroundColor', type: 'vec4f', data: [0, 0, 0, 0] }],\n fsMain: /* wgsl */ `\nvar color = load_colorTex(uv, 0);\nlet coverage = clamp(load_coverageTex(uv, 0).a, 0.0, 1.0);\nif (flatBackgroundColor.a > 0.5 && coverage > 0.0) {\n color = vec4f(color.rgb * coverage, color.a);\n}\noutput.color = color;\n`\n }));\n\n const readbackPass = scratch.get('readbackPass', () => new WGPUFullQuadPass('output readback', device, {\n textureWillBeRead: true, inputs: ['inputTex'], outputs: ['color'],\n fsMain: 'output.color = load_inputTex(uv, 0);'\n }));\n readbackPass.setOutputParams({ color: { format: 'rgba32float' } });\n\n let hdrPeakMeter: WGPUHDRPeakMeter | undefined;\n const composePass = scratch.get('composePass', () => new WGPUFullQuadPass('compose', device, {\n textureWillBeRead: true,\n fsMain: composeMain + compositeDenoiseOutputMain,\n fsDefine: composeDefine,\n uniforms: [\n {\n label: 'exposure',\n type: 'f32',\n data: exposure\n },\n {\n label: 'toneMappingParams',\n type: 'vec2f',\n data: [toneMappingMode, vignette]\n },\n {\n label: 'hdrOutputEnabled',\n type: 'f32',\n data: 0\n },\n {\n label: 'colorGradingParams',\n type: 'vec4f',\n data: [contrast, saturation, temperature, tint]\n },\n {\n label: 'flatBackgroundColor',\n type: 'vec4f',\n data: [0, 0, 0, 0]\n },\n {\n label: 'shadowCatcherColor',\n type: 'vec3f',\n data: shadowCatcherColor\n },\n {\n label: 'shadowCatcherAlpha',\n type: 'f32',\n data: shadowCatcherAlpha\n },\n {\n label: 'shadowCatcherEnabled',\n type: 'f32',\n data: 0\n },\n {\n label: 'bloomIntensity',\n type: 'f32',\n data: 0.25\n }\n ],\n outputs: ['color', 'denoiseColor'],\n inputs: [\n 'colorTex',\n 'foregroundTex',\n 'catcherBackgroundTex',\n 'flatBackgroundMaskTex',\n 'shadowCatcherTex',\n 'bloomTex'\n ]\n }));\n let composeColorFormat: GPUTextureFormat = 'rgba8unorm';\n composePass.setOutputParams({\n color: {\n format: composeColorFormat\n },\n denoiseColor: { format: 'rgba32float' }\n });\n const compositeDenoiseDisplayPass = scratch.get('compositeDenoiseDisplayPass', () => new WGPUFullQuadPass(\n 'OIDN composed display', device, {\n textureWillBeRead: true,\n fsMain: compositeDenoiseDisplayMain,\n fsDefine: linearToSrgbDefine,\n uniforms: [\n { label: 'hdrOutputEnabled', type: 'f32', data: 0 },\n { label: 'denoisedAlpha', type: 'f32', data: 0 }\n ],\n outputs: ['color'], inputs: ['colorTex', 'composedTex']\n }\n ));\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: 'rgba8unorm' } });\n const auxiliaryPassUniforms = [\n {\n label: 'imageSize',\n type: 'vec2i' as const,\n data: new Int32Array([1, 1])\n }\n ];\n const oidnAlbedoEncodePass = scratch.get('oidnAlbedoEncodePass', () => new WGPUComputePass<'albedo', 'albedo'>(\n 'OIDN albedo sRGB encode',\n device,\n {\n inputs: ['albedo'],\n outputs: ['albedo'],\n uniforms: auxiliaryPassUniforms,\n csMain: oidnAlbedoSrgbEncodeMain\n }\n ));\n const oidnAlbedoDecodePass = scratch.get('oidnAlbedoDecodePass', () => new WGPUComputePass<'albedo' | 'rawAlbedo' | 'rawNormal', 'albedo'>(\n 'OIDN albedo sRGB decode',\n device,\n {\n inputs: ['albedo', 'rawAlbedo', 'rawNormal'],\n outputs: ['albedo'],\n uniforms: [...auxiliaryPassUniforms, {\n label: 'preserveSurfaceTexture', type: 'u32', data: 0\n }],\n csMain: oidnAlbedoSrgbDecodeMain\n }\n ));\n const oidnNormalSanitizePass = scratch.get('oidnNormalSanitizePass', () => new WGPUComputePass<'normal', 'normal'>(\n 'OIDN normal sanitize',\n device,\n {\n inputs: ['normal'],\n outputs: ['normal'],\n uniforms: auxiliaryPassUniforms,\n csMain: oidnNormalSanitizeMain\n }\n ));\n oidnAlbedoEncodePass.setOutputParams({ albedo: { channels: 4 } });\n oidnAlbedoDecodePass.setOutputParams({ albedo: { channels: 4 } });\n oidnNormalSanitizePass.setOutputParams({ normal: { channels: 4 } });\n const outputPass = scratch.get('outputPass', () => new WGPUFullQuadPass('output', device, {\n fsMain: /* wgsl */ `\nlet colorUv = min(\n vec2i(uv2 * vec2f(colorTexRegion())),\n vec2i(colorTexRegion()) - vec2i(1)\n);\nvar color = load_colorTex(colorUv, 0);\ncolor = vec4(color.rgb * color.a, color.a);\noutput.color = color;\n`,\n outputs: ['color'],\n inputs: ['colorTex']\n }));\n outputPass.setOutputParams({\n color: {\n format: 'rgba8unorm'\n }\n });\n\n function _present(encoder: GPUCommandEncoder, texture: GPUTexture) {\n outputPass.setRenderToScreen(\n ctx.getCurrentTexture(),\n surface.format\n );\n outputPass.createPass(encoder, {\n colorTex: texture\n });\n }\n\n function _updateSeed(width: number, height: number) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n // Each ray includes a .5 pixel center, so its Halton jitter in [-.5,.5)\n // becomes a sub-pixel offset in [0,1).\n const jitterX = halton(sequenceSample, 2) - 0.5;\n const jitterY = halton(sequenceSample, 3) - 0.5;\n rayTracePass.setJitter(jitterX / width, jitterY / height);\n }\n\n function sample(clear: boolean, tiles: [number, number]) {\n const encoder = device.createCommandEncoder();\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n _updateSeed(renderWidth, renderHeight);\n const activeTimeQuery = timeQuery;\n const isUnmapped = activeTimeQuery?.resultBuffer.mapState === 'unmapped';\n rayTracePass.createPass(\n encoder,\n clear,\n tiles,\n activeTimeQuery ? { querySet: activeTimeQuery.querySet } : undefined\n );\n if (activeTimeQuery) {\n encoder.resolveQuerySet(\n activeTimeQuery.querySet,\n 0,\n activeTimeQuery.querySet.count,\n activeTimeQuery.resolveBuffer,\n 0\n );\n if (isUnmapped) {\n encoder.copyBufferToBuffer(\n activeTimeQuery.resolveBuffer,\n 0,\n activeTimeQuery.resultBuffer,\n 0,\n activeTimeQuery.resultBuffer.size\n );\n }\n }\n\n // TODO if encoder is not submitted. The uniform buffer will be replaced\n device.queue.submit([encoder.finish()]);\n\n const submittedTileRenderWithPredict = tileRenderWithPredict;\n const submittedTimingGeneration = tileTimingGeneration;\n if (activeTimeQuery && isUnmapped && submittedTileRenderWithPredict) {\n\n const submittedTileCount = tiles[0] * tiles[1];\n diagnosticsReadbackPromise = activeTimeQuery.resultBuffer\n .mapAsync(GPUMapMode.READ).then(() => {\n const mappedRange = activeTimeQuery.resultBuffer.getMappedRange();\n const times = new BigInt64Array(mappedRange, 0, 2);\n const traceTime = Math.max(Number(times[1] - times[0]) / 1_000_000, 0.1);\n // A readback may finish after scene preparation or a mode switch.\n // It must not overwrite throughput learned for the current scene.\n const timingIsCurrent =\n !disposed && submittedTimingGeneration === tileTimingGeneration &&\n !isFirstFrame;\n if (timingIsCurrent) {\n lastGpuTraceTiming = {\n tileTimeMs: traceTime,\n tileTimePerSampleMs: traceTime,\n estimatedFullFrameTimeMs: traceTime * submittedTileCount,\n tileCount: submittedTileCount\n };\n submittedTileRenderWithPredict.setLastTraceTime(traceTime);\n }\n activeTimeQuery.resultBuffer.unmap();\n\n }).catch(() => {\n if (activeTimeQuery.resultBuffer.mapState === 'mapped') {\n activeTimeQuery.resultBuffer.unmap();\n }\n });\n }\n }\n\n function clearDenoisedOutput() { denoiseValid = false; }\n\n function invalidateCompositeDenoise() {\n if (!denoisedDisplayLinear) return;\n cancelDenoise();\n denoiseValid = false;\n }\n\n function prepareDenoisedTexture(\n encoder: GPUCommandEncoder,\n buffer: GPUBuffer | undefined,\n texture: GPUTexture | undefined\n ) {\n if (!buffer) {\n return undefined;\n }\n const conversion = scratch.get('denoised conversion', () => new WGPUScratchTexture(device));\n texture = conversion.get(renderWidth, renderHeight); conversion.setRegion(renderWidth, renderHeight);\n encoder.copyBufferToTexture(\n { buffer: buffer!, bytesPerRow: 16 * renderWidth },\n {\n texture: texture\n },\n {\n width: renderWidth,\n height: renderHeight,\n depthOrArrayLayers: 1\n }\n );\n return texture;\n }\n\n function copyDenoisedOutput(\n encoder: GPUCommandEncoder,\n output: OIDNWebGPUOutputData,\n target: GPUBuffer | undefined\n ) {\n const byteLength = output.width * output.height * 16;\n if (!target || target.size !== byteLength) {\n target?.destroy();\n target = device.createBuffer({\n label: 'Persistent denoised output',\n size: byteLength,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC\n });\n }\n encoder.copyBufferToBuffer(output.data, 0, target, 0, byteLength);\n return target;\n }\n\n function prepareComposition() {\n composePass.setSize(renderWidth, renderHeight);\n composePass.setOutputParams({ color: { format: composeColorFormat }, denoiseColor: { format: 'rgba32float' } });\n composePass.setUniform('exposure', exposure);\n composePass.setUniform('toneMappingParams', [toneMappingMode, vignette]);\n composePass.setUniform('colorGradingParams', [contrast, saturation, temperature, tint]);\n composePass.setUniform('hdrOutputEnabled', +hdrOutputActive);\n composePass.setUniform('shadowCatcherColor', shadowCatcherColor);\n composePass.setUniform('shadowCatcherAlpha', shadowCatcherAlpha);\n compositeDenoiseDisplayPass.setSize(renderWidth, renderHeight);\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: composeColorFormat } });\n compositeDenoiseDisplayPass.setUniform('hdrOutputEnabled', +hdrOutputActive);\n compositeDenoiseDisplayPass.setUniform('denoisedAlpha', denoiseValid && denoisedDisplayLinear ? +rayTracePass.needsDenoiseAlpha() : 0);\n }\n function snapshotInput(encoder: GPUCommandEncoder, key: string, texture: GPUTexture, exact = false) {\n const buffer = scratch.get(key, () => new WGPUScratchBuffer(device)).get(renderWidth * renderHeight * 16, exact);\n encoder.copyTextureToBuffer({ texture }, { buffer, bytesPerRow: renderWidth * 16 }, { width: renderWidth, height: renderHeight });\n return buffer;\n }\n function copyGuide(key: string, input: GPUTexture, exact = false) {\n const pass = scratch.get(key, () => new WGPUComputePass(`${key} copy`, device, {\n inputs: ['guide'], outputs: ['color'], uniforms: auxiliaryPassUniforms,\n csMain: 'if (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) {return;} out_color[globalId.x + globalId.y * u32(imageSize.x)] = textureLoad(in_guide, vec2i(globalId.xy), 0);'\n }));\n pass.setOutputParams({ color: { channels: 4 } });\n pass.setSize(renderWidth, renderHeight); pass.setUniform('imageSize', [renderWidth, renderHeight]);\n const output = exact ? scratch.get(`${key} buffer`, () => new WGPUScratchBuffer(device)).get(renderWidth * renderHeight * 16, true) : undefined;\n const encoder = device.createCommandEncoder(); pass.createPass(encoder, { guide: { texture: input, channels: 4 } }, output ? {color: output} : undefined); device.queue.submit([encoder.finish()]);\n return output ?? pass.getOutput('color');\n }\n\n function drawPostProcess(\n encoder: GPUCommandEncoder,\n _forceNeedsDenoise?: boolean,\n resolve = false\n ) {\n displayPostProcess.reset();\n if (resolve) {\n resolvedSamples = sampleCount;\n resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher();\n resolvedFlatBackground = pendingFlatBackground.slice();\n }\n composePass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n rawOutputPass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n if (resolvedSamples < 1) return;\n prepareComposition();\n if (denoiseValid) denoisedTexture = prepareDenoisedTexture(\n encoder,\n denoisedBuffer,\n denoisedTexture\n );\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(encoder, rayTracePass.getOutputBuffer(), resolvedHasShadowCatcher);\n }\n\n composePass.setUniform(\n 'shadowCatcherEnabled',\n +resolvedHasShadowCatcher\n );\n\n let foregroundTexture = getFrameInput(\n resolvedHasShadowCatcher ? 'foreground' : 'color'\n );\n const colorTexture = denoiseValid && denoisedHDR && denoisedTexture ? denoisedTexture : getFrameInput('color');\n let catcherBackgroundTexture = getFrameInput('catcherBackground');\n if (denoiseValid && denoisedHDR && denoisedTexture && resolvedHasShadowCatcher) {\n const layers = scratch.get('custom HDR layers', () => new WGPUFullQuadPass('Custom HDR layers', device, {\n textureWillBeRead: true,\n inputs: ['originalTex', 'filteredTex', 'foregroundTex', 'backgroundTex'],\n outputs: ['foreground', 'background'], fsMain: customDenoiseLayersMain\n }));\n layers.setOutputParams({foreground: {format: 'rgba32float'}, background: {format: 'rgba32float'}});\n layers.setSize(renderWidth, renderHeight);\n layers.createPass(encoder, {originalTex: getFrameInput('color'), filteredTex: denoisedTexture,\n foregroundTex: foregroundTexture, backgroundTex: catcherBackgroundTexture});\n foregroundTexture = layers.getOutput('foreground');\n catcherBackgroundTexture = layers.getOutput('background');\n }\n const bloomEnabled = bloomIntensity > 0.0;\n // Progressive accumulation refreshes bloom every ten samples.\n const samplesSkipped = sampleCount < 10 || sampleCount % 10 > 0;\n const bloomState = scratch.get('bloom state', () => ({ owner: undefined as object | undefined, settings: '', dispose() { } }));\n const bloomSettings = `${bloomThreshold}/${bloomRadius}/${+(denoiseValid && denoisedHDR)}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let bloomIntensityToUpdate = bloomIntensity;\n if (needsUpdateBloom) {\n if (!bloomPass) {\n bloomPass = scratch.get('bloom', () => new WGPUBloomPass(device));\n bloomPass.setSize(renderWidth, renderHeight);\n }\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n bloomPass.createPass(encoder, colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n bloomIntensityToUpdate = 0;\n }\n composePass.setUniform('bloomIntensity', bloomIntensityToUpdate);\n composePass.createPass(encoder, {\n colorTex: colorTexture,\n foregroundTex: foregroundTexture,\n catcherBackgroundTex: catcherBackgroundTexture,\n flatBackgroundMaskTex: getFrameInput('albedo'),\n shadowCatcherTex: getFrameInput('shadowCatcher'),\n // Use color texture as placeholder\n bloomTex: bloomEnabled && bloomPass ? bloomPass.getOutput() : colorTexture\n });\n if (denoiseValid && !denoisedHDR && denoisedDisplayLinear && denoisedTexture) {\n compositeDenoiseDisplayPass.createPass(encoder, {\n colorTex: denoisedTexture,\n composedTex: composePass.getOutput('denoiseColor')\n });\n }\n let displayTexture =\n (denoiseValid && denoisedBuffer ? (denoisedHDR ? composePass.getOutput('color') : denoisedDisplayLinear\n ? compositeDenoiseDisplayPass.getOutput('color') : denoisedTexture) : undefined) ||\n composePass.getOutput('color');\n const activeHDRPeakMeter = hdrOutputActive\n ? (hdrPeakMeter ??= scratch.get('hdrPeak', () => new WGPUHDRPeakMeter(device)))\n : undefined;\n const hdrPeakReadbackSubmitted =\n activeHDRPeakMeter?.encode(\n encoder,\n displayTexture,\n renderWidth,\n renderHeight\n ) ?? false;\n\n if (output === 'normal' || output === 'albedo') {\n displayTexture = getFrameInput(output);\n } else if (output === 'shadowCatcher') {\n displayTexture = getFrameInput('shadowCatcher');\n }\n\n if (displayTexture.width < renderWidth || displayTexture.height < renderHeight) {\n readbackPass.setSize(renderWidth, renderHeight);\n readbackPass.createPass(encoder, { inputTex: displayTexture });\n displayTexture = readbackPass.getOutput('color');\n }\n // Keep the completed denoise visible until its replacement is ready.\n if (!(preserveDenoisedOutput && output === 'final' && !denoiseValid && presentationDenoised)) {\n const width = renderWidth, height = renderHeight;\n if (!presentationTexture || presentationTexture.width !== width || presentationTexture.height !== height || presentationTexture.format !== displayTexture.format) {\n const previous = presentationTexture;\n presentationTexture = device.createTexture({\nlabel: 'Render complete image', size: { width, height }, format: displayTexture.format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC\n});\n if (previous) void device.queue.onSubmittedWorkDone().catch(() => { }).then(() => previous.destroy());\n }\n encoder.copyTextureToTexture({ texture: displayTexture }, { texture: presentationTexture }, { width, height });\n presentationDenoised = output === 'final' && denoiseValid;\n }\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n if (hdrPeakReadbackSubmitted) {\n void activeHDRPeakMeter?.resolve();\n }\n }\n\n function trace(camera: Camera, maxSamples: number) {\n // A call to draw means accumulation has been invalidated. Cancel OIDN\n // before checking shader compilation: pipeline-affecting parameter changes\n // otherwise leave the previous asynchronous denoise alive while resources\n // and bind groups are being replaced.\n cancelDenoise();\n\n if (rayTracePass.isCompilingShader()) {\n isFirstFrame = true;\n sampleCount = 0;\n return true;\n }\n\n // Update the camera before compiling and sampling.\n rayTracePass.setCamera(camera);\n const resetAccumulation = isFirstFrame;\n if (resetAccumulation) {\n denoiseValid = false;\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n (tileRenderWithPredict || tileRender).reset();\n\n // Reset\n isFirstFrame = false;\n sampleCount = 0;\n }\n\n rayTracePass.updatePipeline();\n\n if (rayTracePass.isCompilingShader() || !rayTracePass.isPipelineReady()) {\n isFirstFrame = true;\n sampleCount = 0;\n return true;\n }\n\n // Keep the last completed denoise visible while a static while-converging batch\n // accumulates, including the incomplete first sample after a scene edit.\n if (!preserveDenoisedOutput || isFirstFrame) {\n clearDenoisedOutput();\n }\n if (isPredictingFrame) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n }\n\n // Never enter a waiting prediction state while the shared timestamp\n // buffer is still being mapped. Render normally and retry the probe on a\n // later frame. The probe itself is also non-blocking: if readback fails or\n // is superseded, the renderer keeps using the conservative tile seed.\n if (\n offlineSamplesPerBatch === 0 &&\n tileRenderWithPredict &&\n needsUpdatePredicting &&\n timeQuery?.resultBuffer.mapState === 'unmapped'\n ) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = true;\n tileRenderWithPredict.needsUpdatePredicting();\n needsUpdatePredicting = false;\n }\n\n const frameSampleCount = sampleCount;\n _startRecordFrameTime(!resetAccumulation);\n const renderSampleTarget = maxSamples;\n const batchTarget = Math.min(\n renderSampleTarget,\n sampleCount + Math.max(offlineSamplesPerBatch, 1)\n );\n do {\n let {\n xIndex,\n yIndex,\n columns,\n rows,\n isFirstTile,\n isLastTile,\n samplesPerFrame\n } = (tileRenderWithPredict || tileRender).nextTile(elapsedTileTime);\n\n rayTraceOutputPass.setSampleTileGrid(columns, rows);\n\n if (offlineSamplesPerBatch > 0 && columns * rows === 1) {\n samplesPerFrame = batchTarget - sampleCount;\n } else if (!allowMultipleSamplesPerFrame) {\n samplesPerFrame = 1;\n }\n\n if (columns * rows === 1) {\n rayTracePass.setSampleTiles(1, 1, 0, 0);\n let samplesSubmitted = 0;\n while (\n samplesSubmitted < samplesPerFrame &&\n sampleCount < renderSampleTarget &&\n sampleCount < batchTarget\n ) {\n sample(sampleCount === 0, [1, 1]);\n sampleCount++;\n samplesSubmitted++;\n }\n } else {\n rayTracePass.setSampleTiles(columns, rows, xIndex, yIndex);\n sample(sampleCount === 0 && isFirstTile, [columns, rows]);\n if (isLastTile) sampleCount++;\n }\n } while (\n offlineSamplesPerBatch > 0 &&\n sampleCount < batchTarget &&\n sampleCount < renderSampleTarget\n );\n\n // Not displaying on screen for prediciting frame.\n if (isPredictingFrame) {\n // This hidden timing probe has not resolved the OIDN input textures.\n // Exclude it from progressive samples so a 1spp target cannot denoise\n // stale inputs, and clear its accumulation on the next visible sample.\n sampleCount = 0;\n return false;\n }\n\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= renderSampleTarget)) {\n const encoder = device.createCommandEncoder();\n drawPostProcess(encoder, sampleCount >= renderSampleTarget, true);\n }\n if (sampleCount !== frameSampleCount) {\n\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n }\n\n return false;\n }\n\n function roundUp(a: number, b: number) {\n return Math.ceil(a / b) * b;\n }\n\n function _applyRenderResolution() {\n if (!screenWidth || !screenHeight) return;\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextRenderWidth = roundUp(\n Math.max(1, Math.round(screenWidth * scale)),\n 16\n );\n const nextRenderHeight = roundUp(\n Math.max(1, Math.round(screenHeight * scale)),\n 16\n );\n if (nextRenderWidth === renderWidth && nextRenderHeight === renderHeight) {\n rayTracePass.setSize(nextRenderWidth, nextRenderHeight, screenWidth / screenHeight);\n return;\n }\n\n // OIDN retains the ray-trace output textures supplied at the start of a\n // tile sequence. Stop every phase (including Promise-chained follow-ups)\n // before those textures are replaced below.\n cancelDenoise();\n // Completed OIDN buffers use the previous image dimensions. Scene edits\n // may preserve them, but a resize must not copy them with the new stride.\n // The target retains its complete presentation texture through the resize.\n clearDenoisedOutput();\n tileTimingGeneration++;\n renderWidth = nextRenderWidth;\n renderHeight = nextRenderHeight;\n (tileRenderWithPredict || tileRender).setSize(renderWidth, renderHeight);\n // Projection follows the displayed canvas, independent of preview/texture alignment.\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n compositeDenoiseDisplayPass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n\n resolvedSamples = 0;\n // Resizing starts a fresh accumulation while retaining the previous presentation.\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n }\n\n function setSize(width: number, height: number) {\n if (width === screenWidth && height === screenHeight) {\n return;\n }\n screenWidth = width;\n screenHeight = height;\n invalidateTilePrediction();\n _applyRenderResolution();\n outputPass.setSize(screenWidth, screenHeight);\n isFirstFrame = true;\n }\n\n function synchronizeBackground(background?: SceneBackground) {\n const flatColor = Array.isArray(background) && background[3] >= 0.99999\n ? background\n : undefined;\n const flatBackgroundColor = flatColor\n ? [flatColor[0], flatColor[1], flatColor[2], 1]\n : [0, 0, 0, 0];\n pendingFlatBackground = flatBackgroundColor;\n }\n\n function setToneMappingParams(params: ToneMappingParams) {\n const newExposure = params.exposure ?? 1;\n const newToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const newContrast = params.contrast ?? 1;\n const newSaturation = params.saturation ?? 1;\n const newTemperature = params.temperature ?? 0;\n const newTint = params.tint ?? 0;\n const newVignette = params.vignette ?? 0;\n if (\n newExposure === exposure &&\n newToneMappingMode === toneMappingMode &&\n newContrast === contrast &&\n newSaturation === saturation &&\n newTemperature === temperature &&\n newTint === tint &&\n newVignette === vignette\n ) return false;\n invalidateCompositeDenoise();\n exposure = newExposure;\n toneMappingMode = newToneMappingMode;\n contrast = newContrast;\n saturation = newSaturation;\n temperature = newTemperature;\n tint = newTint;\n vignette = newVignette;\n composePass.setUniform('exposure', exposure);\n composePass.setUniform('toneMappingParams', [toneMappingMode, vignette]);\n composePass.setUniform('colorGradingParams', [\n contrast,\n saturation,\n temperature,\n tint\n ]);\n return true;\n }\n\n function setHDROutputEnabled(enabled: boolean) {\n if (enabled === hdrOutputRequested) return false;\n invalidateCompositeDenoise();\n hdrOutputRequested = enabled;\n const wasActive = hdrOutputActive;\n\n hdrOutputActive = enabled && surface.supportsHDR;\n\n const nextComposeColorFormat: GPUTextureFormat = hdrOutputActive\n ? 'rgba16float'\n : 'rgba8unorm';\n if (nextComposeColorFormat !== composeColorFormat) {\n composeColorFormat = nextComposeColorFormat;\n composePass.setOutputParams({\n color: { format: composeColorFormat },\n denoiseColor: { format: 'rgba32float' }\n });\n\n }\n if (wasActive !== hdrOutputActive) {\n hdrPeakMeter?.reset();\n }\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: composeColorFormat } });\n compositeDenoiseDisplayPass.setUniform('hdrOutputEnabled', hdrOutputActive ? 1 : 0);\n composePass.setUniform('hdrOutputEnabled', hdrOutputActive ? 1 : 0);\n return wasActive !== hdrOutputActive;\n }\n\n function _startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n const scheduleFrame =\n typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (callback: FrameRequestCallback) =>\n setTimeout(\n () => callback(performance.now()),\n 0\n ) as unknown as number;\n scheduleFrame(() => {\n // TODO use timestamp from requestAnimationFrame may have negative value.\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n // Without GPU timestamps, discard the draw that follows a scene\n // update instead of feeding its preparation/compilation time back.\n elapsedTileTime = collectTileTiming ? elapsedFrameTime : undefined;\n }\n });\n }\n function _onPageVisiblilityChange() {\n if (typeof document !== 'undefined' && document.hidden) {\n pageLeaveTime = performance.now();\n } else {\n pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n }\n\n /** Runs the built-in JNLM filter on the current composed image. */\n function performJNLMDenoise(\n denoiser: JNLMDenoiser\n ): Promise<boolean> {\n const generation = denoiseGeneration;\n\n jnlmPass ??= scratch.get('jnlm', () => new WGPUJNLMDenoisePass(device));\n const rayBuffers = rayTracePass.getOutputBuffer();\n const encoder = device.createCommandEncoder({ label: 'JNLM denoise' });\n const output = jnlmPass.encode(encoder, {\n width: renderWidth,\n height: renderHeight,\n accumulation: rayBuffers.shadowCatcher,\n normalAccumulation: rayBuffers.normal,\n color: composePass.getOutput('denoiseColor'),\n albedo: getFrameInput('albedo'),\n normal: getFrameInput('normal'),\n shadowCatcher: getFrameInput('shadowCatcher'),\n strength: denoiser.strength,\n shape: denoiser.shape\n });\n denoisedBuffer = copyDenoisedOutput(\n encoder,\n { data: output, width: renderWidth, height: renderHeight },\n denoisedBuffer\n );\n denoisedDisplayLinear = true;\n denoiseValid = true;\n // The filter also smooths coverage, which carries catcher shadows and\n // transmissive alpha.\n compositeDenoiseDisplayPass.setUniform(\n 'denoisedAlpha', +rayTracePass.needsDenoiseAlpha()\n );\n drawPostProcess(encoder, false);\n return device.queue.onSubmittedWorkDone().then(() => {\n const completed = generation === denoiseGeneration;\n\n return completed;\n });\n }\n\n function performCustomDenoise(\n denoiser: import('../Render.js').Denoiser,\n schedule: import('../Render.js').DenoiseSchedule,\n signal?: AbortSignal\n ): Promise<boolean> {\n const generation = denoiseGeneration;\n const controller = activeCustomController = new AbortController();\n const abort = () => controller.abort();\n signal?.addEventListener('abort', abort, {once: true});\n if (signal?.aborted) abort();\n const task = (async () => {\n if (controller.signal.aborted) return false;\n const color = copyGuide('Custom HDR input', getFrameInput('color'), true);\n const width = renderWidth, height = renderHeight;\n const albedo = copyGuide('Custom albedo', getFrameInput('albedo'), true);\n const normal = copyGuide('Custom normal', getFrameInput('normal'), true);\n const output = scratch.get('Custom output', () => new WGPUScratchBuffer(device)).get(width * height * 16, true);\n await denoiser.denoise({device, width, height, color, albedo, normal, output}, {signal: controller.signal, schedule});\n if (controller.signal.aborted || disposed || generation !== denoiseGeneration) return false;\n const coverage = scratch.get('custom coverage', () => new WGPUComputePass('Custom coverage', device, {\n inputs: ['filtered', 'original'], outputs: ['color'], uniforms: auxiliaryPassUniforms,\n csMain: customDenoiseCoverageMain\n }));\n coverage.setOutputParams({color: {channels: 4}});\n coverage.setSize(width, height); coverage.setUniform('imageSize', [width, height]);\n const finish = device.createCommandEncoder({label: 'Custom HDR result'});\n coverage.createPass(finish, {filtered: {buffer: output, channels: 4}, original: {buffer: color, channels: 4}});\n denoisedBuffer = copyDenoisedOutput(finish, {data: coverage.getOutput('color'), width, height}, denoisedBuffer);\n denoisedHDR = true; denoisedDisplayLinear = false; denoiseValid = true;\n drawPostProcess(finish, false);\n await device.queue.onSubmittedWorkDone();\n return !controller.signal.aborted && !disposed && generation === denoiseGeneration;\n })();\n customJobs.add(task);\n void task.finally(() => {\n customJobs.delete(task); signal?.removeEventListener('abort', abort);\n if (activeCustomController === controller) activeCustomController = undefined;\n }).catch(() => {});\n return task;\n }\n\n function performDenoise(\n attachedDenoiser: DenoiserHandle,\n alphaDenoiser: OIDNWeb | undefined,\n denoiseSchedule: 'converged' | 'progressive' | 'every-sample' = 'converged',\n signal?: AbortSignal\n ): Promise<boolean> {\n cancelDenoise();\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n if (attachedDenoiser.kind === 'custom') return performCustomDenoise(attachedDenoiser.denoiser, denoiseSchedule, signal);\n denoisedHDR = false;\n if (attachedDenoiser.kind === 'jnlm') return performJNLMDenoise(attachedDenoiser.denoiser);\n const denoiser: OIDNWeb = attachedDenoiser.denoiser;\n compositeDenoiseDisplayPass.setUniform('denoisedAlpha', 0);\n const generation = denoiseGeneration;\n\n const size = { width: renderWidth, height: renderHeight };\n const snapshotEncoder = device.createCommandEncoder();\n const colorInput = snapshotInput(snapshotEncoder, 'OIDN color input', composePass.getOutput('denoiseColor'));\n device.queue.submit([snapshotEncoder.finish()]);\n for (const pass of [oidnAlbedoEncodePass, oidnAlbedoDecodePass, oidnNormalSanitizePass]) {\n pass.setSize(renderWidth, renderHeight); pass.setUniform('imageSize', [renderWidth, renderHeight]);\n }\n const convergingTileOptions = {\n ...(denoiseSchedule !== 'converged' ? {\n tileOverlap: 80,\n // Low-resolution interaction must finish as one low-latency frame;\n // otherwise continuous camera updates outrun a multi-tile denoise.\n // The settled full-resolution image uses bounded dynamic tiles so\n // 4K inference cannot allocate a whole-image U-Net activation set.\n wholeImage: denoiseSchedule === 'every-sample'\n } : {}),\n // A preview frame is one whole-image pass. Settled images can take many\n // tiles; oidn-web 0.5 runs those back to back by default, which starves\n // the page at 4K, so pace them to display frames instead.\n scheduling: denoiseSchedule === 'every-sample' ? 'event-loop' as const : 'animation-frame' as const\n };\n type AuxiliaryGuides = {\n albedo: OIDNWebGPUData;\n normal: OIDNWebGPUData;\n };\n\n async function denoiseAuxiliaryGuides(): Promise<\n AuxiliaryGuides | undefined\n > {\n const auxiliaryDenoisers = denoiser.auxiliaryDenoisers;\n // Prefilter sampled texture/normal detail for clean-aux weights. The\n // accumulated guides alone are not antialiased at silhouettes and\n // subpixel texture boundaries.\n if (!auxiliaryDenoisers) {\n return {\n albedo: {\n data: copyGuide('OIDN raw albedo', getFrameInput('albedo')),\n ...size\n },\n normal: {\n data: copyGuide('OIDN raw normal', getFrameInput('normal')),\n ...size\n }\n };\n }\n if (generation !== denoiseGeneration) return undefined;\n\n const encodeEncoder = device.createCommandEncoder();\n oidnAlbedoEncodePass.createPass(encodeEncoder, {\n albedo: {\n texture: getFrameInput('albedo'),\n channels: 4\n }\n });\n device.queue.submit([encodeEncoder.finish()]);\n\n let albedoOutput: OIDNWebGPUOutputData | undefined;\n await runOIDNPhase(generation, (finish, fail) =>\n auxiliaryDenoisers.albedo.tileExecute({\n ...convergingTileOptions,\n color: {\n data: oidnAlbedoEncodePass.getOutput('albedo'),\n ...size\n },\n done(output) {\n albedoOutput = output;\n finish();\n },\n error: fail\n })\n );\n if (generation !== denoiseGeneration || !albedoOutput) return undefined;\n\n const decodeEncoder = device.createCommandEncoder();\n oidnAlbedoDecodePass.setUniform('preserveSurfaceTexture', +false);\n oidnAlbedoDecodePass.createPass(decodeEncoder, {\n albedo: { buffer: albedoOutput.data, channels: 4 },\n rawAlbedo: { texture: getFrameInput('albedo'), channels: 4 },\n rawNormal: { texture: getFrameInput('normal'), channels: 4 }\n });\n device.queue.submit([decodeEncoder.finish()]);\n\n let normalOutput: OIDNWebGPUOutputData | undefined;\n await runOIDNPhase(generation, (finish, fail) =>\n auxiliaryDenoisers.normal.tileExecute({\n ...convergingTileOptions,\n color: {\n data: copyGuide('OIDN raw normal', getFrameInput('normal')),\n ...size\n },\n done(output) {\n normalOutput = output;\n finish();\n },\n error: fail\n })\n );\n if (generation !== denoiseGeneration || !normalOutput) return undefined;\n\n const normalEncoder = device.createCommandEncoder();\n oidnNormalSanitizePass.createPass(normalEncoder, {\n normal: { buffer: normalOutput.data, channels: 4 }\n });\n device.queue.submit([normalEncoder.finish()]);\n\n return {\n albedo: {\n data: oidnAlbedoDecodePass.getOutput('albedo'),\n ...size\n },\n normal: {\n data: oidnNormalSanitizePass.getOutput('normal'),\n ...size\n }\n };\n }\n\n function denoiseComposite(guides: AuxiliaryGuides): Promise<void> {\n if (generation !== denoiseGeneration) return Promise.resolve();\n // Snapshot the complete raw composition; never feed a previous denoise\n // back into the network during progressive updates.\n return runOIDNPhase(generation, (finish, fail) =>\n denoiser.tileExecute({\n ...convergingTileOptions,\n color: { data: colorInput, ...size },\n albedo: guides.albedo,\n normal: guides.normal,\n progress(output, _tileData, _tile, currentIdx, totalIdx) {\n if (generation !== denoiseGeneration) return;\n if (denoiseSchedule !== 'converged' && currentIdx + 1 < totalIdx) return;\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = true;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n },\n done(output) {\n if (generation === denoiseGeneration) {\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = true;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n }\n finish();\n },\n error: fail\n })\n );\n }\n\n // Denoise alpha channel\n function denoiseComposed(): Promise<void> {\n if (!alphaDenoiser || generation !== denoiseGeneration) {\n return Promise.resolve();\n }\n const encoder = device.createCommandEncoder();\n readbackPass.setSize(renderWidth, renderHeight);\n readbackPass.createPass(encoder, { inputTex: denoisedDisplayLinear ? compositeDenoiseDisplayPass.getOutput('color') : composePass.getOutput('color') });\n const alphaInput = snapshotInput(encoder, 'OIDN alpha input', readbackPass.getOutput('color'));\n device.queue.submit([encoder.finish()]);\n return runOIDNPhase(generation, (finish, fail) =>\n alphaDenoiser.tileExecute({\n ...convergingTileOptions,\n color: { data: alphaInput, ...size },\n denoiseAlpha: true,\n progress(output, _tileData, _tile, currentIdx, totalIdx) {\n if (generation !== denoiseGeneration) return;\n // While-converging denoising keeps the previous complete frame (or the\n // fallback) visible while tiled inference is\n // running. Publishing the shared output buffer before its final\n // tile would expose uninitialized regions as black rectangles.\n if (denoiseSchedule !== 'converged' && currentIdx + 1 < totalIdx) return;\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(\n encoder,\n output,\n denoisedBuffer\n );\n denoisedDisplayLinear = false;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n },\n done(output) {\n if (generation === denoiseGeneration) {\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = false;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n }\n finish();\n },\n error: fail\n })\n );\n }\n\n return denoiseAuxiliaryGuides()\n .then(async (guides) => {\n if (guides && generation === denoiseGeneration) {\n await denoiseComposite(guides);\n }\n })\n .then(() => {\n if (\n generation === denoiseGeneration &&\n rayTracePass.needsDenoiseAlpha()\n ) {\n return denoiseComposed();\n }\n })\n .then(() => {\n const completed = generation === denoiseGeneration;\n\n return completed;\n });\n }\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', _onPageVisiblilityChange);\n }\n function dispose() {\n if (disposed) return;\n if (typeof document !== 'undefined') {\n document.removeEventListener(\n 'visibilitychange',\n _onPageVisiblilityChange\n );\n }\n disposed = true;\n tileTimingGeneration++;\n cancelDenoise();\n // Target outputs and timestamp readbacks can still be referenced by the\n // queue. Cancel inference now; retire all GPU-owned target resources after\n // both submitted work and the pending timestamp mapping have completed.\n void Promise.all([\n device.queue.onSubmittedWorkDone().catch(() => undefined),\n diagnosticsReadbackPromise\n ]).then(() => {\n rayTracePass.releaseTarget(targetKey);\n denoisedBuffer?.destroy();\n presentationTexture?.destroy();\n displayPostProcess.dispose();\n rayTraceOutputPass.dispose();\n });\n }\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n if (renderWidth && renderHeight) rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setAlphaBlendStrategy(execution.alphaBlendStrategy);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateTiming: invalidateTilePrediction,\n invalidateDenoisedOutput() { cancelDenoise(); denoiseValid = false; preserveDenoisedOutput = false; },\n configure(settings: TraceSettings) {\n const timingKeys = ['bounces', 'bevel', 'bevelSamples', 'directLightCandidates', 'dispersionWavelengths', 'alphaBlendStrategy', 'samplingPattern', 'clamping', 'transmissiveOutputAlphaMin'] as const;\n if (!execution || timingKeys.some(key => execution![key] !== settings[key])) invalidateTilePrediction();\n execution = { ...settings };\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n allowMultipleSamplesPerFrame = settings.allowMultipleSamplesPerFrame;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n tileRenderWithPredict?.setDesiredMsPerTile(maxTimePerTile);\n tileRenderWithPredict?.setMaxTiles(settings.maxTiles);\n },\n synchronizeBackground,\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) {\n return (lastGpuTraceTiming?.estimatedFullFrameTimeMs ?? elapsedFrameTime) <= timeBudgetMs;\n },\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n surface.configure(hdrOutputActive);\n const encoder = device.createCommandEncoder();\n outputPass.setSize(canvas.width, canvas.height);\n _present(encoder, displayPostProcess.output ?? presentationTexture);\n device.queue.submit([encoder.finish()]);\n },\n getMemory() {\n return {\nwidth: renderWidth, height: renderHeight,\n bytes: rayTracePass.getTargetMemoryBytes(targetKey) + rayTraceOutputPass.getMemoryBytes() + textureBytes(presentationTexture) + displayPostProcess.getMemoryBytes() + (denoisedBuffer?.size ?? 0)\n};\n },\n isFirstFrame() {\n return isFirstFrame;\n },\n\n restartSamples() {\n // Input edits reset accumulation, not learned throughput. Re-arming a\n // hidden probe here starves continuously changing scenes of visible samples.\n tileTimingGeneration++;\n cancelDenoise();\n preserveDenoisedOutput = false;\n denoiseValid = false;\n presentationDenoised = false;\n resolvedSamples = 0;\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n isFirstFrame = true;\n sampleCount = 0;\n },\n\n getOutputTexture(kind) {\n if (resolvedSamples < 1) return;\n if (kind === 'hdr') return getFrameInput('color');\n return displayPostProcess.output ?? presentationTexture;\n },\n applyPostProcesses(passes, render) {\n if (presentationTexture) displayPostProcess.run(presentationTexture, passes, render);\n },\n trace,\n drawPostProcess() {\n const encoder = device.createCommandEncoder();\n drawPostProcess(encoder, true);\n },\n performDenoise,\n cancelDenoise,\n setSize,\n setHDROutputEnabled,\n setToneMappingParams,\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n const image = displayPostProcess.output ?? presentationTexture;\n const width = image.width, height = image.height;\n const bytesPerRow = Math.ceil(width * 16 / 256) * 256;\n const buffer = device.createBuffer({ size: bytesPerRow * height, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ });\n const encoder = device.createCommandEncoder();\n readbackPass.setSize(width, height);\n readbackPass.createPass(encoder, { inputTex: image });\n encoder.copyTextureToBuffer({ texture: readbackPass.getOutput('color') }, { buffer, bytesPerRow }, { width, height });\n device.queue.submit([encoder.finish()]);\n try {\n await buffer.mapAsync(GPUMapMode.READ);\n const mapped = new Float32Array(buffer.getMappedRange());\n const data = new Float32Array(width * height * 4);\n for (let y = 0;y < height;y++) data.set(mapped.subarray(y * bytesPerRow / 4, y * bytesPerRow / 4 + width * 4), y * width * 4);\n return { width, height, data };\n } finally { buffer.unmap(); buffer.destroy(); }\n },\n async readOutput(kind) {\n rawOutputPass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n const width = renderWidth, height = renderHeight;\n const bytesPerRow = Math.ceil(width * 16 / 256) * 256;\n const buffer = device.createBuffer({\n size: bytesPerRow * height, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n });\n const encoder = device.createCommandEncoder();\n const denoised = kind === 'denoised' && denoiseValid ? denoisedBuffer : undefined;\n if (kind === 'denoised' && !denoised) kind = 'hdr';\n const pass = kind === 'hdr' ? rawOutputPass : readbackPass;\n pass.setOutputParams({ color: { format: 'rgba32float' } });\n pass.setSize(width, height);\n if (denoised) {\n encoder.copyBufferToBuffer(denoised, 0, buffer, 0, width * height * 16);\n } else if (kind === 'hdr') {\n rawOutputPass.createPass(encoder, { colorTex: getFrameInput('color'), coverageTex: getFrameInput('albedo') });\n } else {\n readbackPass.createPass(encoder, { inputTex: getFrameInput(kind as 'albedo' | 'normal') });\n }\n if (!denoised) encoder.copyTextureToBuffer({ texture: pass.getOutput('color') }, { buffer, bytesPerRow }, { width, height, depthOrArrayLayers: 1 });\n device.queue.submit([encoder.finish()]);\n try {\n await buffer.mapAsync(GPUMapMode.READ);\n const mapped = new Float32Array(buffer.getMappedRange());\n const data = new Float32Array(width * height * 4);\n const stride = denoised ? width * 4 : bytesPerRow / 4;\n for (let y = 0;y < height;y++) data.set(mapped.subarray(y * stride, y * stride + width * 4), y * width * 4);\n return { data, width, height };\n } finally { buffer.unmap(); buffer.destroy(); }\n },\n\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n setOfflineRenderOptions(options) {\n const wasOffline = offlineSamplesPerBatch > 0;\n offlineSamplesPerBatch = Math.max(0, Math.round(options.samplesPerBatch));\n deferPostProcess = options.deferPostProcess;\n sampleSequenceOffset = Math.max(\n 0,\n Math.round(options.sampleSequenceOffset)\n );\n if (offlineSamplesPerBatch > 0 && isPredictingFrame) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n }\n if (offlineSamplesPerBatch > 0) needsUpdatePredicting = false;\n else if (wasOffline) invalidateTilePrediction();\n },\n setVarianceMoments(enabled: boolean) {\n rayTracePass.setVarianceMoments(enabled);\n },\n setAdaptiveSamplingTargets(targets) {\n rayTracePass.setAdaptiveSamplingTargets(targets);\n },\n prepareOfflineAdaptiveSampling(options) {\n return rayTracePass.prepareOfflineAdaptiveSampling(options);\n },\n\n getTotalSamplesRendered() {\n return sampleCount;\n },\n\n getDiagnostics() {\n return {\n ...rayTracePass.getDiagnostics(),\n hdrPresentation: {\n requested: hdrOutputRequested,\n active: surface.hdr,\n peakDisplayValue: surface.hdr\n ? hdrPeakMeter?.getPeakDisplayValue()\n : undefined\n },\n gpuTraceTiming: lastGpuTraceTiming\n };\n },\n\n async flushDiagnostics() {\n await device.queue.onSubmittedWorkDone();\n await diagnosticsReadbackPromise;\n },\n\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n threshold !== bloomThreshold ||\n intensity !== bloomIntensity ||\n radius !== bloomRadius;\n if (changed) invalidateCompositeDenoise();\n bloomThreshold = threshold;\n bloomIntensity = intensity;\n bloomRadius = radius;\n return changed;\n },\n\n setShadowCatcherParams(color: ColorRGB, alpha: number) {\n const changed =\n color[0] !== shadowCatcherColor[0] ||\n color[1] !== shadowCatcherColor[1] ||\n color[2] !== shadowCatcherColor[2] ||\n alpha !== shadowCatcherAlpha;\n\n if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n\n return changed;\n },\n\n setOnSampleRendered(\n cb: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void\n ) {\n sampleRenderedCallback = cb;\n },\n\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n\n dispose\n } satisfies TargetPipeline;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWGPURenderTargets(canvas: HTMLCanvasElement | OffscreenCanvas, device: GPUDevice, options: WGPURenderingPipelineOptions = {}): RenderPipeline {\n const rayTracePass = new WGPURayTracePass(device);\n const customJobs = new Set<Promise<unknown>>();\n const scratch = new ScratchPool(work => {\n // A cancelled custom filter can keep submitting GPU work until its promise settles.\n // A custom callback can dispose synchronously, before its promise is recorded.\n // Observe leases after that callback returns so its borrowed inputs stay alive.\n void Promise.resolve().then(() => Promise.allSettled([...customJobs]))\n .then(() => device.queue.onSubmittedWorkDone()).catch(() => {}).then(work);\n });\n const surface = scratch.get('canvas', () => new WGPUCanvasSurface(canvas, device, options.presentationFormat ?? navigator.gpu.getPreferredCanvasFormat()));\n return makeRenderPipeline(rayTracePass, () => {\n const target = makeWGPUAccumulationTarget(canvas, device, rayTracePass, surface, scratch, customJobs);\n return target;\n }, false, scratch);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ /** Scene data that changes without changing resource layouts or algorithms. */
2
+ export declare const WGPU_SCENE_FEATURE_BITS: Record<string, number>;
3
+ export declare function wgpuSceneFeatureFlags(constants: Record<string, boolean | number>): number;
@@ -0,0 +1,20 @@
1
+ import { MATERIAL_TEXTURE_FEATURE_BITS } from './materialTextureSlots.js';
2
+ /** Scene data that changes without changing resource layouts or algorithms. */
3
+ export const WGPU_SCENE_FEATURE_BITS = {
4
+ USE_ENVMAP: 1,
5
+ ...MATERIAL_TEXTURE_FEATURE_BITS,
6
+ HAS_THIN_FILM: 2 ** 10,
7
+ HAS_COAT: 2 ** 11,
8
+ HAS_FUZZ: 2 ** 12,
9
+ HAS_SUBSURFACE: 2 ** 13,
10
+ HAS_SHADOW_CATCHER: 2 ** 14
11
+ };
12
+ export function wgpuSceneFeatureFlags(constants) {
13
+ let flags = 0;
14
+ for (const [name, bit] of Object.entries(WGPU_SCENE_FEATURE_BITS)) {
15
+ if (constants[name])
16
+ flags |= bit;
17
+ }
18
+ return flags;
19
+ }
20
+ //# sourceMappingURL=WGPUSceneFeatures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WGPUSceneFeatures.js","sourceRoot":"","sources":["../../src/renderer/WGPUSceneFeatures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAE1E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,uBAAuB,GAA2B;IAC7D,UAAU,EAAE,CAAC;IACb,GAAG,6BAA6B;IAChC,aAAa,EAAE,CAAC,IAAI,EAAE;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE;IACjB,cAAc,EAAE,CAAC,IAAI,EAAE;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE;CAC5B,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,SAA2C;IAC/E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAClE,IAAI,SAAS,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,GAAG,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { MATERIAL_TEXTURE_FEATURE_BITS } from './materialTextureSlots.js';\n\n/** Scene data that changes without changing resource layouts or algorithms. */\nexport const WGPU_SCENE_FEATURE_BITS: Record<string, number> = {\n USE_ENVMAP: 1,\n ...MATERIAL_TEXTURE_FEATURE_BITS,\n HAS_THIN_FILM: 2 ** 10,\n HAS_COAT: 2 ** 11,\n HAS_FUZZ: 2 ** 12,\n HAS_SUBSURFACE: 2 ** 13,\n HAS_SHADOW_CATCHER: 2 ** 14\n};\n\nexport function wgpuSceneFeatureFlags(constants: Record<string, boolean | number>) {\n let flags = 0;\n for (const [name, bit] of Object.entries(WGPU_SCENE_FEATURE_BITS)) {\n if (constants[name]) flags |= bit;\n }\n return flags;\n}\n"]}
@@ -0,0 +1,9 @@
1
+ /** Engine-owned flat RGBA input snapshot, leased until the current inference finishes. */
2
+ export declare class WGPUScratchBuffer {
3
+ private readonly device;
4
+ private buffer?;
5
+ constructor(device: GPUDevice);
6
+ get(bytes: number, exact?: boolean): GPUBuffer;
7
+ getMemoryBytes(): number;
8
+ dispose(): void;
9
+ }
@@ -0,0 +1,21 @@
1
+ /** Engine-owned flat RGBA input snapshot, leased until the current inference finishes. */
2
+ export class WGPUScratchBuffer {
3
+ device;
4
+ buffer;
5
+ constructor(device) {
6
+ this.device = device;
7
+ }
8
+ get(bytes, exact = false) {
9
+ if (!this.buffer || (exact ? this.buffer.size !== bytes : this.buffer.size < bytes)) {
10
+ const previous = this.buffer;
11
+ this.buffer = this.device.createBuffer({ label: 'Shared inference input', size: bytes,
12
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC });
13
+ if (previous)
14
+ void this.device.queue.onSubmittedWorkDone().catch(() => { }).then(() => previous.destroy());
15
+ }
16
+ return this.buffer;
17
+ }
18
+ getMemoryBytes() { return this.buffer?.size ?? 0; }
19
+ dispose() { this.buffer?.destroy(); }
20
+ }
21
+ //# sourceMappingURL=WGPUScratchBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WGPUScratchBuffer.js","sourceRoot":"","sources":["../../src/renderer/WGPUScratchBuffer.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,MAAM,OAAO,iBAAiB;IAEC;IADrB,MAAM,CAAa;IAC3B,YAA6B,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;IAAG,CAAC;IAClD,GAAG,CAAC,KAAa,EAAE,KAAK,GAAG,KAAK;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAC,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,KAAK;gBAClF,KAAK,EAAE,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAC,CAAC,CAAC;YACtF,IAAI,QAAQ;gBAAE,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IACD,cAAc,KAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,CAAA,CAAC;IACjD,OAAO,KAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA,CAAC;CACpC","sourcesContent":["/** Engine-owned flat RGBA input snapshot, leased until the current inference finishes. */\nexport class WGPUScratchBuffer {\n private buffer?: GPUBuffer;\n constructor(private readonly device: GPUDevice) {}\n get(bytes: number, exact = false) {\n if (!this.buffer || (exact ? this.buffer.size !== bytes : this.buffer.size < bytes)) {\n const previous = this.buffer;\n this.buffer = this.device.createBuffer({label: 'Shared inference input', size: bytes,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC});\n if (previous) void this.device.queue.onSubmittedWorkDone().catch(() => {}).then(() => previous.destroy());\n }\n return this.buffer;\n }\n getMemoryBytes() {return this.buffer?.size ?? 0;}\n dispose() {this.buffer?.destroy();}\n}\n"]}
@@ -0,0 +1,10 @@
1
+ /** One shared conversion texture, retaining its largest allocated capacity. */
2
+ export declare class WGPUScratchTexture {
3
+ private readonly device;
4
+ private texture?;
5
+ constructor(device: GPUDevice);
6
+ get(width: number, height: number): GPUTexture;
7
+ setRegion(width: number, height: number): void;
8
+ getMemoryBytes(): number;
9
+ dispose(): void;
10
+ }
@@ -0,0 +1,27 @@
1
+ import { textureBytes } from './gpuMemory.js';
2
+ import { setTextureRegion } from './textureRegion.js';
3
+ /** One shared conversion texture, retaining its largest allocated capacity. */
4
+ export class WGPUScratchTexture {
5
+ device;
6
+ texture;
7
+ constructor(device) {
8
+ this.device = device;
9
+ }
10
+ get(width, height) {
11
+ if (!this.texture || width > this.texture.width || height > this.texture.height) {
12
+ width = Math.max(width, this.texture?.width ?? 0);
13
+ height = Math.max(height, this.texture?.height ?? 0);
14
+ const previous = this.texture;
15
+ this.texture = this.device.createTexture({ label: 'Shared denoised conversion', size: { width, height }, format: 'rgba32float',
16
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC });
17
+ if (previous)
18
+ void this.device.queue.onSubmittedWorkDone().catch(() => { }).then(() => previous.destroy());
19
+ }
20
+ return this.texture;
21
+ }
22
+ setRegion(width, height) { if (this.texture)
23
+ setTextureRegion(this.texture, width, height); }
24
+ getMemoryBytes() { return textureBytes(this.texture); }
25
+ dispose() { this.texture?.destroy(); }
26
+ }
27
+ //# sourceMappingURL=WGPUScratchTexture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WGPUScratchTexture.js","sourceRoot":"","sources":["../../src/renderer/WGPUScratchTexture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,+EAA+E;AAC/E,MAAM,OAAO,kBAAkB;IAEA;IADrB,OAAO,CAAc;IAC7B,YAA6B,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;IAAG,CAAC;IAClD,GAAG,CAAC,KAAa,EAAE,MAAc;QAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAChF,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;YAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;YACxG,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAC,KAAK,EAAE,4BAA4B,EAAE,IAAI,EAAE,EAAC,KAAK,EAAE,MAAM,EAAC,EAAE,MAAM,EAAE,aAAa;gBACzH,KAAK,EAAE,eAAe,CAAC,eAAe,GAAG,eAAe,CAAC,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAC,CAAC,CAAC;YACjG,IAAI,QAAQ;gBAAE,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACD,SAAS,CAAC,KAAa,EAAE,MAAc,IAAG,IAAI,IAAI,CAAC,OAAO;QAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA,CAAC;IAC3G,cAAc,KAAI,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA,CAAC;IACrD,OAAO,KAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA,CAAC;CACrC","sourcesContent":["import {textureBytes} from './gpuMemory.js';\nimport {setTextureRegion} from './textureRegion.js';\n/** One shared conversion texture, retaining its largest allocated capacity. */\nexport class WGPUScratchTexture {\n private texture?: GPUTexture;\n constructor(private readonly device: GPUDevice) {}\n get(width: number, height: number) {\n if (!this.texture || width > this.texture.width || height > this.texture.height) {\n width = Math.max(width, this.texture?.width ?? 0); height = Math.max(height, this.texture?.height ?? 0);\n const previous = this.texture;\n this.texture = this.device.createTexture({label: 'Shared denoised conversion', size: {width, height}, format: 'rgba32float',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC});\n if (previous) void this.device.queue.onSubmittedWorkDone().catch(() => {}).then(() => previous.destroy());\n }\n return this.texture;\n }\n setRegion(width: number, height: number) {if (this.texture) setTextureRegion(this.texture, width, height);}\n getMemoryBytes() {return textureBytes(this.texture);}\n dispose() {this.texture?.destroy();}\n}\n"]}
@@ -0,0 +1,26 @@
1
+ /** Small renderer-owned caches. Keys include exact source and GPU object identity;
2
+ * resources/bind groups are deliberately never retained here. */
3
+ export declare class WGPUShaderCache {
4
+ private device;
5
+ private modules;
6
+ private bindGroupLayouts;
7
+ private layouts;
8
+ private pipelines;
9
+ private renderPipelines;
10
+ private computePipelines;
11
+ private ids;
12
+ private nextId;
13
+ constructor(device: GPUDevice);
14
+ private id;
15
+ private remember;
16
+ createShaderModule(descriptor: Pick<GPUShaderModuleDescriptor, 'code' | 'label'>): GPUShaderModule;
17
+ createBindGroupLayout(descriptor: GPUBindGroupLayoutDescriptor): GPUBindGroupLayout;
18
+ createPipelineLayout(descriptor: GPUPipelineLayoutDescriptor): GPUPipelineLayout;
19
+ createComputePipelineAsync(descriptor: GPUComputePipelineDescriptor): Promise<GPUComputePipeline>;
20
+ createRenderPipeline(descriptor: GPURenderPipelineDescriptor): GPURenderPipeline;
21
+ createComputePipeline(descriptor: GPUComputePipelineDescriptor): GPUComputePipeline;
22
+ clear(): void;
23
+ }
24
+ /** Grow in coarse buckets; scene edits must not shrink a compiled stack. */
25
+ export declare function retainedShaderCapacity(required: number, previous?: number, minimum?: number): number;
26
+ export declare function getTargetShaderCache(device: GPUDevice): WGPUShaderCache;
@@ -0,0 +1,103 @@
1
+ /** Small renderer-owned caches. Keys include exact source and GPU object identity;
2
+ * resources/bind groups are deliberately never retained here. */
3
+ export class WGPUShaderCache {
4
+ device;
5
+ modules = new Map();
6
+ bindGroupLayouts = new Map();
7
+ layouts = new Map();
8
+ pipelines = new Map();
9
+ renderPipelines = new Map();
10
+ computePipelines = new Map();
11
+ ids = new WeakMap();
12
+ nextId = 0;
13
+ constructor(device) {
14
+ this.device = device;
15
+ }
16
+ id(value) {
17
+ let id = this.ids.get(value);
18
+ if (id === undefined) {
19
+ id = ++this.nextId;
20
+ this.ids.set(value, id);
21
+ }
22
+ return id;
23
+ }
24
+ remember(cache, key, value, limit) {
25
+ cache.delete(key);
26
+ cache.set(key, value);
27
+ if (cache.size > limit)
28
+ cache.delete(cache.keys().next().value);
29
+ return value;
30
+ }
31
+ createShaderModule(descriptor) {
32
+ const key = descriptor.code;
33
+ return this.remember(this.modules, key, this.modules.get(key) ?? this.device.createShaderModule(descriptor), 8);
34
+ }
35
+ createBindGroupLayout(descriptor) {
36
+ const entries = Array.from(descriptor.entries);
37
+ const key = JSON.stringify(entries);
38
+ return this.remember(this.bindGroupLayouts, key, this.bindGroupLayouts.get(key) ??
39
+ this.device.createBindGroupLayout({ ...descriptor, entries }), 32);
40
+ }
41
+ createPipelineLayout(descriptor) {
42
+ const bindGroupLayouts = Array.from(descriptor.bindGroupLayouts);
43
+ const { bindGroupLayouts: _groups, label: _label, ...options } = descriptor;
44
+ const key = JSON.stringify([options,
45
+ bindGroupLayouts.map((layout) => layout == null ? null : this.id(layout))]);
46
+ return this.remember(this.layouts, key, this.layouts.get(key) ??
47
+ this.device.createPipelineLayout({ ...descriptor, bindGroupLayouts }), 16);
48
+ }
49
+ createComputePipelineAsync(descriptor) {
50
+ const { compute, layout } = descriptor;
51
+ const key = JSON.stringify([
52
+ this.id(compute.module),
53
+ layout === 'auto' ? 'auto' : this.id(layout),
54
+ compute.entryPoint,
55
+ Object.entries(compute.constants ?? {}).sort(([a], [b]) => a.localeCompare(b))
56
+ ]);
57
+ let pipeline = this.pipelines.get(key);
58
+ if (!pipeline) {
59
+ pipeline = this.device.createComputePipelineAsync(descriptor);
60
+ const pending = pipeline;
61
+ // A failed/in-flight request must not poison a later retry. The identity
62
+ // guard also avoids deleting a replacement after LRU eviction.
63
+ void pending.catch(() => {
64
+ if (this.pipelines.get(key) === pending)
65
+ this.pipelines.delete(key);
66
+ });
67
+ }
68
+ return this.remember(this.pipelines, key, pipeline, 128);
69
+ }
70
+ createRenderPipeline(descriptor) {
71
+ const { label: _label, vertex, fragment, ...options } = descriptor;
72
+ const key = JSON.stringify([options,
73
+ { ...vertex, module: this.id(vertex.module) },
74
+ fragment && { ...fragment, module: this.id(fragment.module) }]);
75
+ return this.remember(this.renderPipelines, key, this.renderPipelines.get(key) ?? this.device.createRenderPipeline(descriptor), 128);
76
+ }
77
+ createComputePipeline(descriptor) {
78
+ const { label: _label, compute, ...options } = descriptor;
79
+ const key = JSON.stringify([options, { ...compute, module: this.id(compute.module) }]);
80
+ return this.remember(this.computePipelines, key, this.computePipelines.get(key) ?? this.device.createComputePipeline(descriptor), 128);
81
+ }
82
+ clear() {
83
+ this.modules.clear();
84
+ this.bindGroupLayouts.clear();
85
+ this.layouts.clear();
86
+ this.pipelines.clear();
87
+ this.renderPipelines.clear();
88
+ this.computePipelines.clear();
89
+ }
90
+ }
91
+ /** Grow in coarse buckets; scene edits must not shrink a compiled stack. */
92
+ export function retainedShaderCapacity(required, previous = 0, minimum = 8) {
93
+ return Math.max(previous, minimum, 2 ** Math.ceil(Math.log2(Math.max(1, required))));
94
+ }
95
+ /** Shared by target-local post-process passes; never contains GPU image resources. */
96
+ const targetShaderCaches = new WeakMap();
97
+ export function getTargetShaderCache(device) {
98
+ let cache = targetShaderCaches.get(device);
99
+ if (!cache)
100
+ targetShaderCaches.set(device, cache = new WGPUShaderCache(device));
101
+ return cache;
102
+ }
103
+ //# sourceMappingURL=WGPUShaderCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WGPUShaderCache.js","sourceRoot":"","sources":["../../src/renderer/WGPUShaderCache.ts"],"names":[],"mappings":"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","sourcesContent":["/** Small renderer-owned caches. Keys include exact source and GPU object identity;\n * resources/bind groups are deliberately never retained here. */\nexport class WGPUShaderCache {\n private modules = new Map<string, GPUShaderModule>();\n private bindGroupLayouts = new Map<string, GPUBindGroupLayout>();\n private layouts = new Map<string, GPUPipelineLayout>();\n private pipelines = new Map<string, Promise<GPUComputePipeline>>();\n private renderPipelines = new Map<string, GPURenderPipeline>();\n private computePipelines = new Map<string, GPUComputePipeline>();\n private ids = new WeakMap<object, number>();\n private nextId = 0;\n\n constructor(private device: GPUDevice) {}\n\n private id(value: object) {\n let id = this.ids.get(value);\n if (id === undefined) {\n id = ++this.nextId;\n this.ids.set(value, id);\n }\n return id;\n }\n\n private remember<T>(cache: Map<string, T>, key: string, value: T, limit: number) {\n cache.delete(key);\n cache.set(key, value);\n if (cache.size > limit) cache.delete(cache.keys().next().value!);\n return value;\n }\n\n createShaderModule(descriptor: Pick<GPUShaderModuleDescriptor, 'code' | 'label'>) {\n const key = descriptor.code;\n return this.remember(this.modules, key,\n this.modules.get(key) ?? this.device.createShaderModule(descriptor), 8);\n }\n\n createBindGroupLayout(descriptor: GPUBindGroupLayoutDescriptor) {\n const entries = Array.from(descriptor.entries);\n const key = JSON.stringify(entries);\n return this.remember(this.bindGroupLayouts, key,\n this.bindGroupLayouts.get(key) ??\n this.device.createBindGroupLayout({ ...descriptor, entries }), 32);\n }\n\n createPipelineLayout(descriptor: GPUPipelineLayoutDescriptor) {\n const bindGroupLayouts = Array.from(descriptor.bindGroupLayouts);\n const { bindGroupLayouts: _groups, label: _label, ...options } = descriptor;\n const key = JSON.stringify([options,\n bindGroupLayouts.map((layout) => layout == null ? null : this.id(layout))]);\n return this.remember(this.layouts, key,\n this.layouts.get(key) ??\n this.device.createPipelineLayout({ ...descriptor, bindGroupLayouts }), 16);\n }\n\n createComputePipelineAsync(descriptor: GPUComputePipelineDescriptor) {\n const { compute, layout } = descriptor;\n const key = JSON.stringify([\n this.id(compute.module),\n layout === 'auto' ? 'auto' : this.id(layout),\n compute.entryPoint,\n Object.entries(compute.constants ?? {}).sort(([a], [b]) => a.localeCompare(b))\n ]);\n let pipeline = this.pipelines.get(key);\n if (!pipeline) {\n pipeline = this.device.createComputePipelineAsync(descriptor);\n const pending = pipeline;\n // A failed/in-flight request must not poison a later retry. The identity\n // guard also avoids deleting a replacement after LRU eviction.\n void pending.catch(() => {\n if (this.pipelines.get(key) === pending) this.pipelines.delete(key);\n });\n }\n return this.remember(this.pipelines, key, pipeline, 128);\n }\n\n createRenderPipeline(descriptor: GPURenderPipelineDescriptor) {\n const { label: _label, vertex, fragment, ...options } = descriptor;\n const key = JSON.stringify([options,\n { ...vertex, module: this.id(vertex.module) },\n fragment && { ...fragment, module: this.id(fragment.module) }]);\n return this.remember(this.renderPipelines, key,\n this.renderPipelines.get(key) ?? this.device.createRenderPipeline(descriptor), 128);\n }\n\n createComputePipeline(descriptor: GPUComputePipelineDescriptor) {\n const { label: _label, compute, ...options } = descriptor;\n const key = JSON.stringify([options, { ...compute, module: this.id(compute.module) }]);\n return this.remember(this.computePipelines, key,\n this.computePipelines.get(key) ?? this.device.createComputePipeline(descriptor), 128);\n }\n\n clear() {\n this.modules.clear();\n this.bindGroupLayouts.clear();\n this.layouts.clear();\n this.pipelines.clear();\n this.renderPipelines.clear();\n this.computePipelines.clear();\n }\n}\n\n/** Grow in coarse buckets; scene edits must not shrink a compiled stack. */\nexport function retainedShaderCapacity(required: number, previous = 0, minimum = 8) {\n return Math.max(previous, minimum, 2 ** Math.ceil(Math.log2(Math.max(1, required))));\n}\n\n/** Shared by target-local post-process passes; never contains GPU image resources. */\nconst targetShaderCaches = new WeakMap<GPUDevice, WGPUShaderCache>();\nexport function getTargetShaderCache(device: GPUDevice) {\n let cache = targetShaderCaches.get(device);\n if (!cache) targetShaderCaches.set(device, cache = new WGPUShaderCache(device));\n return cache;\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import { WebGLDevice, Texture2D } from './webgl.js';
2
+ /** WebGL implementation of the same explicit bloom pass chain as WGPUBloomPass. */
3
+ export default class WebGLBloomPass {
4
+ private readonly _brightPass;
5
+ private readonly _downsamplePasses;
6
+ private readonly _blurHPasses;
7
+ private readonly _blurVPasses;
8
+ private readonly _blendPasses;
9
+ constructor(renderer: WebGLDevice);
10
+ reserveCapacity(): void;
11
+ setSize(width: number, height: number): void;
12
+ setBrightThreshold(threshold: number): void;
13
+ setRadius(radius: number): void;
14
+ createPass(colorTex: Texture2D): void;
15
+ getOutput(): Texture2D;
16
+ getMemoryBytes(): number;
17
+ dispose(): void;
18
+ }