@zephyr3d/scene 0.9.17 → 0.9.19

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 (68) hide show
  1. package/dist/animation/joint_dynamics/collision.js +8 -6
  2. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  3. package/dist/animation/morphtargetgrouptrack.js +11 -3
  4. package/dist/animation/morphtargetgrouptrack.js.map +1 -1
  5. package/dist/app/scriptregistry.js +124 -6
  6. package/dist/app/scriptregistry.js.map +1 -1
  7. package/dist/index.d.ts +270 -7
  8. package/dist/index.js +2 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +11 -5
  11. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  12. package/dist/material/mtoon.js +20 -2
  13. package/dist/material/mtoon.js.map +1 -1
  14. package/dist/material/shader/helper.js +21 -8
  15. package/dist/material/shader/helper.js.map +1 -1
  16. package/dist/material/skin.js +4 -6
  17. package/dist/material/skin.js.map +1 -1
  18. package/dist/material/water.js +1 -1
  19. package/dist/material/water.js.map +1 -1
  20. package/dist/posteffect/bloom.js +177 -29
  21. package/dist/posteffect/bloom.js.map +1 -1
  22. package/dist/posteffect/compositor.js +111 -204
  23. package/dist/posteffect/compositor.js.map +1 -1
  24. package/dist/posteffect/motionblur.js +3 -0
  25. package/dist/posteffect/motionblur.js.map +1 -1
  26. package/dist/posteffect/posteffect.js +79 -0
  27. package/dist/posteffect/posteffect.js.map +1 -1
  28. package/dist/posteffect/skinsss.js +10 -10
  29. package/dist/posteffect/skinsss.js.map +1 -1
  30. package/dist/posteffect/ssr.js +247 -16
  31. package/dist/posteffect/ssr.js.map +1 -1
  32. package/dist/posteffect/taa.js +121 -19
  33. package/dist/posteffect/taa.js.map +1 -1
  34. package/dist/posteffect/tonemap.js +6 -6
  35. package/dist/posteffect/tonemap.js.map +1 -1
  36. package/dist/render/abuffer_oit.js +2 -1
  37. package/dist/render/abuffer_oit.js.map +1 -1
  38. package/dist/render/envlight.js +6 -3
  39. package/dist/render/envlight.js.map +1 -1
  40. package/dist/render/hzb.js +11 -4
  41. package/dist/render/hzb.js.map +1 -1
  42. package/dist/render/lightpass.js +7 -15
  43. package/dist/render/lightpass.js.map +1 -1
  44. package/dist/render/renderer.js +4 -3
  45. package/dist/render/renderer.js.map +1 -1
  46. package/dist/render/rendergraph/blackboard.js +78 -0
  47. package/dist/render/rendergraph/blackboard.js.map +1 -0
  48. package/dist/render/rendergraph/executor.js +41 -11
  49. package/dist/render/rendergraph/executor.js.map +1 -1
  50. package/dist/render/rendergraph/forward_plus_builder.js +495 -201
  51. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  52. package/dist/render/rendergraph/rendergraph.js +29 -0
  53. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  54. package/dist/render/rendergraph/types.js.map +1 -1
  55. package/dist/scene/light.js +146 -146
  56. package/dist/scene/light.js.map +1 -1
  57. package/dist/shaders/ssr.js +52 -21
  58. package/dist/shaders/ssr.js.map +1 -1
  59. package/dist/shadow/shadowmapper.js +95 -95
  60. package/dist/shadow/shadowmapper.js.map +1 -1
  61. package/dist/utility/misc.js +10 -1
  62. package/dist/utility/misc.js.map +1 -1
  63. package/dist/utility/serialization/manager.js +2 -1
  64. package/dist/utility/serialization/manager.js.map +1 -1
  65. package/dist/utility/serialization/scene/animation.js +36 -2
  66. package/dist/utility/serialization/scene/animation.js.map +1 -1
  67. package/dist/utility/serialization/scene/light.js.map +1 -1
  68. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import type { TextureFormat } from '@zephyr3d/device';\r\nimport { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Scene } from '../scene';\r\nimport type { Camera } from '../camera';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport { executeForwardPlusGraph } from './rendergraph/forward_plus_builder';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene to render\r\n * @param camera - The camera that will be used to render the scene\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const halfFloatColorBuffer = device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer;\r\n const colorFormat = camera.HDR && halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = (!camera.TAA || device.type === 'webgl') && !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth > 0 && renderHeight > 0) {\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const SSS = camera.SSS;\r\n const glossySurfaceFormat: TextureFormat = halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors:\r\n device.type !== 'webgl' && (camera.TAA || camera.motionBlur || (SSR && camera.ssrTemporal)),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n sunLight: null,\r\n primaryDirectionalLight: null,\r\n primaryTransmissionLight: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSS,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n SSRRoughnessTexture: SSR\r\n ? device.pool.fetchTemporalTexture2D(true, glossySurfaceFormat, renderWidth, renderHeight)\r\n : null,\r\n SSRNormalTexture: SSR\r\n ? device.pool.fetchTemporalTexture2D(true, glossySurfaceFormat, renderWidth, renderHeight)\r\n : null,\r\n SSSProfileTexture: null,\r\n SSSParamTexture: null,\r\n SSSDiffuseTexture: null,\r\n SSSTransmissionTexture: null,\r\n SkinSSSTexture: null,\r\n ssrSDFBoxBuffer: null,\r\n ssrSDFBoxCount: 0,\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n } else {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext): void {\r\n executeForwardPlusGraph(ctx);\r\n }\r\n}\r\n"],"names":["SceneRenderer","renderScene","scene","camera","device","getDevice","halfFloatColorBuffer","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","colorFormat","HDR","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","TAA","type","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","SSS","glossySurfaceFormat","ctx","oit","motionVectors","motionBlur","ssrTemporal","HiZ","HiZTexture","compositor","queue","lightBlending","renderPass","renderPassHash","flip","drawEnvLight","sunLight","primaryDirectionalLight","primaryTransmissionLight","materialFlags","SSRCalcThickness","ssrCalcThickness","SSRRoughnessTexture","fetchTemporalTexture2D","SSRNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","ssrSDFBoxBuffer","ssrSDFBoxCount","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","getPickResultResolveFunc","release","executeForwardPlusGraph"],"mappings":";;;;;;;;;AAUA;;;AAGC,IACM,MAAMA,aAAAA,CAAAA;AACX;;;;AAIC,MACD,OAAOC,WAAAA,CAAYC,KAAY,EAAEC,MAAc,EAAQ;AACrD,QAAA,MAAMC,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,MAAMC,uBAAuBF,MAAOG,CAAAA,aAAa,EAAGC,CAAAA,WAAW,CAACC,2BAA2B;AAC3F,QAAA,MAAMC,WAAcP,GAAAA,MAAAA,CAAOQ,GAAG,IAAIL,uBAAuB,SAAY,GAAA,YAAA;QACrE,MAAMM,WAAAA,GAAcR,OAAOG,aAAa,EAAA,CAAGM,eAAe,CAACC,2BAA2B,GAClF,QACA,GAAA,OAAA;QACJ,MAAMC,wBAAAA,GAA2BC,yBAAyBC,GAAG,EAAA;AAC7Df,QAAAA,KAAAA,CAAMgB,WAAW,EAAA;AACjBhB,QAAAA,KAAAA,CAAMiB,oBAAoB,CAAChB,MAAAA,CAAAA;AAC3B,QAAA,IAAIA,MAAU,IAAA,CAACC,MAAOgB,CAAAA,aAAa,EAAI,EAAA;AACrC,YAAA,MAAMC,kBAAkB,CAAC,CAAClB,MAAOmB,CAAAA,GAAG,IAAIlB,MAAOmB,CAAAA,IAAI,KAAK,OAAM,KAAM,CAACpB,MAAAA,CAAOqB,QAAQ,IAAI,CAACrB,OAAOsB,OAAO;YACvG,MAAMC,OAAAA,GAAUvB,MAAOqB,CAAAA,QAAQ,GAAGpB,MAAAA,CAAOuB,eAAe,CAACxB,MAAOqB,CAAAA,QAAQ,CAAC,CAAA,CAAE,CAAI,GAAA,CAAA;YAC/E,MAAMI,OAAAA,GAAUzB,MAAOqB,CAAAA,QAAQ,GAAGpB,MAAAA,CAAOyB,eAAe,CAAC1B,MAAOqB,CAAAA,QAAQ,CAAC,CAAA,CAAE,CAAI,GAAA,CAAA;AAC/E,YAAA,MAAMM,WAAc3B,GAAAA,MAAAA,CAAOqB,QAAQ,GAC/BpB,MAAOuB,CAAAA,eAAe,CAACxB,MAAAA,CAAOqB,QAAQ,CAAC,CAAE,CAAA,CAAA,GACzCpB,OAAO2B,qBAAqB,EAAA;AAChC,YAAA,MAAMC,YAAe7B,GAAAA,MAAAA,CAAOqB,QAAQ,GAChCpB,MAAOyB,CAAAA,eAAe,CAAC1B,MAAAA,CAAOqB,QAAQ,CAAC,CAAE,CAAA,CAAA,GACzCpB,OAAO6B,sBAAsB,EAAA;YACjC,IAAIH,WAAAA,GAAc,CAAKE,IAAAA,YAAAA,GAAe,CAAG,EAAA;gBACvC,MAAME,cAAAA,GAAiBb,eACnB,GAAA,IAAA,GACAjB,MAAO+B,CAAAA,IAAI,CAACC,wBAAwB,CAAC,KAAA,EAAON,WAAaE,EAAAA,YAAAA,EAActB,WAAaE,EAAAA,WAAAA,CAAAA;gBACxF,MAAMyB,iBAAAA,GAAoBjC,OAAOkC,cAAc,EAAA;AAC/C,gBAAA,IAAIJ,cAAgB,EAAA;AAClB9B,oBAAAA,MAAAA,CAAOmC,gBAAgB,EAAA;AACvBnC,oBAAAA,MAAAA,CAAOoC,cAAc,CAACN,cAAAA,CAAAA;AACxB;gBACA9B,MAAOqC,CAAAA,gBAAgB,CAACtC,MAAOuC,CAAAA,UAAU,EAAEvC,MAAOwC,CAAAA,UAAU,EAAExC,MAAAA,CAAOyC,YAAY,CAAA;AACjF,gBAAA,MAAMC,MAAM1C,MAAO0C,CAAAA,GAAG,IAAI3C,KAAM4C,CAAAA,GAAG,CAACC,KAAK,CAACC,QAAQ,IAAI9C,MAAM4C,GAAG,CAACC,KAAK,CAACC,QAAQ,CAACC,WAAW,EAAA;gBAC1F,MAAMC,GAAAA,GAAM/C,OAAO+C,GAAG;gBACtB,MAAMC,mBAAAA,GAAqC7C,uBAAuB,SAAY,GAAA,YAAA;AAC9E,gBAAA,MAAM8C,GAAmB,GAAA;AACvBhD,oBAAAA,MAAAA;AACAF,oBAAAA,KAAAA;AACA4B,oBAAAA,WAAAA;AACAE,oBAAAA,YAAAA;oBACAqB,GAAK,EAAA,IAAA;AACLC,oBAAAA,aAAAA,EACElD,MAAOmB,CAAAA,IAAI,KAAK,OAAA,KAAYpB,MAAAA,CAAOmB,GAAG,IAAInB,MAAOoD,CAAAA,UAAU,IAAKV,GAAAA,IAAO1C,OAAOqD,WAAW,CAAA;AAC3FC,oBAAAA,GAAAA,EAAKtD,MAAOsD,CAAAA,GAAG,IAAIrD,MAAAA,CAAOmB,IAAI,KAAK,OAAA;oBACnCmC,UAAY,EAAA,IAAA;AACZ3C,oBAAAA,wBAAAA;AACAZ,oBAAAA,MAAAA;AACAwD,oBAAAA,UAAAA,EAAYxD,OAAOwD,UAAU;oBAC7BC,KAAO,EAAA,CAAA;oBACPC,aAAe,EAAA,KAAA;oBACfC,UAAY,EAAA,IAAA;oBACZC,cAAgB,EAAA,IAAA;oBAChBC,IAAM,EAAA,KAAA;AACNpD,oBAAAA,WAAAA;AACAF,oBAAAA,WAAAA;oBACAuD,YAAc,EAAA,KAAA;oBACdnB,GAAK,EAAA,IAAA;oBACLoB,QAAU,EAAA,IAAA;oBACVC,uBAAyB,EAAA,IAAA;oBACzBC,wBAA0B,EAAA,IAAA;oBAC1BC,aAAe,EAAA,CAAA;AACfxB,oBAAAA,GAAAA;AACAK,oBAAAA,GAAAA;oBACAoB,gBAAkBzB,EAAAA,GAAAA,IAAO1C,OAAOoE,gBAAgB;oBAChDC,mBAAqB3B,EAAAA,GAAAA,GACjBzC,OAAO+B,IAAI,CAACsC,sBAAsB,CAAC,IAAA,EAAMtB,mBAAqBrB,EAAAA,WAAAA,EAAaE,YAC3E,CAAA,GAAA,IAAA;oBACJ0C,gBAAkB7B,EAAAA,GAAAA,GACdzC,OAAO+B,IAAI,CAACsC,sBAAsB,CAAC,IAAA,EAAMtB,mBAAqBrB,EAAAA,WAAAA,EAAaE,YAC3E,CAAA,GAAA,IAAA;oBACJ2C,iBAAmB,EAAA,IAAA;oBACnBC,eAAiB,EAAA,IAAA;oBACjBC,iBAAmB,EAAA,IAAA;oBACnBC,sBAAwB,EAAA,IAAA;oBACxBC,cAAgB,EAAA,IAAA;oBAChBC,eAAiB,EAAA,IAAA;oBACjBC,cAAgB,EAAA,CAAA;AAChBC,oBAAAA,gBAAAA,EAAkB9E,OAAOkC,cAAc,EAAA;oBACvC6C,uBAAyB,EAAA;AAC3B,iBAAA;gBACA,IAAI,CAACC,YAAY,CAAChC,GAAAA,CAAAA;AAClB,gBAAA,IAAIlB,cAAgB,EAAA;AAClB9B,oBAAAA,MAAAA,CAAOiF,eAAe,EAAA;AACtB,oBAAA,MAAMC,iBACJ5D,GAAAA,OAAAA,GAAU,CACVE,IAAAA,OAAAA,GAAU,CACVF,IAAAA,OAAAA,GAAUI,WAAc1B,GAAAA,MAAAA,CAAO2B,qBAAqB,EAAA,IACpDH,OAAUI,GAAAA,YAAAA,GAAe5B,OAAO6B,sBAAsB,EAAA;AACxD,oBAAA,MAAMsD,UAAU,IAAIC,WAAAA,EAAAA;AACpB,oBAAA,IAAIF,iBAAmB,EAAA;AACrBC,wBAAAA,OAAAA,CAAQE,QAAQ,GAAG;AAAC/D,4BAAAA,OAAAA;AAASE,4BAAAA,OAAAA;AAASE,4BAAAA,WAAAA;AAAaE,4BAAAA;AAAa,yBAAA;qBAC3D,MAAA;wBACLuD,OAAQ/D,CAAAA,QAAQ,GAAGrB,MAAOqB,CAAAA,QAAQ,GAAGrB,MAAOqB,CAAAA,QAAQ,CAACkE,KAAK,EAAK,GAAA,IAAA;AACjE;oBACAH,OAAQ9D,CAAAA,OAAO,GAAGtB,MAAOsB,CAAAA,OAAO,GAAGtB,MAAOsB,CAAAA,OAAO,CAACiE,KAAK,EAAK,GAAA,IAAA;oBAC5DH,OAAQI,CAAAA,OAAO,GAAG,CAACtD,iBAAAA;oBACnBkD,OAAQK,CAAAA,IAAI,CACV1D,cAAAA,CAAe2D,mBAAmB,EAAE,CAAC,CAAE,CAAA,EACvCxD,iBAAqB,IAAA,IAAA,EACrByD,YAAa,CAAA,qBAAA,CAAA,CAAA;oBAEf1F,MAAO+B,CAAAA,IAAI,CAAC4D,kBAAkB,CAAC7D,cAAAA,CAAAA;AACjC;aACK,MAAA;AACL/B,gBAAAA,MAAAA,CAAO6F,wBAAwB,EAAK,GAAA,IAAA,CAAA;AACpC,gBAAA;AACF;AACF;AACAhF,QAAAA,wBAAAA,CAAyBiF,OAAO,CAAClF,wBAAAA,CAAAA;AACnC;AAEA,qBACA,OAAiBqE,YAAahC,CAAAA,GAAgB,EAAQ;QACpD8C,uBAAwB9C,CAAAA,GAAAA,CAAAA;AAC1B;AACF;;;;"}
1
+ {"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Scene } from '../scene';\r\nimport type { Camera } from '../camera';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport { executeForwardPlusGraph } from './rendergraph/forward_plus_builder';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene to render\r\n * @param camera - The camera that will be used to render the scene\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const halfFloatColorBuffer = device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer;\r\n const colorFormat = camera.HDR && halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = (!camera.TAA || device.type === 'webgl') && !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth > 0 && renderHeight > 0) {\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const SSS = camera.SSS;\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors:\r\n device.type !== 'webgl' && (camera.TAA || camera.motionBlur || (SSR && camera.ssrTemporal)),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n sunLight: null,\r\n primaryDirectionalLight: null,\r\n primaryTransmissionLight: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSS,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n // SSR roughness/normal MRT textures are render graph resources\r\n // created by the LightPass; resolved into these fields at execution.\r\n SSRRoughnessTexture: null,\r\n SSRNormalTexture: null,\r\n SSSProfileTexture: null,\r\n SSSParamTexture: null,\r\n SSSDiffuseTexture: null,\r\n SSSTransmissionTexture: null,\r\n SkinSSSTexture: null,\r\n ssrSDFBoxBuffer: null,\r\n ssrSDFBoxCount: 0,\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n } else {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext): void {\r\n executeForwardPlusGraph(ctx);\r\n }\r\n}\r\n"],"names":["SceneRenderer","renderScene","scene","camera","device","getDevice","halfFloatColorBuffer","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","colorFormat","HDR","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","TAA","type","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","SSS","ctx","oit","motionVectors","motionBlur","ssrTemporal","HiZ","HiZTexture","compositor","queue","lightBlending","renderPass","renderPassHash","flip","drawEnvLight","sunLight","primaryDirectionalLight","primaryTransmissionLight","materialFlags","SSRCalcThickness","ssrCalcThickness","SSRRoughnessTexture","SSRNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","ssrSDFBoxBuffer","ssrSDFBoxCount","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","getPickResultResolveFunc","release","executeForwardPlusGraph"],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Canonical names for well-known per-frame resources shared through {@link RGBlackboard}.
3
+ *
4
+ * Producer passes register their output handles under these names so that
5
+ * consumers (e.g. post effects) can declare reads without hard-coupling to
6
+ * the pass that produced them.
7
+ *
8
+ * @public
9
+ */ const FrameResources = {
10
+ SceneColor: 'sceneColor',
11
+ SceneColorCopy: 'sceneColorCopy',
12
+ LinearDepth: 'linearDepth',
13
+ SceneDepthAttachment: 'sceneDepthAttachment',
14
+ MotionVector: 'motionVector',
15
+ HiZ: 'hiZ',
16
+ SSRRoughness: 'ssrRoughness',
17
+ SSRNormal: 'ssrNormal',
18
+ SSSProfile: 'sssProfile',
19
+ SSSParam: 'sssParam',
20
+ SSSDiffuse: 'sssDiffuse',
21
+ SSSTransmission: 'sssTransmission',
22
+ SkinSSS: 'skinSSS'
23
+ };
24
+ /**
25
+ * Named registry of render graph resource handles for the current frame.
26
+ *
27
+ * The blackboard decouples resource producers from consumers: passes that
28
+ * create shared resources register the returned handles by name, and later
29
+ * passes look them up to declare read dependencies. This replaces passing
30
+ * textures through mutable `DrawContext` fields.
31
+ *
32
+ * A blackboard instance is valid for a single graph build; create a new one
33
+ * (or clear it) every frame together with the graph.
34
+ *
35
+ * @public
36
+ */ class RGBlackboard {
37
+ /** @internal */ _handles = new Map();
38
+ /**
39
+ * Register a resource handle under a name, replacing any previous entry.
40
+ * @param name - Resource name, typically one of {@link FrameResources}.
41
+ * @param handle - The handle to register.
42
+ */ set(name, handle) {
43
+ this._handles.set(name, handle);
44
+ }
45
+ /**
46
+ * Look up a resource handle by name.
47
+ * @param name - Resource name, typically one of {@link FrameResources}.
48
+ * @returns The registered handle, or null if not present this frame.
49
+ */ get(name) {
50
+ return this._handles.get(name) ?? null;
51
+ }
52
+ /**
53
+ * Check whether a resource is registered.
54
+ * @param name - Resource name.
55
+ * @returns true if a handle is registered under the name.
56
+ */ has(name) {
57
+ return this._handles.has(name);
58
+ }
59
+ /**
60
+ * Look up a resource handle that must exist.
61
+ * @param name - Resource name.
62
+ * @returns The registered handle.
63
+ */ expect(name) {
64
+ const handle = this._handles.get(name);
65
+ if (!handle) {
66
+ throw new Error(`RGBlackboard: required frame resource "${name}" was not registered`);
67
+ }
68
+ return handle;
69
+ }
70
+ /**
71
+ * Remove all registered handles.
72
+ */ clear() {
73
+ this._handles.clear();
74
+ }
75
+ }
76
+
77
+ export { FrameResources, RGBlackboard };
78
+ //# sourceMappingURL=blackboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blackboard.js","sources":["../../../src/render/rendergraph/blackboard.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\nimport type { RGHandle } from './types';\n\n/**\n * Canonical names for well-known per-frame resources shared through {@link RGBlackboard}.\n *\n * Producer passes register their output handles under these names so that\n * consumers (e.g. post effects) can declare reads without hard-coupling to\n * the pass that produced them.\n *\n * @public\n */\nexport const FrameResources = {\n SceneColor: 'sceneColor',\n SceneColorCopy: 'sceneColorCopy',\n LinearDepth: 'linearDepth',\n SceneDepthAttachment: 'sceneDepthAttachment',\n MotionVector: 'motionVector',\n HiZ: 'hiZ',\n SSRRoughness: 'ssrRoughness',\n SSRNormal: 'ssrNormal',\n SSSProfile: 'sssProfile',\n SSSParam: 'sssParam',\n SSSDiffuse: 'sssDiffuse',\n SSSTransmission: 'sssTransmission',\n SkinSSS: 'skinSSS'\n} as const;\n\n/**\n * Named registry of render graph resource handles for the current frame.\n *\n * The blackboard decouples resource producers from consumers: passes that\n * create shared resources register the returned handles by name, and later\n * passes look them up to declare read dependencies. This replaces passing\n * textures through mutable `DrawContext` fields.\n *\n * A blackboard instance is valid for a single graph build; create a new one\n * (or clear it) every frame together with the graph.\n *\n * @public\n */\nexport class RGBlackboard {\n /** @internal */\n private _handles: Map<string, RGHandle> = new Map();\n /**\n * Register a resource handle under a name, replacing any previous entry.\n * @param name - Resource name, typically one of {@link FrameResources}.\n * @param handle - The handle to register.\n */\n set(name: string, handle: RGHandle): void {\n this._handles.set(name, handle);\n }\n /**\n * Look up a resource handle by name.\n * @param name - Resource name, typically one of {@link FrameResources}.\n * @returns The registered handle, or null if not present this frame.\n */\n get(name: string): Nullable<RGHandle> {\n return this._handles.get(name) ?? null;\n }\n /**\n * Check whether a resource is registered.\n * @param name - Resource name.\n * @returns true if a handle is registered under the name.\n */\n has(name: string): boolean {\n return this._handles.has(name);\n }\n /**\n * Look up a resource handle that must exist.\n * @param name - Resource name.\n * @returns The registered handle.\n */\n expect(name: string): RGHandle {\n const handle = this._handles.get(name);\n if (!handle) {\n throw new Error(`RGBlackboard: required frame resource \"${name}\" was not registered`);\n }\n return handle;\n }\n /**\n * Remove all registered handles.\n */\n clear(): void {\n this._handles.clear();\n }\n}\n"],"names":["FrameResources","SceneColor","SceneColorCopy","LinearDepth","SceneDepthAttachment","MotionVector","HiZ","SSRRoughness","SSRNormal","SSSProfile","SSSParam","SSSDiffuse","SSSTransmission","SkinSSS","RGBlackboard","_handles","Map","set","name","handle","get","has","expect","Error","clear"],"mappings":"AAGA;;;;;;;;UASaA,cAAiB,GAAA;IAC5BC,UAAY,EAAA,YAAA;IACZC,cAAgB,EAAA,gBAAA;IAChBC,WAAa,EAAA,aAAA;IACbC,oBAAsB,EAAA,sBAAA;IACtBC,YAAc,EAAA,cAAA;IACdC,GAAK,EAAA,KAAA;IACLC,YAAc,EAAA,cAAA;IACdC,SAAW,EAAA,WAAA;IACXC,UAAY,EAAA,YAAA;IACZC,QAAU,EAAA,UAAA;IACVC,UAAY,EAAA,YAAA;IACZC,eAAiB,EAAA,iBAAA;IACjBC,OAAS,EAAA;AACX;AAEA;;;;;;;;;;;;AAYC,IACM,MAAMC,YAAAA,CAAAA;AACX,qBACQC,QAAkC,GAAA,IAAIC,GAAM,EAAA;AACpD;;;;AAIC,MACDC,GAAIC,CAAAA,IAAY,EAAEC,MAAgB,EAAQ;AACxC,QAAA,IAAI,CAACJ,QAAQ,CAACE,GAAG,CAACC,IAAMC,EAAAA,MAAAA,CAAAA;AAC1B;AACA;;;;MAKAC,GAAAA,CAAIF,IAAY,EAAsB;AACpC,QAAA,OAAO,IAAI,CAACH,QAAQ,CAACK,GAAG,CAACF,IAAS,CAAA,IAAA,IAAA;AACpC;AACA;;;;MAKAG,GAAAA,CAAIH,IAAY,EAAW;AACzB,QAAA,OAAO,IAAI,CAACH,QAAQ,CAACM,GAAG,CAACH,IAAAA,CAAAA;AAC3B;AACA;;;;MAKAI,MAAAA,CAAOJ,IAAY,EAAY;AAC7B,QAAA,MAAMC,SAAS,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAAA,CAAAA;AACjC,QAAA,IAAI,CAACC,MAAQ,EAAA;AACX,YAAA,MAAM,IAAII,KAAM,CAAA,CAAC,uCAAuC,EAAEL,IAAAA,CAAK,oBAAoB,CAAC,CAAA;AACtF;QACA,OAAOC,MAAAA;AACT;AACA;;AAEC,MACDK,KAAc,GAAA;QACZ,IAAI,CAACT,QAAQ,CAACS,KAAK,EAAA;AACrB;AACF;;;;"}
@@ -39,6 +39,7 @@ const DEFAULT_PROFILING_OPTIONS = {
39
39
  /** @internal */ _allocatedTextures = new Map();
40
40
  /** @internal */ _allocatedFramebuffers = new Map();
41
41
  /** @internal */ _importedTextureAliases = new Map();
42
+ /** @internal */ _transientTextureAliases = new Map();
42
43
  /** @internal */ _resolvedImportedTextures = new Map();
43
44
  /** @internal */ _cleanupCallbacks = [];
44
45
  /** @internal */ _profilingOptions;
@@ -113,16 +114,27 @@ const DEFAULT_PROFILING_OPTIONS = {
113
114
  const releaseAt = new Map(); // passIndex -> transient texture resourceIds to release
114
115
  const allocateFramebufferAt = new Map(); // passIndex -> framebuffer resourceIds to allocate
115
116
  const releaseFramebufferAt = new Map(); // passIndex -> framebuffer resourceIds to release
117
+ // Transient write-versions (builder.write on a transient) alias the same
118
+ // physical texture as the original resource: merge their lifetimes by
119
+ // physicalId so one texture is allocated at the first use of any version
120
+ // and released after the last use of any version.
121
+ this._transientTextureAliases.clear();
122
+ const transientSchedules = new Map();
116
123
  for (const [resId, lifetime] of compiled.lifetimes){
117
124
  if (lifetime.resource.kind === 'transient') {
118
- if (!allocateAt.has(lifetime.firstUse)) {
119
- allocateAt.set(lifetime.firstUse, []);
125
+ const physicalId = lifetime.resource.physicalId;
126
+ this._transientTextureAliases.set(resId, physicalId);
127
+ const merged = transientSchedules.get(physicalId);
128
+ if (merged) {
129
+ merged.firstUse = Math.min(merged.firstUse, lifetime.firstUse);
130
+ merged.lastUse = Math.max(merged.lastUse, lifetime.lastUse);
131
+ } else {
132
+ transientSchedules.set(physicalId, {
133
+ firstUse: lifetime.firstUse,
134
+ lastUse: lifetime.lastUse,
135
+ desc: lifetime.resource.desc
136
+ });
120
137
  }
121
- allocateAt.get(lifetime.firstUse).push(resId);
122
- if (!releaseAt.has(lifetime.lastUse)) {
123
- releaseAt.set(lifetime.lastUse, []);
124
- }
125
- releaseAt.get(lifetime.lastUse).push(resId);
126
138
  } else if (lifetime.resource.kind === 'framebuffer') {
127
139
  if (!allocateFramebufferAt.has(lifetime.firstUse)) {
128
140
  allocateFramebufferAt.set(lifetime.firstUse, []);
@@ -134,6 +146,16 @@ const DEFAULT_PROFILING_OPTIONS = {
134
146
  releaseFramebufferAt.get(lifetime.lastUse).push(resId);
135
147
  }
136
148
  }
149
+ for (const [physicalId, schedule] of transientSchedules){
150
+ if (!allocateAt.has(schedule.firstUse)) {
151
+ allocateAt.set(schedule.firstUse, []);
152
+ }
153
+ allocateAt.get(schedule.firstUse).push(physicalId);
154
+ if (!releaseAt.has(schedule.lastUse)) {
155
+ releaseAt.set(schedule.lastUse, []);
156
+ }
157
+ releaseAt.get(schedule.lastUse).push(physicalId);
158
+ }
137
159
  let completed = false;
138
160
  let executionError = null;
139
161
  try {
@@ -143,10 +165,9 @@ const DEFAULT_PROFILING_OPTIONS = {
143
165
  const toAllocate = allocateAt.get(i);
144
166
  if (toAllocate) {
145
167
  for (const resId of toAllocate){
146
- const lifetime = compiled.lifetimes.get(resId);
147
- const desc = lifetime.resource.desc;
148
- const size = this._resolveSize(desc);
149
- const texture = this._allocator.allocate(desc, size);
168
+ const schedule = transientSchedules.get(resId);
169
+ const size = this._resolveSize(schedule.desc);
170
+ const texture = this._allocator.allocate(schedule.desc, size);
150
171
  this._allocatedTextures.set(resId, texture);
151
172
  }
152
173
  }
@@ -268,6 +289,7 @@ const DEFAULT_PROFILING_OPTIONS = {
268
289
  this._allocatedTextures.clear();
269
290
  this._importedTextures.clear();
270
291
  this._importedTextureAliases.clear();
292
+ this._transientTextureAliases.clear();
271
293
  this._resolvedImportedTextures.clear();
272
294
  }
273
295
  // ─── Private ────────────────────────────────────────────────────────
@@ -593,6 +615,14 @@ const DEFAULT_PROFILING_OPTIONS = {
593
615
  if (allocated !== undefined) {
594
616
  return allocated;
595
617
  }
618
+ // Transient write-versions resolve to the physical texture of the original.
619
+ const transientAlias = this._transientTextureAliases.get(handle._id);
620
+ if (transientAlias !== undefined) {
621
+ const aliased = this._allocatedTextures.get(transientAlias);
622
+ if (aliased !== undefined) {
623
+ return aliased;
624
+ }
625
+ }
596
626
  throw new Error(`RenderGraphExecutor: cannot resolve resource "${handle.name}" (id=${handle._id}). ` + `It may not have been allocated yet or was already released.`);
597
627
  }
598
628
  /** @internal */ _createAccessScope(pass) {
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sources":["../../../src/render/rendergraph/executor.ts"],"sourcesContent":["import type {\r\n CompiledRenderGraph,\r\n RenderGraphExecutorOptions,\r\n RGProfileResult,\r\n RGProfileScopeResult,\r\n RGProfileScopeType,\r\n RGProfilingOptions,\r\n RGTextureAllocator,\r\n RGTextureDesc,\r\n RGFramebufferDesc,\r\n RGResolvedSize,\r\n RGExecuteContext,\r\n RGExecuteFn,\r\n RGPass\r\n} from './types';\r\nimport { RGHandle } from './types';\r\nimport type { AbstractDevice, TimestampQueryResult, TimestampQueryStatus } from '@zephyr3d/device';\r\nimport { getDevice } from '../../app/api';\r\n\r\ninterface RGPassAccessScope {\r\n passName: string;\r\n accessibleIds: Set<number>;\r\n textureIds: Set<number>;\r\n framebufferIds: Set<number>;\r\n}\r\n\r\ntype RGResolvedProfilingOptions = Required<Omit<RGProfilingOptions, 'device'>> & {\r\n device?: AbstractDevice;\r\n};\r\n\r\ninterface RGProfileScopeInternal {\r\n result: RGProfileScopeResult;\r\n queryId: number;\r\n ended: boolean;\r\n}\r\n\r\ninterface RGProfileFrameInternal {\r\n serial: number;\r\n device: AbstractDevice | null;\r\n supported: boolean;\r\n result: RGProfileResult;\r\n root: RGProfileScopeInternal;\r\n scopes: RGProfileScopeInternal[];\r\n resolvePromise: Promise<RGProfileResult>;\r\n}\r\n\r\nconst DEFAULT_PROFILING_OPTIONS: RGResolvedProfilingOptions = {\r\n enabled: false,\r\n graph: true,\r\n pass: true,\r\n subpass: true,\r\n includePendingUploads: true,\r\n allowCrossFrame: false,\r\n maxPendingFrames: 3,\r\n label: 'RenderGraph'\r\n};\r\n\r\n/**\r\n * Executes a compiled render graph with automatic resource lifecycle management.\r\n *\r\n * The executor allocates transient textures before their first use and releases\r\n * them after their last use, using the provided {@link RGTextureAllocator}.\r\n *\r\n * Usage:\r\n * ```ts\r\n * const executor = new RenderGraphExecutor(myAllocator, backbufferWidth, backbufferHeight);\r\n * executor.setImportedTexture(backbufferHandle, actualBackbufferTexture);\r\n * executor.execute(compiledGraph);\r\n * ```\r\n *\r\n * @typeParam TTexture - The concrete texture type (e.g. `Texture2D`).\r\n * @public\r\n */\r\nexport class RenderGraphExecutor<TTexture = unknown, TFramebuffer = unknown> {\r\n private static _defaultProfilingOptions: boolean | RGProfilingOptions = false;\r\n private static _latestProfileResult: RGProfileResult | null = null;\r\n private static _latestPendingProfileFrame: RGProfileFrameInternal | null = null;\r\n private static _latestResolvedProfileSerial = 0;\r\n private static _nextProfileSerial = 0;\r\n\r\n /** @internal */\r\n private _allocator: RGTextureAllocator<TTexture, TFramebuffer>;\r\n /** @internal */\r\n private _backbufferWidth: number;\r\n /** @internal */\r\n private _backbufferHeight: number;\r\n /** @internal */\r\n private _importedTextures: Map<number, TTexture> = new Map();\r\n /** @internal */\r\n private _allocatedTextures: Map<number, TTexture> = new Map();\r\n /** @internal */\r\n private _allocatedFramebuffers: Map<number, TFramebuffer> = new Map();\r\n /** @internal */\r\n private _importedTextureAliases: Map<number, number> = new Map();\r\n /** @internal */\r\n private _resolvedImportedTextures: Map<number, TTexture> = new Map();\r\n /** @internal */\r\n private _cleanupCallbacks: Array<() => void> = [];\r\n /** @internal */\r\n private _profilingOptions: RGResolvedProfilingOptions;\r\n /** @internal */\r\n private _pendingProfileFrames: RGProfileFrameInternal[] = [];\r\n /** @internal */\r\n private _latestProfileResult: RGProfileResult | null = null;\r\n /** @internal */\r\n private _latestResolvedProfileSerial = 0;\r\n\r\n constructor(\r\n allocator: RGTextureAllocator<TTexture, TFramebuffer>,\r\n backbufferWidth: number,\r\n backbufferHeight: number,\r\n options?: RenderGraphExecutorOptions\r\n ) {\r\n this._allocator = allocator;\r\n this._backbufferWidth = backbufferWidth;\r\n this._backbufferHeight = backbufferHeight;\r\n this._profilingOptions = this._normalizeProfilingOptions(\r\n options?.profiling ?? RenderGraphExecutor._defaultProfilingOptions,\r\n options?.device\r\n );\r\n }\r\n\r\n /**\r\n * Set the default profiling options used by newly constructed render graph executors.\r\n */\r\n static setDefaultProfilingOptions(options: boolean | RGProfilingOptions): void {\r\n RenderGraphExecutor._defaultProfilingOptions = options;\r\n }\r\n\r\n /**\r\n * Get the latest resolved profile result from any render graph executor.\r\n */\r\n static getLatestProfileResult(): RGProfileResult | null {\r\n return RenderGraphExecutor._latestProfileResult;\r\n }\r\n\r\n /**\r\n * Resolve the latest pending render graph profile result from any executor.\r\n */\r\n static resolveProfileResult(): Promise<RGProfileResult | null> {\r\n return (\r\n RenderGraphExecutor._latestPendingProfileFrame?.resolvePromise ??\r\n Promise.resolve(RenderGraphExecutor._latestProfileResult)\r\n );\r\n }\r\n\r\n /**\r\n * Enable, disable, or update timestamp profiling for this executor.\r\n */\r\n setProfilingOptions(options: boolean | RGProfilingOptions): void {\r\n this._profilingOptions = this._normalizeProfilingOptions(options, this._profilingOptions.device);\r\n }\r\n\r\n /**\r\n * Get the latest resolved profile result produced by this executor.\r\n */\r\n getLatestProfileResult(): RGProfileResult | null {\r\n return this._latestProfileResult;\r\n }\r\n\r\n /**\r\n * Resolve the latest pending profile result produced by this executor.\r\n */\r\n resolveProfileResult(): Promise<RGProfileResult | null> {\r\n return (\r\n this._pendingProfileFrames[this._pendingProfileFrames.length - 1]?.resolvePromise ??\r\n Promise.resolve(this._latestProfileResult)\r\n );\r\n }\r\n\r\n /**\r\n * Update the backbuffer dimensions used for 'backbuffer-relative' sizing.\r\n */\r\n setBackbufferSize(width: number, height: number): void {\r\n this._backbufferWidth = width;\r\n this._backbufferHeight = height;\r\n }\r\n\r\n /**\r\n * Register an imported (external) texture so it can be resolved during execution.\r\n *\r\n * @param handle - The handle returned from {@link RenderGraph.importTexture}.\r\n * @param texture - The actual GPU texture object.\r\n */\r\n setImportedTexture(handle: RGHandle, texture: TTexture): void {\r\n this._importedTextures.set(handle._id, texture);\r\n }\r\n\r\n /**\r\n * Execute the compiled graph with full resource lifecycle management.\r\n *\r\n * For each pass in topological order:\r\n * 1. Allocate any transient resources whose lifetime begins at this pass\r\n * 2. Invoke the pass's execute callback with a context that resolves handles\r\n * 3. Release any transient resources whose lifetime ends at this pass\r\n *\r\n * @param compiled - The compiled graph from {@link RenderGraph.compile}.\r\n */\r\n execute(compiled: CompiledRenderGraph): void {\r\n this._cleanupCallbacks.length = 0;\r\n this._resolveImportedTextureAliases(compiled);\r\n const profileFrame = this._beginProfileFrame();\r\n\r\n // Build per-pass allocation and release schedules\r\n const allocateAt = new Map<number, number[]>(); // passIndex -> transient texture resourceIds to allocate\r\n const releaseAt = new Map<number, number[]>(); // passIndex -> transient texture resourceIds to release\r\n const allocateFramebufferAt = new Map<number, number[]>(); // passIndex -> framebuffer resourceIds to allocate\r\n const releaseFramebufferAt = new Map<number, number[]>(); // passIndex -> framebuffer resourceIds to release\r\n\r\n for (const [resId, lifetime] of compiled.lifetimes) {\r\n if (lifetime.resource.kind === 'transient') {\r\n if (!allocateAt.has(lifetime.firstUse)) {\r\n allocateAt.set(lifetime.firstUse, []);\r\n }\r\n allocateAt.get(lifetime.firstUse)!.push(resId);\r\n\r\n if (!releaseAt.has(lifetime.lastUse)) {\r\n releaseAt.set(lifetime.lastUse, []);\r\n }\r\n releaseAt.get(lifetime.lastUse)!.push(resId);\r\n } else if (lifetime.resource.kind === 'framebuffer') {\r\n if (!allocateFramebufferAt.has(lifetime.firstUse)) {\r\n allocateFramebufferAt.set(lifetime.firstUse, []);\r\n }\r\n allocateFramebufferAt.get(lifetime.firstUse)!.push(resId);\r\n\r\n if (!releaseFramebufferAt.has(lifetime.lastUse)) {\r\n releaseFramebufferAt.set(lifetime.lastUse, []);\r\n }\r\n releaseFramebufferAt.get(lifetime.lastUse)!.push(resId);\r\n }\r\n }\r\n\r\n let completed = false;\r\n let executionError: unknown = null;\r\n try {\r\n for (let i = 0; i < compiled.orderedPasses.length; i++) {\r\n const pass = compiled.orderedPasses[i];\r\n\r\n // Allocate resources that start at this pass\r\n const toAllocate = allocateAt.get(i);\r\n if (toAllocate) {\r\n for (const resId of toAllocate) {\r\n const lifetime = compiled.lifetimes.get(resId)!;\r\n const desc = lifetime.resource.desc as RGTextureDesc;\r\n const size = this._resolveSize(desc);\r\n const texture = this._allocator.allocate(desc, size);\r\n this._allocatedTextures.set(resId, texture);\r\n }\r\n }\r\n\r\n // Allocate framebuffer views after their texture attachments are available.\r\n const framebuffersToAllocate = allocateFramebufferAt.get(i);\r\n if (framebuffersToAllocate) {\r\n for (const resId of framebuffersToAllocate) {\r\n const lifetime = compiled.lifetimes.get(resId)!;\r\n const desc = lifetime.resource.desc as RGFramebufferDesc;\r\n const framebuffer = this._createFramebuffer(this._resolveFramebufferDesc(desc), false);\r\n this._allocatedFramebuffers.set(resId, framebuffer);\r\n }\r\n }\r\n\r\n // Execute the pass with exception safety for resource cleanup.\r\n // Release errors must not hide the original pass execution error.\r\n let passError: unknown = null;\r\n const passProfile = this._beginPassProfileScope(profileFrame, pass);\r\n try {\r\n if (pass.subpasses.length > 0) {\r\n const accessScope = this._createAccessScope(pass);\r\n const ctx = this._createContext(accessScope);\r\n for (const subpass of pass.subpasses) {\r\n const subpassProfile = this._beginSubpassProfileScope(\r\n profileFrame,\r\n passProfile,\r\n pass,\r\n subpass.name\r\n );\r\n try {\r\n (subpass.executeFn as RGExecuteFn<unknown>)(ctx, pass.data);\r\n } catch (e) {\r\n throw this._wrapSubpassError(pass.name, subpass.name, e);\r\n } finally {\r\n this._endProfileScope(profileFrame, subpassProfile);\r\n }\r\n }\r\n } else if (pass.executeFn) {\r\n const accessScope = this._createAccessScope(pass);\r\n const ctx = this._createContext(accessScope);\r\n (pass.executeFn as RGExecuteFn<unknown>)(ctx, pass.data);\r\n }\r\n } catch (e) {\r\n passError = e;\r\n } finally {\r\n this._endProfileScope(profileFrame, passProfile);\r\n }\r\n\r\n let releaseError: unknown = null;\r\n const framebuffersToRelease = releaseFramebufferAt.get(i);\r\n if (framebuffersToRelease) {\r\n for (const resId of framebuffersToRelease) {\r\n const framebuffer = this._allocatedFramebuffers.get(resId);\r\n if (framebuffer !== undefined) {\r\n try {\r\n this._releaseFramebuffer(framebuffer);\r\n this._allocatedFramebuffers.delete(resId);\r\n } catch (e) {\r\n releaseError ??= e;\r\n }\r\n }\r\n }\r\n }\r\n // Release resources that end at this pass (always runs even if pass throws)\r\n const toRelease = releaseAt.get(i);\r\n if (toRelease) {\r\n for (const resId of toRelease) {\r\n const texture = this._allocatedTextures.get(resId);\r\n if (texture !== undefined) {\r\n try {\r\n this._allocator.release(texture);\r\n this._allocatedTextures.delete(resId);\r\n } catch (e) {\r\n releaseError ??= e;\r\n }\r\n }\r\n }\r\n }\r\n if (passError) {\r\n throw passError;\r\n }\r\n if (releaseError) {\r\n throw releaseError;\r\n }\r\n }\r\n completed = true;\r\n } catch (e) {\r\n executionError = e;\r\n } finally {\r\n this._finishProfileFrame(profileFrame);\r\n let cleanupError: unknown = null;\r\n try {\r\n this._runCleanupCallbacks();\r\n } catch (e) {\r\n cleanupError = e;\r\n } finally {\r\n if (!completed) {\r\n try {\r\n this.reset();\r\n } catch (e) {\r\n cleanupError ??= e;\r\n }\r\n }\r\n }\r\n if (executionError) {\r\n throw executionError;\r\n }\r\n if (cleanupError) {\r\n throw cleanupError;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear imported texture registrations and any leftover allocated textures.\r\n * Call this after execution or when resetting for a new frame.\r\n */\r\n reset(): void {\r\n this._runCleanupCallbacks();\r\n // Release any textures that weren't released (shouldn't happen in normal flow)\r\n for (const framebuffer of this._allocatedFramebuffers.values()) {\r\n this._releaseFramebuffer(framebuffer);\r\n }\r\n this._allocatedFramebuffers.clear();\r\n for (const texture of this._allocatedTextures.values()) {\r\n this._allocator.release(texture);\r\n }\r\n this._allocatedTextures.clear();\r\n this._importedTextures.clear();\r\n this._importedTextureAliases.clear();\r\n this._resolvedImportedTextures.clear();\r\n }\r\n\r\n // ─── Private ────────────────────────────────────────────────────────\r\n\r\n /** @internal */\r\n private _normalizeProfilingOptions(\r\n options: boolean | RGProfilingOptions | undefined,\r\n fallbackDevice?: AbstractDevice\r\n ): RGResolvedProfilingOptions {\r\n const source = typeof options === 'object' ? options : {};\r\n const enabled = typeof options === 'boolean' ? options : (source.enabled ?? true);\r\n return {\r\n enabled,\r\n graph: source.graph ?? DEFAULT_PROFILING_OPTIONS.graph,\r\n pass: source.pass ?? DEFAULT_PROFILING_OPTIONS.pass,\r\n subpass: source.subpass ?? DEFAULT_PROFILING_OPTIONS.subpass,\r\n includePendingUploads: source.includePendingUploads ?? DEFAULT_PROFILING_OPTIONS.includePendingUploads,\r\n allowCrossFrame: source.allowCrossFrame ?? DEFAULT_PROFILING_OPTIONS.allowCrossFrame,\r\n maxPendingFrames: Math.max(1, source.maxPendingFrames ?? DEFAULT_PROFILING_OPTIONS.maxPendingFrames),\r\n label: source.label ?? DEFAULT_PROFILING_OPTIONS.label,\r\n device: source.device ?? fallbackDevice\r\n };\r\n }\r\n\r\n /** @internal */\r\n private _getProfilingDevice(): AbstractDevice | null {\r\n if (this._profilingOptions.device) {\r\n return this._profilingOptions.device;\r\n }\r\n try {\r\n return getDevice();\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _beginProfileFrame(): RGProfileFrameInternal | null {\r\n if (!this._profilingOptions.enabled) {\r\n return null;\r\n }\r\n const device = this._getProfilingDevice();\r\n const supported = !!device?.getDeviceCaps().miscCaps.supportTimestampQuery;\r\n const rootResult: RGProfileScopeResult = {\r\n name: this._profilingOptions.label,\r\n type: 'graph',\r\n queryId: 0,\r\n durationMs: 0,\r\n status: supported ? 'resolved' : 'unsupported',\r\n children: [],\r\n message: supported ? undefined : 'GPU timestamp queries are not supported'\r\n };\r\n const result: RGProfileResult = {\r\n frameId: device?.frameInfo.frameCounter ?? -1,\r\n status: rootResult.status,\r\n graph: rootResult,\r\n passes: rootResult.children\r\n };\r\n const root: RGProfileScopeInternal = {\r\n result: rootResult,\r\n queryId: 0,\r\n ended: false\r\n };\r\n const frame: RGProfileFrameInternal = {\r\n serial: ++RenderGraphExecutor._nextProfileSerial,\r\n device,\r\n supported,\r\n result,\r\n root,\r\n scopes: [],\r\n resolvePromise: Promise.resolve(result)\r\n };\r\n if (this._profilingOptions.graph) {\r\n this._beginTimestampScope(frame, root, this._profilingOptions.label);\r\n }\r\n return frame;\r\n }\r\n\r\n /** @internal */\r\n private _beginPassProfileScope(\r\n frame: RGProfileFrameInternal | null,\r\n pass: RGPass\r\n ): RGProfileScopeInternal | null {\r\n if (!frame || (!this._profilingOptions.pass && !this._profilingOptions.subpass)) {\r\n return null;\r\n }\r\n return this._beginProfileScope(frame, frame.root, 'pass', pass.name, this._profilingOptions.pass);\r\n }\r\n\r\n /** @internal */\r\n private _beginSubpassProfileScope(\r\n frame: RGProfileFrameInternal | null,\r\n passScope: RGProfileScopeInternal | null,\r\n pass: RGPass,\r\n subpassName: string\r\n ): RGProfileScopeInternal | null {\r\n if (!frame || !this._profilingOptions.subpass) {\r\n return null;\r\n }\r\n const parent = passScope ?? frame.root;\r\n return this._beginProfileScope(\r\n frame,\r\n parent,\r\n 'subpass',\r\n subpassName,\r\n true,\r\n `${pass.name}/${subpassName}`\r\n );\r\n }\r\n\r\n /** @internal */\r\n private _beginProfileScope(\r\n frame: RGProfileFrameInternal,\r\n parent: RGProfileScopeInternal,\r\n type: RGProfileScopeType,\r\n name: string,\r\n queryEnabled: boolean,\r\n queryLabel?: string\r\n ): RGProfileScopeInternal {\r\n const status =\r\n frame.supported && !queryEnabled ? 'resolved' : frame.supported ? 'pending' : 'unsupported';\r\n const result: RGProfileScopeResult = {\r\n name,\r\n type,\r\n queryId: 0,\r\n durationMs: 0,\r\n status,\r\n children: [],\r\n message: frame.supported ? undefined : 'GPU timestamp queries are not supported'\r\n };\r\n parent.result.children.push(result);\r\n const scope: RGProfileScopeInternal = {\r\n result,\r\n queryId: 0,\r\n ended: false\r\n };\r\n if (queryEnabled) {\r\n this._beginTimestampScope(frame, scope, queryLabel ?? name);\r\n }\r\n return scope;\r\n }\r\n\r\n /** @internal */\r\n private _beginTimestampScope(\r\n frame: RGProfileFrameInternal,\r\n scope: RGProfileScopeInternal,\r\n label: string\r\n ): void {\r\n if (!frame.supported || !frame.device) {\r\n scope.result.status = 'unsupported';\r\n scope.result.message = 'GPU timestamp queries are not supported';\r\n return;\r\n }\r\n const queryId = frame.device.beginTimestampQuery(label, {\r\n includePendingUploads: this._profilingOptions.includePendingUploads,\r\n allowCrossFrame: this._profilingOptions.allowCrossFrame\r\n });\r\n scope.queryId = queryId;\r\n scope.result.queryId = queryId;\r\n if (queryId > 0) {\r\n scope.result.status = 'pending';\r\n frame.scopes.push(scope);\r\n } else {\r\n scope.result.status = 'unsupported';\r\n scope.result.message = 'GPU timestamp query was not started';\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _endProfileScope(frame: RGProfileFrameInternal | null, scope: RGProfileScopeInternal | null): void {\r\n if (!frame || !frame.device || !scope || scope.ended) {\r\n return;\r\n }\r\n scope.ended = true;\r\n if (scope.queryId > 0) {\r\n frame.device.endTimestampQuery(scope.queryId);\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _finishProfileFrame(frame: RGProfileFrameInternal | null): void {\r\n if (!frame) {\r\n return;\r\n }\r\n this._endProfileScope(frame, frame.root);\r\n if (frame.scopes.length === 0 || !frame.device) {\r\n frame.result.status = this._aggregateProfileStatus(frame.result.graph);\r\n this._publishProfileResult(frame);\r\n return;\r\n }\r\n frame.resolvePromise = Promise.all(\r\n frame.scopes.map((scope) => frame.device!.resolveTimestampQuery(scope.queryId))\r\n )\r\n .then((results) => {\r\n for (let i = 0; i < results.length; i++) {\r\n this._applyTimestampResult(frame.scopes[i], results[i]);\r\n }\r\n frame.result.status = this._aggregateProfileStatus(frame.result.graph);\r\n this._publishProfileResult(frame);\r\n return frame.result;\r\n })\r\n .catch((err) => {\r\n const message = err instanceof Error ? err.message : String(err);\r\n for (const scope of frame.scopes) {\r\n scope.result.status = 'failed';\r\n scope.result.message = message;\r\n }\r\n frame.result.status = 'failed';\r\n this._publishProfileResult(frame);\r\n return frame.result;\r\n });\r\n this._trackPendingProfileFrame(frame);\r\n }\r\n\r\n /** @internal */\r\n private _trackPendingProfileFrame(frame: RGProfileFrameInternal): void {\r\n this._pendingProfileFrames.push(frame);\r\n while (this._pendingProfileFrames.length > this._profilingOptions.maxPendingFrames) {\r\n this._pendingProfileFrames.shift();\r\n }\r\n RenderGraphExecutor._latestPendingProfileFrame = frame;\r\n }\r\n\r\n /** @internal */\r\n private _publishProfileResult(frame: RGProfileFrameInternal): void {\r\n this._pendingProfileFrames = this._pendingProfileFrames.filter((pending) => pending !== frame);\r\n if (frame.serial >= this._latestResolvedProfileSerial) {\r\n this._latestResolvedProfileSerial = frame.serial;\r\n this._latestProfileResult = frame.result;\r\n }\r\n if (frame.serial >= RenderGraphExecutor._latestResolvedProfileSerial) {\r\n RenderGraphExecutor._latestResolvedProfileSerial = frame.serial;\r\n RenderGraphExecutor._latestProfileResult = frame.result;\r\n }\r\n if (RenderGraphExecutor._latestPendingProfileFrame === frame) {\r\n RenderGraphExecutor._latestPendingProfileFrame = null;\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _applyTimestampResult(scope: RGProfileScopeInternal, result: TimestampQueryResult): void {\r\n scope.result.queryId = result.id;\r\n scope.result.durationMs = result.durationMs;\r\n scope.result.status = result.status;\r\n scope.result.message = result.message;\r\n }\r\n\r\n /** @internal */\r\n private _aggregateProfileStatus(scope: RGProfileScopeResult): TimestampQueryStatus {\r\n const statuses: TimestampQueryStatus[] = [];\r\n const collect = (node: RGProfileScopeResult) => {\r\n statuses.push(node.status);\r\n for (const child of node.children) {\r\n collect(child);\r\n }\r\n };\r\n collect(scope);\r\n for (const status of ['failed', 'invalid', 'exhausted', 'pending', 'auto-closed'] as const) {\r\n if (statuses.includes(status)) {\r\n return status;\r\n }\r\n }\r\n if (statuses.includes('unsupported')) {\r\n return 'unsupported';\r\n }\r\n return 'resolved';\r\n }\r\n\r\n /** @internal */\r\n private _resolveSize(desc: RGTextureDesc): RGResolvedSize {\r\n const mode = desc.sizeMode ?? 'backbuffer-relative';\r\n if (mode === 'absolute') {\r\n return {\r\n width: desc.width ?? 1,\r\n height: desc.height ?? 1\r\n };\r\n }\r\n // backbuffer-relative: width/height are scale factors (default 1.0)\r\n const scaleX = desc.width ?? 1.0;\r\n const scaleY = desc.height ?? 1.0;\r\n return {\r\n width: Math.max(1, Math.floor(this._backbufferWidth * scaleX)),\r\n height: Math.max(1, Math.floor(this._backbufferHeight * scaleY))\r\n };\r\n }\r\n\r\n /** @internal */\r\n private _resolveImportedTextureAliases(compiled: CompiledRenderGraph): void {\r\n this._importedTextureAliases.clear();\r\n this._resolvedImportedTextures.clear();\r\n const physicalToTexture = new Map<number, TTexture>();\r\n for (const lifetime of compiled.lifetimes.values()) {\r\n const resource = lifetime.resource;\r\n if (resource.kind !== 'imported') {\r\n continue;\r\n }\r\n const texture =\r\n this._importedTextures.get(resource.id) ?? this._importedTextures.get(resource.physicalId);\r\n if (texture !== undefined) {\r\n physicalToTexture.set(resource.physicalId, texture);\r\n }\r\n }\r\n for (const lifetime of compiled.lifetimes.values()) {\r\n const resource = lifetime.resource;\r\n if (resource.kind !== 'imported') {\r\n continue;\r\n }\r\n this._importedTextureAliases.set(resource.id, resource.physicalId);\r\n const texture = physicalToTexture.get(resource.physicalId);\r\n if (texture !== undefined) {\r\n this._resolvedImportedTextures.set(resource.id, texture);\r\n this._resolvedImportedTextures.set(resource.physicalId, texture);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _runCleanupCallbacks(): void {\r\n let error: unknown = null;\r\n while (this._cleanupCallbacks.length > 0) {\r\n const callback = this._cleanupCallbacks.pop()!;\r\n try {\r\n callback();\r\n } catch (e) {\r\n error ??= e;\r\n }\r\n }\r\n if (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _createFramebuffer(desc: RGFramebufferDesc, autoCleanup = true): TFramebuffer {\r\n if (!this._allocator.allocateFramebuffer || !this._allocator.releaseFramebuffer) {\r\n throw new Error('RenderGraphExecutor: framebuffer allocation is not supported by this allocator.');\r\n }\r\n const framebuffer = this._allocator.allocateFramebuffer(desc);\r\n if (autoCleanup) {\r\n this._cleanupCallbacks.push(() => {\r\n this._allocator.releaseFramebuffer!(framebuffer);\r\n });\r\n }\r\n return framebuffer;\r\n }\r\n\r\n /** @internal */\r\n private _releaseFramebuffer(framebuffer: TFramebuffer): void {\r\n if (!this._allocator.releaseFramebuffer) {\r\n throw new Error('RenderGraphExecutor: framebuffer release is not supported by this allocator.');\r\n }\r\n this._allocator.releaseFramebuffer(framebuffer);\r\n }\r\n\r\n /** @internal */\r\n private _resolveFramebufferDesc(\r\n desc: RGFramebufferDesc,\r\n accessScope?: RGPassAccessScope\r\n ): RGFramebufferDesc {\r\n const resolveAttachment = (attachment: unknown): unknown => {\r\n if (attachment instanceof RGHandle) {\r\n if (accessScope) {\r\n this._assertDeclaredAccess(accessScope, attachment, 'texture');\r\n }\r\n return this._resolveResource(attachment);\r\n }\r\n return attachment;\r\n };\r\n const colors = Array.isArray(desc.colorAttachments)\r\n ? desc.colorAttachments.map(resolveAttachment)\r\n : desc.colorAttachments\r\n ? resolveAttachment(desc.colorAttachments)\r\n : null;\r\n return {\r\n ...desc,\r\n colorAttachments: colors,\r\n depthAttachment: resolveAttachment(desc.depthAttachment)\r\n };\r\n }\r\n\r\n /** @internal */\r\n private _resolveResource(handle: RGHandle): TTexture {\r\n const imported = this._importedTextures.get(handle._id);\r\n if (imported !== undefined) {\r\n return imported;\r\n }\r\n const resolvedImported = this._resolvedImportedTextures.get(handle._id);\r\n if (resolvedImported !== undefined) {\r\n return resolvedImported;\r\n }\r\n const importedAlias = this._importedTextureAliases.get(handle._id);\r\n if (importedAlias !== undefined) {\r\n const aliased =\r\n this._importedTextures.get(importedAlias) ?? this._resolvedImportedTextures.get(importedAlias);\r\n if (aliased !== undefined) {\r\n return aliased;\r\n }\r\n }\r\n const allocated = this._allocatedTextures.get(handle._id);\r\n if (allocated !== undefined) {\r\n return allocated;\r\n }\r\n throw new Error(\r\n `RenderGraphExecutor: cannot resolve resource \"${handle.name}\" (id=${handle._id}). ` +\r\n `It may not have been allocated yet or was already released.`\r\n );\r\n }\r\n\r\n /** @internal */\r\n private _createAccessScope(pass: RGPass): RGPassAccessScope {\r\n const accessibleIds = new Set<number>();\r\n const textureIds = new Set<number>();\r\n const framebufferIds = new Set<number>();\r\n for (const resource of pass.reads) {\r\n accessibleIds.add(resource.id);\r\n if (resource.kind === 'transient' || resource.kind === 'imported') {\r\n textureIds.add(resource.id);\r\n } else if (resource.kind === 'framebuffer') {\r\n framebufferIds.add(resource.id);\r\n }\r\n }\r\n for (const resource of pass.writes) {\r\n accessibleIds.add(resource.id);\r\n if (resource.kind === 'transient' || resource.kind === 'imported') {\r\n textureIds.add(resource.id);\r\n } else if (resource.kind === 'framebuffer') {\r\n framebufferIds.add(resource.id);\r\n }\r\n }\r\n return {\r\n passName: pass.name,\r\n accessibleIds,\r\n textureIds,\r\n framebufferIds\r\n };\r\n }\r\n\r\n /** @internal */\r\n private _assertDeclaredAccess(\r\n accessScope: RGPassAccessScope,\r\n handle: RGHandle,\r\n access: 'texture' | 'framebuffer'\r\n ): void {\r\n if (!accessScope.accessibleIds.has(handle._id)) {\r\n throw new Error(\r\n `RenderGraphExecutor: pass \"${accessScope.passName}\" tried to access ${access} \"${handle.name}\" ` +\r\n `without declaring a read/write dependency.`\r\n );\r\n }\r\n if (access === 'texture' && !accessScope.textureIds.has(handle._id)) {\r\n throw new Error(\r\n `RenderGraphExecutor: pass \"${accessScope.passName}\" tried to access \"${handle.name}\" as a texture, ` +\r\n `but it is not a texture resource.`\r\n );\r\n }\r\n if (access === 'framebuffer' && !accessScope.framebufferIds.has(handle._id)) {\r\n throw new Error(\r\n `RenderGraphExecutor: pass \"${accessScope.passName}\" tried to access \"${handle.name}\" as a framebuffer, ` +\r\n `but it is not a framebuffer resource.`\r\n );\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _wrapSubpassError(passName: string, subpassName: string, error: unknown): Error {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const wrapped = new Error(\r\n `RenderGraphExecutor: pass \"${passName}\" subpass \"${subpassName}\" failed: ${message}`\r\n );\r\n (wrapped as Error & { cause?: unknown }).cause = error;\r\n return wrapped;\r\n }\r\n\r\n /** @internal */\r\n private _createContext(accessScope: RGPassAccessScope): RGExecuteContext {\r\n const self = this;\r\n return {\r\n getTexture<T>(handle: RGHandle): T {\r\n self._assertDeclaredAccess(accessScope, handle, 'texture');\r\n return self._resolveResource(handle) as unknown as T;\r\n },\r\n getFramebuffer<TFramebuffer = unknown>(handle: RGHandle): TFramebuffer {\r\n self._assertDeclaredAccess(accessScope, handle, 'framebuffer');\r\n const framebuffer = self._allocatedFramebuffers.get(handle._id);\r\n if (framebuffer !== undefined) {\r\n return framebuffer as unknown as TFramebuffer;\r\n }\r\n throw new Error(\r\n `RenderGraphExecutor: cannot resolve framebuffer \"${handle.name}\" (id=${handle._id}). ` +\r\n `It may not have been allocated yet or was already released.`\r\n );\r\n },\r\n createFramebuffer<TFramebuffer = unknown>(desc: RGFramebufferDesc): TFramebuffer {\r\n return self._createFramebuffer(\r\n self._resolveFramebufferDesc(desc, accessScope)\r\n ) as unknown as TFramebuffer;\r\n },\r\n deferCleanup(callback: () => void): void {\r\n self._cleanupCallbacks.push(callback);\r\n }\r\n };\r\n }\r\n}\r\n"],"names":["DEFAULT_PROFILING_OPTIONS","enabled","graph","pass","subpass","includePendingUploads","allowCrossFrame","maxPendingFrames","label","RenderGraphExecutor","_defaultProfilingOptions","_latestProfileResult","_latestPendingProfileFrame","_latestResolvedProfileSerial","_nextProfileSerial","_importedTextures","Map","_allocatedTextures","_allocatedFramebuffers","_importedTextureAliases","_resolvedImportedTextures","_cleanupCallbacks","_pendingProfileFrames","allocator","backbufferWidth","backbufferHeight","options","_allocator","_backbufferWidth","_backbufferHeight","_profilingOptions","_normalizeProfilingOptions","profiling","device","setDefaultProfilingOptions","getLatestProfileResult","resolveProfileResult","resolvePromise","Promise","resolve","setProfilingOptions","length","setBackbufferSize","width","height","setImportedTexture","handle","texture","set","_id","execute","compiled","_resolveImportedTextureAliases","profileFrame","_beginProfileFrame","allocateAt","releaseAt","allocateFramebufferAt","releaseFramebufferAt","resId","lifetime","lifetimes","resource","kind","has","firstUse","get","push","lastUse","completed","executionError","i","orderedPasses","toAllocate","desc","size","_resolveSize","allocate","framebuffersToAllocate","framebuffer","_createFramebuffer","_resolveFramebufferDesc","passError","passProfile","_beginPassProfileScope","subpasses","accessScope","_createAccessScope","ctx","_createContext","subpassProfile","_beginSubpassProfileScope","name","executeFn","data","e","_wrapSubpassError","_endProfileScope","releaseError","framebuffersToRelease","undefined","_releaseFramebuffer","delete","toRelease","release","_finishProfileFrame","cleanupError","_runCleanupCallbacks","reset","values","clear","fallbackDevice","source","Math","max","getDevice","_getProfilingDevice","supported","getDeviceCaps","miscCaps","supportTimestampQuery","rootResult","type","queryId","durationMs","status","children","message","result","frameId","frameInfo","frameCounter","passes","root","ended","frame","serial","scopes","_beginTimestampScope","_beginProfileScope","passScope","subpassName","parent","queryEnabled","queryLabel","scope","beginTimestampQuery","endTimestampQuery","_aggregateProfileStatus","_publishProfileResult","all","map","resolveTimestampQuery","then","results","_applyTimestampResult","catch","err","Error","String","_trackPendingProfileFrame","shift","filter","pending","id","statuses","collect","node","child","includes","mode","sizeMode","scaleX","scaleY","floor","physicalToTexture","physicalId","error","callback","pop","autoCleanup","allocateFramebuffer","releaseFramebuffer","resolveAttachment","attachment","RGHandle","_assertDeclaredAccess","_resolveResource","colors","Array","isArray","colorAttachments","depthAttachment","imported","resolvedImported","importedAlias","aliased","allocated","accessibleIds","Set","textureIds","framebufferIds","reads","add","writes","passName","access","wrapped","cause","self","getTexture","getFramebuffer","createFramebuffer","deferCleanup"],"mappings":"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"}
1
+ {"version":3,"file":"executor.js","sources":["../../../src/render/rendergraph/executor.ts"],"sourcesContent":["import type {\r\n CompiledRenderGraph,\r\n RenderGraphExecutorOptions,\r\n RGProfileResult,\r\n RGProfileScopeResult,\r\n RGProfileScopeType,\r\n RGProfilingOptions,\r\n RGTextureAllocator,\r\n RGTextureDesc,\r\n RGFramebufferDesc,\r\n RGResolvedSize,\r\n RGExecuteContext,\r\n RGExecuteFn,\r\n RGPass\r\n} from './types';\r\nimport { RGHandle } from './types';\r\nimport type { AbstractDevice, TimestampQueryResult, TimestampQueryStatus } from '@zephyr3d/device';\r\nimport { getDevice } from '../../app/api';\r\n\r\ninterface RGPassAccessScope {\r\n passName: string;\r\n accessibleIds: Set<number>;\r\n textureIds: Set<number>;\r\n framebufferIds: Set<number>;\r\n}\r\n\r\ntype RGResolvedProfilingOptions = Required<Omit<RGProfilingOptions, 'device'>> & {\r\n device?: AbstractDevice;\r\n};\r\n\r\ninterface RGProfileScopeInternal {\r\n result: RGProfileScopeResult;\r\n queryId: number;\r\n ended: boolean;\r\n}\r\n\r\ninterface RGProfileFrameInternal {\r\n serial: number;\r\n device: AbstractDevice | null;\r\n supported: boolean;\r\n result: RGProfileResult;\r\n root: RGProfileScopeInternal;\r\n scopes: RGProfileScopeInternal[];\r\n resolvePromise: Promise<RGProfileResult>;\r\n}\r\n\r\nconst DEFAULT_PROFILING_OPTIONS: RGResolvedProfilingOptions = {\r\n enabled: false,\r\n graph: true,\r\n pass: true,\r\n subpass: true,\r\n includePendingUploads: true,\r\n allowCrossFrame: false,\r\n maxPendingFrames: 3,\r\n label: 'RenderGraph'\r\n};\r\n\r\n/**\r\n * Executes a compiled render graph with automatic resource lifecycle management.\r\n *\r\n * The executor allocates transient textures before their first use and releases\r\n * them after their last use, using the provided {@link RGTextureAllocator}.\r\n *\r\n * Usage:\r\n * ```ts\r\n * const executor = new RenderGraphExecutor(myAllocator, backbufferWidth, backbufferHeight);\r\n * executor.setImportedTexture(backbufferHandle, actualBackbufferTexture);\r\n * executor.execute(compiledGraph);\r\n * ```\r\n *\r\n * @typeParam TTexture - The concrete texture type (e.g. `Texture2D`).\r\n * @public\r\n */\r\nexport class RenderGraphExecutor<TTexture = unknown, TFramebuffer = unknown> {\r\n private static _defaultProfilingOptions: boolean | RGProfilingOptions = false;\r\n private static _latestProfileResult: RGProfileResult | null = null;\r\n private static _latestPendingProfileFrame: RGProfileFrameInternal | null = null;\r\n private static _latestResolvedProfileSerial = 0;\r\n private static _nextProfileSerial = 0;\r\n\r\n /** @internal */\r\n private _allocator: RGTextureAllocator<TTexture, TFramebuffer>;\r\n /** @internal */\r\n private _backbufferWidth: number;\r\n /** @internal */\r\n private _backbufferHeight: number;\r\n /** @internal */\r\n private _importedTextures: Map<number, TTexture> = new Map();\r\n /** @internal */\r\n private _allocatedTextures: Map<number, TTexture> = new Map();\r\n /** @internal */\r\n private _allocatedFramebuffers: Map<number, TFramebuffer> = new Map();\r\n /** @internal */\r\n private _importedTextureAliases: Map<number, number> = new Map();\r\n /** @internal */\r\n private _transientTextureAliases: Map<number, number> = new Map();\r\n /** @internal */\r\n private _resolvedImportedTextures: Map<number, TTexture> = new Map();\r\n /** @internal */\r\n private _cleanupCallbacks: Array<() => void> = [];\r\n /** @internal */\r\n private _profilingOptions: RGResolvedProfilingOptions;\r\n /** @internal */\r\n private _pendingProfileFrames: RGProfileFrameInternal[] = [];\r\n /** @internal */\r\n private _latestProfileResult: RGProfileResult | null = null;\r\n /** @internal */\r\n private _latestResolvedProfileSerial = 0;\r\n\r\n constructor(\r\n allocator: RGTextureAllocator<TTexture, TFramebuffer>,\r\n backbufferWidth: number,\r\n backbufferHeight: number,\r\n options?: RenderGraphExecutorOptions\r\n ) {\r\n this._allocator = allocator;\r\n this._backbufferWidth = backbufferWidth;\r\n this._backbufferHeight = backbufferHeight;\r\n this._profilingOptions = this._normalizeProfilingOptions(\r\n options?.profiling ?? RenderGraphExecutor._defaultProfilingOptions,\r\n options?.device\r\n );\r\n }\r\n\r\n /**\r\n * Set the default profiling options used by newly constructed render graph executors.\r\n */\r\n static setDefaultProfilingOptions(options: boolean | RGProfilingOptions): void {\r\n RenderGraphExecutor._defaultProfilingOptions = options;\r\n }\r\n\r\n /**\r\n * Get the latest resolved profile result from any render graph executor.\r\n */\r\n static getLatestProfileResult(): RGProfileResult | null {\r\n return RenderGraphExecutor._latestProfileResult;\r\n }\r\n\r\n /**\r\n * Resolve the latest pending render graph profile result from any executor.\r\n */\r\n static resolveProfileResult(): Promise<RGProfileResult | null> {\r\n return (\r\n RenderGraphExecutor._latestPendingProfileFrame?.resolvePromise ??\r\n Promise.resolve(RenderGraphExecutor._latestProfileResult)\r\n );\r\n }\r\n\r\n /**\r\n * Enable, disable, or update timestamp profiling for this executor.\r\n */\r\n setProfilingOptions(options: boolean | RGProfilingOptions): void {\r\n this._profilingOptions = this._normalizeProfilingOptions(options, this._profilingOptions.device);\r\n }\r\n\r\n /**\r\n * Get the latest resolved profile result produced by this executor.\r\n */\r\n getLatestProfileResult(): RGProfileResult | null {\r\n return this._latestProfileResult;\r\n }\r\n\r\n /**\r\n * Resolve the latest pending profile result produced by this executor.\r\n */\r\n resolveProfileResult(): Promise<RGProfileResult | null> {\r\n return (\r\n this._pendingProfileFrames[this._pendingProfileFrames.length - 1]?.resolvePromise ??\r\n Promise.resolve(this._latestProfileResult)\r\n );\r\n }\r\n\r\n /**\r\n * Update the backbuffer dimensions used for 'backbuffer-relative' sizing.\r\n */\r\n setBackbufferSize(width: number, height: number): void {\r\n this._backbufferWidth = width;\r\n this._backbufferHeight = height;\r\n }\r\n\r\n /**\r\n * Register an imported (external) texture so it can be resolved during execution.\r\n *\r\n * @param handle - The handle returned from {@link RenderGraph.importTexture}.\r\n * @param texture - The actual GPU texture object.\r\n */\r\n setImportedTexture(handle: RGHandle, texture: TTexture): void {\r\n this._importedTextures.set(handle._id, texture);\r\n }\r\n\r\n /**\r\n * Execute the compiled graph with full resource lifecycle management.\r\n *\r\n * For each pass in topological order:\r\n * 1. Allocate any transient resources whose lifetime begins at this pass\r\n * 2. Invoke the pass's execute callback with a context that resolves handles\r\n * 3. Release any transient resources whose lifetime ends at this pass\r\n *\r\n * @param compiled - The compiled graph from {@link RenderGraph.compile}.\r\n */\r\n execute(compiled: CompiledRenderGraph): void {\r\n this._cleanupCallbacks.length = 0;\r\n this._resolveImportedTextureAliases(compiled);\r\n const profileFrame = this._beginProfileFrame();\r\n\r\n // Build per-pass allocation and release schedules\r\n const allocateAt = new Map<number, number[]>(); // passIndex -> transient texture resourceIds to allocate\r\n const releaseAt = new Map<number, number[]>(); // passIndex -> transient texture resourceIds to release\r\n const allocateFramebufferAt = new Map<number, number[]>(); // passIndex -> framebuffer resourceIds to allocate\r\n const releaseFramebufferAt = new Map<number, number[]>(); // passIndex -> framebuffer resourceIds to release\r\n\r\n // Transient write-versions (builder.write on a transient) alias the same\r\n // physical texture as the original resource: merge their lifetimes by\r\n // physicalId so one texture is allocated at the first use of any version\r\n // and released after the last use of any version.\r\n this._transientTextureAliases.clear();\r\n const transientSchedules = new Map<number, { firstUse: number; lastUse: number; desc: RGTextureDesc }>();\r\n for (const [resId, lifetime] of compiled.lifetimes) {\r\n if (lifetime.resource.kind === 'transient') {\r\n const physicalId = lifetime.resource.physicalId;\r\n this._transientTextureAliases.set(resId, physicalId);\r\n const merged = transientSchedules.get(physicalId);\r\n if (merged) {\r\n merged.firstUse = Math.min(merged.firstUse, lifetime.firstUse);\r\n merged.lastUse = Math.max(merged.lastUse, lifetime.lastUse);\r\n } else {\r\n transientSchedules.set(physicalId, {\r\n firstUse: lifetime.firstUse,\r\n lastUse: lifetime.lastUse,\r\n desc: lifetime.resource.desc as RGTextureDesc\r\n });\r\n }\r\n } else if (lifetime.resource.kind === 'framebuffer') {\r\n if (!allocateFramebufferAt.has(lifetime.firstUse)) {\r\n allocateFramebufferAt.set(lifetime.firstUse, []);\r\n }\r\n allocateFramebufferAt.get(lifetime.firstUse)!.push(resId);\r\n\r\n if (!releaseFramebufferAt.has(lifetime.lastUse)) {\r\n releaseFramebufferAt.set(lifetime.lastUse, []);\r\n }\r\n releaseFramebufferAt.get(lifetime.lastUse)!.push(resId);\r\n }\r\n }\r\n for (const [physicalId, schedule] of transientSchedules) {\r\n if (!allocateAt.has(schedule.firstUse)) {\r\n allocateAt.set(schedule.firstUse, []);\r\n }\r\n allocateAt.get(schedule.firstUse)!.push(physicalId);\r\n\r\n if (!releaseAt.has(schedule.lastUse)) {\r\n releaseAt.set(schedule.lastUse, []);\r\n }\r\n releaseAt.get(schedule.lastUse)!.push(physicalId);\r\n }\r\n\r\n let completed = false;\r\n let executionError: unknown = null;\r\n try {\r\n for (let i = 0; i < compiled.orderedPasses.length; i++) {\r\n const pass = compiled.orderedPasses[i];\r\n\r\n // Allocate resources that start at this pass\r\n const toAllocate = allocateAt.get(i);\r\n if (toAllocate) {\r\n for (const resId of toAllocate) {\r\n const schedule = transientSchedules.get(resId)!;\r\n const size = this._resolveSize(schedule.desc);\r\n const texture = this._allocator.allocate(schedule.desc, size);\r\n this._allocatedTextures.set(resId, texture);\r\n }\r\n }\r\n\r\n // Allocate framebuffer views after their texture attachments are available.\r\n const framebuffersToAllocate = allocateFramebufferAt.get(i);\r\n if (framebuffersToAllocate) {\r\n for (const resId of framebuffersToAllocate) {\r\n const lifetime = compiled.lifetimes.get(resId)!;\r\n const desc = lifetime.resource.desc as RGFramebufferDesc;\r\n const framebuffer = this._createFramebuffer(this._resolveFramebufferDesc(desc), false);\r\n this._allocatedFramebuffers.set(resId, framebuffer);\r\n }\r\n }\r\n\r\n // Execute the pass with exception safety for resource cleanup.\r\n // Release errors must not hide the original pass execution error.\r\n let passError: unknown = null;\r\n const passProfile = this._beginPassProfileScope(profileFrame, pass);\r\n try {\r\n if (pass.subpasses.length > 0) {\r\n const accessScope = this._createAccessScope(pass);\r\n const ctx = this._createContext(accessScope);\r\n for (const subpass of pass.subpasses) {\r\n const subpassProfile = this._beginSubpassProfileScope(\r\n profileFrame,\r\n passProfile,\r\n pass,\r\n subpass.name\r\n );\r\n try {\r\n (subpass.executeFn as RGExecuteFn<unknown>)(ctx, pass.data);\r\n } catch (e) {\r\n throw this._wrapSubpassError(pass.name, subpass.name, e);\r\n } finally {\r\n this._endProfileScope(profileFrame, subpassProfile);\r\n }\r\n }\r\n } else if (pass.executeFn) {\r\n const accessScope = this._createAccessScope(pass);\r\n const ctx = this._createContext(accessScope);\r\n (pass.executeFn as RGExecuteFn<unknown>)(ctx, pass.data);\r\n }\r\n } catch (e) {\r\n passError = e;\r\n } finally {\r\n this._endProfileScope(profileFrame, passProfile);\r\n }\r\n\r\n let releaseError: unknown = null;\r\n const framebuffersToRelease = releaseFramebufferAt.get(i);\r\n if (framebuffersToRelease) {\r\n for (const resId of framebuffersToRelease) {\r\n const framebuffer = this._allocatedFramebuffers.get(resId);\r\n if (framebuffer !== undefined) {\r\n try {\r\n this._releaseFramebuffer(framebuffer);\r\n this._allocatedFramebuffers.delete(resId);\r\n } catch (e) {\r\n releaseError ??= e;\r\n }\r\n }\r\n }\r\n }\r\n // Release resources that end at this pass (always runs even if pass throws)\r\n const toRelease = releaseAt.get(i);\r\n if (toRelease) {\r\n for (const resId of toRelease) {\r\n const texture = this._allocatedTextures.get(resId);\r\n if (texture !== undefined) {\r\n try {\r\n this._allocator.release(texture);\r\n this._allocatedTextures.delete(resId);\r\n } catch (e) {\r\n releaseError ??= e;\r\n }\r\n }\r\n }\r\n }\r\n if (passError) {\r\n throw passError;\r\n }\r\n if (releaseError) {\r\n throw releaseError;\r\n }\r\n }\r\n completed = true;\r\n } catch (e) {\r\n executionError = e;\r\n } finally {\r\n this._finishProfileFrame(profileFrame);\r\n let cleanupError: unknown = null;\r\n try {\r\n this._runCleanupCallbacks();\r\n } catch (e) {\r\n cleanupError = e;\r\n } finally {\r\n if (!completed) {\r\n try {\r\n this.reset();\r\n } catch (e) {\r\n cleanupError ??= e;\r\n }\r\n }\r\n }\r\n if (executionError) {\r\n throw executionError;\r\n }\r\n if (cleanupError) {\r\n throw cleanupError;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear imported texture registrations and any leftover allocated textures.\r\n * Call this after execution or when resetting for a new frame.\r\n */\r\n reset(): void {\r\n this._runCleanupCallbacks();\r\n // Release any textures that weren't released (shouldn't happen in normal flow)\r\n for (const framebuffer of this._allocatedFramebuffers.values()) {\r\n this._releaseFramebuffer(framebuffer);\r\n }\r\n this._allocatedFramebuffers.clear();\r\n for (const texture of this._allocatedTextures.values()) {\r\n this._allocator.release(texture);\r\n }\r\n this._allocatedTextures.clear();\r\n this._importedTextures.clear();\r\n this._importedTextureAliases.clear();\r\n this._transientTextureAliases.clear();\r\n this._resolvedImportedTextures.clear();\r\n }\r\n\r\n // ─── Private ────────────────────────────────────────────────────────\r\n\r\n /** @internal */\r\n private _normalizeProfilingOptions(\r\n options: boolean | RGProfilingOptions | undefined,\r\n fallbackDevice?: AbstractDevice\r\n ): RGResolvedProfilingOptions {\r\n const source = typeof options === 'object' ? options : {};\r\n const enabled = typeof options === 'boolean' ? options : (source.enabled ?? true);\r\n return {\r\n enabled,\r\n graph: source.graph ?? DEFAULT_PROFILING_OPTIONS.graph,\r\n pass: source.pass ?? DEFAULT_PROFILING_OPTIONS.pass,\r\n subpass: source.subpass ?? DEFAULT_PROFILING_OPTIONS.subpass,\r\n includePendingUploads: source.includePendingUploads ?? DEFAULT_PROFILING_OPTIONS.includePendingUploads,\r\n allowCrossFrame: source.allowCrossFrame ?? DEFAULT_PROFILING_OPTIONS.allowCrossFrame,\r\n maxPendingFrames: Math.max(1, source.maxPendingFrames ?? DEFAULT_PROFILING_OPTIONS.maxPendingFrames),\r\n label: source.label ?? DEFAULT_PROFILING_OPTIONS.label,\r\n device: source.device ?? fallbackDevice\r\n };\r\n }\r\n\r\n /** @internal */\r\n private _getProfilingDevice(): AbstractDevice | null {\r\n if (this._profilingOptions.device) {\r\n return this._profilingOptions.device;\r\n }\r\n try {\r\n return getDevice();\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _beginProfileFrame(): RGProfileFrameInternal | null {\r\n if (!this._profilingOptions.enabled) {\r\n return null;\r\n }\r\n const device = this._getProfilingDevice();\r\n const supported = !!device?.getDeviceCaps().miscCaps.supportTimestampQuery;\r\n const rootResult: RGProfileScopeResult = {\r\n name: this._profilingOptions.label,\r\n type: 'graph',\r\n queryId: 0,\r\n durationMs: 0,\r\n status: supported ? 'resolved' : 'unsupported',\r\n children: [],\r\n message: supported ? undefined : 'GPU timestamp queries are not supported'\r\n };\r\n const result: RGProfileResult = {\r\n frameId: device?.frameInfo.frameCounter ?? -1,\r\n status: rootResult.status,\r\n graph: rootResult,\r\n passes: rootResult.children\r\n };\r\n const root: RGProfileScopeInternal = {\r\n result: rootResult,\r\n queryId: 0,\r\n ended: false\r\n };\r\n const frame: RGProfileFrameInternal = {\r\n serial: ++RenderGraphExecutor._nextProfileSerial,\r\n device,\r\n supported,\r\n result,\r\n root,\r\n scopes: [],\r\n resolvePromise: Promise.resolve(result)\r\n };\r\n if (this._profilingOptions.graph) {\r\n this._beginTimestampScope(frame, root, this._profilingOptions.label);\r\n }\r\n return frame;\r\n }\r\n\r\n /** @internal */\r\n private _beginPassProfileScope(\r\n frame: RGProfileFrameInternal | null,\r\n pass: RGPass\r\n ): RGProfileScopeInternal | null {\r\n if (!frame || (!this._profilingOptions.pass && !this._profilingOptions.subpass)) {\r\n return null;\r\n }\r\n return this._beginProfileScope(frame, frame.root, 'pass', pass.name, this._profilingOptions.pass);\r\n }\r\n\r\n /** @internal */\r\n private _beginSubpassProfileScope(\r\n frame: RGProfileFrameInternal | null,\r\n passScope: RGProfileScopeInternal | null,\r\n pass: RGPass,\r\n subpassName: string\r\n ): RGProfileScopeInternal | null {\r\n if (!frame || !this._profilingOptions.subpass) {\r\n return null;\r\n }\r\n const parent = passScope ?? frame.root;\r\n return this._beginProfileScope(\r\n frame,\r\n parent,\r\n 'subpass',\r\n subpassName,\r\n true,\r\n `${pass.name}/${subpassName}`\r\n );\r\n }\r\n\r\n /** @internal */\r\n private _beginProfileScope(\r\n frame: RGProfileFrameInternal,\r\n parent: RGProfileScopeInternal,\r\n type: RGProfileScopeType,\r\n name: string,\r\n queryEnabled: boolean,\r\n queryLabel?: string\r\n ): RGProfileScopeInternal {\r\n const status =\r\n frame.supported && !queryEnabled ? 'resolved' : frame.supported ? 'pending' : 'unsupported';\r\n const result: RGProfileScopeResult = {\r\n name,\r\n type,\r\n queryId: 0,\r\n durationMs: 0,\r\n status,\r\n children: [],\r\n message: frame.supported ? undefined : 'GPU timestamp queries are not supported'\r\n };\r\n parent.result.children.push(result);\r\n const scope: RGProfileScopeInternal = {\r\n result,\r\n queryId: 0,\r\n ended: false\r\n };\r\n if (queryEnabled) {\r\n this._beginTimestampScope(frame, scope, queryLabel ?? name);\r\n }\r\n return scope;\r\n }\r\n\r\n /** @internal */\r\n private _beginTimestampScope(\r\n frame: RGProfileFrameInternal,\r\n scope: RGProfileScopeInternal,\r\n label: string\r\n ): void {\r\n if (!frame.supported || !frame.device) {\r\n scope.result.status = 'unsupported';\r\n scope.result.message = 'GPU timestamp queries are not supported';\r\n return;\r\n }\r\n const queryId = frame.device.beginTimestampQuery(label, {\r\n includePendingUploads: this._profilingOptions.includePendingUploads,\r\n allowCrossFrame: this._profilingOptions.allowCrossFrame\r\n });\r\n scope.queryId = queryId;\r\n scope.result.queryId = queryId;\r\n if (queryId > 0) {\r\n scope.result.status = 'pending';\r\n frame.scopes.push(scope);\r\n } else {\r\n scope.result.status = 'unsupported';\r\n scope.result.message = 'GPU timestamp query was not started';\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _endProfileScope(frame: RGProfileFrameInternal | null, scope: RGProfileScopeInternal | null): void {\r\n if (!frame || !frame.device || !scope || scope.ended) {\r\n return;\r\n }\r\n scope.ended = true;\r\n if (scope.queryId > 0) {\r\n frame.device.endTimestampQuery(scope.queryId);\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _finishProfileFrame(frame: RGProfileFrameInternal | null): void {\r\n if (!frame) {\r\n return;\r\n }\r\n this._endProfileScope(frame, frame.root);\r\n if (frame.scopes.length === 0 || !frame.device) {\r\n frame.result.status = this._aggregateProfileStatus(frame.result.graph);\r\n this._publishProfileResult(frame);\r\n return;\r\n }\r\n frame.resolvePromise = Promise.all(\r\n frame.scopes.map((scope) => frame.device!.resolveTimestampQuery(scope.queryId))\r\n )\r\n .then((results) => {\r\n for (let i = 0; i < results.length; i++) {\r\n this._applyTimestampResult(frame.scopes[i], results[i]);\r\n }\r\n frame.result.status = this._aggregateProfileStatus(frame.result.graph);\r\n this._publishProfileResult(frame);\r\n return frame.result;\r\n })\r\n .catch((err) => {\r\n const message = err instanceof Error ? err.message : String(err);\r\n for (const scope of frame.scopes) {\r\n scope.result.status = 'failed';\r\n scope.result.message = message;\r\n }\r\n frame.result.status = 'failed';\r\n this._publishProfileResult(frame);\r\n return frame.result;\r\n });\r\n this._trackPendingProfileFrame(frame);\r\n }\r\n\r\n /** @internal */\r\n private _trackPendingProfileFrame(frame: RGProfileFrameInternal): void {\r\n this._pendingProfileFrames.push(frame);\r\n while (this._pendingProfileFrames.length > this._profilingOptions.maxPendingFrames) {\r\n this._pendingProfileFrames.shift();\r\n }\r\n RenderGraphExecutor._latestPendingProfileFrame = frame;\r\n }\r\n\r\n /** @internal */\r\n private _publishProfileResult(frame: RGProfileFrameInternal): void {\r\n this._pendingProfileFrames = this._pendingProfileFrames.filter((pending) => pending !== frame);\r\n if (frame.serial >= this._latestResolvedProfileSerial) {\r\n this._latestResolvedProfileSerial = frame.serial;\r\n this._latestProfileResult = frame.result;\r\n }\r\n if (frame.serial >= RenderGraphExecutor._latestResolvedProfileSerial) {\r\n RenderGraphExecutor._latestResolvedProfileSerial = frame.serial;\r\n RenderGraphExecutor._latestProfileResult = frame.result;\r\n }\r\n if (RenderGraphExecutor._latestPendingProfileFrame === frame) {\r\n RenderGraphExecutor._latestPendingProfileFrame = null;\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _applyTimestampResult(scope: RGProfileScopeInternal, result: TimestampQueryResult): void {\r\n scope.result.queryId = result.id;\r\n scope.result.durationMs = result.durationMs;\r\n scope.result.status = result.status;\r\n scope.result.message = result.message;\r\n }\r\n\r\n /** @internal */\r\n private _aggregateProfileStatus(scope: RGProfileScopeResult): TimestampQueryStatus {\r\n const statuses: TimestampQueryStatus[] = [];\r\n const collect = (node: RGProfileScopeResult) => {\r\n statuses.push(node.status);\r\n for (const child of node.children) {\r\n collect(child);\r\n }\r\n };\r\n collect(scope);\r\n for (const status of ['failed', 'invalid', 'exhausted', 'pending', 'auto-closed'] as const) {\r\n if (statuses.includes(status)) {\r\n return status;\r\n }\r\n }\r\n if (statuses.includes('unsupported')) {\r\n return 'unsupported';\r\n }\r\n return 'resolved';\r\n }\r\n\r\n /** @internal */\r\n private _resolveSize(desc: RGTextureDesc): RGResolvedSize {\r\n const mode = desc.sizeMode ?? 'backbuffer-relative';\r\n if (mode === 'absolute') {\r\n return {\r\n width: desc.width ?? 1,\r\n height: desc.height ?? 1\r\n };\r\n }\r\n // backbuffer-relative: width/height are scale factors (default 1.0)\r\n const scaleX = desc.width ?? 1.0;\r\n const scaleY = desc.height ?? 1.0;\r\n return {\r\n width: Math.max(1, Math.floor(this._backbufferWidth * scaleX)),\r\n height: Math.max(1, Math.floor(this._backbufferHeight * scaleY))\r\n };\r\n }\r\n\r\n /** @internal */\r\n private _resolveImportedTextureAliases(compiled: CompiledRenderGraph): void {\r\n this._importedTextureAliases.clear();\r\n this._resolvedImportedTextures.clear();\r\n const physicalToTexture = new Map<number, TTexture>();\r\n for (const lifetime of compiled.lifetimes.values()) {\r\n const resource = lifetime.resource;\r\n if (resource.kind !== 'imported') {\r\n continue;\r\n }\r\n const texture =\r\n this._importedTextures.get(resource.id) ?? this._importedTextures.get(resource.physicalId);\r\n if (texture !== undefined) {\r\n physicalToTexture.set(resource.physicalId, texture);\r\n }\r\n }\r\n for (const lifetime of compiled.lifetimes.values()) {\r\n const resource = lifetime.resource;\r\n if (resource.kind !== 'imported') {\r\n continue;\r\n }\r\n this._importedTextureAliases.set(resource.id, resource.physicalId);\r\n const texture = physicalToTexture.get(resource.physicalId);\r\n if (texture !== undefined) {\r\n this._resolvedImportedTextures.set(resource.id, texture);\r\n this._resolvedImportedTextures.set(resource.physicalId, texture);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _runCleanupCallbacks(): void {\r\n let error: unknown = null;\r\n while (this._cleanupCallbacks.length > 0) {\r\n const callback = this._cleanupCallbacks.pop()!;\r\n try {\r\n callback();\r\n } catch (e) {\r\n error ??= e;\r\n }\r\n }\r\n if (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _createFramebuffer(desc: RGFramebufferDesc, autoCleanup = true): TFramebuffer {\r\n if (!this._allocator.allocateFramebuffer || !this._allocator.releaseFramebuffer) {\r\n throw new Error('RenderGraphExecutor: framebuffer allocation is not supported by this allocator.');\r\n }\r\n const framebuffer = this._allocator.allocateFramebuffer(desc);\r\n if (autoCleanup) {\r\n this._cleanupCallbacks.push(() => {\r\n this._allocator.releaseFramebuffer!(framebuffer);\r\n });\r\n }\r\n return framebuffer;\r\n }\r\n\r\n /** @internal */\r\n private _releaseFramebuffer(framebuffer: TFramebuffer): void {\r\n if (!this._allocator.releaseFramebuffer) {\r\n throw new Error('RenderGraphExecutor: framebuffer release is not supported by this allocator.');\r\n }\r\n this._allocator.releaseFramebuffer(framebuffer);\r\n }\r\n\r\n /** @internal */\r\n private _resolveFramebufferDesc(\r\n desc: RGFramebufferDesc,\r\n accessScope?: RGPassAccessScope\r\n ): RGFramebufferDesc {\r\n const resolveAttachment = (attachment: unknown): unknown => {\r\n if (attachment instanceof RGHandle) {\r\n if (accessScope) {\r\n this._assertDeclaredAccess(accessScope, attachment, 'texture');\r\n }\r\n return this._resolveResource(attachment);\r\n }\r\n return attachment;\r\n };\r\n const colors = Array.isArray(desc.colorAttachments)\r\n ? desc.colorAttachments.map(resolveAttachment)\r\n : desc.colorAttachments\r\n ? resolveAttachment(desc.colorAttachments)\r\n : null;\r\n return {\r\n ...desc,\r\n colorAttachments: colors,\r\n depthAttachment: resolveAttachment(desc.depthAttachment)\r\n };\r\n }\r\n\r\n /** @internal */\r\n private _resolveResource(handle: RGHandle): TTexture {\r\n const imported = this._importedTextures.get(handle._id);\r\n if (imported !== undefined) {\r\n return imported;\r\n }\r\n const resolvedImported = this._resolvedImportedTextures.get(handle._id);\r\n if (resolvedImported !== undefined) {\r\n return resolvedImported;\r\n }\r\n const importedAlias = this._importedTextureAliases.get(handle._id);\r\n if (importedAlias !== undefined) {\r\n const aliased =\r\n this._importedTextures.get(importedAlias) ?? this._resolvedImportedTextures.get(importedAlias);\r\n if (aliased !== undefined) {\r\n return aliased;\r\n }\r\n }\r\n const allocated = this._allocatedTextures.get(handle._id);\r\n if (allocated !== undefined) {\r\n return allocated;\r\n }\r\n // Transient write-versions resolve to the physical texture of the original.\r\n const transientAlias = this._transientTextureAliases.get(handle._id);\r\n if (transientAlias !== undefined) {\r\n const aliased = this._allocatedTextures.get(transientAlias);\r\n if (aliased !== undefined) {\r\n return aliased;\r\n }\r\n }\r\n throw new Error(\r\n `RenderGraphExecutor: cannot resolve resource \"${handle.name}\" (id=${handle._id}). ` +\r\n `It may not have been allocated yet or was already released.`\r\n );\r\n }\r\n\r\n /** @internal */\r\n private _createAccessScope(pass: RGPass): RGPassAccessScope {\r\n const accessibleIds = new Set<number>();\r\n const textureIds = new Set<number>();\r\n const framebufferIds = new Set<number>();\r\n for (const resource of pass.reads) {\r\n accessibleIds.add(resource.id);\r\n if (resource.kind === 'transient' || resource.kind === 'imported') {\r\n textureIds.add(resource.id);\r\n } else if (resource.kind === 'framebuffer') {\r\n framebufferIds.add(resource.id);\r\n }\r\n }\r\n for (const resource of pass.writes) {\r\n accessibleIds.add(resource.id);\r\n if (resource.kind === 'transient' || resource.kind === 'imported') {\r\n textureIds.add(resource.id);\r\n } else if (resource.kind === 'framebuffer') {\r\n framebufferIds.add(resource.id);\r\n }\r\n }\r\n return {\r\n passName: pass.name,\r\n accessibleIds,\r\n textureIds,\r\n framebufferIds\r\n };\r\n }\r\n\r\n /** @internal */\r\n private _assertDeclaredAccess(\r\n accessScope: RGPassAccessScope,\r\n handle: RGHandle,\r\n access: 'texture' | 'framebuffer'\r\n ): void {\r\n if (!accessScope.accessibleIds.has(handle._id)) {\r\n throw new Error(\r\n `RenderGraphExecutor: pass \"${accessScope.passName}\" tried to access ${access} \"${handle.name}\" ` +\r\n `without declaring a read/write dependency.`\r\n );\r\n }\r\n if (access === 'texture' && !accessScope.textureIds.has(handle._id)) {\r\n throw new Error(\r\n `RenderGraphExecutor: pass \"${accessScope.passName}\" tried to access \"${handle.name}\" as a texture, ` +\r\n `but it is not a texture resource.`\r\n );\r\n }\r\n if (access === 'framebuffer' && !accessScope.framebufferIds.has(handle._id)) {\r\n throw new Error(\r\n `RenderGraphExecutor: pass \"${accessScope.passName}\" tried to access \"${handle.name}\" as a framebuffer, ` +\r\n `but it is not a framebuffer resource.`\r\n );\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _wrapSubpassError(passName: string, subpassName: string, error: unknown): Error {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const wrapped = new Error(\r\n `RenderGraphExecutor: pass \"${passName}\" subpass \"${subpassName}\" failed: ${message}`\r\n );\r\n (wrapped as Error & { cause?: unknown }).cause = error;\r\n return wrapped;\r\n }\r\n\r\n /** @internal */\r\n private _createContext(accessScope: RGPassAccessScope): RGExecuteContext {\r\n const self = this;\r\n return {\r\n getTexture<T>(handle: RGHandle): T {\r\n self._assertDeclaredAccess(accessScope, handle, 'texture');\r\n return self._resolveResource(handle) as unknown as T;\r\n },\r\n getFramebuffer<TFramebuffer = unknown>(handle: RGHandle): TFramebuffer {\r\n self._assertDeclaredAccess(accessScope, handle, 'framebuffer');\r\n const framebuffer = self._allocatedFramebuffers.get(handle._id);\r\n if (framebuffer !== undefined) {\r\n return framebuffer as unknown as TFramebuffer;\r\n }\r\n throw new Error(\r\n `RenderGraphExecutor: cannot resolve framebuffer \"${handle.name}\" (id=${handle._id}). ` +\r\n `It may not have been allocated yet or was already released.`\r\n );\r\n },\r\n createFramebuffer<TFramebuffer = unknown>(desc: RGFramebufferDesc): TFramebuffer {\r\n return self._createFramebuffer(\r\n self._resolveFramebufferDesc(desc, accessScope)\r\n ) as unknown as TFramebuffer;\r\n },\r\n deferCleanup(callback: () => void): void {\r\n self._cleanupCallbacks.push(callback);\r\n }\r\n };\r\n }\r\n}\r\n"],"names":["DEFAULT_PROFILING_OPTIONS","enabled","graph","pass","subpass","includePendingUploads","allowCrossFrame","maxPendingFrames","label","RenderGraphExecutor","_defaultProfilingOptions","_latestProfileResult","_latestPendingProfileFrame","_latestResolvedProfileSerial","_nextProfileSerial","_importedTextures","Map","_allocatedTextures","_allocatedFramebuffers","_importedTextureAliases","_transientTextureAliases","_resolvedImportedTextures","_cleanupCallbacks","_pendingProfileFrames","allocator","backbufferWidth","backbufferHeight","options","_allocator","_backbufferWidth","_backbufferHeight","_profilingOptions","_normalizeProfilingOptions","profiling","device","setDefaultProfilingOptions","getLatestProfileResult","resolveProfileResult","resolvePromise","Promise","resolve","setProfilingOptions","length","setBackbufferSize","width","height","setImportedTexture","handle","texture","set","_id","execute","compiled","_resolveImportedTextureAliases","profileFrame","_beginProfileFrame","allocateAt","releaseAt","allocateFramebufferAt","releaseFramebufferAt","clear","transientSchedules","resId","lifetime","lifetimes","resource","kind","physicalId","merged","get","firstUse","Math","min","lastUse","max","desc","has","push","schedule","completed","executionError","i","orderedPasses","toAllocate","size","_resolveSize","allocate","framebuffersToAllocate","framebuffer","_createFramebuffer","_resolveFramebufferDesc","passError","passProfile","_beginPassProfileScope","subpasses","accessScope","_createAccessScope","ctx","_createContext","subpassProfile","_beginSubpassProfileScope","name","executeFn","data","e","_wrapSubpassError","_endProfileScope","releaseError","framebuffersToRelease","undefined","_releaseFramebuffer","delete","toRelease","release","_finishProfileFrame","cleanupError","_runCleanupCallbacks","reset","values","fallbackDevice","source","getDevice","_getProfilingDevice","supported","getDeviceCaps","miscCaps","supportTimestampQuery","rootResult","type","queryId","durationMs","status","children","message","result","frameId","frameInfo","frameCounter","passes","root","ended","frame","serial","scopes","_beginTimestampScope","_beginProfileScope","passScope","subpassName","parent","queryEnabled","queryLabel","scope","beginTimestampQuery","endTimestampQuery","_aggregateProfileStatus","_publishProfileResult","all","map","resolveTimestampQuery","then","results","_applyTimestampResult","catch","err","Error","String","_trackPendingProfileFrame","shift","filter","pending","id","statuses","collect","node","child","includes","mode","sizeMode","scaleX","scaleY","floor","physicalToTexture","error","callback","pop","autoCleanup","allocateFramebuffer","releaseFramebuffer","resolveAttachment","attachment","RGHandle","_assertDeclaredAccess","_resolveResource","colors","Array","isArray","colorAttachments","depthAttachment","imported","resolvedImported","importedAlias","aliased","allocated","transientAlias","accessibleIds","Set","textureIds","framebufferIds","reads","add","writes","passName","access","wrapped","cause","self","getTexture","getFramebuffer","createFramebuffer","deferCleanup"],"mappings":"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"}