@meimu/mutracer 0.2.0 → 0.3.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 (211) hide show
  1. package/README.md +3 -0
  2. package/dist/assets/bvh.worker.js +1 -1
  3. package/dist/mutracer.umd.js +8949 -7915
  4. package/docs/api.md +42 -21
  5. package/docs/caustics.md +80 -0
  6. package/docs/materials.md +5 -4
  7. package/docs/progressive-rendering.md +50 -9
  8. package/docs/technical/continuous-spectrum.md +93 -0
  9. package/docs/updates.md +3 -1
  10. package/docs/viewer-checklist.md +65 -0
  11. package/docs/viewer.md +7 -5
  12. package/lib/Display.js +1 -1
  13. package/lib/Display.js.map +1 -1
  14. package/lib/Engine.d.ts +2 -0
  15. package/lib/Engine.js +47 -12
  16. package/lib/Engine.js.map +1 -1
  17. package/lib/Render.d.ts +61 -13
  18. package/lib/Render.js +169 -19
  19. package/lib/Render.js.map +1 -1
  20. package/lib/RenderLoop.d.ts +7 -3
  21. package/lib/RenderLoop.js +68 -44
  22. package/lib/RenderLoop.js.map +1 -1
  23. package/lib/main.d.ts +1 -1
  24. package/lib/main.js.map +1 -1
  25. package/lib/oidn.d.ts +1 -1
  26. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  27. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  28. package/lib/renderer/GPUTraceQueue.js +3 -1
  29. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  30. package/lib/renderer/RenderingPipeline.d.ts +4 -0
  31. package/lib/renderer/RenderingPipeline.js.map +1 -1
  32. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  33. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  34. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  35. package/lib/renderer/WGPUEnvMapDistribution.js +18 -18
  36. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  37. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  38. package/lib/renderer/WGPUPhotonMap.js +191 -0
  39. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  40. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  41. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  42. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  43. package/lib/renderer/WGPURayTracePass.d.ts +48 -17
  44. package/lib/renderer/WGPURayTracePass.js +538 -340
  45. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  46. package/lib/renderer/WGPURenderingPipeline.js +83 -47
  47. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  48. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  49. package/lib/renderer/WebGLFullQuadPass.js +4 -0
  50. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  51. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  52. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  53. package/lib/renderer/WebGLRayTracePass.d.ts +6 -1
  54. package/lib/renderer/WebGLRayTracePass.js +43 -6
  55. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  56. package/lib/renderer/WebGLRenderingPipeline.js +10 -14
  57. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  58. package/lib/renderer/WebGLSkyBaker.js +60 -60
  59. package/lib/renderer/accumulationTarget.d.ts +2 -1
  60. package/lib/renderer/accumulationTarget.js.map +1 -1
  61. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  62. package/lib/renderer/causticDiagnostics.js +5 -0
  63. package/lib/renderer/causticDiagnostics.js.map +1 -0
  64. package/lib/renderer/causticEmission.d.ts +10 -0
  65. package/lib/renderer/causticEmission.js +40 -0
  66. package/lib/renderer/causticEmission.js.map +1 -0
  67. package/lib/renderer/causticUniform.d.ts +12 -0
  68. package/lib/renderer/causticUniform.js +22 -0
  69. package/lib/renderer/causticUniform.js.map +1 -0
  70. package/lib/renderer/caustics.d.ts +16 -0
  71. package/lib/renderer/caustics.js +93 -0
  72. package/lib/renderer/caustics.js.map +1 -0
  73. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  74. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  75. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  76. package/lib/renderer/glsl/aovTrace.frag.js +33 -33
  77. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  78. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  79. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  80. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  81. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  82. package/lib/renderer/glsl/chunks/intersect.glsl.js +426 -428
  83. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  84. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  85. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  86. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  87. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  88. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  89. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  90. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  91. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +68 -63
  92. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  93. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  94. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  95. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  96. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +140 -117
  97. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  98. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  99. package/lib/renderer/glsl/chunks/sampling.glsl.js +89 -92
  100. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  101. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  102. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  103. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  104. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  105. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  106. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  107. package/lib/renderer/glsl/rayTrace.frag.js +260 -237
  108. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  109. package/lib/renderer/glsl/shadowCatcher.frag.js +26 -26
  110. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  111. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  112. package/lib/renderer/lightSampling.d.ts +3 -2
  113. package/lib/renderer/lightSampling.js +14 -8
  114. package/lib/renderer/lightSampling.js.map +1 -1
  115. package/lib/renderer/progressiveScheduler.js +4 -3
  116. package/lib/renderer/progressiveScheduler.js.map +1 -1
  117. package/lib/renderer/renderPipeline.d.ts +1 -0
  118. package/lib/renderer/renderPipeline.js.map +1 -1
  119. package/lib/renderer/researchTransport.d.ts +31 -0
  120. package/lib/renderer/researchTransport.js +5 -0
  121. package/lib/renderer/researchTransport.js.map +1 -0
  122. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  123. package/lib/renderer/sceneLayoutSchema.js +2 -2
  124. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  125. package/lib/renderer/scratchSampling.js +6 -6
  126. package/lib/renderer/spectrum.d.ts +21 -0
  127. package/lib/renderer/spectrum.js +154 -0
  128. package/lib/renderer/spectrum.js.map +1 -0
  129. package/lib/renderer/webglLightSampling.d.ts +39 -0
  130. package/lib/renderer/webglLightSampling.js +15 -0
  131. package/lib/renderer/webglLightSampling.js.map +1 -0
  132. package/lib/renderer/wgpuBindlessSource.js +3 -3
  133. package/lib/renderer/wgpuShaderSource.d.ts +7 -0
  134. package/lib/renderer/wgpuShaderSource.js +2 -0
  135. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  136. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  137. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  138. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  139. package/lib/renderer/wgsl/aovResolve.wgsl.js +2 -2
  140. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +1 -1
  141. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  142. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  143. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  144. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  145. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  146. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  147. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  148. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  149. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  150. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  151. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  152. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  153. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  154. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  155. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  156. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  157. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  158. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  159. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  160. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +598 -592
  161. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  162. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +14 -14
  163. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  164. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +75 -73
  165. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  166. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +794 -794
  167. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  168. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  169. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  170. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +35 -25
  171. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  172. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  173. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  174. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  175. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  176. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +204 -187
  177. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  178. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  179. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  180. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  181. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  182. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +89 -93
  183. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  184. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  185. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  186. package/lib/renderer/wgsl/compose.frag.wgsl.js +98 -98
  187. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  188. package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
  189. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  190. package/lib/renderer/wgsl/offlineAdaptive.compute.js +25 -25
  191. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  192. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  193. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  194. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  195. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  196. package/lib/renderer/wgsl/rayTrace.compute.d.ts +9 -1
  197. package/lib/renderer/wgsl/rayTrace.compute.js +448 -522
  198. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  199. package/lib/scene/MaterialState.d.ts +2 -2
  200. package/lib/scene/MaterialState.js +2 -2
  201. package/lib/scene/MaterialState.js.map +1 -1
  202. package/lib/settings/render.d.ts +11 -0
  203. package/lib/settings/render.js +1 -0
  204. package/lib/settings/render.js.map +1 -1
  205. package/lib/util/fromTHREE.js +2 -2
  206. package/lib/util/fromTHREE.js.map +1 -1
  207. package/lib/version.d.ts +1 -1
  208. package/lib/version.js +1 -1
  209. package/lib/version.js.map +1 -1
  210. package/llms.txt +2 -1
  211. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"WGPURenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WGPURenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {DisplayParityAccumulation, DisplayParityTarget} from './displayParityDiagnostics.js';\nimport {hdrResolveWGSL} from './wgsl/compose.frag.wgsl.js';\nimport {oidnAuxiliaryDefine} from './wgsl/oidnAuxiliary.wgsl.js';\nimport {displayAovKind, DEFAULT_AOV_DISPLAY, type AovDisplayOptions} from './aovDisplay.js';\nimport {WGPUAov} from './WGPUAov.js';\nimport {aovMask} from './aov.js';\nimport {scheduleFrame} from '../util/frame.js';\nimport {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 { GPUTraceQueue } from './GPUTraceQueue.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 type { SceneBackground } from '../scene/Scene.js';\nimport Camera from '../scene/Camera.js';\n\nimport { WGPUFullQuadPass } from './WGPUFullQuadPass.js';\nimport WGPURayTracePass from './WGPURayTracePass.js';\nimport type {MaterialTextureSelection} from './wgpuBindless.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 type { ToneMappingParams } from './RenderingPipeline.js';\nimport type { DisplayChannel } from './RenderingPipeline.js';\nimport type { 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 encoded = oidnEncodeAlbedo(raw.rgb);\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 linear = oidnDecodeAlbedo(filtered.rgb);\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(oidnSanitizeNormal(in_normal[index].rgb), 1.0);\n`;\n\nexport interface WGPURenderingPipelineOptions {\n presentationFormat?: GPUTextureFormat;\n materialTextures?: MaterialTextureSelection;\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 traceQueue: GPUTraceQueue\n) {\n let sampleRenderedCallback: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void = () => { };\n\n let batchSamples = false;\n let realtimeBatchBudgetMs = Infinity;\n // Samples traced between display frames skip the resolve and composition;\n // the next presentation or read resolves them once.\n let realtimeDeferPostProcess = false;\n let postProcessPending = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n\n const aov = new WGPUAov(device);\n let aovCamera: Camera | undefined;\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 displayTrace: string[] | 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 // Sample count of this accumulation's last bloom refresh.\n let bloomSamples = 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 aovDisplayOptions: AovDisplayOptions = DEFAULT_AOV_DISPLAY;\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 fsDefine: hdrResolveWGSL,\n fsMain: /* wgsl */ `\nvar color = load_colorTex(uv, 0);\nlet coverage = clamp(load_coverageTex(uv, 0).a, 0.0, 1.0);\ncolor = vec4f(\n hdr_flat_component(color.r, coverage, flatBackgroundColor.a > 0.5, true),\n hdr_flat_component(color.g, coverage, flatBackgroundColor.a > 0.5, true),\n hdr_flat_component(color.b, coverage, flatBackgroundColor.a > 0.5, true), color.a);\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', 'denoiseAlbedo'],\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 denoiseAlbedo: { format: 'rgba8unorm' }\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: '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 csDefine: oidnAuxiliaryDefine,\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 csDefine: oidnAuxiliaryDefine,\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 csDefine: oidnAuxiliaryDefine,\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' }, denoiseAlbedo: { format: 'rgba8unorm' } });\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('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 const aovKind = displayAovKind(output);\n if (aovKind && sampleCount === 0) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n if (!aov.samples) return;\n finishPresentation(encoder, aov.visualize(aovKind, aovDisplayOptions, hdrOutputActive));\n return;\n }\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 displayTrace?.push('CorrectLayers:SceneLinear');\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 after every ten new samples,\n // including when several samples are resolved at once.\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 && (sampleCount - bloomSamples >= 10 || 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; bloomSamples = sampleCount;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n displayTrace?.push('Bloom:SceneLinear');\n bloomPass.createPass(encoder, colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n bloomIntensityToUpdate = 0;\n }\n composePass.setUniform('bloomIntensity', bloomIntensityToUpdate);\n displayTrace?.push('Compose:DisplayLinear+DisplayEncoded');\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 displayTrace?.push('Encode:DisplayEncoded');\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 if (aovKind) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n displayTexture = aov.visualize(aovKind, aovDisplayOptions, hdrOutputActive);\n }\n finishPresentation(encoder, displayTexture);\n }\n\n function finishPresentation(encoder: GPUCommandEncoder, displayTexture: GPUTexture) {\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 displayTrace?.push('AOV:Raw');\n displayTexture = getFrameInput(output);\n } else if (output === 'shadowCatcher') {\n displayTrace?.push('AOV:Raw');\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 flushPostProcess() {\n if (!postProcessPending) return;\n postProcessPending = false;\n drawPostProcess(device.createCommandEncoder(), false, true);\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 aovCamera = camera;\n const resetAccumulation = isFirstFrame;\n if (resetAccumulation) aov.reset();\n if (resetAccumulation) {\n postProcessPending = false;\n bloomSamples = 0;\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 if (execution?.aovs?.length && !rayTracePass.prepareAovs(execution.aovs)) return true;\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 at an\n // accumulation restart; a delayed probe must not discard visible samples.\n // 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 resetAccumulation &&\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 const sampleTimeMs = lastGpuTraceTiming?.estimatedFullFrameTimeMs;\n const realtime = offlineSamplesPerBatch === 0 && batchSamples;\n const realtimeBudget = Math.min(maxTimePerTile, realtimeBatchBudgetMs);\n if (realtime && !resetAccumulation && !isPredictingFrame && sampleTimeMs !== undefined &&\n traceQueue.available(realtimeBudget) < Math.min(sampleTimeMs, realtimeBudget)) return false;\n // Only batch a measured, unchanged full-frame workload. New cameras get\n // their first sample immediately; expensive samples retain tiled execution.\n const realtimeBatch = realtime && sampleCount > 0 &&\n !resetAccumulation && !isPredictingFrame && lastGpuTraceTiming?.tileCount === 1 && sampleTimeMs !== undefined &&\n sampleTimeMs <= realtimeBudget / 2;\n const realtimeSamples = realtimeBatch\n ? Math.min(64, Math.floor(traceQueue.available(realtimeBudget) / sampleTimeMs!)) : 1;\n if (realtimeBatch && realtimeSamples === 0) return false;\n const batchStarted = performance.now();\n _startRecordFrameTime(!resetAccumulation);\n const renderSampleTarget = maxSamples;\n const batchTarget = Math.min(\n renderSampleTarget,\n sampleCount + (offlineSamplesPerBatch > 0 ? offlineSamplesPerBatch : realtimeSamples)\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 || realtimeBatch) && columns * rows === 1) {\n samplesPerFrame = batchTarget - sampleCount;\n } else if (!batchSamples) {\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 if (realtime && !isPredictingFrame && sampleTimeMs !== undefined) traceQueue.track(sampleTimeMs);\n if (realtimeBatch) {\n // Encoding many tiny samples must also leave the main thread free\n // to receive camera input. Yield before encoding another batch.\n if (performance.now() - batchStarted >= 4) break;\n }\n }\n } else {\n rayTracePass.setSampleTiles(columns, rows, xIndex, yIndex);\n sample(sampleCount === 0 && isFirstTile, [columns, rows]);\n if (realtime && !isPredictingFrame && sampleTimeMs !== undefined) traceQueue.track(sampleTimeMs / (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 && execution?.aovs?.length) {\n rayTracePass.renderAovs(aov, camera, sampleCount, execution.aovSamples ?? 16, execution.aovs);\n }\n if (sampleCount !== frameSampleCount && realtime && realtimeDeferPostProcess && sampleCount < renderSampleTarget) {\n postProcessPending = true;\n } else if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= renderSampleTarget)) {\n postProcessPending = false;\n const encoder = device.createCommandEncoder();\n drawPostProcess(encoder, sampleCount >= renderSampleTarget, true);\n }\n if (sampleCount !== frameSampleCount) {\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 denoiseAlbedo: { format: 'rgba8unorm' }\n });\n\n }\n if (wasActive !== hdrOutputActive) {\n hdrPeakMeter?.reset();\n }\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: composeColorFormat } });\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 displayTrace?.push('Denoise:DisplayLinear');\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 requestedAovs: readonly import('./aov.js').AovKind[] = []\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 const aovs=requestedAovs.length?aov.snapshot(requestedAovs):undefined;\n displayTrace?.push('Denoise:SceneLinear');\n try {await denoiser.denoise({device, width, height, color, albedo, normal, output, aovs}, {signal: controller.signal, schedule});}\n finally {if(aovs)void device.queue.onSubmittedWorkDone().catch(()=>undefined).then(()=>aov.releaseSnapshot(aovs));}\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 (output !== 'final' && output !== 'shadow') return Promise.resolve(true);\n flushPostProcess();\n if (attachedDenoiser.kind === 'custom') return performCustomDenoise(attachedDenoiser.denoiser, denoiseSchedule, signal, attachedDenoiser.aovs);\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-webgpu 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', composePass.getOutput('denoiseAlbedo')),\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: composePass.getOutput('denoiseAlbedo'),\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: composePass.getOutput('denoiseAlbedo'), 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 displayTrace?.push('Denoise:DisplayLinear');\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 aov.dispose();\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 if (settings.aovs?.length && (!Number.isInteger(settings.aovSamples ?? 16) || (settings.aovSamples ?? 16) < 1)) throw new RangeError('aovSamples must be a positive integer');\n const previousMask = aovMask(execution?.aovs ?? []), nextMask = aovMask(settings.aovs ?? []);\n if (previousMask !== nextMask || execution?.aovSamples !== settings.aovSamples) aov.samples = 0;\n execution = { ...settings, aovs: [...(settings.aovs ?? [])] };\n // Presentation may still name the previous preview's AOV. Drop that\n // selection before tracing with a smaller set; Display validates and\n // reapplies the current channel when the new image is presented.\n const displayedAov = displayAovKind(output);\n if (displayedAov && !settings.aovs?.includes(displayedAov)) output = 'final';\n if (previousMask && !nextMask) { aov.dispose(); aov.history.clear(); aov.width = aov.height = 0; aov.reset(); }\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n batchSamples = settings.batchSamples;\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 setRealtimeBatchBudget(milliseconds) { realtimeBatchBudgetMs = milliseconds; },\n setRealtimeDeferPostProcess(defer) { realtimeDeferPostProcess = defer; },\n getRealtimeSampleTime() { return lastGpuTraceTiming?.tileCount === 1 ? lastGpuTraceTiming.estimatedFullFrameTimeMs : undefined; },\n whenTraceAvailable() { return traceQueue.whenAvailable(); },\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: aov.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 aov.reset();\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; postProcessPending = false; bloomSamples = 0;\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n isFirstFrame = true;\n sampleCount = 0;\n },\n\n getOutputTexture(kind) {\n flushPostProcess();\n if (kind === 'hdr') return resolvedSamples > 0 ? getFrameInput('color') : undefined;\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 resolve = postProcessPending;\n postProcessPending = false;\n drawPostProcess(device.createCommandEncoder(), true, resolve);\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 const presentationReadback=hdrOutputActive && displayAovKind(output) ? scratch.get('AOV encoded readback',()=>new WGPUFullQuadPass('AOV encoded readback',device,{textureWillBeRead:true,inputs:['inputTex'],outputs:['color'],fsMain:`let c=load_inputTex(uv,0);let rgb=select(1.055*pow(max(c.rgb,vec3f(0.0)),vec3f(1.0/2.4))-0.055,12.92*c.rgb,c.rgb<=vec3f(0.0031308));output.color=vec4f(rgb,c.a);`})) : readbackPass;\n presentationReadback.setOutputParams({color:{format:'rgba32float'}});presentationReadback.setSize(width,height);\n presentationReadback.createPass(encoder,{inputTex:image});\n encoder.copyTextureToBuffer({texture:presentationReadback.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 aovReady(kind) { return !!execution?.aovs?.includes(kind) && aov.samples > 0; },\n getAovSamples() { return aov.samples; },\n restartAovs() { aov.reset(); },\n refineAovs(camera, samples = sampleCount) {\n if (samples < 1 || !execution?.aovs?.length) return true;\n rayTracePass.setCamera(camera); aovCamera = camera;\n rayTracePass.updatePipeline();\n if (rayTracePass.isCompilingShader() || !rayTracePass.isPipelineReady()) return false;\n return rayTracePass.renderAovs(aov, camera, samples, execution.aovSamples ?? 16, execution.aovs);\n },\n async readAov(kind) {\n if (!execution?.aovs?.includes(kind) || !aovCamera || (sampleCount < 1 && aov.samples < 1)) throw new Error('AOV output is not ready');\n rayTracePass.setCamera(aovCamera);\n while (!rayTracePass.renderAovs(aov, aovCamera, Math.max(sampleCount, aov.samples), execution.aovSamples ?? 16, execution.aovs)) {\n if (disposed) throw new Error('AOV compilation was interrupted');\n await new Promise<void>(resolve => scheduleFrame(() => resolve()));\n }\n return aov.read(kind);\n },\n async readOutput(kind) {\n flushPostProcess();\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 /** @internal */\n _displayParity() {\n return {\n record(trace?: string[]) { displayTrace = trace; },\n load(input: DisplayParityAccumulation) {\n cancelDenoise(); clearDenoisedOutput();\n setSize(input.width, input.height);\n rayTracePass.useTarget(targetKey);\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n const buffers = rayTracePass.getOutputBuffer();\n const shadow = new Float32Array(input.width * input.height * 12);\n for (let i = 0; i < input.width * input.height; i++) {\n shadow.set(input.shadow.subarray(i * 8, i * 8 + 8), i * 12);\n shadow.set(input.moments.subarray(i * 4, i * 4 + 4), i * 12 + 8);\n }\n for (const [buffer, data] of [[buffers.color, input.color], [buffers.albedo, input.albedo],\n [buffers.normal, input.normal], [buffers.shadowCatcher, shadow]] as const) device.queue.writeBuffer(buffer, 0, data);\n sampleCount = resolvedSamples = input.samples;\n resolvedHasShadowCatcher = input.catcher;\n isFirstFrame = false; postProcessPending = false; bloomSamples = 0;\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.setSampleTileGrid(1, 1);\n const encoder = device.createCommandEncoder();\n rayTraceOutputPass.createPass(encoder, buffers, resolvedHasShadowCatcher);\n device.queue.submit([encoder.finish()]);\n }\n };\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 setAovDisplayOptions(options: AovDisplayOptions) { aovDisplayOptions={...options,depthRange:[...options.depthRange]}; },\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n\n dispose\n } satisfies TargetPipeline & DisplayParityTarget;\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, options.materialTextures);\n const traceQueue = new GPUTraceQueue(device.queue);\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, traceQueue);\n return target;\n }, false, scratch);\n}\n"]}
1
+ {"version":3,"file":"WGPURenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WGPURenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {DisplayParityAccumulation, DisplayParityTarget} from './displayParityDiagnostics.js';\nimport {hdrResolveWGSL} from './wgsl/compose.frag.wgsl.js';\nimport {oidnAuxiliaryDefine} from './wgsl/oidnAuxiliary.wgsl.js';\nimport {displayAovKind, DEFAULT_AOV_DISPLAY, type AovDisplayOptions} from './aovDisplay.js';\nimport {WGPUAov} from './WGPUAov.js';\nimport {aovMask} from './aov.js';\nimport {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 { GPUTraceQueue } from './GPUTraceQueue.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 type { SceneBackground } from '../scene/Scene.js';\nimport Camera from '../scene/Camera.js';\n\nimport { WGPUFullQuadPass } from './WGPUFullQuadPass.js';\nimport WGPURayTracePass from './WGPURayTracePass.js';\nimport type {MaterialTextureSelection} from './wgpuBindless.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 type { ToneMappingParams } from './RenderingPipeline.js';\nimport type { DisplayChannel } from './RenderingPipeline.js';\nimport type { 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 encoded = oidnEncodeAlbedo(raw.rgb);\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 linear = oidnDecodeAlbedo(filtered.rgb);\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(oidnSanitizeNormal(in_normal[index].rgb), 1.0);\n`;\n\nexport interface WGPURenderingPipelineOptions {\n presentationFormat?: GPUTextureFormat;\n materialTextures?: MaterialTextureSelection;\n}\n\nfunction createTimeQuery(device: GPUDevice) {\n try {\n const querySet = device.createQuerySet({\n type: 'timestamp',\n count: 16\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 traceQueue: GPUTraceQueue\n) {\n let sampleRenderedCallback: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void = () => { };\n\n let batchSamples = false;\n let realtimeBatchBudgetMs = Infinity;\n // Samples traced between display frames skip the resolve and composition;\n // the next presentation or read resolves them once.\n let realtimeDeferPostProcess = false;\n let postProcessPending = false;\n // Resolve uses the configuration that produced these buffers, even if another\n // target has since changed the shared trace pass's caustic settings.\n let sampledOutput: ReturnType<WGPURayTracePass['getOutputBuffer']> | undefined;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n\n const aov = new WGPUAov(device);\n let aovCamera: Camera | undefined;\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let causticBatchTimeMs=0,photonBatchTimeMs=0;\n let lastGpuTraceTiming:\n | {\n causticTimeMs?:number;\n photonMappingTimeMs?:number;\n photonStagesMs?:number[];\n pathTracingTimeMs?:number;\n tileTimeMs: number;\n tileTimePerSampleMs?: number;\n estimatedFullFrameTimeMs: number;\n tileCount: number;\n }\n | undefined;\n let displayTrace: string[] | 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 // Sample count of this accumulation's last bloom refresh.\n let bloomSamples = 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 aovDisplayOptions: AovDisplayOptions = DEFAULT_AOV_DISPLAY;\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;causticBatchTimeMs=0;photonBatchTimeMs=0;\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 fsDefine: hdrResolveWGSL,\n fsMain: /* wgsl */ `\nvar color = load_colorTex(uv, 0);\nlet coverage = clamp(load_coverageTex(uv, 0).a, 0.0, 1.0);\ncolor = vec4f(\n hdr_flat_component(color.r, coverage, flatBackgroundColor.a > 0.5, true),\n hdr_flat_component(color.g, coverage, flatBackgroundColor.a > 0.5, true),\n hdr_flat_component(color.b, coverage, flatBackgroundColor.a > 0.5, true), color.a);\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', 'denoiseAlbedo'],\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 denoiseAlbedo: { format: 'rgba8unorm' }\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: '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 csDefine: oidnAuxiliaryDefine,\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 csDefine: oidnAuxiliaryDefine,\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 csDefine: oidnAuxiliaryDefine,\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 const measuredCausticBatch=rayTracePass.createPass(\n encoder,\n clear,\n tiles,\n activeTimeQuery ? { querySet: activeTimeQuery.querySet } : undefined\n );\n sampledOutput = rayTracePass.getOutputBuffer();\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, 16);\n const causticTime=(measuredCausticBatch&1)?Math.max(Number(times[3]-times[2]+times[5]-times[4])/1_000_000,0):0;\n // Independent timestamp pairs avoid Metal's cross-pass counter bug.\n const photonTime=(measuredCausticBatch&2)?Math.max(Number(times[7]-times[6]+times[9]-times[8]+times[11]-times[10]+times[13]-times[12]+times[15]-times[14])/1_000_000,0):0;\n const ptTime=Math.max(Number(times[1]-times[0])/1_000_000,0);\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 if(measuredCausticBatch&1)causticBatchTimeMs=causticTime;\n if(measuredCausticBatch&2)photonBatchTimeMs=photonTime;\n const traceTime=Math.max(ptTime+(causticBatchTimeMs+photonBatchTimeMs)/submittedTileCount,.1);\n lastGpuTraceTiming = {\n causticTimeMs:causticBatchTimeMs,photonMappingTimeMs:photonBatchTimeMs,\n photonStagesMs:(measuredCausticBatch&2)?[6,8,10,12,14].map(i=>Math.max(Number(times[i+1]-times[i])/1_000_000,0)):undefined,\n pathTracingTimeMs:ptTime,\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' }, denoiseAlbedo: { format: 'rgba8unorm' } });\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('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 const aovKind = displayAovKind(output);\n if (aovKind && sampleCount === 0) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n if (!aov.samples) return;\n finishPresentation(encoder, aov.visualize(aovKind, aovDisplayOptions, hdrOutputActive));\n return;\n }\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, sampledOutput ?? 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 displayTrace?.push('CorrectLayers:SceneLinear');\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 after every ten new samples,\n // including when several samples are resolved at once.\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 && (sampleCount - bloomSamples >= 10 || 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; bloomSamples = sampleCount;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n displayTrace?.push('Bloom:SceneLinear');\n bloomPass.createPass(encoder, colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n bloomIntensityToUpdate = 0;\n }\n composePass.setUniform('bloomIntensity', bloomIntensityToUpdate);\n displayTrace?.push('Compose:DisplayLinear+DisplayEncoded');\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 displayTrace?.push('Encode:DisplayEncoded');\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 if (aovKind) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n displayTexture = aov.visualize(aovKind, aovDisplayOptions, hdrOutputActive);\n }\n finishPresentation(encoder, displayTexture);\n }\n\n function finishPresentation(encoder: GPUCommandEncoder, displayTexture: GPUTexture) {\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 displayTrace?.push('AOV:Raw');\n displayTexture = getFrameInput(output);\n } else if (output === 'shadowCatcher') {\n displayTrace?.push('AOV:Raw');\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 flushPostProcess() {\n if (!postProcessPending) return;\n postProcessPending = false;\n drawPostProcess(device.createCommandEncoder(), false, true);\n }\n\n function trace(camera: Camera, maxSamples: number) {\n applyTraceQuality();\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 // Update the camera before compiling and sampling.\n rayTracePass.setCamera(camera);\n aovCamera = camera;\n rayTracePass.updatePipeline();\n const pipelineError = rayTracePass.getPipelineError();\n if (pipelineError) throw pipelineError;\n\n // Waiting for a shader is not an input change: this render's samples and\n // complete image stay valid, and only Render's restart discards them.\n if (rayTracePass.isCompilingShader() || !rayTracePass.isPipelineReady()) return true;\n if (execution?.aovs?.length && !rayTracePass.prepareAovs(execution.aovs)) return true;\n\n const resetAccumulation = isFirstFrame;\n if (resetAccumulation) aov.reset();\n if (resetAccumulation) {\n postProcessPending = false;\n bloomSamples = 0;\n denoiseValid = false;\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n (tileRenderWithPredict || tileRender).reset();\n\n // Reset\n isFirstFrame = false;\n sampleCount = 0;\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 at an\n // accumulation restart; a delayed probe must not discard visible samples.\n // 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 resetAccumulation &&\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 const sampleTimeMs = lastGpuTraceTiming?.estimatedFullFrameTimeMs;\n const realtime = offlineSamplesPerBatch === 0 && batchSamples;\n const realtimeBudget = Math.min(maxTimePerTile, realtimeBatchBudgetMs);\n if (realtime && !resetAccumulation && !isPredictingFrame && sampleTimeMs !== undefined &&\n traceQueue.available(realtimeBudget) < Math.min(sampleTimeMs, realtimeBudget)) return false;\n // Only batch a measured, unchanged full-frame workload. New cameras get\n // their first sample immediately; expensive samples retain tiled execution.\n const realtimeBatch = realtime && sampleCount > 0 &&\n !resetAccumulation && !isPredictingFrame && lastGpuTraceTiming?.tileCount === 1 && sampleTimeMs !== undefined &&\n sampleTimeMs <= realtimeBudget / 2;\n const realtimeSamples = realtimeBatch\n ? Math.min(64, Math.floor(traceQueue.available(realtimeBudget) / sampleTimeMs!)) : 1;\n if (realtimeBatch && realtimeSamples === 0) return false;\n const batchStarted = performance.now();\n _startRecordFrameTime(!resetAccumulation);\n const renderSampleTarget = maxSamples;\n const batchTarget = Math.min(\n renderSampleTarget,\n sampleCount + (offlineSamplesPerBatch > 0 ? offlineSamplesPerBatch : realtimeSamples)\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 || realtimeBatch) && columns * rows === 1) {\n samplesPerFrame = batchTarget - sampleCount;\n } else if (!batchSamples) {\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 if (realtime && !isPredictingFrame && sampleTimeMs !== undefined) traceQueue.track(sampleTimeMs);\n if (realtimeBatch) {\n // Encoding many tiny samples must also leave the main thread free\n // to receive camera input. Yield before encoding another batch.\n if (performance.now() - batchStarted >= 4) break;\n }\n }\n } else {\n rayTracePass.setSampleTiles(columns, rows, xIndex, yIndex);\n sample(sampleCount === 0 && isFirstTile, [columns, rows]);\n if (realtime && !isPredictingFrame && sampleTimeMs !== undefined) traceQueue.track(sampleTimeMs / (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 && execution?.aovs?.length) {\n rayTracePass.renderAovs(aov, camera, sampleCount, execution.aovSamples ?? 16, execution.aovs);\n }\n if (sampleCount !== frameSampleCount && realtime && realtimeDeferPostProcess && sampleCount < renderSampleTarget) {\n postProcessPending = true;\n } else if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= renderSampleTarget)) {\n postProcessPending = false;\n const encoder = device.createCommandEncoder();\n drawPostProcess(encoder, sampleCount >= renderSampleTarget, true);\n }\n if (sampleCount !== frameSampleCount) {\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 sampledOutput = undefined;\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 denoiseAlbedo: { format: 'rgba8unorm' }\n });\n\n }\n if (wasActive !== hdrOutputActive) {\n hdrPeakMeter?.reset();\n }\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: composeColorFormat } });\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 displayTrace?.push('Denoise:DisplayLinear');\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 requestedAovs: readonly import('./aov.js').AovKind[] = []\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 const aovs=requestedAovs.length?aov.snapshot(requestedAovs):undefined;\n displayTrace?.push('Denoise:SceneLinear');\n try {await denoiser.denoise({device, width, height, color, albedo, normal, output, aovs}, {signal: controller.signal, schedule});}\n finally {if(aovs)void device.queue.onSubmittedWorkDone().catch(()=>undefined).then(()=>aov.releaseSnapshot(aovs));}\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 (output !== 'final' && output !== 'shadow') return Promise.resolve(true);\n flushPostProcess();\n if (attachedDenoiser.kind === 'custom') return performCustomDenoise(attachedDenoiser.denoiser, denoiseSchedule, signal, attachedDenoiser.aovs);\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-webgpu 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', composePass.getOutput('denoiseAlbedo')),\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: composePass.getOutput('denoiseAlbedo'),\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: composePass.getOutput('denoiseAlbedo'), 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 displayTrace?.push('Denoise:DisplayLinear');\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 aov.dispose();\n denoisedBuffer?.destroy();\n presentationTexture?.destroy();\n displayPostProcess.dispose();\n rayTraceOutputPass.dispose();\n });\n }\n\n // Keep tracing quality out of presentation: an old fallback must not\n // invalidate a new caustic pipeline while it is compiling.\n function applyTraceQuality() {\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setAlphaBlendStrategy(execution.alphaBlendStrategy);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\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.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\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', 'caustics'] as const;\n if (!execution || timingKeys.some(key => execution![key] !== settings[key])) invalidateTilePrediction();\n if (settings.aovs?.length && (!Number.isInteger(settings.aovSamples ?? 16) || (settings.aovSamples ?? 16) < 1)) throw new RangeError('aovSamples must be a positive integer');\n const previousMask = aovMask(execution?.aovs ?? []), nextMask = aovMask(settings.aovs ?? []);\n if (previousMask !== nextMask || execution?.aovSamples !== settings.aovSamples) aov.samples = 0;\n execution = { ...settings, aovs: [...(settings.aovs ?? [])] };\n // Presentation may still name the previous preview's AOV. Drop that\n // selection before tracing with a smaller set; Display validates and\n // reapplies the current channel when the new image is presented.\n const displayedAov = displayAovKind(output);\n if (displayedAov && !settings.aovs?.includes(displayedAov)) output = 'final';\n if (previousMask && !nextMask) { aov.dispose(); aov.history.clear(); aov.width = aov.height = 0; aov.reset(); }\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n batchSamples = settings.batchSamples;\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 setRealtimeBatchBudget(milliseconds) { realtimeBatchBudgetMs = milliseconds; },\n setRealtimeDeferPostProcess(defer) { realtimeDeferPostProcess = defer; },\n getRealtimeSampleTime() { return lastGpuTraceTiming?.estimatedFullFrameTimeMs; },\n getRealtimeTileTime() { return lastGpuTraceTiming?.tileTimePerSampleMs; },\n whenTraceAvailable() { return traceQueue.whenAvailable(); },\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: aov.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 aov.reset();\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; postProcessPending = false; bloomSamples = 0;\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n isFirstFrame = true;\n sampleCount = 0;\n },\n\n getOutputTexture(kind) {\n flushPostProcess();\n if (kind === 'hdr') return resolvedSamples > 0 ? getFrameInput('color') : undefined;\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 resolve = postProcessPending;\n postProcessPending = false;\n drawPostProcess(device.createCommandEncoder(), true, resolve);\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 const presentationReadback=hdrOutputActive && displayAovKind(output) ? scratch.get('AOV encoded readback',()=>new WGPUFullQuadPass('AOV encoded readback',device,{textureWillBeRead:true,inputs:['inputTex'],outputs:['color'],fsMain:`let c=load_inputTex(uv,0);let rgb=select(1.055*pow(max(c.rgb,vec3f(0.0)),vec3f(1.0/2.4))-0.055,12.92*c.rgb,c.rgb<=vec3f(0.0031308));output.color=vec4f(rgb,c.a);`})) : readbackPass;\n presentationReadback.setOutputParams({color:{format:'rgba32float'}});presentationReadback.setSize(width,height);\n presentationReadback.createPass(encoder,{inputTex:image});\n encoder.copyTextureToBuffer({texture:presentationReadback.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 aovReady(kind) { return !!execution?.aovs?.includes(kind) && aov.samples > 0; },\n getAovSamples() { return aov.samples; },\n restartAovs() { aov.reset(); },\n refineAovs(camera, samples = sampleCount) {\n if (samples < 1 || !execution?.aovs?.length) return true;\n applyTraceQuality();\n rayTracePass.setCamera(camera); aovCamera = camera;\n rayTracePass.updatePipeline();\n const pipelineError = rayTracePass.getPipelineError();\n if (pipelineError) throw pipelineError;\n if (rayTracePass.isCompilingShader() || !rayTracePass.isPipelineReady()) return false;\n return rayTracePass.renderAovs(aov, camera, samples, execution.aovSamples ?? 16, execution.aovs);\n },\n async readAov(kind) {\n if (!execution?.aovs?.includes(kind) || !aovCamera || (sampleCount < 1 && aov.samples < 1)) throw new Error('AOV output is not ready');\n for (;;) {\n if (disposed) throw new Error('AOV compilation was interrupted');\n activate();\n applyTraceQuality();\n rayTracePass.setCamera(aovCamera);\n rayTracePass.updatePipeline();\n const pipelineError = rayTracePass.getPipelineError();\n if (pipelineError) throw pipelineError;\n if (!rayTracePass.isCompilingShader() && rayTracePass.isPipelineReady() &&\n rayTracePass.renderAovs(aov, aovCamera, Math.max(sampleCount, aov.samples), execution.aovSamples ?? 16, execution.aovs)) break;\n // Display frames stop on a hidden page, but compilation still completes.\n await new Promise<void>(resolve => setTimeout(resolve, 16));\n }\n return aov.read(kind);\n },\n async readOutput(kind) {\n flushPostProcess();\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 /** @internal */\n _displayParity() {\n return {\n record(trace?: string[]) { displayTrace = trace; },\n load(input: DisplayParityAccumulation) {\n cancelDenoise(); clearDenoisedOutput();\n setSize(input.width, input.height);\n rayTracePass.useTarget(targetKey);\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n const buffers = sampledOutput = rayTracePass.getOutputBuffer();\n const shadow = new Float32Array(input.width * input.height * 12);\n for (let i = 0; i < input.width * input.height; i++) {\n shadow.set(input.shadow.subarray(i * 8, i * 8 + 8), i * 12);\n shadow.set(input.moments.subarray(i * 4, i * 4 + 4), i * 12 + 8);\n }\n for (const [buffer, data] of [[buffers.color, input.color], [buffers.albedo, input.albedo],\n [buffers.normal, input.normal], [buffers.shadowCatcher, shadow]] as const) device.queue.writeBuffer(buffer, 0, data);\n sampleCount = resolvedSamples = input.samples;\n resolvedHasShadowCatcher = input.catcher;\n isFirstFrame = false; postProcessPending = false; bloomSamples = 0;\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.setSampleTileGrid(1, 1);\n const encoder = device.createCommandEncoder();\n rayTraceOutputPass.createPass(encoder, buffers, resolvedHasShadowCatcher);\n device.queue.submit([encoder.finish()]);\n }\n };\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 setAovDisplayOptions(options: AovDisplayOptions) { aovDisplayOptions={...options,depthRange:[...options.depthRange]}; },\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n\n dispose\n } satisfies TargetPipeline & DisplayParityTarget;\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, options.materialTextures);\n const traceQueue = new GPUTraceQueue(device.queue);\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, traceQueue);\n return target;\n }, false, scratch);\n}\n"]}