@meimu/mutracer 0.1.1 → 0.1.3

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 (95) hide show
  1. package/dist/assets/bvh.worker.js +1 -1
  2. package/dist/mutracer.umd.js +3525 -3484
  3. package/docs/materials.md +27 -7
  4. package/docs/threejs.md +13 -2
  5. package/docs/viewer.md +53 -0
  6. package/lib/oidn.d.ts +1 -1
  7. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  8. package/lib/renderer/MaterialTable.d.ts +1 -0
  9. package/lib/renderer/MaterialTable.js +2 -1
  10. package/lib/renderer/MaterialTable.js.map +1 -1
  11. package/lib/renderer/WGPUBloomPass.js +18 -18
  12. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  13. package/lib/renderer/WGPUJNLMDenoiser.js +62 -62
  14. package/lib/renderer/WGPURayTraceOutput.js +14 -12
  15. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  16. package/lib/renderer/WGPURayTracePass.js +2 -2
  17. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  18. package/lib/renderer/WGPURenderingPipeline.js +20 -18
  19. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  20. package/lib/renderer/WebGLJNLMDenoiser.js +61 -61
  21. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  22. package/lib/renderer/WebGLRayTracePass.js +3 -1
  23. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  24. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  25. package/lib/renderer/glsl/chunks/envMap.glsl.js +45 -45
  26. package/lib/renderer/glsl/chunks/intersect.glsl.js +262 -262
  27. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +111 -111
  28. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +436 -436
  29. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  30. package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
  31. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +32 -32
  32. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +54 -54
  33. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +71 -71
  34. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
  35. package/lib/renderer/glsl/chunks/sampling.glsl.js +64 -64
  36. package/lib/renderer/glsl/chunks/sobol.glsl.js +49 -49
  37. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  38. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +5 -5
  39. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  40. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
  41. package/lib/renderer/glsl/rayTrace.frag.js +128 -128
  42. package/lib/renderer/glsl/shadowCatcher.frag.js +12 -12
  43. package/lib/renderer/glsl/webglPipeline.frag.js +49 -49
  44. package/lib/renderer/lightsUtil.js +1 -1
  45. package/lib/renderer/lightsUtil.js.map +1 -1
  46. package/lib/renderer/materialComparison.generated.js +5 -0
  47. package/lib/renderer/materialComparison.generated.js.map +1 -1
  48. package/lib/renderer/materialLayout.js +2 -1
  49. package/lib/renderer/materialLayout.js.map +1 -1
  50. package/lib/renderer/prepareMeshBVH.d.ts +4 -2
  51. package/lib/renderer/prepareMeshBVH.js +44 -20
  52. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  53. package/lib/renderer/scratchSampling.js +6 -6
  54. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  55. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +29 -29
  56. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +376 -379
  57. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  58. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +5 -5
  59. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +51 -51
  60. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +453 -453
  61. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
  62. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +122 -117
  63. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
  64. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  65. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +13 -13
  66. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +94 -94
  67. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +119 -119
  68. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +5 -5
  69. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +62 -62
  70. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
  71. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
  72. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  73. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +53 -53
  74. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +5 -5
  75. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
  76. package/lib/renderer/wgsl/compose.frag.wgsl.js +120 -92
  77. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  78. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  79. package/lib/renderer/wgsl/depthQuery.wgsl.js +3 -3
  80. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  81. package/lib/renderer/wgsl/rayTrace.compute.js +220 -211
  82. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  83. package/lib/scene/OpenPBRMaterial.d.ts +4 -2
  84. package/lib/scene/OpenPBRMaterial.js +4 -2
  85. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  86. package/lib/scene/openPbrSchema.d.ts +7 -2
  87. package/lib/scene/openPbrSchema.js +2 -1
  88. package/lib/scene/openPbrSchema.js.map +1 -1
  89. package/lib/util/fromTHREE.d.ts +1 -0
  90. package/lib/util/fromTHREE.js +24 -6
  91. package/lib/util/fromTHREE.js.map +1 -1
  92. package/lib/version.d.ts +1 -1
  93. package/lib/version.js +1 -1
  94. package/lib/version.js.map +1 -1
  95. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"WGPURenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WGPURenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import {DisplayPostProcess} from './DisplayPostProcess.js';\nimport {customDenoiseLayersMain, customDenoiseCoverageMain} from './wgsl/customDenoise.wgsl.js';\nimport { WGPUCanvasSurface } from './WGPUCanvasSurface.js';\nimport { WGPUScratchBuffer } from './WGPUScratchBuffer.js';\nimport { WGPUScratchTexture } from './WGPUScratchTexture.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport { textureBytes } from './gpuMemory.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { SceneBackground } from '../scene/Scene.js';\nimport Camera from '../scene/Camera.js';\n\nimport { WGPUFullQuadPass } from './WGPUFullQuadPass.js';\nimport WGPURayTracePass from './WGPURayTracePass.js';\nimport {\n composeMain,\n composeDefine,\n compositeDenoiseOutputMain,\n compositeDenoiseDisplayMain,\n linearToSrgbDefine\n} from './wgsl/compose.frag.wgsl.js';\nimport halton from './halton.js';\nimport { makeTileRender, makeTileRenderWithPredict } from './TileRender.js';\nimport { ToneMappingParams } from './RenderingPipeline.js';\nimport { DisplayChannel } from './RenderingPipeline.js';\nimport { ColorRGB } from '../types.js';\nimport { WGPURayTraceOutputPass } from './WGPURayTraceOutput.js';\nimport { vec3 } from '../math.js';\n\nimport WGPUBloomPass from './WGPUBloomPass.js';\nimport { WGPUComputePass } from './WGPUComputePass.js';\nimport WGPUHDRPeakMeter from './WGPUHDRPeakMeter.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport type { DenoiserHandle, OIDNWeb, OIDNWebGPUData, OIDNWebGPUOutputData } from './denoiser.js';\nimport { WGPUJNLMDenoisePass } from './WGPUJNLMDenoiser.js';\n\nexport const oidnAlbedoSrgbEncodeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nlet raw = textureLoad(in_albedo, vec2u(globalId.xy), 0);\nlet linear = clamp(raw.rgb, vec3f(0.0), vec3f(1.0));\nlet encoded = select(\n 1.055 * pow(linear, vec3f(1.0 / 2.4)) - 0.055,\n 12.92 * linear,\n linear <= vec3f(0.0031308)\n);\nout_albedo[index] = vec4f(encoded, raw.a);\n`;\n\nexport const oidnAlbedoSrgbDecodeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nlet filtered = in_albedo[index];\nlet encoded = clamp(filtered.rgb, vec3f(0.0), vec3f(1.0));\nlet linear = select(\n pow((encoded + 0.055) / 1.055, vec3f(2.4)),\n encoded / 12.92,\n encoded <= vec3f(0.04045)\n);\nvar result = linear;\nlet surfaceCoverage = textureLoad(in_rawAlbedo, vec2i(globalId.xy), 0).a;\nif (preserveSurfaceTexture != 0u) {\n // Primary albedo retains the accumulated surface texture. Do not ask the\n // auxiliary network to reconstruct its high-frequency texture.\n // Retain its filtered result across normal/coverage discontinuities.\n let pixel = vec2i(globalId.xy);\n let center = textureLoad(in_rawNormal, pixel, 0);\n let n = normalize(center.rgb * 2.0 - 1.0 + vec3f(1e-8));\n var discontinuity = 0.0;\n for (var y = -1; y <= 1; y++) {\n for (var x = -1; x <= 1; x++) {\n let neighbor = textureLoad(in_rawNormal,\n clamp(pixel + vec2i(x, y), vec2i(0), imageSize - 1), 0);\n let nn = normalize(neighbor.rgb * 2.0 - 1.0 + vec3f(1e-8));\n discontinuity = max(discontinuity,\n max(1.0 - dot(n, nn), abs(center.a - neighbor.a)));\n }\n }\n let edgeWeight = smoothstep(0.02, 0.1, discontinuity);\n let raw = clamp(textureLoad(in_rawAlbedo, pixel, 0).rgb,\n vec3f(0.0), vec3f(1.0));\n result = mix(raw, linear, edgeWeight);\n}\nout_albedo[index] = vec4f(result, surfaceCoverage);\n`;\n\nexport const oidnNormalSanitizeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nout_normal[index] = vec4f(clamp(in_normal[index].rgb, vec3f(0.0), vec3f(1.0)), 1.0);\n`;\n\nexport interface WGPURenderingPipelineOptions {\n presentationFormat?: GPUTextureFormat;\n}\n\nfunction createTimeQuery(device: GPUDevice) {\n try {\n const querySet = device.createQuerySet({\n type: 'timestamp',\n count: 2\n });\n const resolveBuffer = device.createBuffer({\n size: querySet.count * 8,\n usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC\n });\n const resultBuffer = device.createBuffer({\n size: resolveBuffer.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n });\n return {\n querySet,\n resolveBuffer,\n resultBuffer\n };\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\nfunction makeWGPUAccumulationTarget(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n device: GPUDevice,\n rayTracePass: WGPURayTracePass,\n surface: WGPUCanvasSurface,\n scratch: ScratchPool,\n customJobs: Set<Promise<unknown>>\n) {\n let sampleRenderedCallback: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void = () => { };\n\n let allowMultipleSamplesPerFrame = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let lastGpuTraceTiming:\n | {\n tileTimeMs: number;\n tileTimePerSampleMs?: number;\n estimatedFullFrameTimeMs: number;\n tileCount: number;\n }\n | undefined;\n let diagnosticsReadbackPromise: Promise<void> = Promise.resolve();\n\n let isFirstFrame = true;\n let disposed = false;\n\n let needsUpdatePredicting = true;\n let isPredictingFrame = false;\n\n let renderWidth = 0;\n let renderHeight = 0;\n let screenWidth = 0;\n let screenHeight = 0;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let pendingFlatBackground = [0, 0, 0, 0];\n let resolvedFlatBackground = [0, 0, 0, 0];\n let presentationTexture: GPUTexture | undefined;\n let presentationDenoised = false;\n const displayPostProcess = new DisplayPostProcess(device);\n let denoiseValid = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\n\n let exposure = 1;\n let toneMappingMode = 0;\n let contrast = 1;\n let saturation = 1;\n let temperature = 0;\n let tint = 0;\n let vignette = 0;\n let hdrOutputRequested = false;\n let hdrOutputActive = false;\n let output: DisplayChannel = 'final';\n let shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n\n let denoisedBuffer: GPUBuffer | undefined;\n let denoisedTexture: GPUTexture | undefined;\n let denoisedDisplayLinear = false;\n let denoisedHDR = false;\n let activeCustomController: AbortController | undefined;\n let jnlmPass: WGPUJNLMDenoisePass | undefined;\n let denoiseGeneration = 0;\n let preserveDenoisedOutput = false;\n\n let activeOidnPhase:\n | {\n abort: () => void;\n finish: () => void;\n }\n | undefined;\n\n function cancelDenoise() {\n activeCustomController?.abort(); activeCustomController = undefined;\n denoiseGeneration++;\n const activePhase = activeOidnPhase;\n activeOidnPhase = undefined;\n if (activePhase) {\n try {\n activePhase.abort();\n } finally {\n activePhase.finish();\n }\n }\n }\n\n function runOIDNPhase(\n generation: number,\n execute: (\n finish: () => void,\n fail: (reason: unknown) => void\n ) => () => void\n ): Promise<void> {\n if (generation !== denoiseGeneration) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n let settled = false;\n let phase:\n | {\n abort: () => void;\n finish: () => void;\n }\n | undefined;\n const finish = () => {\n if (settled) return;\n settled = true;\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n resolve();\n };\n const fail = (reason: unknown) => {\n if (settled) return;\n settled = true;\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n reject(reason);\n };\n\n try {\n const abort = execute(finish, fail);\n phase = { abort, finish };\n if (settled) return;\n if (generation !== denoiseGeneration) {\n abort();\n finish();\n return;\n }\n activeOidnPhase = phase;\n } catch (error) {\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n settled = true;\n reject(error);\n }\n });\n }\n\n const ctx = surface.context;\n\n const timeQuery = device.features.has('timestamp-query')\n ? scratch.get('trace timing', () => {\n const query = createTimeQuery(device);\n return {\nquery, getMemoryBytes: () => query ? query.resolveBuffer.size + query.resultBuffer.size : 0,\n dispose() { query?.querySet.destroy(); query?.resolveBuffer.destroy(); query?.resultBuffer.destroy(); }\n};\n }).query\n : undefined;\n const tileRender = makeTileRender();\n const tileRenderWithPredict = timeQuery ? makeTileRenderWithPredict() : undefined;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRenderWithPredict?.setDesiredMsPerTile(maxTimePerTile);\n\n function invalidateTilePrediction() {\n tileTimingGeneration++;\n tileRenderWithPredict?.needsUpdatePredicting();\n lastGpuTraceTiming = undefined;\n // A changed render configuration needs fresh timing. Refresh\n // its estimator without submitting a hidden probe in that mode.\n needsUpdatePredicting = offlineSamplesPerBatch === 0;\n isPredictingFrame = false;\n }\n\n const zero = scratch.get('empty texture', () => {\n const texture = device.createTexture({ label: 'Shared empty image', size: { width: 1, height: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING });\n return { texture, getMemoryBytes: () => 4, dispose: () => texture.destroy() };\n }).texture;\n const rayTraceOutputPass = new WGPURayTraceOutputPass(device, zero);\n const getFrameInput = (label: 'color' | 'albedo' | 'normal' | 'shadowCatcher' | 'foreground' | 'catcherBackground') =>\n rayTraceOutputPass.getOutput(label);\n let bloomPass: WGPUBloomPass | undefined;\n\n // Primary misses on a flat colour background are blank: they add the\n // background radiance but no surface hit, and the normalized colour divides\n // by hits only. Raw readback restores the per-sample average, as on WebGL.\n // Fully blank pixels are already divided by the sample count.\n const rawOutputPass = scratch.get('rawOutputPass', () => new WGPUFullQuadPass('raw output', device, {\n textureWillBeRead: true,\n inputs: ['colorTex', 'coverageTex'],\n outputs: ['color'],\n uniforms: [{ label: 'flatBackgroundColor', type: 'vec4f', data: [0, 0, 0, 0] }],\n fsMain: /* wgsl */ `\nvar color = load_colorTex(uv, 0);\nlet coverage = clamp(load_coverageTex(uv, 0).a, 0.0, 1.0);\nif (flatBackgroundColor.a > 0.5 && coverage > 0.0) {\n color = vec4f(color.rgb * coverage, color.a);\n}\noutput.color = color;\n`\n }));\n\n const readbackPass = scratch.get('readbackPass', () => new WGPUFullQuadPass('output readback', device, {\n textureWillBeRead: true, inputs: ['inputTex'], outputs: ['color'],\n fsMain: 'output.color = load_inputTex(uv, 0);'\n }));\n readbackPass.setOutputParams({ color: { format: 'rgba32float' } });\n\n let hdrPeakMeter: WGPUHDRPeakMeter | undefined;\n const composePass = scratch.get('composePass', () => new WGPUFullQuadPass('compose', device, {\n textureWillBeRead: true,\n fsMain: composeMain + compositeDenoiseOutputMain,\n fsDefine: composeDefine,\n uniforms: [\n {\n label: 'exposure',\n type: 'f32',\n data: exposure\n },\n {\n label: 'toneMappingParams',\n type: 'vec2f',\n data: [toneMappingMode, vignette]\n },\n {\n label: 'hdrOutputEnabled',\n type: 'f32',\n data: 0\n },\n {\n label: 'colorGradingParams',\n type: 'vec4f',\n data: [contrast, saturation, temperature, tint]\n },\n {\n label: 'flatBackgroundColor',\n type: 'vec4f',\n data: [0, 0, 0, 0]\n },\n {\n label: 'shadowCatcherColor',\n type: 'vec3f',\n data: shadowCatcherColor\n },\n {\n label: 'shadowCatcherAlpha',\n type: 'f32',\n data: shadowCatcherAlpha\n },\n {\n label: 'shadowCatcherEnabled',\n type: 'f32',\n data: 0\n },\n {\n label: 'bloomIntensity',\n type: 'f32',\n data: 0.25\n }\n ],\n outputs: ['color', 'denoiseColor'],\n inputs: [\n 'colorTex',\n 'foregroundTex',\n 'catcherBackgroundTex',\n 'flatBackgroundMaskTex',\n 'shadowCatcherTex',\n 'bloomTex'\n ]\n }));\n let composeColorFormat: GPUTextureFormat = 'rgba8unorm';\n composePass.setOutputParams({\n color: {\n format: composeColorFormat\n },\n denoiseColor: { format: 'rgba32float' }\n });\n const compositeDenoiseDisplayPass = scratch.get('compositeDenoiseDisplayPass', () => new WGPUFullQuadPass(\n 'OIDN composed display', device, {\n textureWillBeRead: true,\n fsMain: compositeDenoiseDisplayMain,\n fsDefine: linearToSrgbDefine,\n uniforms: [\n { label: 'hdrOutputEnabled', type: 'f32', data: 0 },\n { label: 'denoisedAlpha', type: 'f32', data: 0 }\n ],\n outputs: ['color'], inputs: ['colorTex', 'composedTex']\n }\n ));\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: 'rgba8unorm' } });\n const auxiliaryPassUniforms = [\n {\n label: 'imageSize',\n type: 'vec2i' as const,\n data: new Int32Array([1, 1])\n }\n ];\n const oidnAlbedoEncodePass = scratch.get('oidnAlbedoEncodePass', () => new WGPUComputePass<'albedo', 'albedo'>(\n 'OIDN albedo sRGB encode',\n device,\n {\n inputs: ['albedo'],\n outputs: ['albedo'],\n uniforms: auxiliaryPassUniforms,\n csMain: oidnAlbedoSrgbEncodeMain\n }\n ));\n const oidnAlbedoDecodePass = scratch.get('oidnAlbedoDecodePass', () => new WGPUComputePass<'albedo' | 'rawAlbedo' | 'rawNormal', 'albedo'>(\n 'OIDN albedo sRGB decode',\n device,\n {\n inputs: ['albedo', 'rawAlbedo', 'rawNormal'],\n outputs: ['albedo'],\n uniforms: [...auxiliaryPassUniforms, {\n label: 'preserveSurfaceTexture', type: 'u32', data: 0\n }],\n csMain: oidnAlbedoSrgbDecodeMain\n }\n ));\n const oidnNormalSanitizePass = scratch.get('oidnNormalSanitizePass', () => new WGPUComputePass<'normal', 'normal'>(\n 'OIDN normal sanitize',\n device,\n {\n inputs: ['normal'],\n outputs: ['normal'],\n uniforms: auxiliaryPassUniforms,\n csMain: oidnNormalSanitizeMain\n }\n ));\n oidnAlbedoEncodePass.setOutputParams({ albedo: { channels: 4 } });\n oidnAlbedoDecodePass.setOutputParams({ albedo: { channels: 4 } });\n oidnNormalSanitizePass.setOutputParams({ normal: { channels: 4 } });\n const outputPass = scratch.get('outputPass', () => new WGPUFullQuadPass('output', device, {\n fsMain: /* wgsl */ `\nlet colorUv = min(\n vec2i(uv2 * vec2f(colorTexRegion())),\n vec2i(colorTexRegion()) - vec2i(1)\n);\nvar color = load_colorTex(colorUv, 0);\ncolor = vec4(color.rgb * color.a, color.a);\noutput.color = color;\n`,\n outputs: ['color'],\n inputs: ['colorTex']\n }));\n outputPass.setOutputParams({\n color: {\n format: 'rgba8unorm'\n }\n });\n\n function _present(encoder: GPUCommandEncoder, texture: GPUTexture) {\n outputPass.setRenderToScreen(\n ctx.getCurrentTexture(),\n surface.format\n );\n outputPass.createPass(encoder, {\n colorTex: texture\n });\n }\n\n function _updateSeed(width: number, height: number) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n // Each ray includes a .5 pixel center, so its Halton jitter in [-.5,.5)\n // becomes a sub-pixel offset in [0,1).\n const jitterX = halton(sequenceSample, 2) - 0.5;\n const jitterY = halton(sequenceSample, 3) - 0.5;\n rayTracePass.setJitter(jitterX / width, jitterY / height);\n }\n\n function sample(clear: boolean, tiles: [number, number]) {\n const encoder = device.createCommandEncoder();\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n _updateSeed(renderWidth, renderHeight);\n const activeTimeQuery = timeQuery;\n const isUnmapped = activeTimeQuery?.resultBuffer.mapState === 'unmapped';\n rayTracePass.createPass(\n encoder,\n clear,\n tiles,\n activeTimeQuery ? { querySet: activeTimeQuery.querySet } : undefined\n );\n if (activeTimeQuery) {\n encoder.resolveQuerySet(\n activeTimeQuery.querySet,\n 0,\n activeTimeQuery.querySet.count,\n activeTimeQuery.resolveBuffer,\n 0\n );\n if (isUnmapped) {\n encoder.copyBufferToBuffer(\n activeTimeQuery.resolveBuffer,\n 0,\n activeTimeQuery.resultBuffer,\n 0,\n activeTimeQuery.resultBuffer.size\n );\n }\n }\n\n // TODO if encoder is not submitted. The uniform buffer will be replaced\n device.queue.submit([encoder.finish()]);\n\n const submittedTileRenderWithPredict = tileRenderWithPredict;\n const submittedTimingGeneration = tileTimingGeneration;\n if (activeTimeQuery && isUnmapped && submittedTileRenderWithPredict) {\n\n const submittedTileCount = tiles[0] * tiles[1];\n diagnosticsReadbackPromise = activeTimeQuery.resultBuffer\n .mapAsync(GPUMapMode.READ).then(() => {\n const mappedRange = activeTimeQuery.resultBuffer.getMappedRange();\n const times = new BigInt64Array(mappedRange, 0, 2);\n const traceTime = Math.max(Number(times[1] - times[0]) / 1_000_000, 0.1);\n // A readback may finish after scene preparation or a mode switch.\n // It must not overwrite throughput learned for the current scene.\n const timingIsCurrent =\n !disposed && submittedTimingGeneration === tileTimingGeneration &&\n !isFirstFrame;\n if (timingIsCurrent) {\n lastGpuTraceTiming = {\n tileTimeMs: traceTime,\n tileTimePerSampleMs: traceTime,\n estimatedFullFrameTimeMs: traceTime * submittedTileCount,\n tileCount: submittedTileCount\n };\n submittedTileRenderWithPredict.setLastTraceTime(traceTime);\n }\n activeTimeQuery.resultBuffer.unmap();\n\n }).catch(() => {\n if (activeTimeQuery.resultBuffer.mapState === 'mapped') {\n activeTimeQuery.resultBuffer.unmap();\n }\n });\n }\n }\n\n function clearDenoisedOutput() { denoiseValid = false; }\n\n function invalidateCompositeDenoise() {\n if (!denoisedDisplayLinear) return;\n cancelDenoise();\n denoiseValid = false;\n }\n\n function prepareDenoisedTexture(\n encoder: GPUCommandEncoder,\n buffer: GPUBuffer | undefined,\n texture: GPUTexture | undefined\n ) {\n if (!buffer) {\n return undefined;\n }\n const conversion = scratch.get('denoised conversion', () => new WGPUScratchTexture(device));\n texture = conversion.get(renderWidth, renderHeight); conversion.setRegion(renderWidth, renderHeight);\n encoder.copyBufferToTexture(\n { buffer: buffer!, bytesPerRow: 16 * renderWidth },\n {\n texture: texture\n },\n {\n width: renderWidth,\n height: renderHeight,\n depthOrArrayLayers: 1\n }\n );\n return texture;\n }\n\n function copyDenoisedOutput(\n encoder: GPUCommandEncoder,\n output: OIDNWebGPUOutputData,\n target: GPUBuffer | undefined\n ) {\n const byteLength = output.width * output.height * 16;\n if (!target || target.size !== byteLength) {\n target?.destroy();\n target = device.createBuffer({\n label: 'Persistent denoised output',\n size: byteLength,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC\n });\n }\n encoder.copyBufferToBuffer(output.data, 0, target, 0, byteLength);\n return target;\n }\n\n function prepareComposition() {\n composePass.setSize(renderWidth, renderHeight);\n composePass.setOutputParams({ color: { format: composeColorFormat }, denoiseColor: { format: 'rgba32float' } });\n composePass.setUniform('exposure', exposure);\n composePass.setUniform('toneMappingParams', [toneMappingMode, vignette]);\n composePass.setUniform('colorGradingParams', [contrast, saturation, temperature, tint]);\n composePass.setUniform('hdrOutputEnabled', +hdrOutputActive);\n composePass.setUniform('shadowCatcherColor', shadowCatcherColor);\n composePass.setUniform('shadowCatcherAlpha', shadowCatcherAlpha);\n compositeDenoiseDisplayPass.setSize(renderWidth, renderHeight);\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: composeColorFormat } });\n compositeDenoiseDisplayPass.setUniform('hdrOutputEnabled', +hdrOutputActive);\n compositeDenoiseDisplayPass.setUniform('denoisedAlpha', denoiseValid && denoisedDisplayLinear ? +rayTracePass.needsDenoiseAlpha() : 0);\n }\n function snapshotInput(encoder: GPUCommandEncoder, key: string, texture: GPUTexture, exact = false) {\n const buffer = scratch.get(key, () => new WGPUScratchBuffer(device)).get(renderWidth * renderHeight * 16, exact);\n encoder.copyTextureToBuffer({ texture }, { buffer, bytesPerRow: renderWidth * 16 }, { width: renderWidth, height: renderHeight });\n return buffer;\n }\n function copyGuide(key: string, input: GPUTexture, exact = false) {\n const pass = scratch.get(key, () => new WGPUComputePass(`${key} copy`, device, {\n inputs: ['guide'], outputs: ['color'], uniforms: auxiliaryPassUniforms,\n csMain: 'if (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) {return;} out_color[globalId.x + globalId.y * u32(imageSize.x)] = textureLoad(in_guide, vec2i(globalId.xy), 0);'\n }));\n pass.setOutputParams({ color: { channels: 4 } });\n pass.setSize(renderWidth, renderHeight); pass.setUniform('imageSize', [renderWidth, renderHeight]);\n const output = exact ? scratch.get(`${key} buffer`, () => new WGPUScratchBuffer(device)).get(renderWidth * renderHeight * 16, true) : undefined;\n const encoder = device.createCommandEncoder(); pass.createPass(encoder, { guide: { texture: input, channels: 4 } }, output ? {color: output} : undefined); device.queue.submit([encoder.finish()]);\n return output ?? pass.getOutput('color');\n }\n\n function drawPostProcess(\n encoder: GPUCommandEncoder,\n _forceNeedsDenoise?: boolean,\n resolve = false\n ) {\n displayPostProcess.reset();\n if (resolve) {\n resolvedSamples = sampleCount;\n resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher();\n resolvedFlatBackground = pendingFlatBackground.slice();\n }\n composePass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n rawOutputPass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n if (resolvedSamples < 1) return;\n prepareComposition();\n if (denoiseValid) denoisedTexture = prepareDenoisedTexture(\n encoder,\n denoisedBuffer,\n denoisedTexture\n );\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(encoder, rayTracePass.getOutputBuffer(), resolvedHasShadowCatcher);\n }\n\n composePass.setUniform(\n 'shadowCatcherEnabled',\n +resolvedHasShadowCatcher\n );\n\n let foregroundTexture = getFrameInput(\n resolvedHasShadowCatcher ? 'foreground' : 'color'\n );\n const colorTexture = denoiseValid && denoisedHDR && denoisedTexture ? denoisedTexture : getFrameInput('color');\n let catcherBackgroundTexture = getFrameInput('catcherBackground');\n if (denoiseValid && denoisedHDR && denoisedTexture && resolvedHasShadowCatcher) {\n const layers = scratch.get('custom HDR layers', () => new WGPUFullQuadPass('Custom HDR layers', device, {\n textureWillBeRead: true,\n inputs: ['originalTex', 'filteredTex', 'foregroundTex', 'backgroundTex'],\n outputs: ['foreground', 'background'], fsMain: customDenoiseLayersMain\n }));\n layers.setOutputParams({foreground: {format: 'rgba32float'}, background: {format: 'rgba32float'}});\n layers.setSize(renderWidth, renderHeight);\n layers.createPass(encoder, {originalTex: getFrameInput('color'), filteredTex: denoisedTexture,\n foregroundTex: foregroundTexture, backgroundTex: catcherBackgroundTexture});\n foregroundTexture = layers.getOutput('foreground');\n catcherBackgroundTexture = layers.getOutput('background');\n }\n const bloomEnabled = bloomIntensity > 0.0;\n // Progressive accumulation refreshes bloom every ten samples.\n const samplesSkipped = sampleCount < 10 || sampleCount % 10 > 0;\n const bloomState = scratch.get('bloom state', () => ({ owner: undefined as object | undefined, settings: '', dispose() { } }));\n const bloomSettings = `${bloomThreshold}/${bloomRadius}/${+(denoiseValid && denoisedHDR)}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let bloomIntensityToUpdate = bloomIntensity;\n if (needsUpdateBloom) {\n if (!bloomPass) {\n bloomPass = scratch.get('bloom', () => new WGPUBloomPass(device));\n bloomPass.setSize(renderWidth, renderHeight);\n }\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n bloomPass.createPass(encoder, colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n bloomIntensityToUpdate = 0;\n }\n composePass.setUniform('bloomIntensity', bloomIntensityToUpdate);\n composePass.createPass(encoder, {\n colorTex: colorTexture,\n foregroundTex: foregroundTexture,\n catcherBackgroundTex: catcherBackgroundTexture,\n flatBackgroundMaskTex: getFrameInput('albedo'),\n shadowCatcherTex: getFrameInput('shadowCatcher'),\n // Use color texture as placeholder\n bloomTex: bloomEnabled && bloomPass ? bloomPass.getOutput() : colorTexture\n });\n if (denoiseValid && !denoisedHDR && denoisedDisplayLinear && denoisedTexture) {\n compositeDenoiseDisplayPass.createPass(encoder, {\n colorTex: denoisedTexture,\n composedTex: composePass.getOutput('denoiseColor')\n });\n }\n let displayTexture =\n (denoiseValid && denoisedBuffer ? (denoisedHDR ? composePass.getOutput('color') : denoisedDisplayLinear\n ? compositeDenoiseDisplayPass.getOutput('color') : denoisedTexture) : undefined) ||\n composePass.getOutput('color');\n const activeHDRPeakMeter = hdrOutputActive\n ? (hdrPeakMeter ??= scratch.get('hdrPeak', () => new WGPUHDRPeakMeter(device)))\n : undefined;\n const hdrPeakReadbackSubmitted =\n activeHDRPeakMeter?.encode(\n encoder,\n displayTexture,\n renderWidth,\n renderHeight\n ) ?? false;\n\n if (output === 'normal' || output === 'albedo') {\n displayTexture = getFrameInput(output);\n } else if (output === 'shadowCatcher') {\n displayTexture = getFrameInput('shadowCatcher');\n }\n\n if (displayTexture.width < renderWidth || displayTexture.height < renderHeight) {\n readbackPass.setSize(renderWidth, renderHeight);\n readbackPass.createPass(encoder, { inputTex: displayTexture });\n displayTexture = readbackPass.getOutput('color');\n }\n // Keep the completed denoise visible until its replacement is ready.\n if (!(preserveDenoisedOutput && output === 'final' && !denoiseValid && presentationDenoised)) {\n const width = renderWidth, height = renderHeight;\n if (!presentationTexture || presentationTexture.width !== width || presentationTexture.height !== height || presentationTexture.format !== displayTexture.format) {\n const previous = presentationTexture;\n presentationTexture = device.createTexture({\nlabel: 'Render complete image', size: { width, height }, format: displayTexture.format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC\n});\n if (previous) void device.queue.onSubmittedWorkDone().catch(() => { }).then(() => previous.destroy());\n }\n encoder.copyTextureToTexture({ texture: displayTexture }, { texture: presentationTexture }, { width, height });\n presentationDenoised = output === 'final' && denoiseValid;\n }\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n if (hdrPeakReadbackSubmitted) {\n void activeHDRPeakMeter?.resolve();\n }\n }\n\n function trace(camera: Camera, maxSamples: number) {\n // A call to draw means accumulation has been invalidated. Cancel OIDN\n // before checking shader compilation: pipeline-affecting parameter changes\n // otherwise leave the previous asynchronous denoise alive while resources\n // and bind groups are being replaced.\n cancelDenoise();\n\n if (rayTracePass.isCompilingShader()) {\n isFirstFrame = true;\n sampleCount = 0;\n return true;\n }\n\n // Update the camera before compiling and sampling.\n rayTracePass.setCamera(camera);\n const resetAccumulation = isFirstFrame;\n if (resetAccumulation) {\n denoiseValid = false;\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n (tileRenderWithPredict || tileRender).reset();\n\n // Reset\n isFirstFrame = false;\n sampleCount = 0;\n }\n\n rayTracePass.updatePipeline();\n\n if (rayTracePass.isCompilingShader() || !rayTracePass.isPipelineReady()) {\n isFirstFrame = true;\n sampleCount = 0;\n return true;\n }\n\n // Keep the last completed denoise visible while a static while-converging batch\n // accumulates, including the incomplete first sample after a scene edit.\n if (!preserveDenoisedOutput || isFirstFrame) {\n clearDenoisedOutput();\n }\n if (isPredictingFrame) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n }\n\n // Never enter a waiting prediction state while the shared timestamp\n // buffer is still being mapped. Render normally and retry the probe 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 _startRecordFrameTime(!resetAccumulation);\n const renderSampleTarget = maxSamples;\n const batchTarget = Math.min(\n renderSampleTarget,\n sampleCount + Math.max(offlineSamplesPerBatch, 1)\n );\n do {\n let {\n xIndex,\n yIndex,\n columns,\n rows,\n isFirstTile,\n isLastTile,\n samplesPerFrame\n } = (tileRenderWithPredict || tileRender).nextTile(elapsedTileTime);\n\n rayTraceOutputPass.setSampleTileGrid(columns, rows);\n\n if (offlineSamplesPerBatch > 0 && columns * rows === 1) {\n samplesPerFrame = batchTarget - sampleCount;\n } else if (!allowMultipleSamplesPerFrame) {\n samplesPerFrame = 1;\n }\n\n if (columns * rows === 1) {\n rayTracePass.setSampleTiles(1, 1, 0, 0);\n let samplesSubmitted = 0;\n while (\n samplesSubmitted < samplesPerFrame &&\n sampleCount < renderSampleTarget &&\n sampleCount < batchTarget\n ) {\n sample(sampleCount === 0, [1, 1]);\n sampleCount++;\n samplesSubmitted++;\n }\n } else {\n rayTracePass.setSampleTiles(columns, rows, xIndex, yIndex);\n sample(sampleCount === 0 && isFirstTile, [columns, rows]);\n if (isLastTile) sampleCount++;\n }\n } while (\n offlineSamplesPerBatch > 0 &&\n sampleCount < batchTarget &&\n sampleCount < renderSampleTarget\n );\n\n // Not displaying on screen for prediciting frame.\n if (isPredictingFrame) {\n // This hidden timing probe has not resolved the OIDN input textures.\n // Exclude it from progressive samples so a 1spp target cannot denoise\n // stale inputs, and clear its accumulation on the next visible sample.\n sampleCount = 0;\n return false;\n }\n\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= renderSampleTarget)) {\n const encoder = device.createCommandEncoder();\n drawPostProcess(encoder, sampleCount >= renderSampleTarget, true);\n }\n if (sampleCount !== frameSampleCount) {\n\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n }\n\n return false;\n }\n\n function roundUp(a: number, b: number) {\n return Math.ceil(a / b) * b;\n }\n\n function _applyRenderResolution() {\n if (!screenWidth || !screenHeight) return;\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextRenderWidth = roundUp(\n Math.max(1, Math.round(screenWidth * scale)),\n 16\n );\n const nextRenderHeight = roundUp(\n Math.max(1, Math.round(screenHeight * scale)),\n 16\n );\n if (nextRenderWidth === renderWidth && nextRenderHeight === renderHeight) {\n rayTracePass.setSize(nextRenderWidth, nextRenderHeight, screenWidth / screenHeight);\n return;\n }\n\n // OIDN retains the ray-trace output textures supplied at the start of a\n // tile sequence. Stop every phase (including Promise-chained follow-ups)\n // before those textures are replaced below.\n cancelDenoise();\n // Completed OIDN buffers use the previous image dimensions. Scene edits\n // may preserve them, but a resize must not copy them with the new stride.\n // The target retains its complete presentation texture through the resize.\n clearDenoisedOutput();\n tileTimingGeneration++;\n renderWidth = nextRenderWidth;\n renderHeight = nextRenderHeight;\n (tileRenderWithPredict || tileRender).setSize(renderWidth, renderHeight);\n // Projection follows the displayed canvas, independent of preview/texture alignment.\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n compositeDenoiseDisplayPass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n\n resolvedSamples = 0;\n // Resizing starts a fresh accumulation while retaining the previous presentation.\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n }\n\n function setSize(width: number, height: number) {\n if (width === screenWidth && height === screenHeight) {\n return;\n }\n screenWidth = width;\n screenHeight = height;\n invalidateTilePrediction();\n _applyRenderResolution();\n outputPass.setSize(screenWidth, screenHeight);\n isFirstFrame = true;\n }\n\n function synchronizeBackground(background?: SceneBackground) {\n const flatColor = Array.isArray(background) && background[3] >= 0.99999\n ? background\n : undefined;\n const flatBackgroundColor = flatColor\n ? [flatColor[0], flatColor[1], flatColor[2], 1]\n : [0, 0, 0, 0];\n pendingFlatBackground = flatBackgroundColor;\n }\n\n function setToneMappingParams(params: ToneMappingParams) {\n const newExposure = params.exposure ?? 1;\n const newToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const newContrast = params.contrast ?? 1;\n const newSaturation = params.saturation ?? 1;\n const newTemperature = params.temperature ?? 0;\n const newTint = params.tint ?? 0;\n const newVignette = params.vignette ?? 0;\n if (\n newExposure === exposure &&\n newToneMappingMode === toneMappingMode &&\n newContrast === contrast &&\n newSaturation === saturation &&\n newTemperature === temperature &&\n newTint === tint &&\n newVignette === vignette\n ) return false;\n invalidateCompositeDenoise();\n exposure = newExposure;\n toneMappingMode = newToneMappingMode;\n contrast = newContrast;\n saturation = newSaturation;\n temperature = newTemperature;\n tint = newTint;\n vignette = newVignette;\n composePass.setUniform('exposure', exposure);\n composePass.setUniform('toneMappingParams', [toneMappingMode, vignette]);\n composePass.setUniform('colorGradingParams', [\n contrast,\n saturation,\n temperature,\n tint\n ]);\n return true;\n }\n\n function setHDROutputEnabled(enabled: boolean) {\n if (enabled === hdrOutputRequested) return false;\n invalidateCompositeDenoise();\n hdrOutputRequested = enabled;\n const wasActive = hdrOutputActive;\n\n hdrOutputActive = enabled && surface.supportsHDR;\n\n const nextComposeColorFormat: GPUTextureFormat = hdrOutputActive\n ? 'rgba16float'\n : 'rgba8unorm';\n if (nextComposeColorFormat !== composeColorFormat) {\n composeColorFormat = nextComposeColorFormat;\n composePass.setOutputParams({\n color: { format: composeColorFormat },\n denoiseColor: { format: 'rgba32float' }\n });\n\n }\n if (wasActive !== hdrOutputActive) {\n hdrPeakMeter?.reset();\n }\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: composeColorFormat } });\n compositeDenoiseDisplayPass.setUniform('hdrOutputEnabled', hdrOutputActive ? 1 : 0);\n composePass.setUniform('hdrOutputEnabled', hdrOutputActive ? 1 : 0);\n return wasActive !== hdrOutputActive;\n }\n\n function _startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n const scheduleFrame =\n typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (callback: FrameRequestCallback) =>\n setTimeout(\n () => callback(performance.now()),\n 0\n ) as unknown as number;\n scheduleFrame(() => {\n // TODO use timestamp from requestAnimationFrame may have negative value.\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n // Without GPU timestamps, discard the draw that follows a scene\n // update instead of feeding its preparation/compilation time back.\n elapsedTileTime = collectTileTiming ? elapsedFrameTime : undefined;\n }\n });\n }\n function _onPageVisiblilityChange() {\n if (typeof document !== 'undefined' && document.hidden) {\n pageLeaveTime = performance.now();\n } else {\n pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n }\n\n /** Runs the built-in JNLM filter on the current composed image. */\n function performJNLMDenoise(\n denoiser: JNLMDenoiser\n ): Promise<boolean> {\n const generation = denoiseGeneration;\n\n jnlmPass ??= scratch.get('jnlm', () => new WGPUJNLMDenoisePass(device));\n const rayBuffers = rayTracePass.getOutputBuffer();\n const encoder = device.createCommandEncoder({ label: 'JNLM denoise' });\n const output = jnlmPass.encode(encoder, {\n width: renderWidth,\n height: renderHeight,\n accumulation: rayBuffers.shadowCatcher,\n normalAccumulation: rayBuffers.normal,\n color: composePass.getOutput('denoiseColor'),\n albedo: getFrameInput('albedo'),\n normal: getFrameInput('normal'),\n shadowCatcher: getFrameInput('shadowCatcher'),\n strength: denoiser.strength,\n shape: denoiser.shape\n });\n denoisedBuffer = copyDenoisedOutput(\n encoder,\n { data: output, width: renderWidth, height: renderHeight },\n denoisedBuffer\n );\n denoisedDisplayLinear = true;\n denoiseValid = true;\n // The filter also smooths coverage, which carries catcher shadows and\n // transmissive alpha.\n compositeDenoiseDisplayPass.setUniform(\n 'denoisedAlpha', +rayTracePass.needsDenoiseAlpha()\n );\n drawPostProcess(encoder, false);\n return device.queue.onSubmittedWorkDone().then(() => {\n const completed = generation === denoiseGeneration;\n\n return completed;\n });\n }\n\n function performCustomDenoise(\n denoiser: import('../Render.js').Denoiser,\n schedule: import('../Render.js').DenoiseSchedule,\n signal?: AbortSignal\n ): Promise<boolean> {\n const generation = denoiseGeneration;\n const controller = activeCustomController = new AbortController();\n const abort = () => controller.abort();\n signal?.addEventListener('abort', abort, {once: true});\n if (signal?.aborted) abort();\n const task = (async () => {\n if (controller.signal.aborted) return false;\n const color = copyGuide('Custom HDR input', getFrameInput('color'), true);\n const width = renderWidth, height = renderHeight;\n const albedo = copyGuide('Custom albedo', getFrameInput('albedo'), true);\n const normal = copyGuide('Custom normal', getFrameInput('normal'), true);\n const output = scratch.get('Custom output', () => new WGPUScratchBuffer(device)).get(width * height * 16, true);\n await denoiser.denoise({device, width, height, color, albedo, normal, output}, {signal: controller.signal, schedule});\n if (controller.signal.aborted || disposed || generation !== denoiseGeneration) return false;\n const coverage = scratch.get('custom coverage', () => new WGPUComputePass('Custom coverage', device, {\n inputs: ['filtered', 'original'], outputs: ['color'], uniforms: auxiliaryPassUniforms,\n csMain: customDenoiseCoverageMain\n }));\n coverage.setOutputParams({color: {channels: 4}});\n coverage.setSize(width, height); coverage.setUniform('imageSize', [width, height]);\n const finish = device.createCommandEncoder({label: 'Custom HDR result'});\n coverage.createPass(finish, {filtered: {buffer: output, channels: 4}, original: {buffer: color, channels: 4}});\n denoisedBuffer = copyDenoisedOutput(finish, {data: coverage.getOutput('color'), width, height}, denoisedBuffer);\n denoisedHDR = true; denoisedDisplayLinear = false; denoiseValid = true;\n drawPostProcess(finish, false);\n await device.queue.onSubmittedWorkDone();\n return !controller.signal.aborted && !disposed && generation === denoiseGeneration;\n })();\n customJobs.add(task);\n void task.finally(() => {\n customJobs.delete(task); signal?.removeEventListener('abort', abort);\n if (activeCustomController === controller) activeCustomController = undefined;\n }).catch(() => {});\n return task;\n }\n\n function performDenoise(\n attachedDenoiser: DenoiserHandle,\n alphaDenoiser: OIDNWeb | undefined,\n denoiseSchedule: 'converged' | 'progressive' | 'every-sample' = 'converged',\n signal?: AbortSignal\n ): Promise<boolean> {\n cancelDenoise();\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n if (attachedDenoiser.kind === 'custom') return performCustomDenoise(attachedDenoiser.denoiser, denoiseSchedule, signal);\n denoisedHDR = false;\n if (attachedDenoiser.kind === 'jnlm') return performJNLMDenoise(attachedDenoiser.denoiser);\n const denoiser: OIDNWeb = attachedDenoiser.denoiser;\n compositeDenoiseDisplayPass.setUniform('denoisedAlpha', 0);\n const generation = denoiseGeneration;\n\n const size = { width: renderWidth, height: renderHeight };\n const snapshotEncoder = device.createCommandEncoder();\n const colorInput = snapshotInput(snapshotEncoder, 'OIDN color input', composePass.getOutput('denoiseColor'));\n device.queue.submit([snapshotEncoder.finish()]);\n for (const pass of [oidnAlbedoEncodePass, oidnAlbedoDecodePass, oidnNormalSanitizePass]) {\n pass.setSize(renderWidth, renderHeight); pass.setUniform('imageSize', [renderWidth, renderHeight]);\n }\n const convergingTileOptions = {\n ...(denoiseSchedule !== 'converged' ? {\n tileOverlap: 80,\n // Low-resolution interaction must finish as one low-latency frame;\n // otherwise continuous camera updates outrun a multi-tile denoise.\n // The settled full-resolution image uses bounded dynamic tiles so\n // 4K inference cannot allocate a whole-image U-Net activation set.\n wholeImage: denoiseSchedule === 'every-sample'\n } : {}),\n // A preview frame is one whole-image pass. Settled images can take many\n // tiles; oidn-web 0.5 runs those back to back by default, which starves\n // the page at 4K, so pace them to display frames instead.\n scheduling: denoiseSchedule === 'every-sample' ? 'event-loop' as const : 'animation-frame' as const\n };\n type AuxiliaryGuides = {\n albedo: OIDNWebGPUData;\n normal: OIDNWebGPUData;\n };\n\n async function denoiseAuxiliaryGuides(): Promise<\n AuxiliaryGuides | undefined\n > {\n const auxiliaryDenoisers = denoiser.auxiliaryDenoisers;\n // Prefilter sampled texture/normal detail for clean-aux weights. The\n // accumulated guides alone are not antialiased at silhouettes and\n // subpixel texture boundaries.\n if (!auxiliaryDenoisers) {\n return {\n albedo: {\n data: copyGuide('OIDN raw albedo', getFrameInput('albedo')),\n ...size\n },\n normal: {\n data: copyGuide('OIDN raw normal', getFrameInput('normal')),\n ...size\n }\n };\n }\n if (generation !== denoiseGeneration) return undefined;\n\n const encodeEncoder = device.createCommandEncoder();\n oidnAlbedoEncodePass.createPass(encodeEncoder, {\n albedo: {\n texture: getFrameInput('albedo'),\n channels: 4\n }\n });\n device.queue.submit([encodeEncoder.finish()]);\n\n let albedoOutput: OIDNWebGPUOutputData | undefined;\n await runOIDNPhase(generation, (finish, fail) =>\n auxiliaryDenoisers.albedo.tileExecute({\n ...convergingTileOptions,\n color: {\n data: oidnAlbedoEncodePass.getOutput('albedo'),\n ...size\n },\n done(output) {\n albedoOutput = output;\n finish();\n },\n error: fail\n })\n );\n if (generation !== denoiseGeneration || !albedoOutput) return undefined;\n\n const decodeEncoder = device.createCommandEncoder();\n oidnAlbedoDecodePass.setUniform('preserveSurfaceTexture', +false);\n oidnAlbedoDecodePass.createPass(decodeEncoder, {\n albedo: { buffer: albedoOutput.data, channels: 4 },\n rawAlbedo: { texture: getFrameInput('albedo'), channels: 4 },\n rawNormal: { texture: getFrameInput('normal'), channels: 4 }\n });\n device.queue.submit([decodeEncoder.finish()]);\n\n let normalOutput: OIDNWebGPUOutputData | undefined;\n await runOIDNPhase(generation, (finish, fail) =>\n auxiliaryDenoisers.normal.tileExecute({\n ...convergingTileOptions,\n color: {\n data: copyGuide('OIDN raw normal', getFrameInput('normal')),\n ...size\n },\n done(output) {\n normalOutput = output;\n finish();\n },\n error: fail\n })\n );\n if (generation !== denoiseGeneration || !normalOutput) return undefined;\n\n const normalEncoder = device.createCommandEncoder();\n oidnNormalSanitizePass.createPass(normalEncoder, {\n normal: { buffer: normalOutput.data, channels: 4 }\n });\n device.queue.submit([normalEncoder.finish()]);\n\n return {\n albedo: {\n data: oidnAlbedoDecodePass.getOutput('albedo'),\n ...size\n },\n normal: {\n data: oidnNormalSanitizePass.getOutput('normal'),\n ...size\n }\n };\n }\n\n function denoiseComposite(guides: AuxiliaryGuides): Promise<void> {\n if (generation !== denoiseGeneration) return Promise.resolve();\n // Snapshot the complete raw composition; never feed a previous denoise\n // back into the network during progressive updates.\n return runOIDNPhase(generation, (finish, fail) =>\n denoiser.tileExecute({\n ...convergingTileOptions,\n color: { data: colorInput, ...size },\n albedo: guides.albedo,\n normal: guides.normal,\n progress(output, _tileData, _tile, currentIdx, totalIdx) {\n if (generation !== denoiseGeneration) return;\n if (denoiseSchedule !== 'converged' && currentIdx + 1 < totalIdx) return;\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = true;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n },\n done(output) {\n if (generation === denoiseGeneration) {\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = true;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n }\n finish();\n },\n error: fail\n })\n );\n }\n\n // Denoise alpha channel\n function denoiseComposed(): Promise<void> {\n if (!alphaDenoiser || generation !== denoiseGeneration) {\n return Promise.resolve();\n }\n const encoder = device.createCommandEncoder();\n readbackPass.setSize(renderWidth, renderHeight);\n readbackPass.createPass(encoder, { inputTex: denoisedDisplayLinear ? compositeDenoiseDisplayPass.getOutput('color') : composePass.getOutput('color') });\n const alphaInput = snapshotInput(encoder, 'OIDN alpha input', readbackPass.getOutput('color'));\n device.queue.submit([encoder.finish()]);\n return runOIDNPhase(generation, (finish, fail) =>\n alphaDenoiser.tileExecute({\n ...convergingTileOptions,\n color: { data: alphaInput, ...size },\n denoiseAlpha: true,\n progress(output, _tileData, _tile, currentIdx, totalIdx) {\n if (generation !== denoiseGeneration) return;\n // While-converging denoising keeps the previous complete frame (or the\n // fallback) visible while tiled inference is\n // running. Publishing the shared output buffer before its final\n // tile would expose uninitialized regions as black rectangles.\n if (denoiseSchedule !== 'converged' && currentIdx + 1 < totalIdx) return;\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(\n encoder,\n output,\n denoisedBuffer\n );\n denoisedDisplayLinear = false;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n },\n done(output) {\n if (generation === denoiseGeneration) {\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = false;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n }\n finish();\n },\n error: fail\n })\n );\n }\n\n return denoiseAuxiliaryGuides()\n .then(async (guides) => {\n if (guides && generation === denoiseGeneration) {\n await denoiseComposite(guides);\n }\n })\n .then(() => {\n if (\n generation === denoiseGeneration &&\n rayTracePass.needsDenoiseAlpha()\n ) {\n return denoiseComposed();\n }\n })\n .then(() => {\n const completed = generation === denoiseGeneration;\n\n return completed;\n });\n }\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', _onPageVisiblilityChange);\n }\n function dispose() {\n if (disposed) return;\n if (typeof document !== 'undefined') {\n document.removeEventListener(\n 'visibilitychange',\n _onPageVisiblilityChange\n );\n }\n disposed = true;\n tileTimingGeneration++;\n cancelDenoise();\n // Target outputs and timestamp readbacks can still be referenced by the\n // queue. Cancel inference now; retire all GPU-owned target resources after\n // both submitted work and the pending timestamp mapping have completed.\n void Promise.all([\n device.queue.onSubmittedWorkDone().catch(() => undefined),\n diagnosticsReadbackPromise\n ]).then(() => {\n rayTracePass.releaseTarget(targetKey);\n denoisedBuffer?.destroy();\n presentationTexture?.destroy();\n displayPostProcess.dispose();\n rayTraceOutputPass.dispose();\n });\n }\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n if (renderWidth && renderHeight) rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setAlphaBlendStrategy(execution.alphaBlendStrategy);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateTiming: invalidateTilePrediction,\n invalidateDenoisedOutput() { cancelDenoise(); denoiseValid = false; preserveDenoisedOutput = false; },\n configure(settings: TraceSettings) {\n const timingKeys = ['bounces', 'bevel', 'bevelSamples', 'directLightCandidates', 'dispersionWavelengths', 'alphaBlendStrategy', 'samplingPattern', 'clamping', 'transmissiveOutputAlphaMin'] as const;\n if (!execution || timingKeys.some(key => execution![key] !== settings[key])) invalidateTilePrediction();\n execution = { ...settings };\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n allowMultipleSamplesPerFrame = settings.allowMultipleSamplesPerFrame;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n tileRenderWithPredict?.setDesiredMsPerTile(maxTimePerTile);\n tileRenderWithPredict?.setMaxTiles(settings.maxTiles);\n },\n synchronizeBackground,\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) {\n return (lastGpuTraceTiming?.estimatedFullFrameTimeMs ?? elapsedFrameTime) <= timeBudgetMs;\n },\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n surface.configure(hdrOutputActive);\n const encoder = device.createCommandEncoder();\n outputPass.setSize(canvas.width, canvas.height);\n _present(encoder, displayPostProcess.output ?? presentationTexture);\n device.queue.submit([encoder.finish()]);\n },\n getMemory() {\n return {\nwidth: renderWidth, height: renderHeight,\n bytes: rayTracePass.getTargetMemoryBytes(targetKey) + rayTraceOutputPass.getMemoryBytes() + textureBytes(presentationTexture) + displayPostProcess.getMemoryBytes() + (denoisedBuffer?.size ?? 0)\n};\n },\n isFirstFrame() {\n return isFirstFrame;\n },\n\n restartSamples() {\n // Input edits reset accumulation, not learned throughput. Re-arming a\n // hidden probe here starves continuously changing scenes of visible samples.\n tileTimingGeneration++;\n cancelDenoise();\n preserveDenoisedOutput = false;\n denoiseValid = false;\n presentationDenoised = false;\n resolvedSamples = 0;\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n isFirstFrame = true;\n sampleCount = 0;\n },\n\n getOutputTexture(kind) {\n if (resolvedSamples < 1) return;\n if (kind === 'hdr') return getFrameInput('color');\n return displayPostProcess.output ?? presentationTexture;\n },\n applyPostProcesses(passes, render) {\n if (presentationTexture) displayPostProcess.run(presentationTexture, passes, render);\n },\n trace,\n drawPostProcess() {\n const encoder = device.createCommandEncoder();\n drawPostProcess(encoder, true);\n },\n performDenoise,\n cancelDenoise,\n setSize,\n setHDROutputEnabled,\n setToneMappingParams,\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n const image = displayPostProcess.output ?? presentationTexture;\n const width = image.width, height = image.height;\n const bytesPerRow = Math.ceil(width * 16 / 256) * 256;\n const buffer = device.createBuffer({ size: bytesPerRow * height, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ });\n const encoder = device.createCommandEncoder();\n readbackPass.setSize(width, height);\n readbackPass.createPass(encoder, { inputTex: image });\n encoder.copyTextureToBuffer({ texture: readbackPass.getOutput('color') }, { buffer, bytesPerRow }, { width, height });\n device.queue.submit([encoder.finish()]);\n try {\n await buffer.mapAsync(GPUMapMode.READ);\n const mapped = new Float32Array(buffer.getMappedRange());\n const data = new Float32Array(width * height * 4);\n for (let y = 0;y < height;y++) data.set(mapped.subarray(y * bytesPerRow / 4, y * bytesPerRow / 4 + width * 4), y * width * 4);\n return { width, height, data };\n } finally { buffer.unmap(); buffer.destroy(); }\n },\n async readOutput(kind) {\n rawOutputPass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n const width = renderWidth, height = renderHeight;\n const bytesPerRow = Math.ceil(width * 16 / 256) * 256;\n const buffer = device.createBuffer({\n size: bytesPerRow * height, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n });\n const encoder = device.createCommandEncoder();\n const denoised = kind === 'denoised' && denoiseValid ? denoisedBuffer : undefined;\n if (kind === 'denoised' && !denoised) kind = 'hdr';\n const pass = kind === 'hdr' ? rawOutputPass : readbackPass;\n pass.setOutputParams({ color: { format: 'rgba32float' } });\n pass.setSize(width, height);\n if (denoised) {\n encoder.copyBufferToBuffer(denoised, 0, buffer, 0, width * height * 16);\n } else if (kind === 'hdr') {\n rawOutputPass.createPass(encoder, { colorTex: getFrameInput('color'), coverageTex: getFrameInput('albedo') });\n } else {\n readbackPass.createPass(encoder, { inputTex: getFrameInput(kind as 'albedo' | 'normal') });\n }\n if (!denoised) encoder.copyTextureToBuffer({ texture: pass.getOutput('color') }, { buffer, bytesPerRow }, { width, height, depthOrArrayLayers: 1 });\n device.queue.submit([encoder.finish()]);\n try {\n await buffer.mapAsync(GPUMapMode.READ);\n const mapped = new Float32Array(buffer.getMappedRange());\n const data = new Float32Array(width * height * 4);\n const stride = denoised ? width * 4 : bytesPerRow / 4;\n for (let y = 0;y < height;y++) data.set(mapped.subarray(y * stride, y * stride + width * 4), y * width * 4);\n return { data, width, height };\n } finally { buffer.unmap(); buffer.destroy(); }\n },\n\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n setOfflineRenderOptions(options) {\n const wasOffline = offlineSamplesPerBatch > 0;\n offlineSamplesPerBatch = Math.max(0, Math.round(options.samplesPerBatch));\n deferPostProcess = options.deferPostProcess;\n sampleSequenceOffset = Math.max(\n 0,\n Math.round(options.sampleSequenceOffset)\n );\n if (offlineSamplesPerBatch > 0 && isPredictingFrame) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n }\n if (offlineSamplesPerBatch > 0) needsUpdatePredicting = false;\n else if (wasOffline) invalidateTilePrediction();\n },\n setVarianceMoments(enabled: boolean) {\n rayTracePass.setVarianceMoments(enabled);\n },\n setAdaptiveSamplingTargets(targets) {\n rayTracePass.setAdaptiveSamplingTargets(targets);\n },\n prepareOfflineAdaptiveSampling(options) {\n return rayTracePass.prepareOfflineAdaptiveSampling(options);\n },\n\n getTotalSamplesRendered() {\n return sampleCount;\n },\n\n getDiagnostics() {\n return {\n ...rayTracePass.getDiagnostics(),\n hdrPresentation: {\n requested: hdrOutputRequested,\n active: surface.hdr,\n peakDisplayValue: surface.hdr\n ? hdrPeakMeter?.getPeakDisplayValue()\n : undefined\n },\n gpuTraceTiming: lastGpuTraceTiming\n };\n },\n\n async flushDiagnostics() {\n await device.queue.onSubmittedWorkDone();\n await diagnosticsReadbackPromise;\n },\n\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n threshold !== bloomThreshold ||\n intensity !== bloomIntensity ||\n radius !== bloomRadius;\n if (changed) invalidateCompositeDenoise();\n bloomThreshold = threshold;\n bloomIntensity = intensity;\n bloomRadius = radius;\n return changed;\n },\n\n setShadowCatcherParams(color: ColorRGB, alpha: number) {\n const changed =\n color[0] !== shadowCatcherColor[0] ||\n color[1] !== shadowCatcherColor[1] ||\n color[2] !== shadowCatcherColor[2] ||\n alpha !== shadowCatcherAlpha;\n\n if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n\n return changed;\n },\n\n setOnSampleRendered(\n cb: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void\n ) {\n sampleRenderedCallback = cb;\n },\n\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n\n dispose\n } satisfies TargetPipeline;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWGPURenderTargets(canvas: HTMLCanvasElement | OffscreenCanvas, device: GPUDevice, options: WGPURenderingPipelineOptions = {}): RenderPipeline {\n const rayTracePass = new WGPURayTracePass(device);\n const customJobs = new Set<Promise<unknown>>();\n const scratch = new ScratchPool(work => {\n // A cancelled custom filter can keep submitting GPU work until its promise settles.\n // A custom callback can dispose synchronously, before its promise is recorded.\n // Observe leases after that callback returns so its borrowed inputs stay alive.\n void Promise.resolve().then(() => Promise.allSettled([...customJobs]))\n .then(() => device.queue.onSubmittedWorkDone()).catch(() => {}).then(work);\n });\n const surface = scratch.get('canvas', () => new WGPUCanvasSurface(canvas, device, options.presentationFormat ?? navigator.gpu.getPreferredCanvasFormat()));\n return makeRenderPipeline(rayTracePass, () => {\n const target = makeWGPUAccumulationTarget(canvas, device, rayTracePass, surface, scratch, customJobs);\n return target;\n }, false, scratch);\n}\n"]}
1
+ {"version":3,"file":"WGPURenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WGPURenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import {DisplayPostProcess} from './DisplayPostProcess.js';\nimport {customDenoiseLayersMain, customDenoiseCoverageMain} from './wgsl/customDenoise.wgsl.js';\nimport { WGPUCanvasSurface } from './WGPUCanvasSurface.js';\nimport { WGPUScratchBuffer } from './WGPUScratchBuffer.js';\nimport { WGPUScratchTexture } from './WGPUScratchTexture.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport { textureBytes } from './gpuMemory.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { SceneBackground } from '../scene/Scene.js';\nimport Camera from '../scene/Camera.js';\n\nimport { WGPUFullQuadPass } from './WGPUFullQuadPass.js';\nimport WGPURayTracePass from './WGPURayTracePass.js';\nimport {\n composeMain,\n composeDefine,\n compositeDenoiseOutputMain,\n compositeDenoiseDisplayMain,\n linearToSrgbDefine\n} from './wgsl/compose.frag.wgsl.js';\nimport halton from './halton.js';\nimport { makeTileRender, makeTileRenderWithPredict } from './TileRender.js';\nimport { ToneMappingParams } from './RenderingPipeline.js';\nimport { DisplayChannel } from './RenderingPipeline.js';\nimport { ColorRGB } from '../types.js';\nimport { WGPURayTraceOutputPass } from './WGPURayTraceOutput.js';\nimport { vec3 } from '../math.js';\n\nimport WGPUBloomPass from './WGPUBloomPass.js';\nimport { WGPUComputePass } from './WGPUComputePass.js';\nimport WGPUHDRPeakMeter from './WGPUHDRPeakMeter.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport type { DenoiserHandle, OIDNWeb, OIDNWebGPUData, OIDNWebGPUOutputData } from './denoiser.js';\nimport { WGPUJNLMDenoisePass } from './WGPUJNLMDenoiser.js';\n\nexport const oidnAlbedoSrgbEncodeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nlet raw = textureLoad(in_albedo, vec2u(globalId.xy), 0);\nlet linear = clamp(raw.rgb, vec3f(0.0), vec3f(1.0));\nlet encoded = select(\n 1.055 * pow(linear, vec3f(1.0 / 2.4)) - 0.055,\n 12.92 * linear,\n linear <= vec3f(0.0031308)\n);\nout_albedo[index] = vec4f(encoded, raw.a);\n`;\n\nexport const oidnAlbedoSrgbDecodeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nlet filtered = in_albedo[index];\nlet encoded = clamp(filtered.rgb, vec3f(0.0), vec3f(1.0));\nlet linear = select(\n pow((encoded + 0.055) / 1.055, vec3f(2.4)),\n encoded / 12.92,\n encoded <= vec3f(0.04045)\n);\nvar result = linear;\nlet surfaceCoverage = textureLoad(in_rawAlbedo, vec2i(globalId.xy), 0).a;\nif (preserveSurfaceTexture != 0u) {\n // Primary albedo retains the accumulated surface texture. Do not ask the\n // auxiliary network to reconstruct its high-frequency texture.\n // Retain its filtered result across normal/coverage discontinuities.\n let pixel = vec2i(globalId.xy);\n let center = textureLoad(in_rawNormal, pixel, 0);\n let n = normalize(center.rgb * 2.0 - 1.0 + vec3f(1e-8));\n var discontinuity = 0.0;\n for (var y = -1; y <= 1; y++) {\n for (var x = -1; x <= 1; x++) {\n let neighbor = textureLoad(in_rawNormal,\n clamp(pixel + vec2i(x, y), vec2i(0), imageSize - 1), 0);\n let nn = normalize(neighbor.rgb * 2.0 - 1.0 + vec3f(1e-8));\n discontinuity = max(discontinuity,\n max(1.0 - dot(n, nn), abs(center.a - neighbor.a)));\n }\n }\n let edgeWeight = smoothstep(0.02, 0.1, discontinuity);\n let raw = clamp(textureLoad(in_rawAlbedo, pixel, 0).rgb,\n vec3f(0.0), vec3f(1.0));\n result = mix(raw, linear, edgeWeight);\n}\nout_albedo[index] = vec4f(result, surfaceCoverage);\n`;\n\nexport const oidnNormalSanitizeMain = /* wgsl */ `\nif (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) { return; }\nlet index = globalId.x + globalId.y * u32(imageSize.x);\nout_normal[index] = vec4f(clamp(in_normal[index].rgb, vec3f(0.0), vec3f(1.0)), 1.0);\n`;\n\nexport interface WGPURenderingPipelineOptions {\n presentationFormat?: GPUTextureFormat;\n}\n\nfunction createTimeQuery(device: GPUDevice) {\n try {\n const querySet = device.createQuerySet({\n type: 'timestamp',\n count: 2\n });\n const resolveBuffer = device.createBuffer({\n size: querySet.count * 8,\n usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC\n });\n const resultBuffer = device.createBuffer({\n size: resolveBuffer.size,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n });\n return {\n querySet,\n resolveBuffer,\n resultBuffer\n };\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\nfunction makeWGPUAccumulationTarget(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n device: GPUDevice,\n rayTracePass: WGPURayTracePass,\n surface: WGPUCanvasSurface,\n scratch: ScratchPool,\n customJobs: Set<Promise<unknown>>\n) {\n let sampleRenderedCallback: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void = () => { };\n\n let allowMultipleSamplesPerFrame = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let lastGpuTraceTiming:\n | {\n tileTimeMs: number;\n tileTimePerSampleMs?: number;\n estimatedFullFrameTimeMs: number;\n tileCount: number;\n }\n | undefined;\n let diagnosticsReadbackPromise: Promise<void> = Promise.resolve();\n\n let isFirstFrame = true;\n let disposed = false;\n\n let needsUpdatePredicting = true;\n let isPredictingFrame = false;\n\n let renderWidth = 0;\n let renderHeight = 0;\n let screenWidth = 0;\n let screenHeight = 0;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let pendingFlatBackground = [0, 0, 0, 0];\n let resolvedFlatBackground = [0, 0, 0, 0];\n let presentationTexture: GPUTexture | undefined;\n let presentationDenoised = false;\n const displayPostProcess = new DisplayPostProcess(device);\n let denoiseValid = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\n\n let exposure = 1;\n let toneMappingMode = 0;\n let contrast = 1;\n let saturation = 1;\n let temperature = 0;\n let tint = 0;\n let vignette = 0;\n let hdrOutputRequested = false;\n let hdrOutputActive = false;\n let output: DisplayChannel = 'final';\n let shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n\n let denoisedBuffer: GPUBuffer | undefined;\n let denoisedTexture: GPUTexture | undefined;\n let denoisedDisplayLinear = false;\n let denoisedHDR = false;\n let activeCustomController: AbortController | undefined;\n let jnlmPass: WGPUJNLMDenoisePass | undefined;\n let denoiseGeneration = 0;\n let preserveDenoisedOutput = false;\n\n let activeOidnPhase:\n | {\n abort: () => void;\n finish: () => void;\n }\n | undefined;\n\n function cancelDenoise() {\n activeCustomController?.abort(); activeCustomController = undefined;\n denoiseGeneration++;\n const activePhase = activeOidnPhase;\n activeOidnPhase = undefined;\n if (activePhase) {\n try {\n activePhase.abort();\n } finally {\n activePhase.finish();\n }\n }\n }\n\n function runOIDNPhase(\n generation: number,\n execute: (\n finish: () => void,\n fail: (reason: unknown) => void\n ) => () => void\n ): Promise<void> {\n if (generation !== denoiseGeneration) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n let settled = false;\n let phase:\n | {\n abort: () => void;\n finish: () => void;\n }\n | undefined;\n const finish = () => {\n if (settled) return;\n settled = true;\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n resolve();\n };\n const fail = (reason: unknown) => {\n if (settled) return;\n settled = true;\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n reject(reason);\n };\n\n try {\n const abort = execute(finish, fail);\n phase = { abort, finish };\n if (settled) return;\n if (generation !== denoiseGeneration) {\n abort();\n finish();\n return;\n }\n activeOidnPhase = phase;\n } catch (error) {\n if (activeOidnPhase === phase) activeOidnPhase = undefined;\n settled = true;\n reject(error);\n }\n });\n }\n\n const ctx = surface.context;\n\n const timeQuery = device.features.has('timestamp-query')\n ? scratch.get('trace timing', () => {\n const query = createTimeQuery(device);\n return {\nquery, getMemoryBytes: () => query ? query.resolveBuffer.size + query.resultBuffer.size : 0,\n dispose() { query?.querySet.destroy(); query?.resolveBuffer.destroy(); query?.resultBuffer.destroy(); }\n};\n }).query\n : undefined;\n const tileRender = makeTileRender();\n const tileRenderWithPredict = timeQuery ? makeTileRenderWithPredict() : undefined;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRenderWithPredict?.setDesiredMsPerTile(maxTimePerTile);\n\n function invalidateTilePrediction() {\n tileTimingGeneration++;\n tileRenderWithPredict?.needsUpdatePredicting();\n lastGpuTraceTiming = undefined;\n // A changed render configuration needs fresh timing. Refresh\n // its estimator without submitting a hidden probe in that mode.\n needsUpdatePredicting = offlineSamplesPerBatch === 0;\n isPredictingFrame = false;\n }\n\n const zero = scratch.get('empty texture', () => {\n const texture = device.createTexture({ label: 'Shared empty image', size: { width: 1, height: 1 }, format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING });\n return { texture, getMemoryBytes: () => 4, dispose: () => texture.destroy() };\n }).texture;\n const rayTraceOutputPass = new WGPURayTraceOutputPass(device, zero);\n const getFrameInput = (label: 'color' | 'albedo' | 'normal' | 'shadowCatcher' | 'foreground' | 'catcherBackground') =>\n rayTraceOutputPass.getOutput(label);\n let bloomPass: WGPUBloomPass | undefined;\n\n // Primary misses on a flat colour background are blank: they add the\n // background radiance but no surface hit, and the normalized colour divides\n // by hits only. Raw readback restores the per-sample average, as on WebGL.\n // Fully blank pixels are already divided by the sample count.\n const rawOutputPass = scratch.get('rawOutputPass', () => new WGPUFullQuadPass('raw output', device, {\n textureWillBeRead: true,\n inputs: ['colorTex', 'coverageTex'],\n outputs: ['color'],\n uniforms: [{ label: 'flatBackgroundColor', type: 'vec4f', data: [0, 0, 0, 0] }],\n fsMain: /* wgsl */ `\nvar color = load_colorTex(uv, 0);\nlet coverage = clamp(load_coverageTex(uv, 0).a, 0.0, 1.0);\nif (flatBackgroundColor.a > 0.5 && coverage > 0.0) {\n color = vec4f(color.rgb * coverage, color.a);\n}\noutput.color = color;\n`\n }));\n\n const readbackPass = scratch.get('readbackPass', () => new WGPUFullQuadPass('output readback', device, {\n textureWillBeRead: true, inputs: ['inputTex'], outputs: ['color'],\n fsMain: 'output.color = load_inputTex(uv, 0);'\n }));\n readbackPass.setOutputParams({ color: { format: 'rgba32float' } });\n\n let hdrPeakMeter: WGPUHDRPeakMeter | undefined;\n const composePass = scratch.get('composePass', () => new WGPUFullQuadPass('compose', device, {\n textureWillBeRead: true,\n fsMain: composeMain + compositeDenoiseOutputMain,\n fsDefine: composeDefine,\n uniforms: [\n {\n label: 'exposure',\n type: 'f32',\n data: exposure\n },\n {\n label: 'toneMappingParams',\n type: 'vec2f',\n data: [toneMappingMode, vignette]\n },\n {\n label: 'hdrOutputEnabled',\n type: 'f32',\n data: 0\n },\n {\n label: 'colorGradingParams',\n type: 'vec4f',\n data: [contrast, saturation, temperature, tint]\n },\n {\n label: 'flatBackgroundColor',\n type: 'vec4f',\n data: [0, 0, 0, 0]\n },\n {\n label: 'shadowCatcherColor',\n type: 'vec3f',\n data: shadowCatcherColor\n },\n {\n label: 'shadowCatcherAlpha',\n type: 'f32',\n data: shadowCatcherAlpha\n },\n {\n label: 'shadowCatcherEnabled',\n type: 'f32',\n data: 0\n },\n {\n label: 'bloomIntensity',\n type: 'f32',\n data: 0.25\n }\n ],\n outputs: ['color', 'denoiseColor', '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: 'hdrOutputEnabled', type: 'f32', data: 0 },\n { label: 'denoisedAlpha', type: 'f32', data: 0 }\n ],\n outputs: ['color'], inputs: ['colorTex', 'composedTex']\n }\n ));\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: 'rgba8unorm' } });\n const auxiliaryPassUniforms = [\n {\n label: 'imageSize',\n type: 'vec2i' as const,\n data: new Int32Array([1, 1])\n }\n ];\n const oidnAlbedoEncodePass = scratch.get('oidnAlbedoEncodePass', () => new WGPUComputePass<'albedo', 'albedo'>(\n 'OIDN albedo sRGB encode',\n device,\n {\n inputs: ['albedo'],\n outputs: ['albedo'],\n uniforms: auxiliaryPassUniforms,\n csMain: oidnAlbedoSrgbEncodeMain\n }\n ));\n const oidnAlbedoDecodePass = scratch.get('oidnAlbedoDecodePass', () => new WGPUComputePass<'albedo' | 'rawAlbedo' | 'rawNormal', 'albedo'>(\n 'OIDN albedo sRGB decode',\n device,\n {\n inputs: ['albedo', 'rawAlbedo', 'rawNormal'],\n outputs: ['albedo'],\n uniforms: [...auxiliaryPassUniforms, {\n label: 'preserveSurfaceTexture', type: 'u32', data: 0\n }],\n csMain: oidnAlbedoSrgbDecodeMain\n }\n ));\n const oidnNormalSanitizePass = scratch.get('oidnNormalSanitizePass', () => new WGPUComputePass<'normal', 'normal'>(\n 'OIDN normal sanitize',\n device,\n {\n inputs: ['normal'],\n outputs: ['normal'],\n uniforms: auxiliaryPassUniforms,\n csMain: oidnNormalSanitizeMain\n }\n ));\n oidnAlbedoEncodePass.setOutputParams({ albedo: { channels: 4 } });\n oidnAlbedoDecodePass.setOutputParams({ albedo: { channels: 4 } });\n oidnNormalSanitizePass.setOutputParams({ normal: { channels: 4 } });\n const outputPass = scratch.get('outputPass', () => new WGPUFullQuadPass('output', device, {\n fsMain: /* wgsl */ `\nlet colorUv = min(\n vec2i(uv2 * vec2f(colorTexRegion())),\n vec2i(colorTexRegion()) - vec2i(1)\n);\nvar color = load_colorTex(colorUv, 0);\ncolor = vec4(color.rgb * color.a, color.a);\noutput.color = color;\n`,\n outputs: ['color'],\n inputs: ['colorTex']\n }));\n outputPass.setOutputParams({\n color: {\n format: 'rgba8unorm'\n }\n });\n\n function _present(encoder: GPUCommandEncoder, texture: GPUTexture) {\n outputPass.setRenderToScreen(\n ctx.getCurrentTexture(),\n surface.format\n );\n outputPass.createPass(encoder, {\n colorTex: texture\n });\n }\n\n function _updateSeed(width: number, height: number) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n // Each ray includes a .5 pixel center, so its Halton jitter in [-.5,.5)\n // becomes a sub-pixel offset in [0,1).\n const jitterX = halton(sequenceSample, 2) - 0.5;\n const jitterY = halton(sequenceSample, 3) - 0.5;\n rayTracePass.setJitter(jitterX / width, jitterY / height);\n }\n\n function sample(clear: boolean, tiles: [number, number]) {\n const encoder = device.createCommandEncoder();\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n _updateSeed(renderWidth, renderHeight);\n const activeTimeQuery = timeQuery;\n const isUnmapped = activeTimeQuery?.resultBuffer.mapState === 'unmapped';\n rayTracePass.createPass(\n encoder,\n clear,\n tiles,\n activeTimeQuery ? { querySet: activeTimeQuery.querySet } : undefined\n );\n if (activeTimeQuery) {\n encoder.resolveQuerySet(\n activeTimeQuery.querySet,\n 0,\n activeTimeQuery.querySet.count,\n activeTimeQuery.resolveBuffer,\n 0\n );\n if (isUnmapped) {\n encoder.copyBufferToBuffer(\n activeTimeQuery.resolveBuffer,\n 0,\n activeTimeQuery.resultBuffer,\n 0,\n activeTimeQuery.resultBuffer.size\n );\n }\n }\n\n // TODO if encoder is not submitted. The uniform buffer will be replaced\n device.queue.submit([encoder.finish()]);\n\n const submittedTileRenderWithPredict = tileRenderWithPredict;\n const submittedTimingGeneration = tileTimingGeneration;\n if (activeTimeQuery && isUnmapped && submittedTileRenderWithPredict) {\n\n const submittedTileCount = tiles[0] * tiles[1];\n diagnosticsReadbackPromise = activeTimeQuery.resultBuffer\n .mapAsync(GPUMapMode.READ).then(() => {\n const mappedRange = activeTimeQuery.resultBuffer.getMappedRange();\n const times = new BigInt64Array(mappedRange, 0, 2);\n const traceTime = Math.max(Number(times[1] - times[0]) / 1_000_000, 0.1);\n // A readback may finish after scene preparation or a mode switch.\n // It must not overwrite throughput learned for the current scene.\n const timingIsCurrent =\n !disposed && submittedTimingGeneration === tileTimingGeneration &&\n !isFirstFrame;\n if (timingIsCurrent) {\n lastGpuTraceTiming = {\n tileTimeMs: traceTime,\n tileTimePerSampleMs: traceTime,\n estimatedFullFrameTimeMs: traceTime * submittedTileCount,\n tileCount: submittedTileCount\n };\n submittedTileRenderWithPredict.setLastTraceTime(traceTime);\n }\n activeTimeQuery.resultBuffer.unmap();\n\n }).catch(() => {\n if (activeTimeQuery.resultBuffer.mapState === 'mapped') {\n activeTimeQuery.resultBuffer.unmap();\n }\n });\n }\n }\n\n function clearDenoisedOutput() { denoiseValid = false; }\n\n function invalidateCompositeDenoise() {\n if (!denoisedDisplayLinear) return;\n cancelDenoise();\n denoiseValid = false;\n }\n\n function prepareDenoisedTexture(\n encoder: GPUCommandEncoder,\n buffer: GPUBuffer | undefined,\n texture: GPUTexture | undefined\n ) {\n if (!buffer) {\n return undefined;\n }\n const conversion = scratch.get('denoised conversion', () => new WGPUScratchTexture(device));\n texture = conversion.get(renderWidth, renderHeight); conversion.setRegion(renderWidth, renderHeight);\n encoder.copyBufferToTexture(\n { buffer: buffer!, bytesPerRow: 16 * renderWidth },\n {\n texture: texture\n },\n {\n width: renderWidth,\n height: renderHeight,\n depthOrArrayLayers: 1\n }\n );\n return texture;\n }\n\n function copyDenoisedOutput(\n encoder: GPUCommandEncoder,\n output: OIDNWebGPUOutputData,\n target: GPUBuffer | undefined\n ) {\n const byteLength = output.width * output.height * 16;\n if (!target || target.size !== byteLength) {\n target?.destroy();\n target = device.createBuffer({\n label: 'Persistent denoised output',\n size: byteLength,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC\n });\n }\n encoder.copyBufferToBuffer(output.data, 0, target, 0, byteLength);\n return target;\n }\n\n function prepareComposition() {\n composePass.setSize(renderWidth, renderHeight);\n composePass.setOutputParams({ color: { format: composeColorFormat }, denoiseColor: { format: 'rgba32float' }, 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('hdrOutputEnabled', +hdrOutputActive);\n compositeDenoiseDisplayPass.setUniform('denoisedAlpha', denoiseValid && denoisedDisplayLinear ? +rayTracePass.needsDenoiseAlpha() : 0);\n }\n function snapshotInput(encoder: GPUCommandEncoder, key: string, texture: GPUTexture, exact = false) {\n const buffer = scratch.get(key, () => new WGPUScratchBuffer(device)).get(renderWidth * renderHeight * 16, exact);\n encoder.copyTextureToBuffer({ texture }, { buffer, bytesPerRow: renderWidth * 16 }, { width: renderWidth, height: renderHeight });\n return buffer;\n }\n function copyGuide(key: string, input: GPUTexture, exact = false) {\n const pass = scratch.get(key, () => new WGPUComputePass(`${key} copy`, device, {\n inputs: ['guide'], outputs: ['color'], uniforms: auxiliaryPassUniforms,\n csMain: 'if (globalId.x >= u32(imageSize.x) || globalId.y >= u32(imageSize.y)) {return;} out_color[globalId.x + globalId.y * u32(imageSize.x)] = textureLoad(in_guide, vec2i(globalId.xy), 0);'\n }));\n pass.setOutputParams({ color: { channels: 4 } });\n pass.setSize(renderWidth, renderHeight); pass.setUniform('imageSize', [renderWidth, renderHeight]);\n const output = exact ? scratch.get(`${key} buffer`, () => new WGPUScratchBuffer(device)).get(renderWidth * renderHeight * 16, true) : undefined;\n const encoder = device.createCommandEncoder(); pass.createPass(encoder, { guide: { texture: input, channels: 4 } }, output ? {color: output} : undefined); device.queue.submit([encoder.finish()]);\n return output ?? pass.getOutput('color');\n }\n\n function drawPostProcess(\n encoder: GPUCommandEncoder,\n _forceNeedsDenoise?: boolean,\n resolve = false\n ) {\n displayPostProcess.reset();\n if (resolve) {\n resolvedSamples = sampleCount;\n resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher();\n resolvedFlatBackground = pendingFlatBackground.slice();\n }\n composePass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n rawOutputPass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n if (resolvedSamples < 1) return;\n prepareComposition();\n if (denoiseValid) denoisedTexture = prepareDenoisedTexture(\n encoder,\n denoisedBuffer,\n denoisedTexture\n );\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(encoder, rayTracePass.getOutputBuffer(), resolvedHasShadowCatcher);\n }\n\n composePass.setUniform(\n 'shadowCatcherEnabled',\n +resolvedHasShadowCatcher\n );\n\n let foregroundTexture = getFrameInput(\n resolvedHasShadowCatcher ? 'foreground' : 'color'\n );\n const colorTexture = denoiseValid && denoisedHDR && denoisedTexture ? denoisedTexture : getFrameInput('color');\n let catcherBackgroundTexture = getFrameInput('catcherBackground');\n if (denoiseValid && denoisedHDR && denoisedTexture && resolvedHasShadowCatcher) {\n const layers = scratch.get('custom HDR layers', () => new WGPUFullQuadPass('Custom HDR layers', device, {\n textureWillBeRead: true,\n inputs: ['originalTex', 'filteredTex', 'foregroundTex', 'backgroundTex'],\n outputs: ['foreground', 'background'], fsMain: customDenoiseLayersMain\n }));\n layers.setOutputParams({foreground: {format: 'rgba32float'}, background: {format: 'rgba32float'}});\n layers.setSize(renderWidth, renderHeight);\n layers.createPass(encoder, {originalTex: getFrameInput('color'), filteredTex: denoisedTexture,\n foregroundTex: foregroundTexture, backgroundTex: catcherBackgroundTexture});\n foregroundTexture = layers.getOutput('foreground');\n catcherBackgroundTexture = layers.getOutput('background');\n }\n const bloomEnabled = bloomIntensity > 0.0;\n // Progressive accumulation refreshes bloom every ten samples.\n const samplesSkipped = sampleCount < 10 || sampleCount % 10 > 0;\n const bloomState = scratch.get('bloom state', () => ({ owner: undefined as object | undefined, settings: '', dispose() { } }));\n const bloomSettings = `${bloomThreshold}/${bloomRadius}/${+(denoiseValid && denoisedHDR)}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let bloomIntensityToUpdate = bloomIntensity;\n if (needsUpdateBloom) {\n if (!bloomPass) {\n bloomPass = scratch.get('bloom', () => new WGPUBloomPass(device));\n bloomPass.setSize(renderWidth, renderHeight);\n }\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n bloomPass.createPass(encoder, colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n bloomIntensityToUpdate = 0;\n }\n composePass.setUniform('bloomIntensity', bloomIntensityToUpdate);\n composePass.createPass(encoder, {\n colorTex: colorTexture,\n foregroundTex: foregroundTexture,\n catcherBackgroundTex: catcherBackgroundTexture,\n flatBackgroundMaskTex: getFrameInput('albedo'),\n shadowCatcherTex: getFrameInput('shadowCatcher'),\n // Use color texture as placeholder\n bloomTex: bloomEnabled && bloomPass ? bloomPass.getOutput() : colorTexture\n });\n if (denoiseValid && !denoisedHDR && denoisedDisplayLinear && denoisedTexture) {\n compositeDenoiseDisplayPass.createPass(encoder, {\n colorTex: denoisedTexture,\n composedTex: composePass.getOutput('denoiseColor')\n });\n }\n let displayTexture =\n (denoiseValid && denoisedBuffer ? (denoisedHDR ? composePass.getOutput('color') : denoisedDisplayLinear\n ? compositeDenoiseDisplayPass.getOutput('color') : denoisedTexture) : undefined) ||\n composePass.getOutput('color');\n const activeHDRPeakMeter = hdrOutputActive\n ? (hdrPeakMeter ??= scratch.get('hdrPeak', () => new WGPUHDRPeakMeter(device)))\n : undefined;\n const hdrPeakReadbackSubmitted =\n activeHDRPeakMeter?.encode(\n encoder,\n displayTexture,\n renderWidth,\n renderHeight\n ) ?? false;\n\n if (output === 'normal' || output === 'albedo') {\n displayTexture = getFrameInput(output);\n } else if (output === 'shadowCatcher') {\n displayTexture = getFrameInput('shadowCatcher');\n }\n\n if (displayTexture.width < renderWidth || displayTexture.height < renderHeight) {\n readbackPass.setSize(renderWidth, renderHeight);\n readbackPass.createPass(encoder, { inputTex: displayTexture });\n displayTexture = readbackPass.getOutput('color');\n }\n // Keep the completed denoise visible until its replacement is ready.\n if (!(preserveDenoisedOutput && output === 'final' && !denoiseValid && presentationDenoised)) {\n const width = renderWidth, height = renderHeight;\n if (!presentationTexture || presentationTexture.width !== width || presentationTexture.height !== height || presentationTexture.format !== displayTexture.format) {\n const previous = presentationTexture;\n presentationTexture = device.createTexture({\nlabel: 'Render complete image', size: { width, height }, format: displayTexture.format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC\n});\n if (previous) void device.queue.onSubmittedWorkDone().catch(() => { }).then(() => previous.destroy());\n }\n encoder.copyTextureToTexture({ texture: displayTexture }, { texture: presentationTexture }, { width, height });\n presentationDenoised = output === 'final' && denoiseValid;\n }\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n if (hdrPeakReadbackSubmitted) {\n void activeHDRPeakMeter?.resolve();\n }\n }\n\n function trace(camera: Camera, maxSamples: number) {\n // A call to draw means accumulation has been invalidated. Cancel OIDN\n // before checking shader compilation: pipeline-affecting parameter changes\n // otherwise leave the previous asynchronous denoise alive while resources\n // and bind groups are being replaced.\n cancelDenoise();\n\n if (rayTracePass.isCompilingShader()) {\n isFirstFrame = true;\n sampleCount = 0;\n return true;\n }\n\n // Update the camera before compiling and sampling.\n rayTracePass.setCamera(camera);\n const resetAccumulation = isFirstFrame;\n if (resetAccumulation) {\n denoiseValid = false;\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n (tileRenderWithPredict || tileRender).reset();\n\n // Reset\n isFirstFrame = false;\n sampleCount = 0;\n }\n\n rayTracePass.updatePipeline();\n\n if (rayTracePass.isCompilingShader() || !rayTracePass.isPipelineReady()) {\n isFirstFrame = true;\n sampleCount = 0;\n return true;\n }\n\n // Keep the last completed denoise visible while a static while-converging batch\n // accumulates, including the incomplete first sample after a scene edit.\n if (!preserveDenoisedOutput || isFirstFrame) {\n clearDenoisedOutput();\n }\n if (isPredictingFrame) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n }\n\n // Never enter a waiting prediction state while the shared timestamp\n // buffer is still being mapped. Render normally and retry the probe 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 _startRecordFrameTime(!resetAccumulation);\n const renderSampleTarget = maxSamples;\n const batchTarget = Math.min(\n renderSampleTarget,\n sampleCount + Math.max(offlineSamplesPerBatch, 1)\n );\n do {\n let {\n xIndex,\n yIndex,\n columns,\n rows,\n isFirstTile,\n isLastTile,\n samplesPerFrame\n } = (tileRenderWithPredict || tileRender).nextTile(elapsedTileTime);\n\n rayTraceOutputPass.setSampleTileGrid(columns, rows);\n\n if (offlineSamplesPerBatch > 0 && columns * rows === 1) {\n samplesPerFrame = batchTarget - sampleCount;\n } else if (!allowMultipleSamplesPerFrame) {\n samplesPerFrame = 1;\n }\n\n if (columns * rows === 1) {\n rayTracePass.setSampleTiles(1, 1, 0, 0);\n let samplesSubmitted = 0;\n while (\n samplesSubmitted < samplesPerFrame &&\n sampleCount < renderSampleTarget &&\n sampleCount < batchTarget\n ) {\n sample(sampleCount === 0, [1, 1]);\n sampleCount++;\n samplesSubmitted++;\n }\n } else {\n rayTracePass.setSampleTiles(columns, rows, xIndex, yIndex);\n sample(sampleCount === 0 && isFirstTile, [columns, rows]);\n if (isLastTile) sampleCount++;\n }\n } while (\n offlineSamplesPerBatch > 0 &&\n sampleCount < batchTarget &&\n sampleCount < renderSampleTarget\n );\n\n // Not displaying on screen for prediciting frame.\n if (isPredictingFrame) {\n // This hidden timing probe has not resolved the OIDN input textures.\n // Exclude it from progressive samples so a 1spp target cannot denoise\n // stale inputs, and clear its accumulation on the next visible sample.\n sampleCount = 0;\n return false;\n }\n\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= renderSampleTarget)) {\n const encoder = device.createCommandEncoder();\n drawPostProcess(encoder, sampleCount >= renderSampleTarget, true);\n }\n if (sampleCount !== frameSampleCount) {\n\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n }\n\n return false;\n }\n\n function roundUp(a: number, b: number) {\n return Math.ceil(a / b) * b;\n }\n\n function _applyRenderResolution() {\n if (!screenWidth || !screenHeight) return;\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextRenderWidth = roundUp(\n Math.max(1, Math.round(screenWidth * scale)),\n 16\n );\n const nextRenderHeight = roundUp(\n Math.max(1, Math.round(screenHeight * scale)),\n 16\n );\n if (nextRenderWidth === renderWidth && nextRenderHeight === renderHeight) {\n rayTracePass.setSize(nextRenderWidth, nextRenderHeight, screenWidth / screenHeight);\n return;\n }\n\n // OIDN retains the ray-trace output textures supplied at the start of a\n // tile sequence. Stop every phase (including Promise-chained follow-ups)\n // before those textures are replaced below.\n cancelDenoise();\n // Completed OIDN buffers use the previous image dimensions. Scene edits\n // may preserve them, but a resize must not copy them with the new stride.\n // The target retains its complete presentation texture through the resize.\n clearDenoisedOutput();\n tileTimingGeneration++;\n renderWidth = nextRenderWidth;\n renderHeight = nextRenderHeight;\n (tileRenderWithPredict || tileRender).setSize(renderWidth, renderHeight);\n // Projection follows the displayed canvas, independent of preview/texture alignment.\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n compositeDenoiseDisplayPass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n\n resolvedSamples = 0;\n // Resizing starts a fresh accumulation while retaining the previous presentation.\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n }\n\n function setSize(width: number, height: number) {\n if (width === screenWidth && height === screenHeight) {\n return;\n }\n screenWidth = width;\n screenHeight = height;\n invalidateTilePrediction();\n _applyRenderResolution();\n outputPass.setSize(screenWidth, screenHeight);\n isFirstFrame = true;\n }\n\n function synchronizeBackground(background?: SceneBackground) {\n const flatColor = Array.isArray(background) && background[3] >= 0.99999\n ? background\n : undefined;\n const flatBackgroundColor = flatColor\n ? [flatColor[0], flatColor[1], flatColor[2], 1]\n : [0, 0, 0, 0];\n pendingFlatBackground = flatBackgroundColor;\n }\n\n function setToneMappingParams(params: ToneMappingParams) {\n const newExposure = params.exposure ?? 1;\n const newToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const newContrast = params.contrast ?? 1;\n const newSaturation = params.saturation ?? 1;\n const newTemperature = params.temperature ?? 0;\n const newTint = params.tint ?? 0;\n const newVignette = params.vignette ?? 0;\n if (\n newExposure === exposure &&\n newToneMappingMode === toneMappingMode &&\n newContrast === contrast &&\n newSaturation === saturation &&\n newTemperature === temperature &&\n newTint === tint &&\n newVignette === vignette\n ) return false;\n invalidateCompositeDenoise();\n exposure = newExposure;\n toneMappingMode = newToneMappingMode;\n contrast = newContrast;\n saturation = newSaturation;\n temperature = newTemperature;\n tint = newTint;\n vignette = newVignette;\n composePass.setUniform('exposure', exposure);\n composePass.setUniform('toneMappingParams', [toneMappingMode, vignette]);\n composePass.setUniform('colorGradingParams', [\n contrast,\n saturation,\n temperature,\n tint\n ]);\n return true;\n }\n\n function setHDROutputEnabled(enabled: boolean) {\n if (enabled === hdrOutputRequested) return false;\n invalidateCompositeDenoise();\n hdrOutputRequested = enabled;\n const wasActive = hdrOutputActive;\n\n hdrOutputActive = enabled && surface.supportsHDR;\n\n const nextComposeColorFormat: GPUTextureFormat = hdrOutputActive\n ? 'rgba16float'\n : 'rgba8unorm';\n if (nextComposeColorFormat !== composeColorFormat) {\n composeColorFormat = nextComposeColorFormat;\n composePass.setOutputParams({\n color: { format: composeColorFormat },\n denoiseColor: { format: 'rgba32float' },\n denoiseAlbedo: { format: 'rgba8unorm' }\n });\n\n }\n if (wasActive !== hdrOutputActive) {\n hdrPeakMeter?.reset();\n }\n compositeDenoiseDisplayPass.setOutputParams({ color: { format: composeColorFormat } });\n compositeDenoiseDisplayPass.setUniform('hdrOutputEnabled', hdrOutputActive ? 1 : 0);\n composePass.setUniform('hdrOutputEnabled', hdrOutputActive ? 1 : 0);\n return wasActive !== hdrOutputActive;\n }\n\n function _startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n const scheduleFrame =\n typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (callback: FrameRequestCallback) =>\n setTimeout(\n () => callback(performance.now()),\n 0\n ) as unknown as number;\n scheduleFrame(() => {\n // TODO use timestamp from requestAnimationFrame may have negative value.\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n // Without GPU timestamps, discard the draw that follows a scene\n // update instead of feeding its preparation/compilation time back.\n elapsedTileTime = collectTileTiming ? elapsedFrameTime : undefined;\n }\n });\n }\n function _onPageVisiblilityChange() {\n if (typeof document !== 'undefined' && document.hidden) {\n pageLeaveTime = performance.now();\n } else {\n pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n }\n\n /** Runs the built-in JNLM filter on the current composed image. */\n function performJNLMDenoise(\n denoiser: JNLMDenoiser\n ): Promise<boolean> {\n const generation = denoiseGeneration;\n\n jnlmPass ??= scratch.get('jnlm', () => new WGPUJNLMDenoisePass(device));\n const rayBuffers = rayTracePass.getOutputBuffer();\n const encoder = device.createCommandEncoder({ label: 'JNLM denoise' });\n const output = jnlmPass.encode(encoder, {\n width: renderWidth,\n height: renderHeight,\n accumulation: rayBuffers.shadowCatcher,\n normalAccumulation: rayBuffers.normal,\n color: composePass.getOutput('denoiseColor'),\n albedo: getFrameInput('albedo'),\n normal: getFrameInput('normal'),\n shadowCatcher: getFrameInput('shadowCatcher'),\n strength: denoiser.strength,\n shape: denoiser.shape\n });\n denoisedBuffer = copyDenoisedOutput(\n encoder,\n { data: output, width: renderWidth, height: renderHeight },\n denoisedBuffer\n );\n denoisedDisplayLinear = true;\n denoiseValid = true;\n // The filter also smooths coverage, which carries catcher shadows and\n // transmissive alpha.\n compositeDenoiseDisplayPass.setUniform(\n 'denoisedAlpha', +rayTracePass.needsDenoiseAlpha()\n );\n drawPostProcess(encoder, false);\n return device.queue.onSubmittedWorkDone().then(() => {\n const completed = generation === denoiseGeneration;\n\n return completed;\n });\n }\n\n function performCustomDenoise(\n denoiser: import('../Render.js').Denoiser,\n schedule: import('../Render.js').DenoiseSchedule,\n signal?: AbortSignal\n ): Promise<boolean> {\n const generation = denoiseGeneration;\n const controller = activeCustomController = new AbortController();\n const abort = () => controller.abort();\n signal?.addEventListener('abort', abort, {once: true});\n if (signal?.aborted) abort();\n const task = (async () => {\n if (controller.signal.aborted) return false;\n const color = copyGuide('Custom HDR input', getFrameInput('color'), true);\n const width = renderWidth, height = renderHeight;\n const albedo = copyGuide('Custom albedo', getFrameInput('albedo'), true);\n const normal = copyGuide('Custom normal', getFrameInput('normal'), true);\n const output = scratch.get('Custom output', () => new WGPUScratchBuffer(device)).get(width * height * 16, true);\n await denoiser.denoise({device, width, height, color, albedo, normal, output}, {signal: controller.signal, schedule});\n if (controller.signal.aborted || disposed || generation !== denoiseGeneration) return false;\n const coverage = scratch.get('custom coverage', () => new WGPUComputePass('Custom coverage', device, {\n inputs: ['filtered', 'original'], outputs: ['color'], uniforms: auxiliaryPassUniforms,\n csMain: customDenoiseCoverageMain\n }));\n coverage.setOutputParams({color: {channels: 4}});\n coverage.setSize(width, height); coverage.setUniform('imageSize', [width, height]);\n const finish = device.createCommandEncoder({label: 'Custom HDR result'});\n coverage.createPass(finish, {filtered: {buffer: output, channels: 4}, original: {buffer: color, channels: 4}});\n denoisedBuffer = copyDenoisedOutput(finish, {data: coverage.getOutput('color'), width, height}, denoisedBuffer);\n denoisedHDR = true; denoisedDisplayLinear = false; denoiseValid = true;\n drawPostProcess(finish, false);\n await device.queue.onSubmittedWorkDone();\n return !controller.signal.aborted && !disposed && generation === denoiseGeneration;\n })();\n customJobs.add(task);\n void task.finally(() => {\n customJobs.delete(task); signal?.removeEventListener('abort', abort);\n if (activeCustomController === controller) activeCustomController = undefined;\n }).catch(() => {});\n return task;\n }\n\n function performDenoise(\n attachedDenoiser: DenoiserHandle,\n alphaDenoiser: OIDNWeb | undefined,\n denoiseSchedule: 'converged' | 'progressive' | 'every-sample' = 'converged',\n signal?: AbortSignal\n ): Promise<boolean> {\n cancelDenoise();\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n if (attachedDenoiser.kind === 'custom') return performCustomDenoise(attachedDenoiser.denoiser, denoiseSchedule, signal);\n denoisedHDR = false;\n if (attachedDenoiser.kind === 'jnlm') return performJNLMDenoise(attachedDenoiser.denoiser);\n const denoiser: OIDNWeb = attachedDenoiser.denoiser;\n compositeDenoiseDisplayPass.setUniform('denoisedAlpha', 0);\n const generation = denoiseGeneration;\n\n const size = { width: renderWidth, height: renderHeight };\n const snapshotEncoder = device.createCommandEncoder();\n const colorInput = snapshotInput(snapshotEncoder, 'OIDN color input', composePass.getOutput('denoiseColor'));\n device.queue.submit([snapshotEncoder.finish()]);\n for (const pass of [oidnAlbedoEncodePass, oidnAlbedoDecodePass, oidnNormalSanitizePass]) {\n pass.setSize(renderWidth, renderHeight); pass.setUniform('imageSize', [renderWidth, renderHeight]);\n }\n const convergingTileOptions = {\n ...(denoiseSchedule !== 'converged' ? {\n tileOverlap: 80,\n // Low-resolution interaction must finish as one low-latency frame;\n // otherwise continuous camera updates outrun a multi-tile denoise.\n // The settled full-resolution image uses bounded dynamic tiles so\n // 4K inference cannot allocate a whole-image U-Net activation set.\n wholeImage: denoiseSchedule === 'every-sample'\n } : {}),\n // A preview frame is one whole-image pass. Settled images can take many\n // tiles; oidn-web 0.5 runs those back to back by default, which starves\n // the page at 4K, so pace them to display frames instead.\n scheduling: denoiseSchedule === 'every-sample' ? 'event-loop' as const : 'animation-frame' as const\n };\n type AuxiliaryGuides = {\n albedo: OIDNWebGPUData;\n normal: OIDNWebGPUData;\n };\n\n async function denoiseAuxiliaryGuides(): Promise<\n AuxiliaryGuides | undefined\n > {\n const auxiliaryDenoisers = denoiser.auxiliaryDenoisers;\n // Prefilter sampled texture/normal detail for clean-aux weights. The\n // accumulated guides alone are not antialiased at silhouettes and\n // subpixel texture boundaries.\n if (!auxiliaryDenoisers) {\n return {\n albedo: {\n data: copyGuide('OIDN raw albedo', 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 return runOIDNPhase(generation, (finish, fail) =>\n denoiser.tileExecute({\n ...convergingTileOptions,\n color: { data: colorInput, ...size },\n albedo: guides.albedo,\n normal: guides.normal,\n progress(output, _tileData, _tile, currentIdx, totalIdx) {\n if (generation !== denoiseGeneration) return;\n if (denoiseSchedule !== 'converged' && currentIdx + 1 < totalIdx) return;\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = true;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n },\n done(output) {\n if (generation === denoiseGeneration) {\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = true;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n }\n finish();\n },\n error: fail\n })\n );\n }\n\n // Denoise alpha channel\n function denoiseComposed(): Promise<void> {\n if (!alphaDenoiser || generation !== denoiseGeneration) {\n return Promise.resolve();\n }\n const encoder = device.createCommandEncoder();\n readbackPass.setSize(renderWidth, renderHeight);\n readbackPass.createPass(encoder, { inputTex: denoisedDisplayLinear ? compositeDenoiseDisplayPass.getOutput('color') : composePass.getOutput('color') });\n const alphaInput = snapshotInput(encoder, 'OIDN alpha input', readbackPass.getOutput('color'));\n device.queue.submit([encoder.finish()]);\n return runOIDNPhase(generation, (finish, fail) =>\n alphaDenoiser.tileExecute({\n ...convergingTileOptions,\n color: { data: alphaInput, ...size },\n denoiseAlpha: true,\n progress(output, _tileData, _tile, currentIdx, totalIdx) {\n if (generation !== denoiseGeneration) return;\n // While-converging denoising keeps the previous complete frame (or the\n // fallback) visible while tiled inference is\n // running. Publishing the shared output buffer before its final\n // tile would expose uninitialized regions as black rectangles.\n if (denoiseSchedule !== 'converged' && currentIdx + 1 < totalIdx) return;\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(\n encoder,\n output,\n denoisedBuffer\n );\n denoisedDisplayLinear = false;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n },\n done(output) {\n if (generation === denoiseGeneration) {\n const encoder = device.createCommandEncoder();\n denoisedBuffer = copyDenoisedOutput(encoder, output, denoisedBuffer);\n denoisedDisplayLinear = false;\n denoiseValid = true;\n drawPostProcess(encoder, false);\n }\n finish();\n },\n error: fail\n })\n );\n }\n\n return denoiseAuxiliaryGuides()\n .then(async (guides) => {\n if (guides && generation === denoiseGeneration) {\n await denoiseComposite(guides);\n }\n })\n .then(() => {\n if (\n generation === denoiseGeneration &&\n rayTracePass.needsDenoiseAlpha()\n ) {\n return denoiseComposed();\n }\n })\n .then(() => {\n const completed = generation === denoiseGeneration;\n\n return completed;\n });\n }\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', _onPageVisiblilityChange);\n }\n function dispose() {\n if (disposed) return;\n if (typeof document !== 'undefined') {\n document.removeEventListener(\n 'visibilitychange',\n _onPageVisiblilityChange\n );\n }\n disposed = true;\n tileTimingGeneration++;\n cancelDenoise();\n // Target outputs and timestamp readbacks can still be referenced by the\n // queue. Cancel inference now; retire all GPU-owned target resources after\n // both submitted work and the pending timestamp mapping have completed.\n void Promise.all([\n device.queue.onSubmittedWorkDone().catch(() => undefined),\n diagnosticsReadbackPromise\n ]).then(() => {\n rayTracePass.releaseTarget(targetKey);\n denoisedBuffer?.destroy();\n presentationTexture?.destroy();\n displayPostProcess.dispose();\n rayTraceOutputPass.dispose();\n });\n }\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n if (renderWidth && renderHeight) rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setAlphaBlendStrategy(execution.alphaBlendStrategy);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateTiming: invalidateTilePrediction,\n invalidateDenoisedOutput() { cancelDenoise(); denoiseValid = false; preserveDenoisedOutput = false; },\n configure(settings: TraceSettings) {\n const timingKeys = ['bounces', 'bevel', 'bevelSamples', 'directLightCandidates', 'dispersionWavelengths', 'alphaBlendStrategy', 'samplingPattern', 'clamping', 'transmissiveOutputAlphaMin'] as const;\n if (!execution || timingKeys.some(key => execution![key] !== settings[key])) invalidateTilePrediction();\n execution = { ...settings };\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n allowMultipleSamplesPerFrame = settings.allowMultipleSamplesPerFrame;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n tileRenderWithPredict?.setDesiredMsPerTile(maxTimePerTile);\n tileRenderWithPredict?.setMaxTiles(settings.maxTiles);\n },\n synchronizeBackground,\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) {\n return (lastGpuTraceTiming?.estimatedFullFrameTimeMs ?? elapsedFrameTime) <= timeBudgetMs;\n },\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n surface.configure(hdrOutputActive);\n const encoder = device.createCommandEncoder();\n outputPass.setSize(canvas.width, canvas.height);\n _present(encoder, displayPostProcess.output ?? presentationTexture);\n device.queue.submit([encoder.finish()]);\n },\n getMemory() {\n return {\nwidth: renderWidth, height: renderHeight,\n bytes: rayTracePass.getTargetMemoryBytes(targetKey) + rayTraceOutputPass.getMemoryBytes() + textureBytes(presentationTexture) + displayPostProcess.getMemoryBytes() + (denoisedBuffer?.size ?? 0)\n};\n },\n isFirstFrame() {\n return isFirstFrame;\n },\n\n restartSamples() {\n // Input edits reset accumulation, not learned throughput. Re-arming a\n // hidden probe here starves continuously changing scenes of visible samples.\n tileTimingGeneration++;\n cancelDenoise();\n preserveDenoisedOutput = false;\n denoiseValid = false;\n presentationDenoised = false;\n resolvedSamples = 0;\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n isFirstFrame = true;\n sampleCount = 0;\n },\n\n getOutputTexture(kind) {\n if (resolvedSamples < 1) return;\n if (kind === 'hdr') return getFrameInput('color');\n return displayPostProcess.output ?? presentationTexture;\n },\n applyPostProcesses(passes, render) {\n if (presentationTexture) displayPostProcess.run(presentationTexture, passes, render);\n },\n trace,\n drawPostProcess() {\n const encoder = device.createCommandEncoder();\n drawPostProcess(encoder, true);\n },\n performDenoise,\n cancelDenoise,\n setSize,\n setHDROutputEnabled,\n setToneMappingParams,\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n const image = displayPostProcess.output ?? presentationTexture;\n const width = image.width, height = image.height;\n const bytesPerRow = Math.ceil(width * 16 / 256) * 256;\n const buffer = device.createBuffer({ size: bytesPerRow * height, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ });\n const encoder = device.createCommandEncoder();\n readbackPass.setSize(width, height);\n readbackPass.createPass(encoder, { inputTex: image });\n encoder.copyTextureToBuffer({ texture: readbackPass.getOutput('color') }, { buffer, bytesPerRow }, { width, height });\n device.queue.submit([encoder.finish()]);\n try {\n await buffer.mapAsync(GPUMapMode.READ);\n const mapped = new Float32Array(buffer.getMappedRange());\n const data = new Float32Array(width * height * 4);\n for (let y = 0;y < height;y++) data.set(mapped.subarray(y * bytesPerRow / 4, y * bytesPerRow / 4 + width * 4), y * width * 4);\n return { width, height, data };\n } finally { buffer.unmap(); buffer.destroy(); }\n },\n async readOutput(kind) {\n rawOutputPass.setUniform('flatBackgroundColor', resolvedFlatBackground);\n const width = renderWidth, height = renderHeight;\n const bytesPerRow = Math.ceil(width * 16 / 256) * 256;\n const buffer = device.createBuffer({\n size: bytesPerRow * height, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n });\n const encoder = device.createCommandEncoder();\n const denoised = kind === 'denoised' && denoiseValid ? denoisedBuffer : undefined;\n if (kind === 'denoised' && !denoised) kind = 'hdr';\n const pass = kind === 'hdr' ? rawOutputPass : readbackPass;\n pass.setOutputParams({ color: { format: 'rgba32float' } });\n pass.setSize(width, height);\n if (denoised) {\n encoder.copyBufferToBuffer(denoised, 0, buffer, 0, width * height * 16);\n } else if (kind === 'hdr') {\n rawOutputPass.createPass(encoder, { colorTex: getFrameInput('color'), coverageTex: getFrameInput('albedo') });\n } else {\n readbackPass.createPass(encoder, { inputTex: getFrameInput(kind as 'albedo' | 'normal') });\n }\n if (!denoised) encoder.copyTextureToBuffer({ texture: pass.getOutput('color') }, { buffer, bytesPerRow }, { width, height, depthOrArrayLayers: 1 });\n device.queue.submit([encoder.finish()]);\n try {\n await buffer.mapAsync(GPUMapMode.READ);\n const mapped = new Float32Array(buffer.getMappedRange());\n const data = new Float32Array(width * height * 4);\n const stride = denoised ? width * 4 : bytesPerRow / 4;\n for (let y = 0;y < height;y++) data.set(mapped.subarray(y * stride, y * stride + width * 4), y * width * 4);\n return { data, width, height };\n } finally { buffer.unmap(); buffer.destroy(); }\n },\n\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n setOfflineRenderOptions(options) {\n const wasOffline = offlineSamplesPerBatch > 0;\n offlineSamplesPerBatch = Math.max(0, Math.round(options.samplesPerBatch));\n deferPostProcess = options.deferPostProcess;\n sampleSequenceOffset = Math.max(\n 0,\n Math.round(options.sampleSequenceOffset)\n );\n if (offlineSamplesPerBatch > 0 && isPredictingFrame) {\n (tileRenderWithPredict || tileRender).reset();\n isPredictingFrame = false;\n }\n if (offlineSamplesPerBatch > 0) needsUpdatePredicting = false;\n else if (wasOffline) invalidateTilePrediction();\n },\n setVarianceMoments(enabled: boolean) {\n rayTracePass.setVarianceMoments(enabled);\n },\n setAdaptiveSamplingTargets(targets) {\n rayTracePass.setAdaptiveSamplingTargets(targets);\n },\n prepareOfflineAdaptiveSampling(options) {\n return rayTracePass.prepareOfflineAdaptiveSampling(options);\n },\n\n getTotalSamplesRendered() {\n return sampleCount;\n },\n\n getDiagnostics() {\n return {\n ...rayTracePass.getDiagnostics(),\n hdrPresentation: {\n requested: hdrOutputRequested,\n active: surface.hdr,\n peakDisplayValue: surface.hdr\n ? hdrPeakMeter?.getPeakDisplayValue()\n : undefined\n },\n gpuTraceTiming: lastGpuTraceTiming\n };\n },\n\n async flushDiagnostics() {\n await device.queue.onSubmittedWorkDone();\n await diagnosticsReadbackPromise;\n },\n\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n threshold !== bloomThreshold ||\n intensity !== bloomIntensity ||\n radius !== bloomRadius;\n if (changed) invalidateCompositeDenoise();\n bloomThreshold = threshold;\n bloomIntensity = intensity;\n bloomRadius = radius;\n return changed;\n },\n\n setShadowCatcherParams(color: ColorRGB, alpha: number) {\n const changed =\n color[0] !== shadowCatcherColor[0] ||\n color[1] !== shadowCatcherColor[1] ||\n color[2] !== shadowCatcherColor[2] ||\n alpha !== shadowCatcherAlpha;\n\n if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n\n return changed;\n },\n\n setOnSampleRendered(\n cb: (\n sampleCount: number,\n isFirstFrame: boolean,\n frameTime: number\n ) => void\n ) {\n sampleRenderedCallback = cb;\n },\n\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n\n dispose\n } satisfies TargetPipeline;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWGPURenderTargets(canvas: HTMLCanvasElement | OffscreenCanvas, device: GPUDevice, options: WGPURenderingPipelineOptions = {}): RenderPipeline {\n const rayTracePass = new WGPURayTracePass(device);\n const customJobs = new Set<Promise<unknown>>();\n const scratch = new ScratchPool(work => {\n // A cancelled custom filter can keep submitting GPU work until its promise settles.\n // A custom callback can dispose synchronously, before its promise is recorded.\n // Observe leases after that callback returns so its borrowed inputs stay alive.\n void Promise.resolve().then(() => Promise.allSettled([...customJobs]))\n .then(() => device.queue.onSubmittedWorkDone()).catch(() => {}).then(work);\n });\n const surface = scratch.get('canvas', () => new WGPUCanvasSurface(canvas, device, options.presentationFormat ?? navigator.gpu.getPreferredCanvasFormat()));\n return makeRenderPipeline(rayTracePass, () => {\n const target = makeWGPUAccumulationTarget(canvas, device, rayTracePass, surface, scratch, customJobs);\n return target;\n }, false, scratch);\n}\n"]}