@zephyr3d/scene 0.9.22 → 0.9.24
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.
- package/dist/animation/joint_dynamics/collision.js +1 -7
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/constraints.js +2 -17
- package/dist/animation/joint_dynamics/constraints.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +2 -20
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +1 -3
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +14 -60
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js +3 -3
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/app/app.js +23 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/scriptregistry.js +16 -53
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -0
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/model.js +22 -0
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js +3 -1
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/blitter.js +3 -3
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/camera/camera.js +398 -45
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +69 -2
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +9113 -8740
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/lambert.js +3 -3
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +8 -5
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +17 -10
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +21 -6
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +33 -11
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/brdf.js +44 -12
- package/dist/material/mixins/pbr/brdf.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +149 -14
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +7 -4
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrblueprint.js +5 -1
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js +1 -1
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +512 -334
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/skin.js +2 -2
- package/dist/material/skin.js.map +1 -1
- package/dist/material/terrain-cm.js +5 -5
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/water.js +6 -4
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +54 -4
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +41 -0
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/posteffect.js +35 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +7 -6
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +3 -3
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +988 -436
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +83 -45
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +18 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +5 -4
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +15 -3
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +2 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js +22 -16
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/drawable_mixin.js +8 -5
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +10 -5
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +298 -5
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/gpu_picking.js +7 -5
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +28 -19
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +18 -4
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/render_queue.js +37 -4
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +8 -3
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +20 -48
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js +18 -58
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +89 -115
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +1003 -715
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +1 -1
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +14 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -0
- package/dist/render/rendergraph/history_resource_manager.js +74 -140
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +7 -5
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/render_context.js +19 -0
- package/dist/render/rendergraph/render_context.js.map +1 -0
- package/dist/render/rendergraph/render_pipeline.js +315 -0
- package/dist/render/rendergraph/render_pipeline.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +158 -141
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +267 -0
- package/dist/render/rendergraph/scene_render_context.js.map +1 -0
- package/dist/render/rendergraph/texture_affinity_cache.js +19 -0
- package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -0
- package/dist/render/rendergraph/types.js +19 -31
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +3 -3
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +7 -6
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/sky.js +257 -95
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js +4 -3
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +2 -0
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +10 -0
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +61 -2
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/light.js +178 -10
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/meshdrawable.js +89 -2
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +2 -0
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +2 -0
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +2 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +34 -1
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +2 -1
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +2 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +2 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js +5 -4
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +10 -3
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/shadow.js +149 -40
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.js.map +1 -0
- package/dist/shaders/ssr.js +322 -154
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shadow/esm.js +10 -7
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +12 -12
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +12 -12
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +16 -11
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +29 -3
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadowmapper.js +5 -2
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +13 -13
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +7 -7
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/utility/physical.js +74 -0
- package/dist/utility/physical.js.map +1 -0
- package/dist/utility/rendermipmap.js +2 -2
- package/dist/utility/rendermipmap.js.map +1 -1
- package/dist/utility/serialization/manager.js +3 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +3 -1
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +3 -1
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +598 -2
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +180 -9
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +43 -3
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +3 -1
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +3 -1
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +3 -1
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +2 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +70 -0
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +3 -1
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +3 -1
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +3 -0
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +3 -1
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/values.js +59 -65
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rendergraph.js","sources":["../../../src/render/rendergraph/rendergraph.ts"],"sourcesContent":["import {\r\n RGHandle,\r\n RGResource,\r\n RGPass,\r\n RGSubpass,\r\n type RGTextureDesc,\r\n type RGFramebufferDesc,\r\n type RGPassBuilder,\r\n type RGExecuteFn,\r\n type RGExecuteContext,\r\n type CompiledRenderGraph,\r\n type RGResourceLifetime\r\n} from './types';\r\n\r\n/**\r\n * Render Graph — declarative, configurable render pipeline.\r\n *\r\n * Usage:\r\n * ```ts\r\n * const graph = new RenderGraph();\r\n * let backbuffer = graph.importTexture('backbuffer');\r\n *\r\n * let linearDepth: RGHandle;\r\n * graph.addPass('DepthPrepass', (builder) => {\r\n * linearDepth = builder.createTexture({ format: 'r32f', label: 'linearDepth' });\r\n * builder.setExecute(() => { ... });\r\n * });\r\n *\r\n * graph.addPass('LightPass', (builder) => {\r\n * builder.read(linearDepth);\r\n * backbuffer = builder.write(backbuffer);\r\n * builder.setExecute(() => { ... });\r\n * });\r\n *\r\n * const compiled = graph.compile([backbuffer]);\r\n * graph.execute(compiled);\r\n * graph.reset();\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class RenderGraph {\r\n /** @internal */\r\n private _nextResourceId = 0;\r\n /** @internal */\r\n private _resources: Map<number, RGResource> = new Map();\r\n /** @internal */\r\n private _passes: RGPass[] = [];\r\n /** @internal */\r\n private _compiled: CompiledRenderGraph | null = null;\r\n\r\n // ─── Graph Building ─────────────────────────────────────────────────\r\n\r\n /**\r\n * Import an external (persistent) texture into the graph.\r\n *\r\n * Imported resources are not allocated or released by the graph.\r\n * Typically used for the backbuffer or any texture that outlives a single frame.\r\n *\r\n * @param name - Debug label for the imported resource.\r\n * @returns A handle referencing the imported resource.\r\n */\r\n importTexture(name: string): RGHandle {\r\n const id = this._nextResourceId++;\r\n const resource = new RGResource(id, name, 'imported', null);\r\n this._resources.set(id, resource);\r\n this._compiled = null;\r\n return new RGHandle(id, name);\r\n }\r\n\r\n /**\r\n * Add a render pass to the graph.\r\n *\r\n * The setup callback receives a {@link RGPassBuilder} to declare resource\r\n * dependencies. Call `builder.setExecute(fn)` inside setup to provide the\r\n * execution callback.\r\n *\r\n * @param name - Debug label for the pass.\r\n * @param setup - Setup callback that declares resources and sets the execute function.\r\n */\r\n addPass<T = void>(name: string, setup: (builder: RGPassBuilder) => T): T {\r\n const pass = new RGPass(this._passes.length, name);\r\n const builder = this._createBuilder(pass);\r\n const data = setup(builder);\r\n pass.data = data;\r\n this._passes.push(pass);\r\n this._compiled = null;\r\n return data;\r\n }\r\n\r\n // ─── Compilation ────────────────────────────────────────────────────\r\n\r\n /**\r\n * Compile the render graph.\r\n *\r\n * Performs dead-pass culling, topological sorting, and resource lifetime analysis.\r\n *\r\n * @param outputs - Handles of resources that must be produced (graph sinks).\r\n * If a resource was passed to {@link RGPassBuilder.write}, use the returned\r\n * post-write handle here, not the original handle.\r\n * Passes that do not contribute to these outputs (directly or transitively)\r\n * are culled, unless marked as side-effect passes.\r\n * @returns The compiled graph ready for execution.\r\n */\r\n compile(outputs: RGHandle[]): CompiledRenderGraph {\r\n this._validateOutputs(outputs);\r\n // 1. Mark alive passes via backward traversal from outputs + side-effect passes\r\n this._cullDeadPasses(outputs);\r\n // 2. Topological sort of alive passes\r\n const ordered = this._topologicalSort();\r\n // 3. Resource lifetime analysis\r\n const lifetimes = this._analyzeLifetimes(ordered);\r\n\r\n this._compiled = { orderedPasses: ordered, lifetimes };\r\n return this._compiled;\r\n }\r\n\r\n /**\r\n * Execute a compiled render graph (simple mode, no resource management).\r\n *\r\n * For automatic resource allocation/release, use {@link RenderGraphExecutor} instead.\r\n *\r\n * @param compiled - The compiled graph from {@link RenderGraph.compile}.\r\n */\r\n execute(compiled: CompiledRenderGraph): void {\r\n const noopCtx: RGExecuteContext = {\r\n getTexture() {\r\n throw new Error(\r\n 'RenderGraph.execute(): resource resolution not available. Use RenderGraphExecutor for managed execution.'\r\n );\r\n },\r\n getFramebuffer() {\r\n throw new Error(\r\n 'RenderGraph.execute(): framebuffer resolution not available. Use RenderGraphExecutor for managed execution.'\r\n );\r\n },\r\n createFramebuffer() {\r\n throw new Error(\r\n 'RenderGraph.execute(): framebuffer allocation not available. Use RenderGraphExecutor for managed execution.'\r\n );\r\n },\r\n deferCleanup() {\r\n // No-op in unmanaged execution mode.\r\n }\r\n };\r\n for (const pass of compiled.orderedPasses) {\r\n if (pass.subpasses.length > 0) {\r\n for (const subpass of pass.subpasses) {\r\n (subpass.executeFn as RGExecuteFn<unknown>)(noopCtx, pass.data);\r\n }\r\n } else if (pass.executeFn) {\r\n (pass.executeFn as RGExecuteFn<unknown>)(noopCtx, pass.data);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Reset the graph for the next frame.\r\n *\r\n * Clears all passes, transient resources, and compiled state.\r\n * Imported resources are also cleared — re-import them each frame.\r\n */\r\n reset(): void {\r\n this._passes.length = 0;\r\n this._resources.clear();\r\n this._nextResourceId = 0;\r\n this._compiled = null;\r\n }\r\n\r\n // ─── Accessors (for testing / debugging) ────────────────────────────\r\n\r\n /** @internal */\r\n getResource(handle: RGHandle): RGResource | undefined {\r\n return this._resources.get(handle._id);\r\n }\r\n\r\n /** @internal */\r\n get passes(): ReadonlyArray<RGPass> {\r\n return this._passes;\r\n }\r\n\r\n /** @internal */\r\n get resources(): ReadonlyMap<number, RGResource> {\r\n return this._resources;\r\n }\r\n\r\n // ─── Private: Builder ───────────────────────────────────────────────\r\n\r\n /** @internal */\r\n private _createBuilder(pass: RGPass): RGPassBuilder {\r\n const graph = this;\r\n return {\r\n read(handle: RGHandle): void {\r\n const res = graph._resources.get(handle._id);\r\n if (!res) {\r\n throw new Error(`RenderGraph: unknown resource \"${handle.name}\" (id=${handle._id})`);\r\n }\r\n // Validate that transient resources have a producer\r\n if (res.kind === 'transient' && !res.producer) {\r\n throw new Error(\r\n `RenderGraph: pass \"${pass.name}\" attempts to read transient resource \"${res.name}\" ` +\r\n `which has no producer. Ensure the resource is created before being read.`\r\n );\r\n }\r\n if (!pass.reads.includes(res)) {\r\n pass.reads.push(res);\r\n }\r\n if (!res.consumers.includes(pass)) {\r\n res.consumers.push(pass);\r\n }\r\n },\r\n write(handle: RGHandle): RGHandle {\r\n const res = graph._resources.get(handle._id);\r\n if (!res) {\r\n throw new Error(`RenderGraph: unknown resource \"${handle.name}\" (id=${handle._id})`);\r\n }\r\n if (res.kind === 'token') {\r\n throw new Error(\r\n `RenderGraph: pass \"${pass.name}\" attempts to write token \"${res.name}\". ` +\r\n `Use createToken() to produce ordering tokens.`\r\n );\r\n }\r\n if (res.kind === 'framebuffer') {\r\n throw new Error(\r\n `RenderGraph: pass \"${pass.name}\" attempts to write framebuffer \"${res.name}\". ` +\r\n `Create a new framebuffer view instead.`\r\n );\r\n }\r\n for (const consumer of res.consumers) {\r\n if (consumer !== pass && !pass.dependencies.includes(consumer)) {\r\n pass.dependencies.push(consumer);\r\n }\r\n }\r\n if (res.producer && res.producer !== pass && !pass.dependencies.includes(res.producer)) {\r\n pass.dependencies.push(res.producer);\r\n }\r\n const id = graph._nextResourceId++;\r\n const versionName = `${res.name}@${pass.name}`;\r\n const version = new RGResource(id, versionName, res.kind, res.desc, res.physicalId);\r\n version.producer = pass;\r\n graph._resources.set(id, version);\r\n if (!pass.writes.includes(version)) {\r\n pass.writes.push(version);\r\n }\r\n return new RGHandle(id, versionName);\r\n },\r\n createTexture(desc: RGTextureDesc): RGHandle {\r\n const id = graph._nextResourceId++;\r\n const name = desc.label ?? `_tex_${id}`;\r\n const res = new RGResource(id, name, 'transient', desc);\r\n res.producer = pass;\r\n graph._resources.set(id, res);\r\n pass.writes.push(res);\r\n return new RGHandle(id, name);\r\n },\r\n createToken(name?: string): RGHandle {\r\n const id = graph._nextResourceId++;\r\n const tokenName = name ?? `_token_${id}`;\r\n const res = new RGResource(id, tokenName, 'token', null);\r\n res.producer = pass;\r\n graph._resources.set(id, res);\r\n pass.writes.push(res);\r\n return new RGHandle(id, tokenName);\r\n },\r\n createFramebuffer(desc): RGHandle {\r\n const id = graph._nextResourceId++;\r\n const name = desc.label ?? `_fb_${id}`;\r\n const res = new RGResource(id, name, 'framebuffer', desc);\r\n res.producer = pass;\r\n graph._resources.set(id, res);\r\n pass.writes.push(res);\r\n graph._declareFramebufferAttachmentDeps(pass, desc);\r\n return new RGHandle(id, name);\r\n },\r\n sideEffect(): void {\r\n pass.hasSideEffect = true;\r\n },\r\n addSubpass<D>(name: string, fn: RGExecuteFn<D>): void {\r\n if (pass.executeFn) {\r\n throw new Error(\r\n `RenderGraph: pass \"${pass.name}\" cannot use addSubpass() after setExecute(). ` +\r\n `Use either subpasses or a single execute callback.`\r\n );\r\n }\r\n pass.subpasses.push(new RGSubpass(name, fn as RGExecuteFn<unknown>));\r\n },\r\n setExecute<D>(fn: RGExecuteFn<D>): void {\r\n if (pass.subpasses.length > 0) {\r\n throw new Error(\r\n `RenderGraph: pass \"${pass.name}\" cannot use setExecute() after addSubpass(). ` +\r\n `Use either subpasses or a single execute callback.`\r\n );\r\n }\r\n pass.executeFn = fn as RGExecuteFn<unknown>;\r\n }\r\n };\r\n }\r\n\r\n // ─── Private: Dead Pass Culling ─────────────────────────────────────\r\n\r\n /** @internal */\r\n private _validateOutputs(outputs: RGHandle[]): void {\r\n const latestVersions = new Map<number, RGResource>();\r\n for (const res of this._resources.values()) {\r\n const current = latestVersions.get(res.physicalId);\r\n if (!current || res.id > current.id) {\r\n latestVersions.set(res.physicalId, res);\r\n }\r\n }\r\n\r\n for (const handle of outputs) {\r\n const res = this._resources.get(handle._id);\r\n if (!res) {\r\n throw new Error(`RenderGraph: unknown output resource \"${handle.name}\" (id=${handle._id})`);\r\n }\r\n const latest = latestVersions.get(res.physicalId);\r\n if (latest && latest.id !== res.id) {\r\n throw new Error(\r\n `RenderGraph: output resource \"${res.name}\" (id=${res.id}) is not the latest version. ` +\r\n `Use the handle returned by builder.write(); latest is \"${latest.name}\" (id=${latest.id}).`\r\n );\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _cullDeadPasses(outputs: RGHandle[]): void {\r\n // Start with all passes marked dead\r\n for (const pass of this._passes) {\r\n pass.alive = false;\r\n }\r\n\r\n // Seed: resources that are requested outputs\r\n const neededResources = new Set<number>();\r\n const stack: RGResource[] = [];\r\n const markResourceNeeded = (res: RGResource) => {\r\n if (!neededResources.has(res.id)) {\r\n neededResources.add(res.id);\r\n stack.push(res);\r\n }\r\n };\r\n const markPassAlive = (pass: RGPass) => {\r\n if (pass.alive) {\r\n return;\r\n }\r\n pass.alive = true;\r\n for (const dep of pass.reads) {\r\n markResourceNeeded(dep);\r\n }\r\n for (const dependency of pass.dependencies) {\r\n markPassAlive(dependency);\r\n }\r\n };\r\n\r\n for (const handle of outputs) {\r\n const res = this._resources.get(handle._id);\r\n if (!res) {\r\n throw new Error(`RenderGraph: unknown output resource \"${handle.name}\" (id=${handle._id})`);\r\n }\r\n markResourceNeeded(res);\r\n }\r\n\r\n // Seed: side-effect passes (always alive) — push their read dependencies\r\n for (const pass of this._passes) {\r\n if (pass.hasSideEffect) {\r\n markPassAlive(pass);\r\n }\r\n }\r\n\r\n // Backward traversal: for each needed resource, mark its producer alive\r\n // and recursively mark the producer's read dependencies as needed\r\n while (stack.length > 0) {\r\n const res = stack.pop()!;\r\n const producer = res.producer;\r\n if (producer) {\r\n markPassAlive(producer);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _declareFramebufferAttachmentDeps(\r\n pass: RGPass,\r\n desc: { colorAttachments: unknown | unknown[] | null; depthAttachment?: unknown | null }\r\n ): void {\r\n const declare = (attachment: unknown) => {\r\n if (attachment instanceof RGHandle) {\r\n const res = this._resources.get(attachment._id);\r\n if (!res) {\r\n throw new Error(\r\n `RenderGraph: unknown framebuffer attachment \"${attachment.name}\" (id=${attachment._id})`\r\n );\r\n }\r\n if (res.kind !== 'transient' && res.kind !== 'imported') {\r\n throw new Error(\r\n `RenderGraph: framebuffer attachment \"${res.name}\" must be a texture resource, got ${res.kind}.`\r\n );\r\n }\r\n if (res.producer !== pass) {\r\n if (!pass.reads.includes(res)) {\r\n pass.reads.push(res);\r\n }\r\n if (!res.consumers.includes(pass)) {\r\n res.consumers.push(pass);\r\n }\r\n }\r\n }\r\n };\r\n const colors = Array.isArray(desc.colorAttachments)\r\n ? desc.colorAttachments\r\n : desc.colorAttachments\r\n ? [desc.colorAttachments]\r\n : [];\r\n for (const attachment of colors) {\r\n declare(attachment);\r\n }\r\n declare(desc.depthAttachment);\r\n }\r\n\r\n // ─── Private: Topological Sort (Kahn's Algorithm) ───────────────────\r\n\r\n /** @internal */\r\n private _topologicalSort(): RGPass[] {\r\n const alivePasses = this._passes.filter((p) => p.alive);\r\n if (alivePasses.length === 0) {\r\n return [];\r\n }\r\n\r\n // Build adjacency: producer -> consumers (only among alive passes)\r\n const aliveSet = new Set(alivePasses);\r\n const inDegree = new Map<RGPass, number>();\r\n const adjacency = new Map<RGPass, RGPass[]>();\r\n\r\n for (const pass of alivePasses) {\r\n inDegree.set(pass, 0);\r\n adjacency.set(pass, []);\r\n }\r\n\r\n const addEdge = (from: RGPass, to: RGPass) => {\r\n if (from === to || !aliveSet.has(from) || !aliveSet.has(to)) {\r\n return;\r\n }\r\n const neighbors = adjacency.get(from)!;\r\n if (!neighbors.includes(to)) {\r\n neighbors.push(to);\r\n inDegree.set(to, inDegree.get(to)! + 1);\r\n }\r\n };\r\n\r\n for (const pass of alivePasses) {\r\n for (const dependency of pass.dependencies) {\r\n addEdge(dependency, pass);\r\n }\r\n }\r\n\r\n // For each resource, its producer has an edge to each of its consumers\r\n for (const res of this._resources.values()) {\r\n if (!res.producer || !aliveSet.has(res.producer)) {\r\n continue;\r\n }\r\n for (const consumer of res.consumers) {\r\n addEdge(res.producer, consumer);\r\n }\r\n }\r\n\r\n // Kahn's algorithm\r\n const queue: RGPass[] = [];\r\n for (const pass of alivePasses) {\r\n if (inDegree.get(pass) === 0) {\r\n queue.push(pass);\r\n }\r\n }\r\n\r\n const result: RGPass[] = [];\r\n while (queue.length > 0) {\r\n const pass = queue.shift()!;\r\n result.push(pass);\r\n for (const neighbor of adjacency.get(pass)!) {\r\n const deg = inDegree.get(neighbor)! - 1;\r\n inDegree.set(neighbor, deg);\r\n if (deg === 0) {\r\n queue.push(neighbor);\r\n }\r\n }\r\n }\r\n\r\n if (result.length !== alivePasses.length) {\r\n // Find passes that are part of the cycle (those with non-zero in-degree)\r\n const cycleParticipants: string[] = [];\r\n for (const [pass, degree] of inDegree) {\r\n if (degree > 0) {\r\n cycleParticipants.push(pass.name);\r\n }\r\n }\r\n throw new Error(\r\n `RenderGraph: circular dependency detected. ` +\r\n `Sorted ${result.length} of ${alivePasses.length} alive passes. ` +\r\n `Passes in cycle: [${cycleParticipants.join(', ')}]`\r\n );\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // ─── Private: Resource Lifetime Analysis ────────────────────────────\r\n\r\n /** @internal */\r\n private _analyzeLifetimes(orderedPasses: RGPass[]): Map<number, RGResourceLifetime> {\r\n const lifetimes = new Map<number, { resource: RGResource; firstUse: number; lastUse: number }>();\r\n\r\n // Build pass -> order index map\r\n const orderMap = new Map<RGPass, number>();\r\n for (let i = 0; i < orderedPasses.length; i++) {\r\n orderMap.set(orderedPasses[i], i);\r\n }\r\n\r\n for (const res of this._resources.values()) {\r\n let first = Infinity;\r\n let last = -Infinity;\r\n\r\n // Producer\r\n if (res.producer && orderMap.has(res.producer)) {\r\n const idx = orderMap.get(res.producer)!;\r\n first = Math.min(first, idx);\r\n last = Math.max(last, idx);\r\n }\r\n\r\n // Consumers\r\n for (const consumer of res.consumers) {\r\n if (orderMap.has(consumer)) {\r\n const idx = orderMap.get(consumer)!;\r\n first = Math.min(first, idx);\r\n last = Math.max(last, idx);\r\n }\r\n }\r\n\r\n if (first !== Infinity) {\r\n lifetimes.set(res.id, { resource: res, firstUse: first, lastUse: last });\r\n }\r\n }\r\n\r\n // A pass that reads a framebuffer implicitly reads its attachment textures:\r\n // extend each RGHandle attachment's lifetime to cover the framebuffer's\r\n // lifetime so the executor never releases a backing texture while a later\r\n // pass can still render through the framebuffer. Framebuffers cannot be\r\n // attachments of other framebuffers, so a single propagation pass suffices.\r\n for (const lifetime of lifetimes.values()) {\r\n const res = lifetime.resource;\r\n if (res.kind !== 'framebuffer' || !res.desc) {\r\n continue;\r\n }\r\n const desc = res.desc as RGFramebufferDesc;\r\n const extend = (attachment: unknown) => {\r\n if (!(attachment instanceof RGHandle)) {\r\n return;\r\n }\r\n const attachmentLifetime = lifetimes.get(attachment._id);\r\n if (attachmentLifetime) {\r\n attachmentLifetime.firstUse = Math.min(attachmentLifetime.firstUse, lifetime.firstUse);\r\n attachmentLifetime.lastUse = Math.max(attachmentLifetime.lastUse, lifetime.lastUse);\r\n }\r\n };\r\n const colors = Array.isArray(desc.colorAttachments)\r\n ? desc.colorAttachments\r\n : desc.colorAttachments\r\n ? [desc.colorAttachments]\r\n : [];\r\n for (const attachment of colors) {\r\n extend(attachment);\r\n }\r\n extend(desc.depthAttachment);\r\n }\r\n\r\n return lifetimes;\r\n }\r\n}\r\n"],"names":["RenderGraph","_nextResourceId","_resources","Map","_passes","_compiled","importTexture","name","id","resource","RGResource","set","RGHandle","addPass","setup","pass","RGPass","length","builder","_createBuilder","data","push","compile","outputs","_validateOutputs","_cullDeadPasses","ordered","_topologicalSort","lifetimes","_analyzeLifetimes","orderedPasses","execute","compiled","noopCtx","getTexture","Error","getFramebuffer","createFramebuffer","deferCleanup","subpasses","subpass","executeFn","reset","clear","getResource","handle","get","_id","passes","resources","graph","read","res","kind","producer","reads","includes","consumers","write","consumer","dependencies","versionName","version","desc","physicalId","writes","createTexture","label","createToken","tokenName","_declareFramebufferAttachmentDeps","sideEffect","hasSideEffect","addSubpass","fn","RGSubpass","setExecute","latestVersions","values","current","latest","alive","neededResources","Set","stack","markResourceNeeded","has","add","markPassAlive","dep","dependency","pop","declare","attachment","colors","Array","isArray","colorAttachments","depthAttachment","alivePasses","filter","p","aliveSet","inDegree","adjacency","addEdge","from","to","neighbors","queue","result","shift","neighbor","deg","cycleParticipants","degree","join","orderMap","i","first","Infinity","last","idx","Math","min","max","firstUse","lastUse","lifetime","extend","attachmentLifetime"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rendergraph.js","sources":["../../../src/render/rendergraph/rendergraph.ts"],"sourcesContent":["import {\r\n RGHandle,\r\n type RGTextureHandle,\r\n type RGFramebufferHandle,\r\n type RGTokenHandle,\r\n RGResource,\r\n RGPass,\r\n RGSubpass,\r\n type RGTextureDesc,\r\n type RGFramebufferDesc,\r\n type RGPassBuilder,\r\n type RGExecuteFn,\r\n type RGExecuteContext,\r\n type CompiledRenderGraph,\r\n type RGResourceLifetime,\r\n type RGWriteOptions\r\n} from './types';\r\n\r\n/** Declarative render pass and resource dependency graph. @public */\r\nexport class RenderGraph {\r\n private _nextResourceId = 0;\r\n private _resources: Map<number, RGResource> = new Map();\r\n private _passes: RGPass<any>[] = [];\r\n private _compiled: CompiledRenderGraph | null = null;\r\n private _lastWriterByPhysicalId = new Map<number, RGPass<any>>();\r\n /** Deduplicates warnings across per-frame graph instances. */\r\n private static _warnedCulledPasses = new Set<string>();\r\n\r\n /** Import an external texture that the graph does not own. */\r\n importTexture<TTexture = unknown>(name: string): RGTextureHandle<TTexture> {\r\n const id = this._nextResourceId++;\r\n const resource = new RGResource(id, name, 'imported', null);\r\n this._resources.set(id, resource);\r\n this._compiled = null;\r\n return new RGHandle(id, name, 'texture');\r\n }\r\n\r\n /**\r\n * Add a pass. The setup callback declares dependencies and execution.\r\n */\r\n addPass<T = void>(name: string, setup: (builder: RGPassBuilder) => T): T {\r\n let nameOccurrence = 0;\r\n for (const existing of this._passes) {\r\n if (existing.name === name) {\r\n nameOccurrence++;\r\n }\r\n }\r\n const pass = new RGPass<T>(this._passes.length, name, nameOccurrence);\r\n const builder = this._createBuilder(pass);\r\n const initialResourceIds = new Set(this._resources.keys());\r\n try {\r\n const data = setup(builder);\r\n pass.data = data;\r\n this._passes.push(pass);\r\n this._compiled = null;\r\n return data;\r\n } catch (error) {\r\n for (const id of this._resources.keys()) {\r\n if (!initialResourceIds.has(id)) {\r\n this._resources.delete(id);\r\n }\r\n }\r\n for (const resource of this._resources.values()) {\r\n for (let i = resource.consumers.length - 1; i >= 0; i--) {\r\n if (resource.consumers[i] === pass) {\r\n resource.consumers.splice(i, 1);\r\n }\r\n }\r\n if (resource.nextWriter === pass) {\r\n resource.nextWriter = null;\r\n }\r\n }\r\n // Remove WAR edges added to existing passes before setup failed.\r\n for (const existing of this._passes) {\r\n for (let i = existing.warDependencies.length - 1; i >= 0; i--) {\r\n if (existing.warDependencies[i] === pass) {\r\n existing.warDependencies.splice(i, 1);\r\n }\r\n }\r\n }\r\n this._lastWriterByPhysicalId.clear();\r\n for (const resource of this._resources.values()) {\r\n if (resource.producer) {\r\n this._lastWriterByPhysicalId.set(resource.physicalId, resource.producer);\r\n }\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Cull dead passes, sort dependencies, and calculate resource lifetimes.\r\n * Outputs must be their latest written versions.\r\n */\r\n compile(outputs: RGHandle[]): CompiledRenderGraph {\r\n this._validateOutputs(outputs);\r\n this._cullDeadPasses(outputs);\r\n const ordered = this._topologicalSort();\r\n const lifetimes = this._analyzeLifetimes(ordered);\r\n this._validateAllocationKeys(lifetimes);\r\n\r\n this._compiled = { orderedPasses: ordered, lifetimes };\r\n return this._compiled;\r\n }\r\n\r\n /** @internal Test-only callback runner; resource-managed code uses RenderGraphExecutor. */\r\n execute(compiled: CompiledRenderGraph): void {\r\n const noopCtx: RGExecuteContext = {\r\n getTexture() {\r\n throw new Error(\r\n 'RenderGraph.execute(): resource resolution not available. Use RenderGraphExecutor for managed execution.'\r\n );\r\n },\r\n getFramebuffer() {\r\n throw new Error(\r\n 'RenderGraph.execute(): framebuffer resolution not available. Use RenderGraphExecutor for managed execution.'\r\n );\r\n },\r\n createFramebuffer() {\r\n throw new Error(\r\n 'RenderGraph.execute(): framebuffer allocation not available. Use RenderGraphExecutor for managed execution.'\r\n );\r\n },\r\n deferCleanup() {}\r\n };\r\n for (const pass of compiled.orderedPasses) {\r\n if (pass.subpasses.length > 0) {\r\n for (const subpass of pass.subpasses) {\r\n (subpass.executeFn as RGExecuteFn<unknown>)(noopCtx, pass.data);\r\n }\r\n } else if (pass.executeFn) {\r\n (pass.executeFn as RGExecuteFn<unknown>)(noopCtx, pass.data);\r\n }\r\n }\r\n }\r\n\r\n /** Clear all passes, resources, and compiled state. */\r\n reset(): void {\r\n this._passes.length = 0;\r\n this._resources.clear();\r\n this._nextResourceId = 0;\r\n this._compiled = null;\r\n this._lastWriterByPhysicalId.clear();\r\n }\r\n\r\n /** @internal */\r\n getResource(handle: RGHandle): RGResource | undefined {\r\n return this._resources.get(handle._id);\r\n }\r\n\r\n /** @internal */\r\n get passes(): ReadonlyArray<RGPass<any>> {\r\n return this._passes;\r\n }\r\n\r\n /** @internal */\r\n get resources(): ReadonlyMap<number, RGResource> {\r\n return this._resources;\r\n }\r\n\r\n private _createBuilder<T>(pass: RGPass<T>): RGPassBuilder<T> {\r\n const graph = this;\r\n const textureLabelOccurrences = new Map<string, number>();\r\n return {\r\n read(handle: RGHandle): void {\r\n const res = graph._resources.get(handle._id);\r\n if (!res) {\r\n throw new Error(`RenderGraph: unknown resource \"${handle.name}\" (id=${handle._id})`);\r\n }\r\n graph._declareRead(pass, res);\r\n },\r\n write<TTexture>(\r\n handle: RGTextureHandle<TTexture> | RGHandle,\r\n options: RGWriteOptions | undefined\r\n ): RGTextureHandle<TTexture> {\r\n const res = graph._resources.get(handle._id);\r\n if (!res) {\r\n throw new Error(`RenderGraph: unknown resource \"${handle.name}\" (id=${handle._id})`);\r\n }\r\n if (res.kind === 'token') {\r\n throw new Error(\r\n `RenderGraph: pass \"${pass.name}\" attempts to write token \"${res.name}\". ` +\r\n `Use createToken() to produce ordering tokens.`\r\n );\r\n }\r\n if (res.kind === 'framebuffer') {\r\n throw new Error(\r\n `RenderGraph: pass \"${pass.name}\" attempts to write framebuffer \"${res.name}\". ` +\r\n `Create a new framebuffer view instead.`\r\n );\r\n }\r\n const discard = options?.load === 'discard';\r\n const previousWriter = graph._lastWriterByPhysicalId.get(res.physicalId);\r\n if (previousWriter && previousWriter !== pass) {\r\n const dependencies = discard ? pass.orderingDependencies : pass.dependencies;\r\n if (!dependencies.includes(previousWriter)) {\r\n dependencies.push(previousWriter);\r\n }\r\n }\r\n // WAR orders live readers before the overwrite without retaining them.\r\n for (const consumer of res.consumers) {\r\n if (consumer !== pass && !pass.warDependencies.includes(consumer)) {\r\n pass.warDependencies.push(consumer);\r\n }\r\n }\r\n if (res.producer && res.producer !== pass) {\r\n const dependencies = discard ? pass.orderingDependencies : pass.dependencies;\r\n if (!dependencies.includes(res.producer)) {\r\n dependencies.push(res.producer);\r\n }\r\n }\r\n const id = graph._nextResourceId++;\r\n const versionName = `${res.name}@${pass.name}`;\r\n const version = new RGResource(\r\n id,\r\n versionName,\r\n res.kind,\r\n res.desc,\r\n res.physicalId,\r\n res.allocationKey\r\n );\r\n version.producer = pass;\r\n // WAW edges make the first overwrite sufficient for stale readers.\r\n if (!res.nextWriter) {\r\n res.nextWriter = pass;\r\n }\r\n graph._resources.set(id, version);\r\n graph._lastWriterByPhysicalId.set(res.physicalId, pass);\r\n if (!pass.writes.includes(version)) {\r\n pass.writes.push(version);\r\n }\r\n return new RGHandle(id, versionName, 'texture');\r\n },\r\n createTexture<TTexture = unknown>(desc: RGTextureDesc): RGTextureHandle<TTexture> {\r\n if (desc.allocationKey !== undefined && desc.allocationKey.length === 0) {\r\n throw new Error(`RenderGraph: pass \"${pass.name}\" specified an empty texture allocationKey.`);\r\n }\r\n const id = graph._nextResourceId++;\r\n const name = desc.label ?? `_tex_${id}`;\r\n const labelKey = desc.label ?? '<unnamed>';\r\n const labelOccurrence = textureLabelOccurrences.get(labelKey) ?? 0;\r\n textureLabelOccurrences.set(labelKey, labelOccurrence + 1);\r\n const allocationKey =\r\n desc.allocationKey ??\r\n `rg:${JSON.stringify([pass.name, pass.nameOccurrence, desc.label ?? null, labelOccurrence])}`;\r\n const res = new RGResource(id, name, 'transient', desc, id, allocationKey);\r\n res.producer = pass;\r\n graph._resources.set(id, res);\r\n graph._lastWriterByPhysicalId.set(res.physicalId, pass);\r\n pass.writes.push(res);\r\n return new RGHandle(id, name, 'texture');\r\n },\r\n createToken(name?: string): RGTokenHandle {\r\n const id = graph._nextResourceId++;\r\n const tokenName = name ?? `_token_${id}`;\r\n const res = new RGResource(id, tokenName, 'token', null);\r\n res.producer = pass;\r\n graph._resources.set(id, res);\r\n pass.writes.push(res);\r\n return new RGHandle(id, tokenName, 'token');\r\n },\r\n createFramebuffer<TFramebuffer = unknown>(desc: RGFramebufferDesc): RGFramebufferHandle<TFramebuffer> {\r\n const id = graph._nextResourceId++;\r\n const name = desc.label ?? `_fb_${id}`;\r\n const res = new RGResource(id, name, 'framebuffer', desc);\r\n res.producer = pass;\r\n graph._resources.set(id, res);\r\n graph._lastWriterByPhysicalId.set(res.physicalId, pass);\r\n pass.writes.push(res);\r\n graph._declareFramebufferAttachmentDeps(pass, desc);\r\n return new RGHandle(id, name, 'framebuffer');\r\n },\r\n sideEffect(): void {\r\n pass.hasSideEffect = true;\r\n },\r\n addSubpass<D = T>(name: string, fn: RGExecuteFn<D>): void {\r\n if (pass.executeFn) {\r\n throw new Error(\r\n `RenderGraph: pass \"${pass.name}\" cannot use addSubpass() after setExecute(). ` +\r\n `Use either subpasses or a single execute callback.`\r\n );\r\n }\r\n pass.subpasses.push(new RGSubpass(name, fn as unknown as RGExecuteFn<T>));\r\n },\r\n setExecute<D = T>(fn: RGExecuteFn<D>): void {\r\n if (pass.subpasses.length > 0) {\r\n throw new Error(\r\n `RenderGraph: pass \"${pass.name}\" cannot use setExecute() after addSubpass(). ` +\r\n `Use either subpasses or a single execute callback.`\r\n );\r\n }\r\n pass.executeFn = fn as unknown as RGExecuteFn<T>;\r\n }\r\n };\r\n }\r\n\r\n private _validateAllocationKeys(lifetimes: ReadonlyMap<number, RGResourceLifetime>): void {\r\n const physicalByKey = new Map<string, number>();\r\n for (const lifetime of lifetimes.values()) {\r\n const resource = lifetime.resource;\r\n if (resource.kind !== 'transient' || !resource.allocationKey) {\r\n continue;\r\n }\r\n const existingPhysicalId = physicalByKey.get(resource.allocationKey);\r\n if (existingPhysicalId !== undefined && existingPhysicalId !== resource.physicalId) {\r\n throw new Error(\r\n `RenderGraph: transient allocationKey \"${resource.allocationKey}\" is used by multiple resources. ` +\r\n 'Use a unique allocationKey for each logical texture.'\r\n );\r\n }\r\n physicalByKey.set(resource.allocationKey, resource.physicalId);\r\n }\r\n }\r\n\r\n private _validateOutputs(outputs: RGHandle[]): void {\r\n const latestVersions = new Map<number, RGResource>();\r\n for (const res of this._resources.values()) {\r\n const current = latestVersions.get(res.physicalId);\r\n if (!current || res.id > current.id) {\r\n latestVersions.set(res.physicalId, res);\r\n }\r\n }\r\n\r\n for (const handle of outputs) {\r\n const res = this._resources.get(handle._id);\r\n if (!res) {\r\n throw new Error(`RenderGraph: unknown output resource \"${handle.name}\" (id=${handle._id})`);\r\n }\r\n const latest = latestVersions.get(res.physicalId);\r\n if (latest && latest.id !== res.id) {\r\n throw new Error(\r\n `RenderGraph: output resource \"${res.name}\" (id=${res.id}) is not the latest version. ` +\r\n `Use the handle returned by builder.write(); latest is \"${latest.name}\" (id=${latest.id}).`\r\n );\r\n }\r\n }\r\n }\r\n\r\n private _cullDeadPasses(outputs: RGHandle[]): void {\r\n for (const pass of this._passes) {\r\n pass.alive = false;\r\n }\r\n\r\n const neededResources = new Set<number>();\r\n const stack: RGResource[] = [];\r\n const markResourceNeeded = (res: RGResource) => {\r\n if (!neededResources.has(res.id)) {\r\n neededResources.add(res.id);\r\n stack.push(res);\r\n }\r\n };\r\n const markPassAlive = (pass: RGPass<any>) => {\r\n if (pass.alive) {\r\n return;\r\n }\r\n pass.alive = true;\r\n for (const dep of pass.reads) {\r\n markResourceNeeded(dep);\r\n }\r\n // WAR dependencies order passes but do not propagate liveness.\r\n for (const dependency of pass.dependencies) {\r\n markPassAlive(dependency);\r\n }\r\n };\r\n\r\n for (const handle of outputs) {\r\n const res = this._resources.get(handle._id);\r\n if (!res) {\r\n throw new Error(`RenderGraph: unknown output resource \"${handle.name}\" (id=${handle._id})`);\r\n }\r\n markResourceNeeded(res);\r\n }\r\n\r\n for (const pass of this._passes) {\r\n if (pass.hasSideEffect) {\r\n markPassAlive(pass);\r\n }\r\n }\r\n\r\n while (stack.length > 0) {\r\n const res = stack.pop()!;\r\n const producer = res.producer;\r\n if (producer) {\r\n markPassAlive(producer);\r\n }\r\n }\r\n\r\n // Warn when an ordering-only pass may have omitted sideEffect or an output.\r\n for (const pass of this._passes) {\r\n if (\r\n !pass.alive &&\r\n !pass.hasSideEffect &&\r\n pass.warDependencies.length > 0 &&\r\n !RenderGraph._warnedCulledPasses.has(pass.name)\r\n ) {\r\n RenderGraph._warnedCulledPasses.add(pass.name);\r\n console.warn(\r\n `RenderGraph: pass \"${pass.name}\" was culled but is referenced by WAR ` +\r\n `ordering edges. If its work must run, call sideEffect() or route its ` +\r\n `output into a compile() sink.`\r\n );\r\n }\r\n }\r\n }\r\n\r\n private _declareRead(pass: RGPass<any>, res: RGResource): void {\r\n if (res.kind === 'transient' && !res.producer) {\r\n throw new Error(\r\n `RenderGraph: pass \"${pass.name}\" attempts to read transient resource \"${res.name}\" ` +\r\n `which has no producer. Ensure the resource is created before being read.`\r\n );\r\n }\r\n if (!pass.reads.includes(res)) {\r\n pass.reads.push(res);\r\n }\r\n if (!res.consumers.includes(pass)) {\r\n res.consumers.push(pass);\r\n }\r\n // A stale-version read must precede its first overwrite.\r\n if (res.nextWriter && res.nextWriter !== pass && !res.nextWriter.warDependencies.includes(pass)) {\r\n res.nextWriter.warDependencies.push(pass);\r\n }\r\n }\r\n\r\n private _declareFramebufferAttachmentDeps(\r\n pass: RGPass<any>,\r\n desc: { colorAttachments: unknown | unknown[] | null; depthAttachment?: unknown | null }\r\n ): void {\r\n const declare = (attachment: unknown) => {\r\n if (attachment instanceof RGHandle) {\r\n const res = this._resources.get(attachment._id);\r\n if (!res) {\r\n throw new Error(\r\n `RenderGraph: unknown framebuffer attachment \"${attachment.name}\" (id=${attachment._id})`\r\n );\r\n }\r\n if (res.kind !== 'transient' && res.kind !== 'imported') {\r\n throw new Error(\r\n `RenderGraph: framebuffer attachment \"${res.name}\" must be a texture resource, got ${res.kind}.`\r\n );\r\n }\r\n if (res.producer !== pass) {\r\n this._declareRead(pass, res);\r\n }\r\n }\r\n };\r\n const colors = Array.isArray(desc.colorAttachments)\r\n ? desc.colorAttachments\r\n : desc.colorAttachments\r\n ? [desc.colorAttachments]\r\n : [];\r\n for (const attachment of colors) {\r\n declare(attachment);\r\n }\r\n declare(desc.depthAttachment);\r\n }\r\n\r\n private _topologicalSort(): RGPass<any>[] {\r\n const alivePasses = this._passes.filter((p) => p.alive);\r\n if (alivePasses.length === 0) {\r\n return [];\r\n }\r\n\r\n const aliveSet = new Set(alivePasses);\r\n const inDegree = new Map<RGPass<any>, number>();\r\n const adjacency = new Map<RGPass<any>, RGPass<any>[]>();\r\n\r\n for (const pass of alivePasses) {\r\n inDegree.set(pass, 0);\r\n adjacency.set(pass, []);\r\n }\r\n\r\n const addEdge = (from: RGPass<any>, to: RGPass<any>) => {\r\n if (from === to || !aliveSet.has(from) || !aliveSet.has(to)) {\r\n return;\r\n }\r\n const neighbors = adjacency.get(from)!;\r\n if (!neighbors.includes(to)) {\r\n neighbors.push(to);\r\n inDegree.set(to, inDegree.get(to)! + 1);\r\n }\r\n };\r\n\r\n for (const pass of alivePasses) {\r\n for (const dependency of pass.dependencies) {\r\n addEdge(dependency, pass);\r\n }\r\n for (const dependency of pass.orderingDependencies) {\r\n addEdge(dependency, pass);\r\n }\r\n for (const dependency of pass.warDependencies) {\r\n addEdge(dependency, pass);\r\n }\r\n }\r\n\r\n for (const res of this._resources.values()) {\r\n if (!res.producer || !aliveSet.has(res.producer)) {\r\n continue;\r\n }\r\n for (const consumer of res.consumers) {\r\n addEdge(res.producer, consumer);\r\n }\r\n }\r\n\r\n const queue: RGPass<any>[] = [];\r\n for (const pass of alivePasses) {\r\n if (inDegree.get(pass) === 0) {\r\n queue.push(pass);\r\n }\r\n }\r\n\r\n const result: RGPass<any>[] = [];\r\n while (queue.length > 0) {\r\n const pass = queue.shift()!;\r\n result.push(pass);\r\n for (const neighbor of adjacency.get(pass)!) {\r\n const deg = inDegree.get(neighbor)! - 1;\r\n inDegree.set(neighbor, deg);\r\n if (deg === 0) {\r\n queue.push(neighbor);\r\n }\r\n }\r\n }\r\n\r\n if (result.length !== alivePasses.length) {\r\n const cycleParticipants: string[] = [];\r\n for (const [pass, degree] of inDegree) {\r\n if (degree > 0) {\r\n cycleParticipants.push(pass.name);\r\n }\r\n }\r\n throw new Error(\r\n `RenderGraph: circular dependency detected. ` +\r\n `Sorted ${result.length} of ${alivePasses.length} alive passes. ` +\r\n `Passes in cycle: [${cycleParticipants.join(', ')}]`\r\n );\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _analyzeLifetimes(orderedPasses: RGPass<any>[]): Map<number, RGResourceLifetime> {\r\n const lifetimes = new Map<number, { resource: RGResource; firstUse: number; lastUse: number }>();\r\n\r\n const orderMap = new Map<RGPass<any>, number>();\r\n for (let i = 0; i < orderedPasses.length; i++) {\r\n orderMap.set(orderedPasses[i], i);\r\n }\r\n\r\n for (const res of this._resources.values()) {\r\n let first = Infinity;\r\n let last = -Infinity;\r\n\r\n if (res.producer && orderMap.has(res.producer)) {\r\n const idx = orderMap.get(res.producer)!;\r\n first = Math.min(first, idx);\r\n last = Math.max(last, idx);\r\n }\r\n\r\n for (const consumer of res.consumers) {\r\n if (orderMap.has(consumer)) {\r\n const idx = orderMap.get(consumer)!;\r\n first = Math.min(first, idx);\r\n last = Math.max(last, idx);\r\n }\r\n }\r\n\r\n if (first !== Infinity) {\r\n lifetimes.set(res.id, { resource: res, firstUse: first, lastUse: last });\r\n }\r\n }\r\n\r\n // Attachment textures must outlive every framebuffer use.\r\n for (const lifetime of lifetimes.values()) {\r\n const res = lifetime.resource;\r\n if (res.kind !== 'framebuffer' || !res.desc) {\r\n continue;\r\n }\r\n const desc = res.desc as RGFramebufferDesc;\r\n const extend = (attachment: unknown) => {\r\n if (!(attachment instanceof RGHandle)) {\r\n return;\r\n }\r\n const attachmentLifetime = lifetimes.get(attachment._id);\r\n if (attachmentLifetime) {\r\n attachmentLifetime.firstUse = Math.min(attachmentLifetime.firstUse, lifetime.firstUse);\r\n attachmentLifetime.lastUse = Math.max(attachmentLifetime.lastUse, lifetime.lastUse);\r\n }\r\n };\r\n const colors = Array.isArray(desc.colorAttachments)\r\n ? desc.colorAttachments\r\n : desc.colorAttachments\r\n ? [desc.colorAttachments]\r\n : [];\r\n for (const attachment of colors) {\r\n extend(attachment);\r\n }\r\n extend(desc.depthAttachment);\r\n }\r\n\r\n return lifetimes;\r\n }\r\n}\r\n"],"names":["RenderGraph","_nextResourceId","_resources","Map","_passes","_compiled","_lastWriterByPhysicalId","_warnedCulledPasses","Set","importTexture","name","id","resource","RGResource","set","RGHandle","addPass","setup","nameOccurrence","existing","pass","RGPass","length","builder","_createBuilder","initialResourceIds","keys","data","push","error","has","delete","values","i","consumers","splice","nextWriter","warDependencies","clear","producer","physicalId","compile","outputs","_validateOutputs","_cullDeadPasses","ordered","_topologicalSort","lifetimes","_analyzeLifetimes","_validateAllocationKeys","orderedPasses","execute","compiled","noopCtx","getTexture","Error","getFramebuffer","createFramebuffer","deferCleanup","subpasses","subpass","executeFn","reset","getResource","handle","get","_id","passes","resources","graph","textureLabelOccurrences","read","res","_declareRead","write","options","kind","discard","load","previousWriter","dependencies","orderingDependencies","includes","consumer","versionName","version","desc","allocationKey","writes","createTexture","undefined","label","labelKey","labelOccurrence","JSON","stringify","createToken","tokenName","_declareFramebufferAttachmentDeps","sideEffect","hasSideEffect","addSubpass","fn","RGSubpass","setExecute","physicalByKey","lifetime","existingPhysicalId","latestVersions","current","latest","alive","neededResources","stack","markResourceNeeded","add","markPassAlive","dep","reads","dependency","pop","console","warn","declare","attachment","colors","Array","isArray","colorAttachments","depthAttachment","alivePasses","filter","p","aliveSet","inDegree","adjacency","addEdge","from","to","neighbors","queue","result","shift","neighbor","deg","cycleParticipants","degree","join","orderMap","first","Infinity","last","idx","Math","min","max","firstUse","lastUse","extend","attachmentLifetime"],"mappings":"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"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { Vector4, DEPTH_CLEAR_VALUE } from '@zephyr3d/base';
|
|
2
|
+
import { MaterialVaryingFlags } from '../../values.js';
|
|
3
|
+
import { RenderQueue, InstanceBindGroupAllocator } from '../render_queue.js';
|
|
4
|
+
import { LightPass } from '../lightpass.js';
|
|
5
|
+
import { DepthPass } from '../depthpass.js';
|
|
6
|
+
|
|
7
|
+
// The facade renders to a single color target.
|
|
8
|
+
const SURFACE_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SCENE_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION | MaterialVaryingFlags.SKIN_SSS_STORE;
|
|
9
|
+
const _sceneLightPass = new LightPass();
|
|
10
|
+
const _sceneDepthPass = new DepthPass();
|
|
11
|
+
function snapshotDrawContext(ctx) {
|
|
12
|
+
return {
|
|
13
|
+
renderPass: ctx.renderPass,
|
|
14
|
+
renderPassHash: ctx.renderPassHash,
|
|
15
|
+
shaderVariantHash: ctx.shaderVariantHash,
|
|
16
|
+
flip: ctx.flip,
|
|
17
|
+
drawEnvLight: ctx.drawEnvLight,
|
|
18
|
+
env: ctx.env,
|
|
19
|
+
queue: ctx.queue,
|
|
20
|
+
lightBlending: ctx.lightBlending,
|
|
21
|
+
instanceData: ctx.instanceData,
|
|
22
|
+
oit: ctx.oit,
|
|
23
|
+
currentShadowLight: ctx.currentShadowLight,
|
|
24
|
+
materialFlags: ctx.materialFlags,
|
|
25
|
+
shadowMaskClusterSample: ctx.shadowMaskClusterSample,
|
|
26
|
+
compositor: ctx.compositor,
|
|
27
|
+
depthPrepassAttachment: ctx.depthPrepassAttachment,
|
|
28
|
+
sunLight: ctx.sunLight,
|
|
29
|
+
primaryDirectionalLight: ctx.primaryDirectionalLight,
|
|
30
|
+
primaryTransmissionLight: ctx.primaryTransmissionLight
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function restoreDrawContext(ctx, state) {
|
|
34
|
+
Object.assign(ctx, state);
|
|
35
|
+
}
|
|
36
|
+
/** @internal */ class SceneRenderContextImpl {
|
|
37
|
+
_ctx;
|
|
38
|
+
_rgCtx;
|
|
39
|
+
_ownedQueues = [];
|
|
40
|
+
_cleanupRegistered = false;
|
|
41
|
+
constructor(ctx, rgCtx){
|
|
42
|
+
this._ctx = ctx;
|
|
43
|
+
this._rgCtx = rgCtx;
|
|
44
|
+
}
|
|
45
|
+
get ctx() {
|
|
46
|
+
return this._ctx;
|
|
47
|
+
}
|
|
48
|
+
_own(queue) {
|
|
49
|
+
this._ownedQueues.push(queue);
|
|
50
|
+
if (!this._cleanupRegistered) {
|
|
51
|
+
this._cleanupRegistered = true;
|
|
52
|
+
this._rgCtx.deferCleanup(()=>{
|
|
53
|
+
for (const q of this._ownedQueues){
|
|
54
|
+
q.dispose();
|
|
55
|
+
}
|
|
56
|
+
this._ownedQueues.length = 0;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return queue;
|
|
60
|
+
}
|
|
61
|
+
cull(camera, filter) {
|
|
62
|
+
const cullCamera = camera ?? this._ctx.camera;
|
|
63
|
+
const savedContext = snapshotDrawContext(this._ctx);
|
|
64
|
+
let queue;
|
|
65
|
+
try {
|
|
66
|
+
queue = _sceneLightPass.cullScene(this._ctx, cullCamera);
|
|
67
|
+
} finally{
|
|
68
|
+
restoreDrawContext(this._ctx, savedContext);
|
|
69
|
+
}
|
|
70
|
+
if (!filter) {
|
|
71
|
+
return this._own(queue);
|
|
72
|
+
}
|
|
73
|
+
// Rebuild because cullScene returns an already-finalized queue.
|
|
74
|
+
const filtered = new RenderQueue(_sceneLightPass);
|
|
75
|
+
const itemList = queue.itemList;
|
|
76
|
+
if (itemList) {
|
|
77
|
+
const seen = new Set();
|
|
78
|
+
const bundles = [
|
|
79
|
+
itemList.opaque,
|
|
80
|
+
itemList.transmission,
|
|
81
|
+
itemList.transparent,
|
|
82
|
+
itemList.transmission_trans
|
|
83
|
+
];
|
|
84
|
+
for (const bundle of bundles){
|
|
85
|
+
for (const info of [
|
|
86
|
+
...bundle.lit,
|
|
87
|
+
...bundle.unlit
|
|
88
|
+
]){
|
|
89
|
+
const sources = [
|
|
90
|
+
info.itemList,
|
|
91
|
+
info.skinItemList,
|
|
92
|
+
info.morphItemList,
|
|
93
|
+
info.skinAndMorphItemList,
|
|
94
|
+
info.instanceItemList
|
|
95
|
+
];
|
|
96
|
+
for (const list of sources){
|
|
97
|
+
for (const item of list){
|
|
98
|
+
const drawable = item.drawable;
|
|
99
|
+
if (!seen.has(drawable) && filter(drawable)) {
|
|
100
|
+
seen.add(drawable);
|
|
101
|
+
filtered.push(cullCamera, drawable);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
filtered.primaryDirectionalLight = queue.primaryDirectionalLight;
|
|
109
|
+
filtered.primaryTransmissionLight = queue.primaryTransmissionLight;
|
|
110
|
+
filtered.sunLight = queue.sunLight;
|
|
111
|
+
finalizeQueue(filtered, cullCamera);
|
|
112
|
+
queue.dispose();
|
|
113
|
+
return this._own(filtered);
|
|
114
|
+
}
|
|
115
|
+
createPersistentQueue() {
|
|
116
|
+
const allocator = new InstanceBindGroupAllocator();
|
|
117
|
+
const queue = new RenderQueue(_sceneLightPass, allocator);
|
|
118
|
+
return {
|
|
119
|
+
get queue () {
|
|
120
|
+
return queue;
|
|
121
|
+
},
|
|
122
|
+
clear () {
|
|
123
|
+
queue.reset();
|
|
124
|
+
allocator.reset();
|
|
125
|
+
return this;
|
|
126
|
+
},
|
|
127
|
+
add (drawable, camera) {
|
|
128
|
+
queue.push(camera, drawable);
|
|
129
|
+
return this;
|
|
130
|
+
},
|
|
131
|
+
finalize (camera, createRenderBundles) {
|
|
132
|
+
finalizeQueue(queue, camera, createRenderBundles);
|
|
133
|
+
return this;
|
|
134
|
+
},
|
|
135
|
+
dispose () {
|
|
136
|
+
queue.dispose();
|
|
137
|
+
allocator.dispose();
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
createQueue() {
|
|
142
|
+
const owner = this;
|
|
143
|
+
const queue = new RenderQueue(_sceneLightPass);
|
|
144
|
+
let finalized = false;
|
|
145
|
+
const builder = {
|
|
146
|
+
add (drawable, camera) {
|
|
147
|
+
if (finalized) {
|
|
148
|
+
throw new Error('SceneRenderQueueBuilder: cannot add() after finalize().');
|
|
149
|
+
}
|
|
150
|
+
queue.push(camera ?? owner._ctx.camera, drawable);
|
|
151
|
+
return builder;
|
|
152
|
+
},
|
|
153
|
+
finalize (camera) {
|
|
154
|
+
if (finalized) {
|
|
155
|
+
throw new Error('SceneRenderQueueBuilder: finalize() called more than once.');
|
|
156
|
+
}
|
|
157
|
+
finalized = true;
|
|
158
|
+
finalizeQueue(queue, camera ?? owner._ctx.camera);
|
|
159
|
+
return owner._own(queue);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
return builder;
|
|
163
|
+
}
|
|
164
|
+
renderScene(target, queue, opts) {
|
|
165
|
+
this._renderColor(target, queue, opts, true, true);
|
|
166
|
+
}
|
|
167
|
+
renderOpaque(target, queue, opts) {
|
|
168
|
+
this._renderColor(target, queue, opts, true, false);
|
|
169
|
+
}
|
|
170
|
+
renderTransparent(target, queue, opts) {
|
|
171
|
+
this._renderColor(target, queue, opts, false, true);
|
|
172
|
+
}
|
|
173
|
+
/** @internal */ _renderColor(target, queue, opts, renderOpaque, renderTransparent) {
|
|
174
|
+
const ctx = this._ctx;
|
|
175
|
+
const device = ctx.device;
|
|
176
|
+
const camera = opts?.camera ?? ctx.camera;
|
|
177
|
+
// Restore all shared pass and draw-context state after rendering.
|
|
178
|
+
const savedTransmission = _sceneLightPass.transmission;
|
|
179
|
+
const savedRenderOpaque = _sceneLightPass.renderOpaque;
|
|
180
|
+
const savedRenderTransparent = _sceneLightPass.renderTransparent;
|
|
181
|
+
const savedRenderSky = _sceneLightPass.renderSky;
|
|
182
|
+
const savedClearColor = _sceneLightPass.clearColor;
|
|
183
|
+
const savedClearDepth = _sceneLightPass.clearDepth;
|
|
184
|
+
const savedClearStencil = _sceneLightPass.clearStencil;
|
|
185
|
+
const savedContext = snapshotDrawContext(ctx);
|
|
186
|
+
ctx.depthPrepassAttachment = undefined;
|
|
187
|
+
device.pushDeviceStates();
|
|
188
|
+
try {
|
|
189
|
+
device.setFramebuffer(target);
|
|
190
|
+
device.setViewport(null);
|
|
191
|
+
device.setScissor(null);
|
|
192
|
+
// The facade target has no surface MRT or compositor attachments.
|
|
193
|
+
ctx.materialFlags = savedContext.materialFlags & ~SURFACE_MRT_FLAGS;
|
|
194
|
+
ctx.compositor = null;
|
|
195
|
+
ctx.sunLight = queue.sunLight;
|
|
196
|
+
ctx.primaryDirectionalLight = queue.primaryDirectionalLight;
|
|
197
|
+
ctx.primaryTransmissionLight = queue.primaryTransmissionLight;
|
|
198
|
+
_sceneLightPass.transmission = false;
|
|
199
|
+
_sceneLightPass.renderSky = false;
|
|
200
|
+
_sceneLightPass.renderOpaque = renderOpaque;
|
|
201
|
+
_sceneLightPass.renderTransparent = renderTransparent;
|
|
202
|
+
_sceneLightPass.clearColor = opts && 'clearColor' in opts ? opts.clearColor ?? null : null;
|
|
203
|
+
_sceneLightPass.clearDepth = opts && 'clearDepth' in opts ? opts.clearDepth ?? null : null;
|
|
204
|
+
_sceneLightPass.clearStencil = opts && 'clearStencil' in opts ? opts.clearStencil ?? null : null;
|
|
205
|
+
_sceneLightPass.render(ctx, camera, camera, queue);
|
|
206
|
+
} finally{
|
|
207
|
+
_sceneLightPass.transmission = savedTransmission;
|
|
208
|
+
_sceneLightPass.renderOpaque = savedRenderOpaque;
|
|
209
|
+
_sceneLightPass.renderTransparent = savedRenderTransparent;
|
|
210
|
+
_sceneLightPass.renderSky = savedRenderSky;
|
|
211
|
+
_sceneLightPass.clearColor = savedClearColor ?? null;
|
|
212
|
+
_sceneLightPass.clearDepth = savedClearDepth;
|
|
213
|
+
_sceneLightPass.clearStencil = savedClearStencil;
|
|
214
|
+
restoreDrawContext(ctx, savedContext);
|
|
215
|
+
device.popDeviceStates();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
renderDepth(target, queue, opts) {
|
|
219
|
+
const ctx = this._ctx;
|
|
220
|
+
const device = ctx.device;
|
|
221
|
+
const camera = opts?.camera ?? ctx.camera;
|
|
222
|
+
const colorAttachment = target.getColorAttachments()[0];
|
|
223
|
+
const encodeDepth = colorAttachment?.format === 'rgba8unorm';
|
|
224
|
+
const savedTransmission = _sceneDepthPass.transmission;
|
|
225
|
+
const savedEncodeDepth = _sceneDepthPass.encodeDepth;
|
|
226
|
+
const savedRenderBackface = _sceneDepthPass.renderBackface;
|
|
227
|
+
const savedClearColor = _sceneDepthPass.clearColor;
|
|
228
|
+
const savedClearDepth = _sceneDepthPass.clearDepth;
|
|
229
|
+
const savedClearStencil = _sceneDepthPass.clearStencil;
|
|
230
|
+
const savedContext = snapshotDrawContext(ctx);
|
|
231
|
+
device.pushDeviceStates();
|
|
232
|
+
try {
|
|
233
|
+
device.setFramebuffer(target);
|
|
234
|
+
device.setViewport(null);
|
|
235
|
+
device.setScissor(null);
|
|
236
|
+
ctx.materialFlags = savedContext.materialFlags & ~SURFACE_MRT_FLAGS;
|
|
237
|
+
ctx.sunLight = queue.sunLight;
|
|
238
|
+
ctx.primaryDirectionalLight = queue.primaryDirectionalLight;
|
|
239
|
+
ctx.primaryTransmissionLight = queue.primaryTransmissionLight;
|
|
240
|
+
_sceneDepthPass.transmission = false;
|
|
241
|
+
_sceneDepthPass.renderBackface = false;
|
|
242
|
+
_sceneDepthPass.encodeDepth = encodeDepth;
|
|
243
|
+
_sceneDepthPass.clearColor = opts && 'clearColor' in opts ? opts.clearColor ?? null : encodeDepth ? new Vector4(0, 0, 0, 1) : new Vector4(1, 1, 1, 1);
|
|
244
|
+
_sceneDepthPass.clearDepth = opts && 'clearDepth' in opts ? opts.clearDepth ?? null : DEPTH_CLEAR_VALUE;
|
|
245
|
+
_sceneDepthPass.clearStencil = opts && 'clearStencil' in opts ? opts.clearStencil ?? null : null;
|
|
246
|
+
_sceneDepthPass.render(ctx, camera, camera, queue);
|
|
247
|
+
} finally{
|
|
248
|
+
_sceneDepthPass.transmission = savedTransmission;
|
|
249
|
+
_sceneDepthPass.encodeDepth = savedEncodeDepth;
|
|
250
|
+
_sceneDepthPass.renderBackface = savedRenderBackface;
|
|
251
|
+
_sceneDepthPass.clearColor = savedClearColor ?? null;
|
|
252
|
+
_sceneDepthPass.clearDepth = savedClearDepth;
|
|
253
|
+
_sceneDepthPass.clearStencil = savedClearStencil;
|
|
254
|
+
restoreDrawContext(ctx, savedContext);
|
|
255
|
+
device.popDeviceStates();
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/** @internal */ function finalizeQueue(queue, camera, createRenderBundles) {
|
|
260
|
+
queue.end(camera, createRenderBundles);
|
|
261
|
+
}
|
|
262
|
+
/** Create a scene facade bound to the current graph pass. @public */ function createSceneRenderer(ctx, rgCtx) {
|
|
263
|
+
return new SceneRenderContextImpl(ctx, rgCtx);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export { createSceneRenderer };
|
|
267
|
+
//# sourceMappingURL=scene_render_context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene_render_context.js","sources":["../../../src/render/rendergraph/scene_render_context.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_CLEAR_VALUE, Vector4 } from '@zephyr3d/base';\r\nimport type { FrameBuffer, Texture2D } from '@zephyr3d/device';\r\nimport type { Camera } from '../../camera';\r\nimport { MaterialVaryingFlags } from '../../values';\r\nimport type { DrawContext, Drawable } from '../drawable';\r\nimport { RenderQueue, InstanceBindGroupAllocator } from '../render_queue';\r\nimport { LightPass } from '../lightpass';\r\nimport { DepthPass } from '../depthpass';\r\nimport type { RGExecuteContext } from './types';\r\n\r\n// The facade renders to a single color target.\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SCENE_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE;\r\n\r\nconst _sceneLightPass = new LightPass();\r\nconst _sceneDepthPass = new DepthPass();\r\n\r\ntype DrawContextState = Pick<\r\n DrawContext,\r\n | 'renderPass'\r\n | 'renderPassHash'\r\n | 'shaderVariantHash'\r\n | 'flip'\r\n | 'drawEnvLight'\r\n | 'env'\r\n | 'queue'\r\n | 'lightBlending'\r\n | 'instanceData'\r\n | 'oit'\r\n | 'currentShadowLight'\r\n | 'materialFlags'\r\n | 'shadowMaskClusterSample'\r\n | 'compositor'\r\n | 'depthPrepassAttachment'\r\n | 'sunLight'\r\n | 'primaryDirectionalLight'\r\n | 'primaryTransmissionLight'\r\n>;\r\n\r\nfunction snapshotDrawContext(ctx: DrawContext): DrawContextState {\r\n return {\r\n renderPass: ctx.renderPass,\r\n renderPassHash: ctx.renderPassHash,\r\n shaderVariantHash: ctx.shaderVariantHash,\r\n flip: ctx.flip,\r\n drawEnvLight: ctx.drawEnvLight,\r\n env: ctx.env,\r\n queue: ctx.queue,\r\n lightBlending: ctx.lightBlending,\r\n instanceData: ctx.instanceData,\r\n oit: ctx.oit,\r\n currentShadowLight: ctx.currentShadowLight,\r\n materialFlags: ctx.materialFlags,\r\n shadowMaskClusterSample: ctx.shadowMaskClusterSample,\r\n compositor: ctx.compositor,\r\n depthPrepassAttachment: ctx.depthPrepassAttachment,\r\n sunLight: ctx.sunLight,\r\n primaryDirectionalLight: ctx.primaryDirectionalLight,\r\n primaryTransmissionLight: ctx.primaryTransmissionLight\r\n };\r\n}\r\n\r\nfunction restoreDrawContext(ctx: DrawContext, state: DrawContextState): void {\r\n Object.assign(ctx, state);\r\n}\r\n\r\n/** Test-only access to the facade-owned pass instances. @internal */\r\nexport function _getSceneRenderPassesForTest() {\r\n return { light: _sceneLightPass, depth: _sceneDepthPass };\r\n}\r\n\r\n/** Scene render options. Omitted or null clear values preserve the target. @public */\r\nexport interface SceneRenderOptions {\r\n /** Camera whose uniforms drive the render. Defaults to the frame's `ctx.camera`. */\r\n camera?: Camera;\r\n /** Color clear value. Omit or pass null to skip the color clear. */\r\n clearColor?: Nullable<Vector4>;\r\n /** Depth clear value. Omit or pass null to skip the depth clear. */\r\n clearDepth?: Nullable<number>;\r\n /** Stencil clear value. Omit or pass null to skip the stencil clear. */\r\n clearStencil?: Nullable<number>;\r\n}\r\n\r\n/** Builder for a pass-scoped render queue. Call `finalize` before rendering. @public */\r\nexport interface SceneRenderQueueBuilder {\r\n /** Add a drawable, using the frame camera by default. */\r\n add(drawable: Drawable, camera?: Camera): this;\r\n\r\n /** Finalize batching and return the renderable queue. */\r\n finalize(camera?: Camera): RenderQueue;\r\n}\r\n\r\n/** Caller-owned render queue that can be reused across frames. @public */\r\nexport interface PersistentSceneQueue {\r\n /** Renderable queue, valid after {@link PersistentSceneQueue.finalize}. */\r\n readonly queue: RenderQueue;\r\n\r\n /** Clear the queue for rebuilding. */\r\n clear(): this;\r\n\r\n /** Add a drawable. */\r\n add(drawable: Drawable, camera: Camera): this;\r\n\r\n /** Finalize batching, optionally creating reusable render bundles. */\r\n finalize(camera: Camera, createRenderBundles?: boolean): this;\r\n\r\n /** Release the queue and its private allocator's GPU resources. */\r\n dispose(): void;\r\n}\r\n\r\n/** Scene rendering facade for custom render graph passes. @public */\r\nexport interface SceneRenderContext {\r\n /** The frame draw context (camera, scene, env, device). */\r\n readonly ctx: DrawContext;\r\n\r\n /** Cull into a pass-scoped queue, optionally filtering drawables. */\r\n cull(camera?: Camera, filter?: (drawable: Drawable) => boolean): RenderQueue;\r\n\r\n /** Start building a user-authored queue. */\r\n createQueue(): SceneRenderQueueBuilder;\r\n\r\n /** Render opaque and transparent geometry into `target`. */\r\n renderScene(target: FrameBuffer, queue: RenderQueue, opts?: SceneRenderOptions): void;\r\n\r\n /** Render only the opaque geometry of a queue. See {@link SceneRenderContext.renderScene}. */\r\n renderOpaque(target: FrameBuffer, queue: RenderQueue, opts?: SceneRenderOptions): void;\r\n\r\n /** Render only the transparent geometry of a queue. See {@link SceneRenderContext.renderScene}. */\r\n renderTransparent(target: FrameBuffer, queue: RenderQueue, opts?: SceneRenderOptions): void;\r\n\r\n /** Render a linear-depth pass for a queue's opaque geometry. See {@link SceneRenderContext.renderScene}. */\r\n renderDepth(target: FrameBuffer, queue: RenderQueue, opts?: SceneRenderOptions): void;\r\n\r\n /**\r\n * Create a caller-managed queue. It is not disposed with the current pass.\r\n */\r\n createPersistentQueue(): PersistentSceneQueue;\r\n}\r\n\r\n/** @internal */\r\nclass SceneRenderContextImpl implements SceneRenderContext {\r\n private readonly _ctx: DrawContext;\r\n private readonly _rgCtx: RGExecuteContext;\r\n private readonly _ownedQueues: RenderQueue[] = [];\r\n private _cleanupRegistered = false;\r\n\r\n constructor(ctx: DrawContext, rgCtx: RGExecuteContext) {\r\n this._ctx = ctx;\r\n this._rgCtx = rgCtx;\r\n }\r\n\r\n get ctx(): DrawContext {\r\n return this._ctx;\r\n }\r\n\r\n private _own(queue: RenderQueue): RenderQueue {\r\n this._ownedQueues.push(queue);\r\n if (!this._cleanupRegistered) {\r\n this._cleanupRegistered = true;\r\n this._rgCtx.deferCleanup(() => {\r\n for (const q of this._ownedQueues) {\r\n q.dispose();\r\n }\r\n this._ownedQueues.length = 0;\r\n });\r\n }\r\n return queue;\r\n }\r\n\r\n cull(camera?: Camera, filter?: (drawable: Drawable) => boolean): RenderQueue {\r\n const cullCamera = camera ?? this._ctx.camera;\r\n const savedContext = snapshotDrawContext(this._ctx);\r\n let queue: RenderQueue;\r\n try {\r\n queue = _sceneLightPass.cullScene(this._ctx, cullCamera);\r\n } finally {\r\n restoreDrawContext(this._ctx, savedContext);\r\n }\r\n if (!filter) {\r\n return this._own(queue);\r\n }\r\n // Rebuild because cullScene returns an already-finalized queue.\r\n const filtered = new RenderQueue(_sceneLightPass);\r\n const itemList = queue.itemList;\r\n if (itemList) {\r\n const seen = new Set<Drawable>();\r\n const bundles = [\r\n itemList.opaque,\r\n itemList.transmission,\r\n itemList.transparent,\r\n itemList.transmission_trans\r\n ];\r\n for (const bundle of bundles) {\r\n for (const info of [...bundle.lit, ...bundle.unlit]) {\r\n const sources = [\r\n info.itemList,\r\n info.skinItemList,\r\n info.morphItemList,\r\n info.skinAndMorphItemList,\r\n info.instanceItemList\r\n ];\r\n for (const list of sources) {\r\n for (const item of list) {\r\n const drawable = item.drawable;\r\n if (!seen.has(drawable) && filter(drawable)) {\r\n seen.add(drawable);\r\n filtered.push(cullCamera, drawable);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n filtered.primaryDirectionalLight = queue.primaryDirectionalLight;\r\n filtered.primaryTransmissionLight = queue.primaryTransmissionLight;\r\n filtered.sunLight = queue.sunLight;\r\n finalizeQueue(filtered, cullCamera);\r\n queue.dispose();\r\n return this._own(filtered);\r\n }\r\n\r\n createPersistentQueue(): PersistentSceneQueue {\r\n const allocator = new InstanceBindGroupAllocator();\r\n const queue = new RenderQueue(_sceneLightPass, allocator);\r\n return {\r\n get queue(): RenderQueue {\r\n return queue;\r\n },\r\n clear(): PersistentSceneQueue {\r\n queue.reset();\r\n allocator.reset();\r\n return this;\r\n },\r\n add(drawable: Drawable, camera: Camera): PersistentSceneQueue {\r\n queue.push(camera, drawable);\r\n return this;\r\n },\r\n finalize(camera: Camera, createRenderBundles?: boolean): PersistentSceneQueue {\r\n finalizeQueue(queue, camera, createRenderBundles);\r\n return this;\r\n },\r\n dispose(): void {\r\n queue.dispose();\r\n allocator.dispose();\r\n }\r\n };\r\n }\r\n\r\n createQueue(): SceneRenderQueueBuilder {\r\n const owner = this;\r\n const queue = new RenderQueue(_sceneLightPass);\r\n let finalized = false;\r\n const builder: SceneRenderQueueBuilder = {\r\n add(drawable: Drawable, camera?: Camera): SceneRenderQueueBuilder {\r\n if (finalized) {\r\n throw new Error('SceneRenderQueueBuilder: cannot add() after finalize().');\r\n }\r\n queue.push(camera ?? owner._ctx.camera, drawable);\r\n return builder;\r\n },\r\n finalize(camera?: Camera): RenderQueue {\r\n if (finalized) {\r\n throw new Error('SceneRenderQueueBuilder: finalize() called more than once.');\r\n }\r\n finalized = true;\r\n finalizeQueue(queue, camera ?? owner._ctx.camera);\r\n return owner._own(queue);\r\n }\r\n };\r\n return builder;\r\n }\r\n\r\n renderScene(target: FrameBuffer, queue: RenderQueue, opts?: SceneRenderOptions): void {\r\n this._renderColor(target, queue, opts, true, true);\r\n }\r\n\r\n renderOpaque(target: FrameBuffer, queue: RenderQueue, opts?: SceneRenderOptions): void {\r\n this._renderColor(target, queue, opts, true, false);\r\n }\r\n\r\n renderTransparent(target: FrameBuffer, queue: RenderQueue, opts?: SceneRenderOptions): void {\r\n this._renderColor(target, queue, opts, false, true);\r\n }\r\n\r\n /** @internal */\r\n private _renderColor(\r\n target: FrameBuffer,\r\n queue: RenderQueue,\r\n opts: SceneRenderOptions | undefined,\r\n renderOpaque: boolean,\r\n renderTransparent: boolean\r\n ): void {\r\n const ctx = this._ctx;\r\n const device = ctx.device;\r\n const camera = opts?.camera ?? ctx.camera;\r\n // Restore all shared pass and draw-context state after rendering.\r\n const savedTransmission = _sceneLightPass.transmission;\r\n const savedRenderOpaque = _sceneLightPass.renderOpaque;\r\n const savedRenderTransparent = _sceneLightPass.renderTransparent;\r\n const savedRenderSky = _sceneLightPass.renderSky;\r\n const savedClearColor = _sceneLightPass.clearColor;\r\n const savedClearDepth = _sceneLightPass.clearDepth;\r\n const savedClearStencil = _sceneLightPass.clearStencil;\r\n const savedContext = snapshotDrawContext(ctx);\r\n ctx.depthPrepassAttachment = undefined;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(target);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n // The facade target has no surface MRT or compositor attachments.\r\n ctx.materialFlags = savedContext.materialFlags & ~SURFACE_MRT_FLAGS;\r\n ctx.compositor = null;\r\n ctx.sunLight = queue.sunLight;\r\n ctx.primaryDirectionalLight = queue.primaryDirectionalLight;\r\n ctx.primaryTransmissionLight = queue.primaryTransmissionLight;\r\n _sceneLightPass.transmission = false;\r\n _sceneLightPass.renderSky = false;\r\n _sceneLightPass.renderOpaque = renderOpaque;\r\n _sceneLightPass.renderTransparent = renderTransparent;\r\n _sceneLightPass.clearColor = opts && 'clearColor' in opts ? (opts.clearColor ?? null) : null;\r\n _sceneLightPass.clearDepth = opts && 'clearDepth' in opts ? (opts.clearDepth ?? null) : null;\r\n _sceneLightPass.clearStencil = opts && 'clearStencil' in opts ? (opts.clearStencil ?? null) : null;\r\n _sceneLightPass.render(ctx, camera, camera, queue);\r\n } finally {\r\n _sceneLightPass.transmission = savedTransmission;\r\n _sceneLightPass.renderOpaque = savedRenderOpaque;\r\n _sceneLightPass.renderTransparent = savedRenderTransparent;\r\n _sceneLightPass.renderSky = savedRenderSky;\r\n _sceneLightPass.clearColor = savedClearColor ?? null;\r\n _sceneLightPass.clearDepth = savedClearDepth;\r\n _sceneLightPass.clearStencil = savedClearStencil;\r\n restoreDrawContext(ctx, savedContext);\r\n device.popDeviceStates();\r\n }\r\n }\r\n\r\n renderDepth(target: FrameBuffer, queue: RenderQueue, opts?: SceneRenderOptions): void {\r\n const ctx = this._ctx;\r\n const device = ctx.device;\r\n const camera = opts?.camera ?? ctx.camera;\r\n const colorAttachment = target.getColorAttachments()[0] as Nullable<Texture2D>;\r\n const encodeDepth = colorAttachment?.format === 'rgba8unorm';\r\n const savedTransmission = _sceneDepthPass.transmission;\r\n const savedEncodeDepth = _sceneDepthPass.encodeDepth;\r\n const savedRenderBackface = _sceneDepthPass.renderBackface;\r\n const savedClearColor = _sceneDepthPass.clearColor;\r\n const savedClearDepth = _sceneDepthPass.clearDepth;\r\n const savedClearStencil = _sceneDepthPass.clearStencil;\r\n const savedContext = snapshotDrawContext(ctx);\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(target);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n ctx.materialFlags = savedContext.materialFlags & ~SURFACE_MRT_FLAGS;\r\n ctx.sunLight = queue.sunLight;\r\n ctx.primaryDirectionalLight = queue.primaryDirectionalLight;\r\n ctx.primaryTransmissionLight = queue.primaryTransmissionLight;\r\n _sceneDepthPass.transmission = false;\r\n _sceneDepthPass.renderBackface = false;\r\n _sceneDepthPass.encodeDepth = encodeDepth;\r\n _sceneDepthPass.clearColor =\r\n opts && 'clearColor' in opts\r\n ? (opts.clearColor ?? null)\r\n : encodeDepth\r\n ? new Vector4(0, 0, 0, 1)\r\n : new Vector4(1, 1, 1, 1);\r\n _sceneDepthPass.clearDepth =\r\n opts && 'clearDepth' in opts ? (opts.clearDepth ?? null) : DEPTH_CLEAR_VALUE;\r\n _sceneDepthPass.clearStencil = opts && 'clearStencil' in opts ? (opts.clearStencil ?? null) : null;\r\n _sceneDepthPass.render(ctx, camera, camera, queue);\r\n } finally {\r\n _sceneDepthPass.transmission = savedTransmission;\r\n _sceneDepthPass.encodeDepth = savedEncodeDepth;\r\n _sceneDepthPass.renderBackface = savedRenderBackface;\r\n _sceneDepthPass.clearColor = savedClearColor ?? null;\r\n _sceneDepthPass.clearDepth = savedClearDepth;\r\n _sceneDepthPass.clearStencil = savedClearStencil;\r\n restoreDrawContext(ctx, savedContext);\r\n device.popDeviceStates();\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nfunction finalizeQueue(queue: RenderQueue, camera: Camera, createRenderBundles?: boolean): void {\r\n (queue as unknown as { end(camera: Camera, createRenderBundles?: boolean): RenderQueue }).end(\r\n camera,\r\n createRenderBundles\r\n );\r\n}\r\n\r\n/** Create a scene facade bound to the current graph pass. @public */\r\nexport function createSceneRenderer(ctx: DrawContext, rgCtx: RGExecuteContext): SceneRenderContext {\r\n return new SceneRenderContextImpl(ctx, rgCtx);\r\n}\r\n"],"names":["SURFACE_MRT_FLAGS","MaterialVaryingFlags","SCENE_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SCENE_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","_sceneLightPass","LightPass","_sceneDepthPass","DepthPass","snapshotDrawContext","ctx","renderPass","renderPassHash","shaderVariantHash","flip","drawEnvLight","env","queue","lightBlending","instanceData","oit","currentShadowLight","materialFlags","shadowMaskClusterSample","compositor","depthPrepassAttachment","sunLight","primaryDirectionalLight","primaryTransmissionLight","restoreDrawContext","state","Object","assign","SceneRenderContextImpl","_ctx","_rgCtx","_ownedQueues","_cleanupRegistered","rgCtx","_own","push","deferCleanup","q","dispose","length","cull","camera","filter","cullCamera","savedContext","cullScene","filtered","RenderQueue","itemList","seen","Set","bundles","opaque","transmission","transparent","transmission_trans","bundle","info","lit","unlit","sources","skinItemList","morphItemList","skinAndMorphItemList","instanceItemList","list","item","drawable","has","add","finalizeQueue","createPersistentQueue","allocator","InstanceBindGroupAllocator","clear","reset","finalize","createRenderBundles","createQueue","owner","finalized","builder","Error","renderScene","target","opts","_renderColor","renderOpaque","renderTransparent","device","savedTransmission","savedRenderOpaque","savedRenderTransparent","savedRenderSky","renderSky","savedClearColor","clearColor","savedClearDepth","clearDepth","savedClearStencil","clearStencil","undefined","pushDeviceStates","setFramebuffer","setViewport","setScissor","render","popDeviceStates","renderDepth","colorAttachment","getColorAttachments","encodeDepth","format","savedEncodeDepth","savedRenderBackface","renderBackface","Vector4","DEPTH_CLEAR_VALUE","end","createSceneRenderer"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** A texture and the resolved descriptor it satisfied in the previous execution. */ /** Remembers transient texture identities across executions without owning them. @public */ class RGTextureAffinityCache {
|
|
2
|
+
/** @internal */ _entries = new Map();
|
|
3
|
+
/** Number of logical resources remembered from the last successful execution. */ get size() {
|
|
4
|
+
return this._entries.size;
|
|
5
|
+
}
|
|
6
|
+
/** Remove all remembered allocations without releasing the referenced textures. */ clear() {
|
|
7
|
+
this._entries.clear();
|
|
8
|
+
}
|
|
9
|
+
/** @internal */ getPreferredTexture(allocationKey, descriptorSignature) {
|
|
10
|
+
const entry = this._entries.get(allocationKey);
|
|
11
|
+
return entry?.descriptorSignature === descriptorSignature ? entry.texture : undefined;
|
|
12
|
+
}
|
|
13
|
+
/** @internal */ replace(entries) {
|
|
14
|
+
this._entries = new Map(entries);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { RGTextureAffinityCache };
|
|
19
|
+
//# sourceMappingURL=texture_affinity_cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texture_affinity_cache.js","sources":["../../../src/render/rendergraph/texture_affinity_cache.ts"],"sourcesContent":["/** A texture and the resolved descriptor it satisfied in the previous execution. */\r\ninterface RGTextureAffinityEntry<TTexture> {\r\n texture: TTexture;\r\n descriptorSignature: string;\r\n}\r\n\r\n/** Remembers transient texture identities across executions without owning them. @public */\r\nexport class RGTextureAffinityCache<TTexture = unknown> {\r\n /** @internal */\r\n private _entries = new Map<string, RGTextureAffinityEntry<TTexture>>();\r\n\r\n /** Number of logical resources remembered from the last successful execution. */\r\n get size(): number {\r\n return this._entries.size;\r\n }\r\n\r\n /** Remove all remembered allocations without releasing the referenced textures. */\r\n clear(): void {\r\n this._entries.clear();\r\n }\r\n\r\n /** @internal */\r\n getPreferredTexture(allocationKey: string, descriptorSignature: string): TTexture | undefined {\r\n const entry = this._entries.get(allocationKey);\r\n return entry?.descriptorSignature === descriptorSignature ? entry.texture : undefined;\r\n }\r\n\r\n /** @internal */\r\n replace(entries: ReadonlyMap<string, RGTextureAffinityEntry<TTexture>>): void {\r\n this._entries = new Map(entries);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type { RGTextureAffinityEntry };\r\n"],"names":["RGTextureAffinityCache","_entries","Map","size","clear","getPreferredTexture","allocationKey","descriptorSignature","entry","get","texture","undefined","replace","entries"],"mappings":"AAAA,kLAOO,MAAMA,sBAAAA,CAAAA;AACX,qBACQC,QAAW,GAAA,IAAIC,GAAgD,EAAA;sFAGvE,IAAIC,IAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAACF,QAAQ,CAACE,IAAI;AAC3B;AAEA,wFACAC,KAAc,GAAA;QACZ,IAAI,CAACH,QAAQ,CAACG,KAAK,EAAA;AACrB;AAEA,qBACAC,mBAAAA,CAAoBC,aAAqB,EAAEC,mBAA2B,EAAwB;AAC5F,QAAA,MAAMC,QAAQ,IAAI,CAACP,QAAQ,CAACQ,GAAG,CAACH,aAAAA,CAAAA;AAChC,QAAA,OAAOE,KAAOD,EAAAA,mBAAAA,KAAwBA,mBAAsBC,GAAAA,KAAAA,CAAME,OAAO,GAAGC,SAAAA;AAC9E;qBAGAC,OAAQC,CAAAA,OAA8D,EAAQ;AAC5E,QAAA,IAAI,CAACZ,QAAQ,GAAG,IAAIC,GAAIW,CAAAA,OAAAA,CAAAA;AAC1B;AACF;;;;"}
|