@babylonjs/core 8.17.2 → 8.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/Collisions/intersectionInfo.d.ts +1 -0
  2. package/Collisions/intersectionInfo.js +1 -0
  3. package/Collisions/intersectionInfo.js.map +1 -1
  4. package/Compute/computeShader.d.ts +7 -0
  5. package/Compute/computeShader.js +15 -0
  6. package/Compute/computeShader.js.map +1 -1
  7. package/Engines/Extensions/engine.computeShader.d.ts +2 -1
  8. package/Engines/Extensions/engine.computeShader.js +1 -0
  9. package/Engines/Extensions/engine.computeShader.js.map +1 -1
  10. package/Engines/IDrawContext.d.ts +31 -1
  11. package/Engines/IDrawContext.js.map +1 -1
  12. package/Engines/IMaterialContext.d.ts +1 -0
  13. package/Engines/IMaterialContext.js.map +1 -1
  14. package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +1 -1
  15. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +2 -2
  16. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  17. package/Engines/WebGPU/webgpuComputeContext.js +15 -0
  18. package/Engines/WebGPU/webgpuComputeContext.js.map +1 -1
  19. package/Engines/WebGPU/webgpuDrawContext.d.ts +48 -3
  20. package/Engines/WebGPU/webgpuDrawContext.js +81 -13
  21. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  22. package/Engines/WebGPU/webgpuMaterialContext.d.ts +1 -0
  23. package/Engines/WebGPU/webgpuMaterialContext.js +1 -0
  24. package/Engines/WebGPU/webgpuMaterialContext.js.map +1 -1
  25. package/Engines/WebGPU/webgpuStencilStateComposer.js +7 -3
  26. package/Engines/WebGPU/webgpuStencilStateComposer.js.map +1 -1
  27. package/Engines/abstractEngine.d.ts +4 -1
  28. package/Engines/abstractEngine.js +2 -2
  29. package/Engines/abstractEngine.js.map +1 -1
  30. package/Engines/engine.d.ts +2 -2
  31. package/Engines/nativeEngine.d.ts +1 -1
  32. package/Engines/nativeEngine.js +2 -2
  33. package/Engines/nativeEngine.js.map +1 -1
  34. package/Engines/renderTargetWrapper.d.ts +8 -0
  35. package/Engines/renderTargetWrapper.js +8 -0
  36. package/Engines/renderTargetWrapper.js.map +1 -1
  37. package/Engines/thinEngine.d.ts +2 -3
  38. package/Engines/thinEngine.js +3 -2
  39. package/Engines/thinEngine.js.map +1 -1
  40. package/Engines/webgpuEngine.d.ts +7 -4
  41. package/Engines/webgpuEngine.js +28 -15
  42. package/Engines/webgpuEngine.js.map +1 -1
  43. package/FrameGraph/Node/Blocks/PostProcesses/basePostProcessBlock.d.ts +1 -1
  44. package/FrameGraph/Node/Blocks/PostProcesses/basePostProcessBlock.js.map +1 -1
  45. package/FrameGraph/Passes/renderPass.d.ts +8 -0
  46. package/FrameGraph/Passes/renderPass.js +10 -1
  47. package/FrameGraph/Passes/renderPass.js.map +1 -1
  48. package/FrameGraph/Tasks/PostProcesses/postProcessTask.d.ts +46 -2
  49. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +62 -15
  50. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
  51. package/FrameGraph/Tasks/Texture/clearTextureTask.d.ts +4 -0
  52. package/FrameGraph/Tasks/Texture/clearTextureTask.js +5 -1
  53. package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
  54. package/FrameGraph/frameGraphRenderContext.d.ts +14 -5
  55. package/FrameGraph/frameGraphRenderContext.js +34 -14
  56. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  57. package/FrameGraph/frameGraphTextureManager.d.ts +3 -1
  58. package/FrameGraph/frameGraphTextureManager.js +16 -10
  59. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  60. package/Layers/effectLayer.d.ts +1 -0
  61. package/Layers/effectLayer.js +4 -2
  62. package/Layers/effectLayer.js.map +1 -1
  63. package/Materials/Node/Blocks/PBR/reflectionBlock.d.ts +1 -0
  64. package/Materials/Node/Blocks/PBR/reflectionBlock.js +4 -1
  65. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  66. package/Materials/Node/nodeMaterial.js +7 -0
  67. package/Materials/Node/nodeMaterial.js.map +1 -1
  68. package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
  69. package/Materials/PBR/pbrBaseMaterial.js +8 -6
  70. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  71. package/Materials/drawWrapper.d.ts +34 -2
  72. package/Materials/drawWrapper.js +22 -2
  73. package/Materials/drawWrapper.js.map +1 -1
  74. package/Materials/effectRenderer.d.ts +4 -0
  75. package/Materials/effectRenderer.js +2 -1
  76. package/Materials/effectRenderer.js.map +1 -1
  77. package/Materials/index.d.ts +1 -0
  78. package/Materials/index.js +1 -0
  79. package/Materials/index.js.map +1 -1
  80. package/Materials/material.d.ts +8 -1
  81. package/Materials/material.js +21 -1
  82. package/Materials/material.js.map +1 -1
  83. package/Materials/materialHelper.functions.d.ts +3 -1
  84. package/Materials/materialHelper.functions.js +7 -1
  85. package/Materials/materialHelper.functions.js.map +1 -1
  86. package/Materials/shaderMaterial.js +11 -0
  87. package/Materials/shaderMaterial.js.map +1 -1
  88. package/Materials/standardMaterial.d.ts +1 -0
  89. package/Materials/standardMaterial.js +2 -1
  90. package/Materials/standardMaterial.js.map +1 -1
  91. package/Materials/uniformBuffer.d.ts +6 -0
  92. package/Materials/uniformBuffer.js +8 -0
  93. package/Materials/uniformBuffer.js.map +1 -1
  94. package/Meshes/abstractMesh.js +3 -2
  95. package/Meshes/abstractMesh.js.map +1 -1
  96. package/Meshes/mesh.js +6 -0
  97. package/Meshes/mesh.js.map +1 -1
  98. package/Misc/fileTools.js +1 -1
  99. package/Misc/fileTools.js.map +1 -1
  100. package/States/index.d.ts +1 -0
  101. package/States/index.js +1 -0
  102. package/States/index.js.map +1 -1
  103. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"frameGraphRenderContext.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphRenderContext.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n Nullable,\r\n AbstractEngine,\r\n DrawWrapper,\r\n IColor4Like,\r\n Layer,\r\n FrameGraphTextureHandle,\r\n Effect,\r\n FrameGraphTextureManager,\r\n ObjectRenderer,\r\n Scene,\r\n FrameGraphRenderTarget,\r\n InternalTexture,\r\n UtilityLayerRenderer,\r\n} from \"core/index\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EffectRenderer } from \"../Materials/effectRenderer\";\r\nimport { CopyTextureToTexture } from \"../Misc/copyTextureToTexture\";\r\nimport { FrameGraphContext } from \"./frameGraphContext\";\r\n\r\n/**\r\n * Frame graph context used render passes.\r\n * @experimental\r\n */\r\nexport class FrameGraphRenderContext extends FrameGraphContext {\r\n private readonly _effectRenderer: EffectRenderer;\r\n private _currentRenderTarget: FrameGraphRenderTarget | undefined;\r\n private _debugMessageWhenTargetBound: string | undefined;\r\n private _debugMessageHasBeenPushed = false;\r\n private _renderTargetIsBound = true;\r\n private readonly _copyTexture: CopyTextureToTexture;\r\n\r\n private static _IsObjectRenderer(value: Layer | ObjectRenderer | UtilityLayerRenderer): value is ObjectRenderer {\r\n return (value as ObjectRenderer).initRender !== undefined;\r\n }\r\n\r\n /** @internal */\r\n constructor(engine: AbstractEngine, textureManager: FrameGraphTextureManager, scene: Scene) {\r\n super(engine, textureManager, scene);\r\n this._effectRenderer = new EffectRenderer(this._engine);\r\n this._copyTexture = new CopyTextureToTexture(this._engine);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's color or depth texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's color or depth texture, otherwise false\r\n */\r\n public isBackbuffer(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager.isBackbuffer(handle);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's color texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's color texture, otherwise false\r\n */\r\n public isBackbufferColor(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager.isBackbufferColor(handle);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's depth texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's depth texture, otherwise false\r\n */\r\n public isBackbufferDepthStencil(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager.isBackbufferDepthStencil(handle);\r\n }\r\n\r\n /**\r\n * Creates a (frame graph) render target wrapper\r\n * Note that renderTargets or renderTargetDepth can be undefined, but not both at the same time!\r\n * @param name Name of the render target wrapper\r\n * @param renderTargets Render target handles (textures) to use\r\n * @param renderTargetDepth Render target depth handle (texture) to use\r\n * @returns The created render target wrapper\r\n */\r\n public createRenderTarget(\r\n name: string,\r\n renderTargets?: FrameGraphTextureHandle | FrameGraphTextureHandle[],\r\n renderTargetDepth?: FrameGraphTextureHandle\r\n ): FrameGraphRenderTarget {\r\n return this._textureManager.createRenderTarget(name, renderTargets, renderTargetDepth);\r\n }\r\n\r\n /**\r\n * Clears the current render buffer or the current render target (if any is set up)\r\n * @param color Defines the color to use\r\n * @param backBuffer Defines if the back buffer must be cleared\r\n * @param depth Defines if the depth buffer must be cleared\r\n * @param stencil Defines if the stencil buffer must be cleared\r\n */\r\n public clear(color: Nullable<IColor4Like>, backBuffer: boolean, depth: boolean, stencil?: boolean): void {\r\n this._applyRenderTarget();\r\n this._engine.clear(color, backBuffer, depth, stencil);\r\n }\r\n\r\n /**\r\n * Clears the color attachments of the current render target\r\n * @param color Defines the color to use\r\n * @param attachments The attachments to clear\r\n */\r\n public clearColorAttachments(color: Nullable<IColor4Like>, attachments: number[]): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n this._engine.clear(color, true, false, false);\r\n }\r\n\r\n /**\r\n * Clears all attachments (color(s) + depth/stencil) of the current render target\r\n * @param color Defines the color to use\r\n * @param attachments The attachments to clear\r\n * @param backBuffer Defines if the back buffer must be cleared\r\n * @param depth Defines if the depth buffer must be cleared\r\n * @param stencil Defines if the stencil buffer must be cleared\r\n */\r\n public clearAttachments(color: Nullable<IColor4Like>, attachments: number[], backBuffer: boolean, depth: boolean, stencil?: boolean): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n this._engine.clear(color, backBuffer, depth, stencil);\r\n }\r\n\r\n /**\r\n * Binds the attachments to the current render target\r\n * @param attachments The attachments to bind\r\n */\r\n public bindAttachments(attachments: number[]): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n }\r\n\r\n /**\r\n * Generates mipmaps for the current render target\r\n */\r\n public generateMipMaps(): void {\r\n if (this._currentRenderTarget?.renderTargetWrapper === undefined) {\r\n return;\r\n }\r\n\r\n if (this._renderTargetIsBound && this._engine._currentRenderTarget) {\r\n // we can't generate the mipmaps if the render target is bound\r\n this._flushDebugMessages();\r\n this._engine.unBindFramebuffer(this._engine._currentRenderTarget);\r\n this._renderTargetIsBound = false;\r\n }\r\n\r\n const textures = this._currentRenderTarget.renderTargetWrapper.textures;\r\n if (textures) {\r\n for (const texture of textures) {\r\n this._engine.generateMipmaps(texture);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the texture sampling mode for a given texture handle\r\n * @param handle Handle of the texture to set the sampling mode for\r\n * @param samplingMode Sampling mode to set\r\n */\r\n public setTextureSamplingMode(handle: FrameGraphTextureHandle, samplingMode: number): void {\r\n const internalTexture = this._textureManager.getTextureFromHandle(handle);\r\n if (internalTexture && internalTexture.samplingMode !== samplingMode) {\r\n this._engine.updateTextureSamplingMode(samplingMode, internalTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Binds a texture handle to a given effect (resolves the handle to a texture and binds it to the effect)\r\n * @param effect The effect to bind the texture to\r\n * @param name The name of the texture in the effect\r\n * @param handle The handle of the texture to bind\r\n */\r\n public bindTextureHandle(effect: Effect, name: string, handle: FrameGraphTextureHandle): void {\r\n let texture: Nullable<InternalTexture>;\r\n\r\n const historyEntry = this._textureManager._historyTextures.get(handle);\r\n if (historyEntry) {\r\n texture = historyEntry.textures[historyEntry.index]; // texture we write to in this frame\r\n if (\r\n this._currentRenderTarget !== undefined &&\r\n this._currentRenderTarget.renderTargetWrapper !== undefined &&\r\n this._currentRenderTarget.renderTargetWrapper.textures!.includes(texture!)\r\n ) {\r\n // If the current render target renders to the history write texture, we bind the read texture instead\r\n texture = historyEntry.textures[historyEntry.index ^ 1];\r\n }\r\n } else {\r\n texture = this._textureManager._textures.get(handle)!.texture;\r\n }\r\n\r\n effect._bindTexture(name, texture);\r\n }\r\n\r\n /**\r\n * Applies a full-screen effect to the current render target\r\n * @param drawWrapper The draw wrapper containing the effect to apply\r\n * @param customBindings The custom bindings to use when applying the effect (optional)\r\n * @returns True if the effect was applied, otherwise false (effect not ready)\r\n */\r\n public applyFullScreenEffect(drawWrapper: DrawWrapper, customBindings?: () => void): boolean {\r\n if (!drawWrapper.effect?.isReady()) {\r\n return false;\r\n }\r\n\r\n this._applyRenderTarget();\r\n\r\n const engineDepthMask = this._engine.getDepthWrite(); // for some reasons, depthWrite is not restored by EffectRenderer.restoreStates\r\n\r\n this._effectRenderer.saveStates();\r\n this._effectRenderer.setViewport();\r\n\r\n this._engine.enableEffect(drawWrapper);\r\n this._engine.setState(false);\r\n this._engine.setDepthBuffer(false);\r\n this._engine.setDepthWrite(false);\r\n\r\n this._effectRenderer.bindBuffers(drawWrapper.effect);\r\n customBindings?.();\r\n this._effectRenderer.draw();\r\n this._effectRenderer.restoreStates();\r\n this._engine.setDepthWrite(engineDepthMask);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Copies a texture to the current render target\r\n * @param sourceTexture The source texture to copy from\r\n * @param forceCopyToBackbuffer If true, the copy will be done to the back buffer regardless of the current render target\r\n */\r\n public copyTexture(sourceTexture: FrameGraphTextureHandle, forceCopyToBackbuffer = false): void {\r\n if (forceCopyToBackbuffer) {\r\n this.bindRenderTarget();\r\n }\r\n this._applyRenderTarget();\r\n this._copyTexture.copy(this._textureManager.getTextureFromHandle(sourceTexture)!);\r\n }\r\n\r\n /**\r\n * Renders a RenderTargetTexture or a layer\r\n * @param object The RenderTargetTexture/Layer to render\r\n * @param viewportWidth The width of the viewport (optional for Layer, but mandatory for ObjectRenderer)\r\n * @param viewportHeight The height of the viewport (optional for Layer, but mandatory for ObjectRenderer)\r\n */\r\n public render(object: Layer | ObjectRenderer | UtilityLayerRenderer, viewportWidth?: number, viewportHeight?: number): void {\r\n if (FrameGraphRenderContext._IsObjectRenderer(object)) {\r\n this._scene._intermediateRendering = true;\r\n if (object.shouldRender()) {\r\n this._scene.incrementRenderId();\r\n this._scene.resetCachedMaterial();\r\n\r\n this._applyRenderTarget();\r\n\r\n object.prepareRenderList();\r\n\r\n object.initRender(viewportWidth!, viewportHeight!);\r\n\r\n object.render();\r\n\r\n object.finishRender();\r\n }\r\n this._scene._intermediateRendering = false;\r\n } else {\r\n this._applyRenderTarget();\r\n object.render();\r\n }\r\n }\r\n\r\n /**\r\n * Binds a render target texture so that upcoming draw calls will render to it\r\n * Note: it is a lazy operation, so the render target will only be bound when needed. This way, it is possible to call\r\n * this method several times with different render targets without incurring the cost of binding if no draw calls are made\r\n * @param renderTarget The handle of the render target texture to bind (default: undefined, meaning \"back buffer\"). Pass an array for MRT rendering.\r\n * @param debugMessage Optional debug message to display when the render target is bound (visible in PIX, for example)\r\n */\r\n public bindRenderTarget(renderTarget?: FrameGraphRenderTarget, debugMessage?: string) {\r\n if (\r\n (renderTarget?.renderTargetWrapper === undefined && this._currentRenderTarget === undefined) ||\r\n (renderTarget && this._currentRenderTarget && renderTarget.equals(this._currentRenderTarget))\r\n ) {\r\n this._flushDebugMessages();\r\n if (debugMessage !== undefined) {\r\n this._engine._debugPushGroup?.(debugMessage, 2);\r\n this._debugMessageWhenTargetBound = undefined;\r\n this._debugMessageHasBeenPushed = true;\r\n }\r\n return;\r\n }\r\n this._currentRenderTarget = renderTarget?.renderTargetWrapper === undefined ? undefined : renderTarget;\r\n this._debugMessageWhenTargetBound = debugMessage;\r\n this._renderTargetIsBound = false;\r\n }\r\n\r\n /** @internal */\r\n public _flushDebugMessages() {\r\n if (this._debugMessageHasBeenPushed) {\r\n this._engine._debugPopGroup?.(2);\r\n this._debugMessageHasBeenPushed = false;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _applyRenderTarget() {\r\n if (this._renderTargetIsBound) {\r\n return;\r\n }\r\n\r\n this._flushDebugMessages();\r\n\r\n const renderTargetWrapper = this._currentRenderTarget?.renderTargetWrapper;\r\n\r\n if (renderTargetWrapper === undefined) {\r\n this._engine.restoreDefaultFramebuffer();\r\n } else {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.unBindFramebuffer(this._engine._currentRenderTarget);\r\n }\r\n this._engine.bindFramebuffer(renderTargetWrapper);\r\n }\r\n\r\n if (this._debugMessageWhenTargetBound !== undefined) {\r\n this._engine._debugPushGroup?.(this._debugMessageWhenTargetBound, 2);\r\n this._debugMessageWhenTargetBound = undefined;\r\n this._debugMessageHasBeenPushed = true;\r\n }\r\n\r\n this._renderTargetIsBound = true;\r\n }\r\n\r\n /** @internal */\r\n public _isReady(): boolean {\r\n return this._copyTexture.isReady();\r\n }\r\n\r\n /** @internal */\r\n public _dispose() {\r\n this._effectRenderer.dispose();\r\n this._copyTexture.dispose();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"frameGraphRenderContext.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphRenderContext.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n Nullable,\r\n AbstractEngine,\r\n DrawWrapper,\r\n IColor4Like,\r\n Layer,\r\n FrameGraphTextureHandle,\r\n Effect,\r\n FrameGraphTextureManager,\r\n ObjectRenderer,\r\n Scene,\r\n FrameGraphRenderTarget,\r\n InternalTexture,\r\n UtilityLayerRenderer,\r\n IStencilState,\r\n} from \"core/index\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EffectRenderer } from \"../Materials/effectRenderer\";\r\nimport { CopyTextureToTexture } from \"../Misc/copyTextureToTexture\";\r\nimport { FrameGraphContext } from \"./frameGraphContext\";\r\n\r\n/**\r\n * Frame graph context used render passes.\r\n * @experimental\r\n */\r\nexport class FrameGraphRenderContext extends FrameGraphContext {\r\n private readonly _effectRenderer: EffectRenderer;\r\n private readonly _effectRendererBack: EffectRenderer;\r\n private _currentRenderTarget: FrameGraphRenderTarget | undefined;\r\n private _debugMessageWhenTargetBound: string | undefined;\r\n private _debugMessageHasBeenPushed = false;\r\n private _renderTargetIsBound = true;\r\n private readonly _copyTexture: CopyTextureToTexture;\r\n\r\n private static _IsObjectRenderer(value: Layer | ObjectRenderer | UtilityLayerRenderer): value is ObjectRenderer {\r\n return (value as ObjectRenderer).initRender !== undefined;\r\n }\r\n\r\n /** @internal */\r\n constructor(engine: AbstractEngine, textureManager: FrameGraphTextureManager, scene: Scene) {\r\n super(engine, textureManager, scene);\r\n this._effectRenderer = new EffectRenderer(this._engine);\r\n this._effectRendererBack = new EffectRenderer(this._engine, {\r\n positions: [1, 1, -1, 1, -1, -1, 1, -1],\r\n indices: [0, 2, 1, 0, 3, 2],\r\n });\r\n this._copyTexture = new CopyTextureToTexture(this._engine);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's color or depth texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's color or depth texture, otherwise false\r\n */\r\n public isBackbuffer(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager.isBackbuffer(handle);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's color texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's color texture, otherwise false\r\n */\r\n public isBackbufferColor(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager.isBackbufferColor(handle);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's depth texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's depth texture, otherwise false\r\n */\r\n public isBackbufferDepthStencil(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager.isBackbufferDepthStencil(handle);\r\n }\r\n\r\n /**\r\n * Creates a (frame graph) render target wrapper\r\n * Note that renderTargets or renderTargetDepth can be undefined, but not both at the same time!\r\n * @param name Name of the render target wrapper\r\n * @param renderTargets Render target handles (textures) to use\r\n * @param renderTargetDepth Render target depth handle (texture) to use\r\n * @param depthReadOnly If true, the depth buffer will be read-only\r\n * @param stencilReadOnly If true, the stencil buffer will be read-only\r\n * @returns The created render target wrapper\r\n */\r\n public createRenderTarget(\r\n name: string,\r\n renderTargets?: FrameGraphTextureHandle | FrameGraphTextureHandle[],\r\n renderTargetDepth?: FrameGraphTextureHandle,\r\n depthReadOnly?: boolean,\r\n stencilReadOnly?: boolean\r\n ): FrameGraphRenderTarget {\r\n return this._textureManager.createRenderTarget(name, renderTargets, renderTargetDepth, depthReadOnly, stencilReadOnly);\r\n }\r\n\r\n /**\r\n * Clears the current render buffer or the current render target (if any is set up)\r\n * @param color Defines the color to use\r\n * @param backBuffer Defines if the back buffer must be cleared\r\n * @param depth Defines if the depth buffer must be cleared\r\n * @param stencil Defines if the stencil buffer must be cleared\r\n * @param stencilClearValue Defines the value to use to clear the stencil buffer (default is 0)\r\n */\r\n public clear(color: Nullable<IColor4Like>, backBuffer: boolean, depth: boolean, stencil?: boolean, stencilClearValue = 0): void {\r\n this._applyRenderTarget();\r\n this._engine.clear(color, backBuffer, depth, stencil, stencilClearValue);\r\n }\r\n\r\n /**\r\n * Clears the color attachments of the current render target\r\n * @param color Defines the color to use\r\n * @param attachments The attachments to clear\r\n */\r\n public clearColorAttachments(color: Nullable<IColor4Like>, attachments: number[]): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n this._engine.clear(color, true, false, false);\r\n }\r\n\r\n /**\r\n * Clears all attachments (color(s) + depth/stencil) of the current render target\r\n * @param color Defines the color to use\r\n * @param attachments The attachments to clear\r\n * @param backBuffer Defines if the back buffer must be cleared\r\n * @param depth Defines if the depth buffer must be cleared\r\n * @param stencil Defines if the stencil buffer must be cleared\r\n * @param stencilClearValue Defines the value to use to clear the stencil buffer (default is 0)\r\n */\r\n public clearAttachments(color: Nullable<IColor4Like>, attachments: number[], backBuffer: boolean, depth: boolean, stencil?: boolean, stencilClearValue = 0): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n this._engine.clear(color, backBuffer, depth, stencil, stencilClearValue);\r\n }\r\n\r\n /**\r\n * Binds the attachments to the current render target\r\n * @param attachments The attachments to bind\r\n */\r\n public bindAttachments(attachments: number[]): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n }\r\n\r\n /**\r\n * Generates mipmaps for the current render target\r\n */\r\n public generateMipMaps(): void {\r\n if (this._currentRenderTarget?.renderTargetWrapper === undefined) {\r\n return;\r\n }\r\n\r\n if (this._renderTargetIsBound && this._engine._currentRenderTarget) {\r\n // we can't generate the mipmaps if the render target is bound\r\n this._flushDebugMessages();\r\n this._engine.unBindFramebuffer(this._engine._currentRenderTarget);\r\n this._renderTargetIsBound = false;\r\n }\r\n\r\n const textures = this._currentRenderTarget.renderTargetWrapper.textures;\r\n if (textures) {\r\n for (const texture of textures) {\r\n this._engine.generateMipmaps(texture);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the texture sampling mode for a given texture handle\r\n * @param handle Handle of the texture to set the sampling mode for\r\n * @param samplingMode Sampling mode to set\r\n */\r\n public setTextureSamplingMode(handle: FrameGraphTextureHandle, samplingMode: number): void {\r\n const internalTexture = this._textureManager.getTextureFromHandle(handle);\r\n if (internalTexture && internalTexture.samplingMode !== samplingMode) {\r\n this._engine.updateTextureSamplingMode(samplingMode, internalTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Binds a texture handle to a given effect (resolves the handle to a texture and binds it to the effect)\r\n * @param effect The effect to bind the texture to\r\n * @param name The name of the texture in the effect\r\n * @param handle The handle of the texture to bind\r\n */\r\n public bindTextureHandle(effect: Effect, name: string, handle: FrameGraphTextureHandle): void {\r\n let texture: Nullable<InternalTexture>;\r\n\r\n const historyEntry = this._textureManager._historyTextures.get(handle);\r\n if (historyEntry) {\r\n texture = historyEntry.textures[historyEntry.index]; // texture we write to in this frame\r\n if (\r\n this._currentRenderTarget !== undefined &&\r\n this._currentRenderTarget.renderTargetWrapper !== undefined &&\r\n this._currentRenderTarget.renderTargetWrapper.textures!.includes(texture!)\r\n ) {\r\n // If the current render target renders to the history write texture, we bind the read texture instead\r\n texture = historyEntry.textures[historyEntry.index ^ 1];\r\n }\r\n } else {\r\n texture = this._textureManager._textures.get(handle)!.texture;\r\n }\r\n\r\n effect._bindTexture(name, texture);\r\n }\r\n\r\n /**\r\n * Applies a full-screen effect to the current render target\r\n * @param drawWrapper The draw wrapper containing the effect to apply\r\n * @param customBindings The custom bindings to use when applying the effect (optional)\r\n * @param stencilState The stencil state to use when applying the effect (optional)\r\n * @param disableColorWrite If true, color write will be disabled when applying the effect (optional)\r\n * @param drawBackFace If true, the fullscreen quad will be drawn as a back face (in CW - optional)\r\n * @param depthTest If true, depth testing will be enabled when applying the effect (default is false)\r\n * @returns True if the effect was applied, otherwise false (effect not ready)\r\n */\r\n public applyFullScreenEffect(\r\n drawWrapper: DrawWrapper,\r\n customBindings?: () => void,\r\n stencilState?: IStencilState,\r\n disableColorWrite?: boolean,\r\n drawBackFace?: boolean,\r\n depthTest?: boolean\r\n ): boolean {\r\n if (!drawWrapper.effect?.isReady()) {\r\n return false;\r\n }\r\n\r\n this._applyRenderTarget();\r\n\r\n const engineDepthMask = this._engine.getDepthWrite(); // for some reasons, depthWrite is not restored by EffectRenderer.restoreStates\r\n\r\n const effectRenderer = drawBackFace ? this._effectRendererBack : this._effectRenderer;\r\n\r\n effectRenderer.saveStates();\r\n effectRenderer.setViewport();\r\n\r\n this._engine.enableEffect(drawWrapper);\r\n this._engine.setState(false, undefined, undefined, undefined, undefined, stencilState);\r\n this._engine.setDepthBuffer(!!depthTest);\r\n if (disableColorWrite) {\r\n this._engine.setColorWrite(false);\r\n }\r\n this._engine.setDepthWrite(false);\r\n\r\n effectRenderer.bindBuffers(drawWrapper.effect);\r\n customBindings?.();\r\n effectRenderer.draw();\r\n effectRenderer.restoreStates();\r\n if (disableColorWrite) {\r\n this._engine.setColorWrite(true);\r\n }\r\n this._engine.setDepthWrite(engineDepthMask);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Copies a texture to the current render target\r\n * @param sourceTexture The source texture to copy from\r\n * @param forceCopyToBackbuffer If true, the copy will be done to the back buffer regardless of the current render target\r\n */\r\n public copyTexture(sourceTexture: FrameGraphTextureHandle, forceCopyToBackbuffer = false): void {\r\n if (forceCopyToBackbuffer) {\r\n this.bindRenderTarget();\r\n }\r\n this._applyRenderTarget();\r\n this._copyTexture.copy(this._textureManager.getTextureFromHandle(sourceTexture)!);\r\n }\r\n\r\n /**\r\n * Renders a RenderTargetTexture or a layer\r\n * @param object The RenderTargetTexture/Layer to render\r\n * @param viewportWidth The width of the viewport (optional for Layer, but mandatory for ObjectRenderer)\r\n * @param viewportHeight The height of the viewport (optional for Layer, but mandatory for ObjectRenderer)\r\n */\r\n public render(object: Layer | ObjectRenderer | UtilityLayerRenderer, viewportWidth?: number, viewportHeight?: number): void {\r\n if (FrameGraphRenderContext._IsObjectRenderer(object)) {\r\n this._scene._intermediateRendering = true;\r\n if (object.shouldRender()) {\r\n this._scene.incrementRenderId();\r\n this._scene.resetCachedMaterial();\r\n\r\n this._applyRenderTarget();\r\n\r\n object.prepareRenderList();\r\n\r\n object.initRender(viewportWidth!, viewportHeight!);\r\n\r\n object.render();\r\n\r\n object.finishRender();\r\n }\r\n this._scene._intermediateRendering = false;\r\n } else {\r\n this._applyRenderTarget();\r\n object.render();\r\n }\r\n }\r\n\r\n /**\r\n * Binds a render target texture so that upcoming draw calls will render to it\r\n * Note: it is a lazy operation, so the render target will only be bound when needed. This way, it is possible to call\r\n * this method several times with different render targets without incurring the cost of binding if no draw calls are made\r\n * @param renderTarget The handle of the render target texture to bind (default: undefined, meaning \"back buffer\"). Pass an array for MRT rendering.\r\n * @param debugMessage Optional debug message to display when the render target is bound (visible in PIX, for example)\r\n */\r\n public bindRenderTarget(renderTarget?: FrameGraphRenderTarget, debugMessage?: string) {\r\n if (\r\n (renderTarget?.renderTargetWrapper === undefined && this._currentRenderTarget === undefined) ||\r\n (renderTarget && this._currentRenderTarget && renderTarget.equals(this._currentRenderTarget))\r\n ) {\r\n this._flushDebugMessages();\r\n if (debugMessage !== undefined) {\r\n this._engine._debugPushGroup?.(debugMessage, 2);\r\n this._debugMessageWhenTargetBound = undefined;\r\n this._debugMessageHasBeenPushed = true;\r\n }\r\n return;\r\n }\r\n this._currentRenderTarget = renderTarget?.renderTargetWrapper === undefined ? undefined : renderTarget;\r\n this._debugMessageWhenTargetBound = debugMessage;\r\n this._renderTargetIsBound = false;\r\n }\r\n\r\n /** @internal */\r\n public _flushDebugMessages() {\r\n if (this._debugMessageHasBeenPushed) {\r\n this._engine._debugPopGroup?.(2);\r\n this._debugMessageHasBeenPushed = false;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _applyRenderTarget() {\r\n if (this._renderTargetIsBound) {\r\n return;\r\n }\r\n\r\n this._flushDebugMessages();\r\n\r\n const renderTargetWrapper = this._currentRenderTarget?.renderTargetWrapper;\r\n\r\n if (renderTargetWrapper === undefined) {\r\n this._engine.restoreDefaultFramebuffer();\r\n } else {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.unBindFramebuffer(this._engine._currentRenderTarget);\r\n }\r\n this._engine.bindFramebuffer(renderTargetWrapper);\r\n }\r\n\r\n if (this._debugMessageWhenTargetBound !== undefined) {\r\n this._engine._debugPushGroup?.(this._debugMessageWhenTargetBound, 2);\r\n this._debugMessageWhenTargetBound = undefined;\r\n this._debugMessageHasBeenPushed = true;\r\n }\r\n\r\n this._renderTargetIsBound = true;\r\n }\r\n\r\n /** @internal */\r\n public _isReady(): boolean {\r\n return this._copyTexture.isReady();\r\n }\r\n\r\n /** @internal */\r\n public _dispose() {\r\n this._effectRenderer.dispose();\r\n this._effectRendererBack.dispose();\r\n this._copyTexture.dispose();\r\n }\r\n}\r\n"]}
@@ -132,9 +132,11 @@ export declare class FrameGraphTextureManager {
132
132
  * @param name Name of the render target wrapper
133
133
  * @param renderTargets Render target handles (textures) to use
134
134
  * @param renderTargetDepth Render target depth handle (texture) to use
135
+ * @param depthReadOnly If true, the depth buffer will be read-only
136
+ * @param stencilReadOnly If true, the stencil buffer will be read-only
135
137
  * @returns The created render target wrapper
136
138
  */
137
- createRenderTarget(name: string, renderTargets?: FrameGraphTextureHandle | FrameGraphTextureHandle[], renderTargetDepth?: FrameGraphTextureHandle): FrameGraphRenderTarget;
139
+ createRenderTarget(name: string, renderTargets?: FrameGraphTextureHandle | FrameGraphTextureHandle[], renderTargetDepth?: FrameGraphTextureHandle, depthReadOnly?: boolean, stencilReadOnly?: boolean): FrameGraphRenderTarget;
138
140
  /**
139
141
  * Creates a handle which is not associated with any texture.
140
142
  * Call resolveDanglingHandle to associate the handle with a valid texture handle.
@@ -208,20 +208,26 @@ export class FrameGraphTextureManager {
208
208
  * @param name Name of the render target wrapper
209
209
  * @param renderTargets Render target handles (textures) to use
210
210
  * @param renderTargetDepth Render target depth handle (texture) to use
211
+ * @param depthReadOnly If true, the depth buffer will be read-only
212
+ * @param stencilReadOnly If true, the stencil buffer will be read-only
211
213
  * @returns The created render target wrapper
212
214
  */
213
- createRenderTarget(name, renderTargets, renderTargetDepth) {
215
+ createRenderTarget(name, renderTargets, renderTargetDepth, depthReadOnly, stencilReadOnly) {
214
216
  const renderTarget = new FrameGraphRenderTarget(name, this, renderTargets, renderTargetDepth);
215
217
  const rtw = renderTarget.renderTargetWrapper;
216
- if (rtw !== undefined && renderTargets) {
217
- const handles = Array.isArray(renderTargets) ? renderTargets : [renderTargets];
218
- for (let i = 0; i < handles.length; i++) {
219
- let handle = handles[i];
220
- handle = this._textures.get(handle)?.refHandle ?? handle;
221
- const historyEntry = this._historyTextures.get(handle);
222
- if (historyEntry) {
223
- historyEntry.references.push({ renderTargetWrapper: rtw, textureIndex: i });
224
- rtw.setTexture(historyEntry.textures[historyEntry.index], i, false);
218
+ if (rtw !== undefined) {
219
+ rtw.depthReadOnly = !!depthReadOnly;
220
+ rtw.stencilReadOnly = !!stencilReadOnly;
221
+ if (renderTargets) {
222
+ const handles = Array.isArray(renderTargets) ? renderTargets : [renderTargets];
223
+ for (let i = 0; i < handles.length; i++) {
224
+ let handle = handles[i];
225
+ handle = this._textures.get(handle)?.refHandle ?? handle;
226
+ const historyEntry = this._historyTextures.get(handle);
227
+ if (historyEntry) {
228
+ historyEntry.references.push({ renderTargetWrapper: rtw, textureIndex: i });
229
+ rtw.setTexture(historyEntry.textures[historyEntry.index], i, false);
230
+ }
225
231
  }
226
232
  }
227
233
  }
@@ -1 +1 @@
1
- {"version":3,"file":"frameGraphTextureManager.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphTextureManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n Scene,\r\n AbstractEngine,\r\n TextureSize,\r\n Nullable,\r\n FrameGraphTextureCreationOptions,\r\n FrameGraphTextureHandle,\r\n InternalTextureCreationOptions,\r\n InternalTexture,\r\n FrameGraphTextureOptions,\r\n FrameGraphTextureDescription,\r\n RenderTargetWrapper,\r\n FrameGraphTask,\r\n IFrameGraphPass,\r\n} from \"core/index\";\r\nimport { getDimensionsFromTextureSize, textureSizeIsObject } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { backbufferColorTextureHandle, backbufferDepthStencilTextureHandle } from \"./frameGraphTypes\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport { FrameGraphRenderTarget } from \"./frameGraphRenderTarget\";\r\nimport { FrameGraphRenderPass } from \"./Passes/renderPass\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { GetTypeForDepthTexture, IsDepthTexture, HasStencilAspect } from \"core/Materials/Textures/textureHelper.functions\";\r\n\r\ntype HistoryTexture = {\r\n textures: Array<Nullable<InternalTexture>>;\r\n handles: Array<FrameGraphTextureHandle>;\r\n index: number; // current index in textures array\r\n references: Array<{ renderTargetWrapper: RenderTargetWrapper; textureIndex: number }>; // render target wrappers that reference this history texture\r\n};\r\n\r\ntype TextureLifespan = {\r\n firstTask: number;\r\n lastTask: number;\r\n};\r\n\r\ntype TextureEntry = {\r\n texture: Nullable<InternalTexture>;\r\n name: string;\r\n creationOptions: FrameGraphTextureCreationOptions; // in TextureEntry, creationOptions.size is always an object\r\n namespace: FrameGraphTextureNamespace;\r\n textureIndex?: number; // Index of the texture in the types, formats, etc array of FrameGraphTextureOptions (default: 0)\r\n debug?: Texture;\r\n refHandle?: FrameGraphTextureHandle; // Handle of the texture this one is referencing - used for dangling handles\r\n textureDescriptionHash?: string; // a hash of the texture creation options\r\n lifespan?: TextureLifespan;\r\n aliasHandle?: FrameGraphTextureHandle; // Handle of the texture this one is aliasing - can be set after execution of texture allocation optimization\r\n};\r\n\r\nenum FrameGraphTextureNamespace {\r\n Task,\r\n Graph,\r\n External,\r\n}\r\n\r\n/**\r\n * Manages the textures used by a frame graph\r\n * @experimental\r\n */\r\nexport class FrameGraphTextureManager {\r\n private static _Counter = 2; // 0 and 1 are reserved for backbuffer textures\r\n\r\n /** @internal */\r\n public readonly _textures: Map<FrameGraphTextureHandle, TextureEntry> = new Map();\r\n\r\n /** @internal */\r\n public readonly _historyTextures: Map<FrameGraphTextureHandle, HistoryTexture> = new Map();\r\n\r\n /** @internal */\r\n public _isRecordingTask = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if debug logs should be shown when applying texture allocation optimization (default: false)\r\n */\r\n public showDebugLogsForTextureAllcationOptimization = false;\r\n\r\n /**\r\n * Constructs a new instance of the texture manager\r\n * @param engine The engine to use\r\n * @param _debugTextures If true, debug textures will be created so that they are visible in the inspector\r\n * @param _scene The scene the manager belongs to\r\n */\r\n constructor(\r\n public readonly engine: AbstractEngine,\r\n private readonly _debugTextures = false,\r\n private readonly _scene: Scene\r\n ) {\r\n this._addSystemTextures();\r\n }\r\n\r\n /**\r\n * Checks if a handle is a backbuffer handle (color or depth/stencil)\r\n * @param handle The handle to check\r\n * @returns True if the handle is a backbuffer handle\r\n */\r\n public isBackbuffer(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferColorTextureHandle || handle === backbufferDepthStencilTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferColorTextureHandle || textureEntry.refHandle === backbufferDepthStencilTextureHandle;\r\n }\r\n\r\n /**\r\n * Checks if a handle is a backbuffer color handle\r\n * @param handle The handle to check\r\n * @returns True if the handle is a backbuffer color handle\r\n */\r\n public isBackbufferColor(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferColorTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferColorTextureHandle;\r\n }\r\n\r\n /**\r\n * Checks if a handle is a backbuffer depth/stencil handle\r\n * @param handle The handle to check\r\n * @returns True if the handle is a backbuffer depth/stencil handle\r\n */\r\n public isBackbufferDepthStencil(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferDepthStencilTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferDepthStencilTextureHandle;\r\n }\r\n\r\n /**\r\n * Checks if a handle is a history texture (or points to a history texture, for a dangling handle)\r\n * @param handle The handle to check\r\n * @returns True if the handle is a history texture, otherwise false\r\n */\r\n public isHistoryTexture(handle: FrameGraphTextureHandle): boolean {\r\n const entry = this._textures.get(handle);\r\n if (!entry) {\r\n return false;\r\n }\r\n\r\n handle = entry.refHandle ?? handle;\r\n\r\n return this._historyTextures.has(handle);\r\n }\r\n\r\n /**\r\n * Gets the creation options of a texture\r\n * @param handle Handle of the texture\r\n * @returns The creation options of the texture\r\n */\r\n public getTextureCreationOptions(handle: FrameGraphTextureHandle): FrameGraphTextureCreationOptions {\r\n const entry = this._textures.get(handle)!;\r\n const creationOptions = entry.creationOptions;\r\n\r\n return {\r\n size: textureSizeIsObject(creationOptions.size) ? { ...creationOptions.size } : creationOptions.size,\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n options: FrameGraphTextureManager.CloneTextureOptions(creationOptions.options, entry.textureIndex),\r\n isHistoryTexture: creationOptions.isHistoryTexture,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the description of a texture\r\n * @param handle Handle of the texture\r\n * @returns The description of the texture\r\n */\r\n public getTextureDescription(handle: FrameGraphTextureHandle): FrameGraphTextureDescription {\r\n const creationOptions = this.getTextureCreationOptions(handle);\r\n\r\n const size = !creationOptions.sizeIsPercentage\r\n ? textureSizeIsObject(creationOptions.size)\r\n ? creationOptions.size\r\n : { width: creationOptions.size, height: creationOptions.size }\r\n : this.getAbsoluteDimensions(creationOptions.size);\r\n\r\n return {\r\n size,\r\n options: creationOptions.options,\r\n };\r\n }\r\n\r\n /**\r\n * Gets a texture handle or creates a new texture if the handle is not provided.\r\n * If handle is not provided, newTextureName and creationOptions must be provided.\r\n * @param handle If provided, will simply return the handle\r\n * @param newTextureName Name of the new texture to create\r\n * @param creationOptions Options to use when creating the new texture\r\n * @returns The handle to the texture.\r\n */\r\n public getTextureHandleOrCreateTexture(handle?: FrameGraphTextureHandle, newTextureName?: string, creationOptions?: FrameGraphTextureCreationOptions): FrameGraphTextureHandle {\r\n if (handle === undefined) {\r\n if (newTextureName === undefined || creationOptions === undefined) {\r\n throw new Error(\"getTextureHandleOrCreateTexture: Either handle or newTextureName and creationOptions must be provided.\");\r\n }\r\n return this.createRenderTargetTexture(newTextureName, creationOptions);\r\n }\r\n return handle;\r\n }\r\n\r\n /**\r\n * Gets a texture from a handle.\r\n * Note that if the texture is a history texture, the read texture for the current frame will be returned.\r\n * @param handle The handle of the texture\r\n * @returns The texture or null if not found\r\n */\r\n public getTextureFromHandle(handle: FrameGraphTextureHandle): Nullable<InternalTexture> {\r\n const historyEntry = this._historyTextures.get(handle);\r\n if (historyEntry) {\r\n return historyEntry.textures[historyEntry.index ^ 1]; // gets the read texture\r\n }\r\n return this._textures.get(handle)!.texture;\r\n }\r\n\r\n /**\r\n * Imports a texture into the texture manager\r\n * @param name Name of the texture\r\n * @param texture Texture to import\r\n * @param handle Existing handle to use for the texture. If not provided (default), a new handle will be created.\r\n * @returns The handle to the texture\r\n */\r\n public importTexture(name: string, texture: InternalTexture, handle?: FrameGraphTextureHandle): FrameGraphTextureHandle {\r\n if (handle !== undefined) {\r\n this._freeEntry(handle);\r\n }\r\n\r\n const creationOptions: FrameGraphTextureCreationOptions = {\r\n size: { width: texture.width, height: texture.height },\r\n sizeIsPercentage: false,\r\n isHistoryTexture: false,\r\n options: {\r\n createMipMaps: texture.generateMipMaps,\r\n samples: texture.samples,\r\n types: [texture.type],\r\n formats: [texture.format],\r\n useSRGBBuffers: [texture._useSRGBBuffer],\r\n creationFlags: [texture._creationFlags],\r\n labels: texture.label ? [texture.label] : [\"imported\"],\r\n },\r\n };\r\n\r\n return this._createHandleForTexture(name, texture, creationOptions, FrameGraphTextureNamespace.External, handle);\r\n }\r\n\r\n /**\r\n * Creates a new render target texture\r\n * If multiple textures are described in FrameGraphTextureCreationOptions, the handle of the first texture is returned, handle+1 is the handle of the second texture, etc.\r\n * @param name Name of the texture\r\n * @param creationOptions Options to use when creating the texture\r\n * @param handle Existing handle to use for the texture. If not provided (default), a new handle will be created.\r\n * @returns The handle to the texture\r\n */\r\n public createRenderTargetTexture(name: string, creationOptions: FrameGraphTextureCreationOptions, handle?: FrameGraphTextureHandle): FrameGraphTextureHandle {\r\n return this._createHandleForTexture(\r\n name,\r\n null,\r\n {\r\n size: textureSizeIsObject(creationOptions.size) ? { ...creationOptions.size } : creationOptions.size,\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n isHistoryTexture: creationOptions.isHistoryTexture,\r\n options: FrameGraphTextureManager.CloneTextureOptions(creationOptions.options, undefined, true),\r\n },\r\n this._isRecordingTask ? FrameGraphTextureNamespace.Task : FrameGraphTextureNamespace.Graph,\r\n handle\r\n );\r\n }\r\n\r\n /**\r\n * Creates a (frame graph) render target wrapper\r\n * Note that renderTargets or renderTargetDepth can be undefined, but not both at the same time!\r\n * @param name Name of the render target wrapper\r\n * @param renderTargets Render target handles (textures) to use\r\n * @param renderTargetDepth Render target depth handle (texture) to use\r\n * @returns The created render target wrapper\r\n */\r\n public createRenderTarget(\r\n name: string,\r\n renderTargets?: FrameGraphTextureHandle | FrameGraphTextureHandle[],\r\n renderTargetDepth?: FrameGraphTextureHandle\r\n ): FrameGraphRenderTarget {\r\n const renderTarget = new FrameGraphRenderTarget(name, this, renderTargets, renderTargetDepth);\r\n\r\n const rtw = renderTarget.renderTargetWrapper;\r\n\r\n if (rtw !== undefined && renderTargets) {\r\n const handles = Array.isArray(renderTargets) ? renderTargets : [renderTargets];\r\n\r\n for (let i = 0; i < handles.length; i++) {\r\n let handle = handles[i];\r\n handle = this._textures.get(handle)?.refHandle ?? handle;\r\n\r\n const historyEntry = this._historyTextures.get(handle);\r\n if (historyEntry) {\r\n historyEntry.references.push({ renderTargetWrapper: rtw, textureIndex: i });\r\n\r\n rtw.setTexture(historyEntry.textures[historyEntry.index]!, i, false);\r\n }\r\n }\r\n }\r\n\r\n return renderTarget;\r\n }\r\n\r\n /**\r\n * Creates a handle which is not associated with any texture.\r\n * Call resolveDanglingHandle to associate the handle with a valid texture handle.\r\n * @returns The dangling handle\r\n */\r\n public createDanglingHandle() {\r\n return FrameGraphTextureManager._Counter++;\r\n }\r\n\r\n /**\r\n * Associates a texture with a dangling handle\r\n * @param danglingHandle The dangling handle\r\n * @param handle The handle to associate with the dangling handle (if not provided, a new texture handle will be created, using the newTextureName and creationOptions parameters)\r\n * @param newTextureName The name of the new texture to create (if handle is not provided)\r\n * @param creationOptions The options to use when creating the new texture (if handle is not provided)\r\n */\r\n public resolveDanglingHandle(\r\n danglingHandle: FrameGraphTextureHandle,\r\n handle?: FrameGraphTextureHandle,\r\n newTextureName?: string,\r\n creationOptions?: FrameGraphTextureCreationOptions\r\n ) {\r\n if (handle === undefined) {\r\n if (newTextureName === undefined || creationOptions === undefined) {\r\n throw new Error(\"resolveDanglingHandle: Either handle or newTextureName and creationOptions must be provided.\");\r\n }\r\n this.createRenderTargetTexture(newTextureName, creationOptions, danglingHandle);\r\n return;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n\r\n if (textureEntry === undefined) {\r\n throw new Error(`resolveDanglingHandle: Handle ${handle} does not exist!`);\r\n }\r\n\r\n this._textures.set(danglingHandle, {\r\n texture: textureEntry.texture,\r\n refHandle: handle,\r\n name: textureEntry.name,\r\n creationOptions: {\r\n size: { ...(textureEntry.creationOptions.size as { width: number; height: number; depth?: number; layers?: number }) },\r\n options: FrameGraphTextureManager.CloneTextureOptions(textureEntry.creationOptions.options),\r\n sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,\r\n isHistoryTexture: false,\r\n },\r\n namespace: textureEntry.namespace,\r\n textureIndex: textureEntry.textureIndex,\r\n });\r\n }\r\n\r\n /**\r\n * Gets the absolute dimensions of a texture.\r\n * @param size The size of the texture. Width and height must be expressed as a percentage of the screen size (100=100%)!\r\n * @param screenWidth The width of the screen (default: the width of the rendering canvas)\r\n * @param screenHeight The height of the screen (default: the height of the rendering canvas)\r\n * @returns The absolute dimensions of the texture\r\n */\r\n public getAbsoluteDimensions(\r\n size: TextureSize,\r\n screenWidth = this.engine.getRenderWidth(true),\r\n screenHeight = this.engine.getRenderHeight(true)\r\n ): { width: number; height: number } {\r\n const { width, height } = getDimensionsFromTextureSize(size);\r\n\r\n return {\r\n width: Math.floor((width * screenWidth) / 100),\r\n height: Math.floor((height * screenHeight) / 100),\r\n };\r\n }\r\n\r\n /**\r\n * Calculates the total byte size of all textures used by the frame graph texture manager (including external textures)\r\n * @param optimizedSize True if the calculation should not factor in aliased textures\r\n * @param outputWidth The output width of the frame graph. Will be used to calculate the size of percentage-based textures\r\n * @param outputHeight The output height of the frame graph. Will be used to calculate the size of percentage-based textures\r\n * @returns The total size of all textures\r\n */\r\n public computeTotalTextureSize(optimizedSize: boolean, outputWidth: number, outputHeight: number) {\r\n let totalSize = 0;\r\n\r\n this._textures.forEach((entry, handle) => {\r\n if (handle === backbufferColorTextureHandle || handle === backbufferDepthStencilTextureHandle || entry.refHandle !== undefined) {\r\n return;\r\n }\r\n if (optimizedSize && entry.aliasHandle !== undefined) {\r\n return;\r\n }\r\n\r\n const options = entry.creationOptions;\r\n const textureIndex = entry.textureIndex || 0;\r\n const dimensions = options.sizeIsPercentage ? this.getAbsoluteDimensions(options.size, outputWidth, outputHeight) : getDimensionsFromTextureSize(options.size);\r\n\r\n const blockInfo = FrameGraphTextureManager._GetTextureBlockInformation(\r\n options.options.types?.[textureIndex] ?? Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n options.options.formats![textureIndex]\r\n );\r\n\r\n const textureByteSize = Math.ceil(dimensions.width / blockInfo.width) * Math.ceil(dimensions.height / blockInfo.height) * blockInfo.length;\r\n\r\n let byteSize = textureByteSize;\r\n\r\n if (options.options.createMipMaps) {\r\n byteSize = Math.floor((byteSize * 4) / 3);\r\n }\r\n\r\n if ((options.options.samples || 1) > 1) {\r\n // We need an additional texture in the case of MSAA\r\n byteSize += textureByteSize;\r\n }\r\n\r\n totalSize += byteSize;\r\n });\r\n\r\n return totalSize;\r\n }\r\n\r\n /** @internal */\r\n public _dispose(): void {\r\n this._releaseTextures();\r\n }\r\n\r\n /** @internal */\r\n public _allocateTextures(tasks?: FrameGraphTask[]): void {\r\n if (tasks) {\r\n this._optimizeTextureAllocation(tasks);\r\n }\r\n\r\n this._textures.forEach((entry) => {\r\n if (!entry.texture) {\r\n if (entry.refHandle !== undefined) {\r\n // entry is a dangling handle which has been resolved to point to refHandle\r\n // We simply update the texture to point to the refHandle texture\r\n const refEntry = this._textures.get(entry.refHandle)!;\r\n\r\n entry.texture = refEntry.texture;\r\n\r\n if (refEntry.refHandle === backbufferColorTextureHandle) {\r\n entry.refHandle = backbufferColorTextureHandle;\r\n }\r\n if (refEntry.refHandle === backbufferDepthStencilTextureHandle) {\r\n entry.refHandle = backbufferDepthStencilTextureHandle;\r\n }\r\n } else if (entry.namespace !== FrameGraphTextureNamespace.External) {\r\n if (entry.aliasHandle !== undefined) {\r\n const aliasEntry = this._textures.get(entry.aliasHandle)!;\r\n\r\n entry.texture = aliasEntry.texture!;\r\n entry.texture.incrementReferences();\r\n } else {\r\n const creationOptions = entry.creationOptions;\r\n const size = creationOptions.sizeIsPercentage ? this.getAbsoluteDimensions(creationOptions.size) : creationOptions.size;\r\n const textureIndex = entry.textureIndex || 0;\r\n\r\n const internalTextureCreationOptions: InternalTextureCreationOptions = {\r\n createMipMaps: creationOptions.options.createMipMaps,\r\n samples: creationOptions.options.samples,\r\n type: creationOptions.options.types?.[textureIndex],\r\n format: creationOptions.options.formats?.[textureIndex],\r\n useSRGBBuffer: creationOptions.options.useSRGBBuffers?.[textureIndex],\r\n creationFlags: creationOptions.options.creationFlags?.[textureIndex],\r\n label: creationOptions.options.labels?.[textureIndex] ?? `${entry.name}${textureIndex > 0 ? \"#\" + textureIndex : \"\"}`,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n createMSAATexture: creationOptions.options.samples! > 1,\r\n };\r\n\r\n const isDepthTexture = IsDepthTexture(internalTextureCreationOptions.format!);\r\n const hasStencil = HasStencilAspect(internalTextureCreationOptions.format!);\r\n const source =\r\n isDepthTexture && hasStencil\r\n ? InternalTextureSource.DepthStencil\r\n : isDepthTexture || hasStencil\r\n ? InternalTextureSource.Depth\r\n : InternalTextureSource.RenderTarget;\r\n\r\n const internalTexture = this.engine._createInternalTexture(size, internalTextureCreationOptions, false, source);\r\n\r\n if (isDepthTexture) {\r\n internalTexture.type = GetTypeForDepthTexture(internalTexture.format);\r\n }\r\n\r\n entry.texture = internalTexture;\r\n }\r\n }\r\n }\r\n\r\n if (entry.texture && entry.refHandle === undefined) {\r\n entry.debug?.dispose();\r\n entry.debug = this._createDebugTexture(entry.name, entry.texture);\r\n }\r\n });\r\n\r\n this._historyTextures.forEach((entry) => {\r\n for (let i = 0; i < entry.handles.length; i++) {\r\n entry.textures[i] = this._textures.get(entry.handles[i])!.texture;\r\n }\r\n });\r\n }\r\n\r\n /** @internal */\r\n public _releaseTextures(releaseAll = true): void {\r\n this._textures.forEach((entry, handle) => {\r\n if (entry.lifespan) {\r\n entry.lifespan.firstTask = Number.MAX_VALUE;\r\n entry.lifespan.lastTask = 0;\r\n }\r\n\r\n entry.aliasHandle = undefined;\r\n\r\n if (releaseAll || entry.namespace !== FrameGraphTextureNamespace.External) {\r\n entry.debug?.dispose();\r\n entry.debug = undefined;\r\n }\r\n\r\n if (entry.namespace === FrameGraphTextureNamespace.External) {\r\n return;\r\n }\r\n\r\n entry.texture?.dispose();\r\n entry.texture = null;\r\n\r\n if (releaseAll || entry.namespace === FrameGraphTextureNamespace.Task) {\r\n this._textures.delete(handle);\r\n }\r\n });\r\n\r\n this._historyTextures.forEach((entry) => {\r\n for (let i = 0; i < entry.handles.length; i++) {\r\n entry.textures[i] = null;\r\n }\r\n });\r\n\r\n if (releaseAll) {\r\n this._textures.clear();\r\n this._historyTextures.clear();\r\n this._addSystemTextures();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _updateHistoryTextures(): void {\r\n this._historyTextures.forEach((entry) => {\r\n entry.index = entry.index ^ 1;\r\n const currentTexture = entry.textures[entry.index];\r\n if (currentTexture) {\r\n for (const { renderTargetWrapper, textureIndex } of entry.references) {\r\n renderTargetWrapper.setTexture(currentTexture, textureIndex, false);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _addSystemTextures() {\r\n const size = { width: this.engine.getRenderWidth(true), height: this.engine.getRenderHeight(true) };\r\n\r\n this._textures.set(backbufferColorTextureHandle, {\r\n name: \"backbuffer color\",\r\n texture: null,\r\n creationOptions: {\r\n size,\r\n options: {\r\n createMipMaps: false,\r\n samples: this.engine.getCreationOptions().antialias ? 4 : 1,\r\n types: [Constants.TEXTURETYPE_UNSIGNED_BYTE], // todo? get from engine\r\n formats: [Constants.TEXTUREFORMAT_RGBA], // todo? get from engine\r\n useSRGBBuffers: [false],\r\n creationFlags: [0],\r\n labels: [\"backbuffer color\"],\r\n },\r\n sizeIsPercentage: false,\r\n },\r\n namespace: FrameGraphTextureNamespace.External,\r\n });\r\n\r\n this._textures.set(backbufferDepthStencilTextureHandle, {\r\n name: \"backbuffer depth/stencil\",\r\n texture: null,\r\n creationOptions: {\r\n size,\r\n options: {\r\n createMipMaps: false,\r\n samples: this.engine.getCreationOptions().antialias ? 4 : 1,\r\n types: [Constants.TEXTURETYPE_UNSIGNED_BYTE], // todo? get from engine\r\n formats: [Constants.TEXTUREFORMAT_DEPTH24], // todo? get from engine\r\n useSRGBBuffers: [false],\r\n creationFlags: [0],\r\n labels: [\"backbuffer depth/stencil\"],\r\n },\r\n sizeIsPercentage: false,\r\n },\r\n namespace: FrameGraphTextureNamespace.External,\r\n });\r\n }\r\n\r\n private _createDebugTexture(name: string, texture: InternalTexture): Texture | undefined {\r\n if (!this._debugTextures) {\r\n return;\r\n }\r\n\r\n const textureDebug = new Texture(null, this._scene);\r\n\r\n textureDebug.name = name;\r\n textureDebug._texture = texture;\r\n textureDebug._texture.incrementReferences();\r\n\r\n return textureDebug;\r\n }\r\n\r\n private _freeEntry(handle: number): void {\r\n const entry = this._textures.get(handle);\r\n\r\n if (entry) {\r\n entry.debug?.dispose();\r\n this._textures.delete(handle);\r\n }\r\n }\r\n\r\n private _createHandleForTexture(\r\n name: string,\r\n texture: Nullable<InternalTexture>,\r\n creationOptions: FrameGraphTextureCreationOptions,\r\n namespace: FrameGraphTextureNamespace,\r\n handle?: FrameGraphTextureHandle,\r\n textureIndex?: number\r\n ): FrameGraphTextureHandle {\r\n handle = handle ?? FrameGraphTextureManager._Counter++;\r\n textureIndex = textureIndex || 0;\r\n\r\n const textureName = creationOptions.isHistoryTexture ? `${name} ping` : name;\r\n\r\n let label = creationOptions.options.labels?.[textureIndex] ?? \"\";\r\n if (label === textureName) {\r\n label = \"\";\r\n }\r\n\r\n const textureEntry: TextureEntry = {\r\n texture,\r\n name: `${textureName}${label ? \" \" + label : \"\"}`,\r\n creationOptions: {\r\n size: textureSizeIsObject(creationOptions.size) ? creationOptions.size : { width: creationOptions.size, height: creationOptions.size },\r\n options: creationOptions.options,\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n isHistoryTexture: creationOptions.isHistoryTexture,\r\n },\r\n namespace,\r\n textureIndex,\r\n textureDescriptionHash: this._createTextureDescriptionHash(creationOptions),\r\n lifespan: {\r\n firstTask: Number.MAX_VALUE,\r\n lastTask: 0,\r\n },\r\n };\r\n\r\n this._textures.set(handle, textureEntry);\r\n\r\n if (namespace === FrameGraphTextureNamespace.External) {\r\n return handle;\r\n }\r\n\r\n if (creationOptions.isHistoryTexture) {\r\n const pongCreationOptions: FrameGraphTextureCreationOptions = {\r\n size: { ...(textureEntry.creationOptions.size as { width: number; height: number }) },\r\n options: { ...textureEntry.creationOptions.options },\r\n sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,\r\n isHistoryTexture: false,\r\n };\r\n\r\n const pongTexture = this._createHandleForTexture(`${name} pong`, null, pongCreationOptions, namespace);\r\n\r\n this._historyTextures.set(handle, { textures: [null, null], handles: [handle, pongTexture], index: 0, references: [] });\r\n\r\n return handle;\r\n }\r\n\r\n if (creationOptions.options.types && creationOptions.options.types.length > 1 && textureIndex === 0) {\r\n const textureCount = creationOptions.options.types.length;\r\n const creationOptionsForTexture: FrameGraphTextureCreationOptions = {\r\n size: textureSizeIsObject(creationOptions.size) ? creationOptions.size : { width: creationOptions.size, height: creationOptions.size },\r\n options: creationOptions.options,\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n };\r\n\r\n for (let i = 1; i < textureCount; i++) {\r\n this._createHandleForTexture(textureName, null, creationOptionsForTexture, namespace, handle + i, i);\r\n }\r\n\r\n FrameGraphTextureManager._Counter += textureCount - 1;\r\n }\r\n\r\n return handle;\r\n }\r\n\r\n private _createTextureDescriptionHash(options: FrameGraphTextureCreationOptions): string {\r\n const hash: string[] = [];\r\n\r\n hash.push(textureSizeIsObject(options.size) ? `${options.size.width}_${options.size.height}` : `${options.size}`);\r\n hash.push(options.sizeIsPercentage ? \"%\" : \"A\");\r\n hash.push(options.options.createMipMaps ? \"M\" : \"N\");\r\n hash.push(options.options.samples ? `${options.options.samples}` : \"S1\");\r\n hash.push(options.options.types ? options.options.types.join(\"_\") : `${Constants.TEXTURETYPE_UNSIGNED_BYTE}`);\r\n hash.push(options.options.formats ? options.options.formats.join(\"_\") : `${Constants.TEXTUREFORMAT_RGBA}`);\r\n hash.push(options.options.useSRGBBuffers ? options.options.useSRGBBuffers.join(\"_\") : \"false\");\r\n hash.push(options.options.creationFlags ? options.options.creationFlags.join(\"_\") : \"0\");\r\n\r\n return hash.join(\"_\");\r\n }\r\n\r\n private _optimizeTextureAllocation(tasks: FrameGraphTask[]): void {\r\n this._computeTextureLifespan(tasks);\r\n\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`================== Optimization of texture allocation ==================`);\r\n }\r\n\r\n const cache: Map<string, Array<[FrameGraphTextureHandle, Array<TextureLifespan>]>> = new Map();\r\n\r\n const iterator = this._textures.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const textureHandle = key.value;\r\n const textureEntry = this._textures.get(textureHandle)!;\r\n if (textureEntry.refHandle !== undefined || textureEntry.namespace === FrameGraphTextureNamespace.External || this._historyTextures.has(textureHandle)) {\r\n continue;\r\n }\r\n\r\n const textureHash = textureEntry.textureDescriptionHash!;\r\n const textureLifespan = textureEntry.lifespan!;\r\n\r\n const cacheEntries = cache.get(textureHash);\r\n if (cacheEntries) {\r\n let cacheEntryFound = false;\r\n for (const cacheEntry of cacheEntries) {\r\n const [sourceHandle, lifespanArray] = cacheEntry;\r\n\r\n let overlapped = false;\r\n for (const lifespan of lifespanArray) {\r\n if (lifespan.firstTask <= textureLifespan.lastTask && lifespan.lastTask >= textureLifespan.firstTask) {\r\n overlapped = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!overlapped) {\r\n // No overlap between texture lifespan and all lifespans in the array, this texture can reuse the same entry cache\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`Texture ${textureHandle} (${textureEntry.name}) reuses cache entry ${sourceHandle}`);\r\n }\r\n\r\n lifespanArray.push(textureLifespan);\r\n textureEntry.aliasHandle = sourceHandle;\r\n cacheEntryFound = true;\r\n break;\r\n }\r\n }\r\n if (!cacheEntryFound) {\r\n cacheEntries.push([textureHandle, [textureLifespan]]);\r\n }\r\n } else {\r\n cache.set(textureHash, [[textureHandle, [textureLifespan]]]);\r\n }\r\n }\r\n }\r\n\r\n // Loop through all task/pass dependencies and compute the lifespan of each texture (that is, the first task/pass that uses it and the last task/pass that uses it)\r\n private _computeTextureLifespan(tasks: FrameGraphTask[]): void {\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`================== Dump of texture dependencies for all tasks/passes ==================`);\r\n }\r\n\r\n for (let t = 0; t < tasks.length; ++t) {\r\n const task = tasks[t];\r\n\r\n if (task.passes.length > 0) {\r\n this._computeTextureLifespanForPasses(task, t, task.passes);\r\n }\r\n\r\n if (task.passesDisabled.length > 0) {\r\n this._computeTextureLifespanForPasses(task, t, task.passesDisabled);\r\n }\r\n\r\n if (task.dependencies) {\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`task#${t} (${task.name}), global dependencies`);\r\n }\r\n\r\n this._updateLifespan(t * 100 + 99, task.dependencies);\r\n }\r\n }\r\n\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`================== Texture lifespans ==================`);\r\n const iterator = this._textures.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const textureHandle = key.value;\r\n const textureEntry = this._textures.get(textureHandle)!;\r\n if (textureEntry.refHandle !== undefined || textureEntry.namespace === FrameGraphTextureNamespace.External || this._historyTextures.has(textureHandle)) {\r\n continue;\r\n }\r\n Logger.Log(`${textureHandle} (${textureEntry.name}): ${textureEntry.lifespan!.firstTask} - ${textureEntry.lifespan!.lastTask}`);\r\n }\r\n }\r\n }\r\n\r\n private _computeTextureLifespanForPasses(task: FrameGraphTask, taskIndex: number, passes: IFrameGraphPass[]): void {\r\n for (let p = 0; p < passes.length; ++p) {\r\n const dependencies = new Set<FrameGraphTextureHandle>();\r\n const pass = passes[p];\r\n\r\n if (!FrameGraphRenderPass.IsRenderPass(pass)) {\r\n continue;\r\n }\r\n\r\n pass.collectDependencies(dependencies);\r\n\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`task#${taskIndex} (${task.name}), pass#${p} (${pass.name})`);\r\n }\r\n\r\n this._updateLifespan(taskIndex * 100 + p, dependencies);\r\n }\r\n }\r\n\r\n private _updateLifespan(passOrderNum: number, dependencies: Set<FrameGraphTextureHandle>) {\r\n const iterator = dependencies.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const textureHandle = key.value;\r\n let textureEntry = this._textures.get(textureHandle);\r\n if (!textureEntry) {\r\n throw new Error(`FrameGraph._computeTextureLifespan: Texture handle \"${textureHandle}\" not found in the texture manager.`);\r\n }\r\n let handle = textureHandle;\r\n while (textureEntry.refHandle !== undefined) {\r\n handle = textureEntry.refHandle;\r\n textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n throw new Error(`FrameGraph._computeTextureLifespan: Texture handle \"${handle}\" not found in the texture manager (source handle=\"${textureHandle}\").`);\r\n }\r\n }\r\n if (textureEntry.namespace === FrameGraphTextureNamespace.External || this._historyTextures.has(handle)) {\r\n continue;\r\n }\r\n\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(` ${handle} (${textureEntry.name})`);\r\n }\r\n\r\n textureEntry.lifespan!.firstTask = Math.min(textureEntry.lifespan!.firstTask, passOrderNum);\r\n textureEntry.lifespan!.lastTask = Math.max(textureEntry.lifespan!.lastTask, passOrderNum);\r\n }\r\n }\r\n\r\n /**\r\n * Clones a texture options\r\n * @param options The options to clone\r\n * @param textureIndex The index of the texture in the types, formats, etc array of FrameGraphTextureOptions. If not provided, all options are cloned.\r\n * @param preserveLabels True if the labels should be preserved (default: false)\r\n * @returns The cloned options\r\n */\r\n public static CloneTextureOptions(options: FrameGraphTextureOptions, textureIndex?: number, preserveLabels?: boolean): FrameGraphTextureOptions {\r\n return textureIndex !== undefined\r\n ? {\r\n createMipMaps: options.createMipMaps,\r\n samples: options.samples,\r\n types: options.types ? [options.types[textureIndex]] : undefined,\r\n formats: options.formats ? [options.formats[textureIndex]] : undefined,\r\n useSRGBBuffers: options.useSRGBBuffers ? [options.useSRGBBuffers[textureIndex]] : undefined,\r\n creationFlags: options.creationFlags ? [options.creationFlags[textureIndex]] : undefined,\r\n labels: options.labels ? [options.labels[textureIndex]] : undefined,\r\n }\r\n : {\r\n createMipMaps: options.createMipMaps,\r\n samples: options.samples,\r\n types: options.types ? [...options.types] : undefined,\r\n formats: options.formats ? [...options.formats] : undefined,\r\n useSRGBBuffers: options.useSRGBBuffers ? [...options.useSRGBBuffers] : undefined,\r\n creationFlags: options.creationFlags ? [...options.creationFlags] : undefined,\r\n labels: options.labels && preserveLabels ? [...options.labels] : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the texture block information.\r\n * @param type Type of the texture.\r\n * @param format Format of the texture.\r\n * @returns The texture block information. You can calculate the byte size of the texture by doing: Math.ceil(width / blockInfo.width) * Math.ceil(height / blockInfo.height) * blockInfo.length\r\n */\r\n private static _GetTextureBlockInformation(type: number, format: number): { width: number; height: number; length: number } {\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_DEPTH16:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTUREFORMAT_DEPTH24:\r\n return { width: 1, height: 1, length: 3 };\r\n case Constants.TEXTUREFORMAT_DEPTH24_STENCIL8:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_DEPTH32_FLOAT:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8:\r\n return { width: 1, height: 1, length: 5 };\r\n case Constants.TEXTUREFORMAT_STENCIL8:\r\n return { width: 1, height: 1, length: 1 };\r\n\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_BPTC_UNORM:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_BPTC_SIGNED_FLOAT:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT5:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT3:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT1:\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_S3TC_DXT1:\r\n return { width: 4, height: 4, length: 8 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_ASTC_4x4:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_ETC1_WEBGL:\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB8_ETC2:\r\n return { width: 4, height: 4, length: 8 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA8_ETC2_EAC:\r\n return { width: 4, height: 4, length: 16 };\r\n }\r\n\r\n switch (type) {\r\n case Constants.TEXTURETYPE_BYTE:\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_R:\r\n case Constants.TEXTUREFORMAT_R_INTEGER:\r\n case Constants.TEXTUREFORMAT_ALPHA:\r\n case Constants.TEXTUREFORMAT_LUMINANCE:\r\n case Constants.TEXTUREFORMAT_LUMINANCE_ALPHA:\r\n return { width: 1, height: 1, length: 1 };\r\n case Constants.TEXTUREFORMAT_RG:\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTUREFORMAT_RGB:\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return { width: 1, height: 1, length: 3 };\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n default:\r\n return { width: 1, height: 1, length: 4 };\r\n }\r\n case Constants.TEXTURETYPE_SHORT:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return { width: 1, height: 1, length: 6 };\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 8 };\r\n default:\r\n return { width: 1, height: 1, length: 8 };\r\n }\r\n case Constants.TEXTURETYPE_INT:\r\n case Constants.TEXTURETYPE_UNSIGNED_INTEGER: // Refers to UNSIGNED_INT\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return { width: 1, height: 1, length: 8 };\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return { width: 1, height: 1, length: 12 };\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 16 };\r\n default:\r\n return { width: 1, height: 1, length: 16 };\r\n }\r\n case Constants.TEXTURETYPE_FLOAT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_RG:\r\n return { width: 1, height: 1, length: 8 };\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return { width: 1, height: 1, length: 12 };\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return { width: 1, height: 1, length: 16 };\r\n default:\r\n return { width: 1, height: 1, length: 16 };\r\n }\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTUREFORMAT_RG:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return { width: 1, height: 1, length: 6 };\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return { width: 1, height: 1, length: 8 };\r\n default:\r\n return { width: 1, height: 1, length: 8 };\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n default:\r\n return { width: 1, height: 1, length: 4 };\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n default:\r\n return { width: 1, height: 1, length: 4 };\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n default:\r\n return { width: 1, height: 1, length: 4 };\r\n }\r\n }\r\n\r\n return { width: 1, height: 1, length: 4 };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"frameGraphTextureManager.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphTextureManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n Scene,\r\n AbstractEngine,\r\n TextureSize,\r\n Nullable,\r\n FrameGraphTextureCreationOptions,\r\n FrameGraphTextureHandle,\r\n InternalTextureCreationOptions,\r\n InternalTexture,\r\n FrameGraphTextureOptions,\r\n FrameGraphTextureDescription,\r\n RenderTargetWrapper,\r\n FrameGraphTask,\r\n IFrameGraphPass,\r\n} from \"core/index\";\r\nimport { getDimensionsFromTextureSize, textureSizeIsObject } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { backbufferColorTextureHandle, backbufferDepthStencilTextureHandle } from \"./frameGraphTypes\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport { FrameGraphRenderTarget } from \"./frameGraphRenderTarget\";\r\nimport { FrameGraphRenderPass } from \"./Passes/renderPass\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { GetTypeForDepthTexture, IsDepthTexture, HasStencilAspect } from \"core/Materials/Textures/textureHelper.functions\";\r\n\r\ntype HistoryTexture = {\r\n textures: Array<Nullable<InternalTexture>>;\r\n handles: Array<FrameGraphTextureHandle>;\r\n index: number; // current index in textures array\r\n references: Array<{ renderTargetWrapper: RenderTargetWrapper; textureIndex: number }>; // render target wrappers that reference this history texture\r\n};\r\n\r\ntype TextureLifespan = {\r\n firstTask: number;\r\n lastTask: number;\r\n};\r\n\r\ntype TextureEntry = {\r\n texture: Nullable<InternalTexture>;\r\n name: string;\r\n creationOptions: FrameGraphTextureCreationOptions; // in TextureEntry, creationOptions.size is always an object\r\n namespace: FrameGraphTextureNamespace;\r\n textureIndex?: number; // Index of the texture in the types, formats, etc array of FrameGraphTextureOptions (default: 0)\r\n debug?: Texture;\r\n refHandle?: FrameGraphTextureHandle; // Handle of the texture this one is referencing - used for dangling handles\r\n textureDescriptionHash?: string; // a hash of the texture creation options\r\n lifespan?: TextureLifespan;\r\n aliasHandle?: FrameGraphTextureHandle; // Handle of the texture this one is aliasing - can be set after execution of texture allocation optimization\r\n};\r\n\r\nenum FrameGraphTextureNamespace {\r\n Task,\r\n Graph,\r\n External,\r\n}\r\n\r\n/**\r\n * Manages the textures used by a frame graph\r\n * @experimental\r\n */\r\nexport class FrameGraphTextureManager {\r\n private static _Counter = 2; // 0 and 1 are reserved for backbuffer textures\r\n\r\n /** @internal */\r\n public readonly _textures: Map<FrameGraphTextureHandle, TextureEntry> = new Map();\r\n\r\n /** @internal */\r\n public readonly _historyTextures: Map<FrameGraphTextureHandle, HistoryTexture> = new Map();\r\n\r\n /** @internal */\r\n public _isRecordingTask = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if debug logs should be shown when applying texture allocation optimization (default: false)\r\n */\r\n public showDebugLogsForTextureAllcationOptimization = false;\r\n\r\n /**\r\n * Constructs a new instance of the texture manager\r\n * @param engine The engine to use\r\n * @param _debugTextures If true, debug textures will be created so that they are visible in the inspector\r\n * @param _scene The scene the manager belongs to\r\n */\r\n constructor(\r\n public readonly engine: AbstractEngine,\r\n private readonly _debugTextures = false,\r\n private readonly _scene: Scene\r\n ) {\r\n this._addSystemTextures();\r\n }\r\n\r\n /**\r\n * Checks if a handle is a backbuffer handle (color or depth/stencil)\r\n * @param handle The handle to check\r\n * @returns True if the handle is a backbuffer handle\r\n */\r\n public isBackbuffer(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferColorTextureHandle || handle === backbufferDepthStencilTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferColorTextureHandle || textureEntry.refHandle === backbufferDepthStencilTextureHandle;\r\n }\r\n\r\n /**\r\n * Checks if a handle is a backbuffer color handle\r\n * @param handle The handle to check\r\n * @returns True if the handle is a backbuffer color handle\r\n */\r\n public isBackbufferColor(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferColorTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferColorTextureHandle;\r\n }\r\n\r\n /**\r\n * Checks if a handle is a backbuffer depth/stencil handle\r\n * @param handle The handle to check\r\n * @returns True if the handle is a backbuffer depth/stencil handle\r\n */\r\n public isBackbufferDepthStencil(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferDepthStencilTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferDepthStencilTextureHandle;\r\n }\r\n\r\n /**\r\n * Checks if a handle is a history texture (or points to a history texture, for a dangling handle)\r\n * @param handle The handle to check\r\n * @returns True if the handle is a history texture, otherwise false\r\n */\r\n public isHistoryTexture(handle: FrameGraphTextureHandle): boolean {\r\n const entry = this._textures.get(handle);\r\n if (!entry) {\r\n return false;\r\n }\r\n\r\n handle = entry.refHandle ?? handle;\r\n\r\n return this._historyTextures.has(handle);\r\n }\r\n\r\n /**\r\n * Gets the creation options of a texture\r\n * @param handle Handle of the texture\r\n * @returns The creation options of the texture\r\n */\r\n public getTextureCreationOptions(handle: FrameGraphTextureHandle): FrameGraphTextureCreationOptions {\r\n const entry = this._textures.get(handle)!;\r\n const creationOptions = entry.creationOptions;\r\n\r\n return {\r\n size: textureSizeIsObject(creationOptions.size) ? { ...creationOptions.size } : creationOptions.size,\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n options: FrameGraphTextureManager.CloneTextureOptions(creationOptions.options, entry.textureIndex),\r\n isHistoryTexture: creationOptions.isHistoryTexture,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the description of a texture\r\n * @param handle Handle of the texture\r\n * @returns The description of the texture\r\n */\r\n public getTextureDescription(handle: FrameGraphTextureHandle): FrameGraphTextureDescription {\r\n const creationOptions = this.getTextureCreationOptions(handle);\r\n\r\n const size = !creationOptions.sizeIsPercentage\r\n ? textureSizeIsObject(creationOptions.size)\r\n ? creationOptions.size\r\n : { width: creationOptions.size, height: creationOptions.size }\r\n : this.getAbsoluteDimensions(creationOptions.size);\r\n\r\n return {\r\n size,\r\n options: creationOptions.options,\r\n };\r\n }\r\n\r\n /**\r\n * Gets a texture handle or creates a new texture if the handle is not provided.\r\n * If handle is not provided, newTextureName and creationOptions must be provided.\r\n * @param handle If provided, will simply return the handle\r\n * @param newTextureName Name of the new texture to create\r\n * @param creationOptions Options to use when creating the new texture\r\n * @returns The handle to the texture.\r\n */\r\n public getTextureHandleOrCreateTexture(handle?: FrameGraphTextureHandle, newTextureName?: string, creationOptions?: FrameGraphTextureCreationOptions): FrameGraphTextureHandle {\r\n if (handle === undefined) {\r\n if (newTextureName === undefined || creationOptions === undefined) {\r\n throw new Error(\"getTextureHandleOrCreateTexture: Either handle or newTextureName and creationOptions must be provided.\");\r\n }\r\n return this.createRenderTargetTexture(newTextureName, creationOptions);\r\n }\r\n return handle;\r\n }\r\n\r\n /**\r\n * Gets a texture from a handle.\r\n * Note that if the texture is a history texture, the read texture for the current frame will be returned.\r\n * @param handle The handle of the texture\r\n * @returns The texture or null if not found\r\n */\r\n public getTextureFromHandle(handle: FrameGraphTextureHandle): Nullable<InternalTexture> {\r\n const historyEntry = this._historyTextures.get(handle);\r\n if (historyEntry) {\r\n return historyEntry.textures[historyEntry.index ^ 1]; // gets the read texture\r\n }\r\n return this._textures.get(handle)!.texture;\r\n }\r\n\r\n /**\r\n * Imports a texture into the texture manager\r\n * @param name Name of the texture\r\n * @param texture Texture to import\r\n * @param handle Existing handle to use for the texture. If not provided (default), a new handle will be created.\r\n * @returns The handle to the texture\r\n */\r\n public importTexture(name: string, texture: InternalTexture, handle?: FrameGraphTextureHandle): FrameGraphTextureHandle {\r\n if (handle !== undefined) {\r\n this._freeEntry(handle);\r\n }\r\n\r\n const creationOptions: FrameGraphTextureCreationOptions = {\r\n size: { width: texture.width, height: texture.height },\r\n sizeIsPercentage: false,\r\n isHistoryTexture: false,\r\n options: {\r\n createMipMaps: texture.generateMipMaps,\r\n samples: texture.samples,\r\n types: [texture.type],\r\n formats: [texture.format],\r\n useSRGBBuffers: [texture._useSRGBBuffer],\r\n creationFlags: [texture._creationFlags],\r\n labels: texture.label ? [texture.label] : [\"imported\"],\r\n },\r\n };\r\n\r\n return this._createHandleForTexture(name, texture, creationOptions, FrameGraphTextureNamespace.External, handle);\r\n }\r\n\r\n /**\r\n * Creates a new render target texture\r\n * If multiple textures are described in FrameGraphTextureCreationOptions, the handle of the first texture is returned, handle+1 is the handle of the second texture, etc.\r\n * @param name Name of the texture\r\n * @param creationOptions Options to use when creating the texture\r\n * @param handle Existing handle to use for the texture. If not provided (default), a new handle will be created.\r\n * @returns The handle to the texture\r\n */\r\n public createRenderTargetTexture(name: string, creationOptions: FrameGraphTextureCreationOptions, handle?: FrameGraphTextureHandle): FrameGraphTextureHandle {\r\n return this._createHandleForTexture(\r\n name,\r\n null,\r\n {\r\n size: textureSizeIsObject(creationOptions.size) ? { ...creationOptions.size } : creationOptions.size,\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n isHistoryTexture: creationOptions.isHistoryTexture,\r\n options: FrameGraphTextureManager.CloneTextureOptions(creationOptions.options, undefined, true),\r\n },\r\n this._isRecordingTask ? FrameGraphTextureNamespace.Task : FrameGraphTextureNamespace.Graph,\r\n handle\r\n );\r\n }\r\n\r\n /**\r\n * Creates a (frame graph) render target wrapper\r\n * Note that renderTargets or renderTargetDepth can be undefined, but not both at the same time!\r\n * @param name Name of the render target wrapper\r\n * @param renderTargets Render target handles (textures) to use\r\n * @param renderTargetDepth Render target depth handle (texture) to use\r\n * @param depthReadOnly If true, the depth buffer will be read-only\r\n * @param stencilReadOnly If true, the stencil buffer will be read-only\r\n * @returns The created render target wrapper\r\n */\r\n public createRenderTarget(\r\n name: string,\r\n renderTargets?: FrameGraphTextureHandle | FrameGraphTextureHandle[],\r\n renderTargetDepth?: FrameGraphTextureHandle,\r\n depthReadOnly?: boolean,\r\n stencilReadOnly?: boolean\r\n ): FrameGraphRenderTarget {\r\n const renderTarget = new FrameGraphRenderTarget(name, this, renderTargets, renderTargetDepth);\r\n\r\n const rtw = renderTarget.renderTargetWrapper;\r\n\r\n if (rtw !== undefined) {\r\n rtw.depthReadOnly = !!depthReadOnly;\r\n rtw.stencilReadOnly = !!stencilReadOnly;\r\n\r\n if (renderTargets) {\r\n const handles = Array.isArray(renderTargets) ? renderTargets : [renderTargets];\r\n\r\n for (let i = 0; i < handles.length; i++) {\r\n let handle = handles[i];\r\n handle = this._textures.get(handle)?.refHandle ?? handle;\r\n\r\n const historyEntry = this._historyTextures.get(handle);\r\n if (historyEntry) {\r\n historyEntry.references.push({ renderTargetWrapper: rtw, textureIndex: i });\r\n\r\n rtw.setTexture(historyEntry.textures[historyEntry.index]!, i, false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return renderTarget;\r\n }\r\n\r\n /**\r\n * Creates a handle which is not associated with any texture.\r\n * Call resolveDanglingHandle to associate the handle with a valid texture handle.\r\n * @returns The dangling handle\r\n */\r\n public createDanglingHandle() {\r\n return FrameGraphTextureManager._Counter++;\r\n }\r\n\r\n /**\r\n * Associates a texture with a dangling handle\r\n * @param danglingHandle The dangling handle\r\n * @param handle The handle to associate with the dangling handle (if not provided, a new texture handle will be created, using the newTextureName and creationOptions parameters)\r\n * @param newTextureName The name of the new texture to create (if handle is not provided)\r\n * @param creationOptions The options to use when creating the new texture (if handle is not provided)\r\n */\r\n public resolveDanglingHandle(\r\n danglingHandle: FrameGraphTextureHandle,\r\n handle?: FrameGraphTextureHandle,\r\n newTextureName?: string,\r\n creationOptions?: FrameGraphTextureCreationOptions\r\n ) {\r\n if (handle === undefined) {\r\n if (newTextureName === undefined || creationOptions === undefined) {\r\n throw new Error(\"resolveDanglingHandle: Either handle or newTextureName and creationOptions must be provided.\");\r\n }\r\n this.createRenderTargetTexture(newTextureName, creationOptions, danglingHandle);\r\n return;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n\r\n if (textureEntry === undefined) {\r\n throw new Error(`resolveDanglingHandle: Handle ${handle} does not exist!`);\r\n }\r\n\r\n this._textures.set(danglingHandle, {\r\n texture: textureEntry.texture,\r\n refHandle: handle,\r\n name: textureEntry.name,\r\n creationOptions: {\r\n size: { ...(textureEntry.creationOptions.size as { width: number; height: number; depth?: number; layers?: number }) },\r\n options: FrameGraphTextureManager.CloneTextureOptions(textureEntry.creationOptions.options),\r\n sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,\r\n isHistoryTexture: false,\r\n },\r\n namespace: textureEntry.namespace,\r\n textureIndex: textureEntry.textureIndex,\r\n });\r\n }\r\n\r\n /**\r\n * Gets the absolute dimensions of a texture.\r\n * @param size The size of the texture. Width and height must be expressed as a percentage of the screen size (100=100%)!\r\n * @param screenWidth The width of the screen (default: the width of the rendering canvas)\r\n * @param screenHeight The height of the screen (default: the height of the rendering canvas)\r\n * @returns The absolute dimensions of the texture\r\n */\r\n public getAbsoluteDimensions(\r\n size: TextureSize,\r\n screenWidth = this.engine.getRenderWidth(true),\r\n screenHeight = this.engine.getRenderHeight(true)\r\n ): { width: number; height: number } {\r\n const { width, height } = getDimensionsFromTextureSize(size);\r\n\r\n return {\r\n width: Math.floor((width * screenWidth) / 100),\r\n height: Math.floor((height * screenHeight) / 100),\r\n };\r\n }\r\n\r\n /**\r\n * Calculates the total byte size of all textures used by the frame graph texture manager (including external textures)\r\n * @param optimizedSize True if the calculation should not factor in aliased textures\r\n * @param outputWidth The output width of the frame graph. Will be used to calculate the size of percentage-based textures\r\n * @param outputHeight The output height of the frame graph. Will be used to calculate the size of percentage-based textures\r\n * @returns The total size of all textures\r\n */\r\n public computeTotalTextureSize(optimizedSize: boolean, outputWidth: number, outputHeight: number) {\r\n let totalSize = 0;\r\n\r\n this._textures.forEach((entry, handle) => {\r\n if (handle === backbufferColorTextureHandle || handle === backbufferDepthStencilTextureHandle || entry.refHandle !== undefined) {\r\n return;\r\n }\r\n if (optimizedSize && entry.aliasHandle !== undefined) {\r\n return;\r\n }\r\n\r\n const options = entry.creationOptions;\r\n const textureIndex = entry.textureIndex || 0;\r\n const dimensions = options.sizeIsPercentage ? this.getAbsoluteDimensions(options.size, outputWidth, outputHeight) : getDimensionsFromTextureSize(options.size);\r\n\r\n const blockInfo = FrameGraphTextureManager._GetTextureBlockInformation(\r\n options.options.types?.[textureIndex] ?? Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n options.options.formats![textureIndex]\r\n );\r\n\r\n const textureByteSize = Math.ceil(dimensions.width / blockInfo.width) * Math.ceil(dimensions.height / blockInfo.height) * blockInfo.length;\r\n\r\n let byteSize = textureByteSize;\r\n\r\n if (options.options.createMipMaps) {\r\n byteSize = Math.floor((byteSize * 4) / 3);\r\n }\r\n\r\n if ((options.options.samples || 1) > 1) {\r\n // We need an additional texture in the case of MSAA\r\n byteSize += textureByteSize;\r\n }\r\n\r\n totalSize += byteSize;\r\n });\r\n\r\n return totalSize;\r\n }\r\n\r\n /** @internal */\r\n public _dispose(): void {\r\n this._releaseTextures();\r\n }\r\n\r\n /** @internal */\r\n public _allocateTextures(tasks?: FrameGraphTask[]): void {\r\n if (tasks) {\r\n this._optimizeTextureAllocation(tasks);\r\n }\r\n\r\n this._textures.forEach((entry) => {\r\n if (!entry.texture) {\r\n if (entry.refHandle !== undefined) {\r\n // entry is a dangling handle which has been resolved to point to refHandle\r\n // We simply update the texture to point to the refHandle texture\r\n const refEntry = this._textures.get(entry.refHandle)!;\r\n\r\n entry.texture = refEntry.texture;\r\n\r\n if (refEntry.refHandle === backbufferColorTextureHandle) {\r\n entry.refHandle = backbufferColorTextureHandle;\r\n }\r\n if (refEntry.refHandle === backbufferDepthStencilTextureHandle) {\r\n entry.refHandle = backbufferDepthStencilTextureHandle;\r\n }\r\n } else if (entry.namespace !== FrameGraphTextureNamespace.External) {\r\n if (entry.aliasHandle !== undefined) {\r\n const aliasEntry = this._textures.get(entry.aliasHandle)!;\r\n\r\n entry.texture = aliasEntry.texture!;\r\n entry.texture.incrementReferences();\r\n } else {\r\n const creationOptions = entry.creationOptions;\r\n const size = creationOptions.sizeIsPercentage ? this.getAbsoluteDimensions(creationOptions.size) : creationOptions.size;\r\n const textureIndex = entry.textureIndex || 0;\r\n\r\n const internalTextureCreationOptions: InternalTextureCreationOptions = {\r\n createMipMaps: creationOptions.options.createMipMaps,\r\n samples: creationOptions.options.samples,\r\n type: creationOptions.options.types?.[textureIndex],\r\n format: creationOptions.options.formats?.[textureIndex],\r\n useSRGBBuffer: creationOptions.options.useSRGBBuffers?.[textureIndex],\r\n creationFlags: creationOptions.options.creationFlags?.[textureIndex],\r\n label: creationOptions.options.labels?.[textureIndex] ?? `${entry.name}${textureIndex > 0 ? \"#\" + textureIndex : \"\"}`,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n createMSAATexture: creationOptions.options.samples! > 1,\r\n };\r\n\r\n const isDepthTexture = IsDepthTexture(internalTextureCreationOptions.format!);\r\n const hasStencil = HasStencilAspect(internalTextureCreationOptions.format!);\r\n const source =\r\n isDepthTexture && hasStencil\r\n ? InternalTextureSource.DepthStencil\r\n : isDepthTexture || hasStencil\r\n ? InternalTextureSource.Depth\r\n : InternalTextureSource.RenderTarget;\r\n\r\n const internalTexture = this.engine._createInternalTexture(size, internalTextureCreationOptions, false, source);\r\n\r\n if (isDepthTexture) {\r\n internalTexture.type = GetTypeForDepthTexture(internalTexture.format);\r\n }\r\n\r\n entry.texture = internalTexture;\r\n }\r\n }\r\n }\r\n\r\n if (entry.texture && entry.refHandle === undefined) {\r\n entry.debug?.dispose();\r\n entry.debug = this._createDebugTexture(entry.name, entry.texture);\r\n }\r\n });\r\n\r\n this._historyTextures.forEach((entry) => {\r\n for (let i = 0; i < entry.handles.length; i++) {\r\n entry.textures[i] = this._textures.get(entry.handles[i])!.texture;\r\n }\r\n });\r\n }\r\n\r\n /** @internal */\r\n public _releaseTextures(releaseAll = true): void {\r\n this._textures.forEach((entry, handle) => {\r\n if (entry.lifespan) {\r\n entry.lifespan.firstTask = Number.MAX_VALUE;\r\n entry.lifespan.lastTask = 0;\r\n }\r\n\r\n entry.aliasHandle = undefined;\r\n\r\n if (releaseAll || entry.namespace !== FrameGraphTextureNamespace.External) {\r\n entry.debug?.dispose();\r\n entry.debug = undefined;\r\n }\r\n\r\n if (entry.namespace === FrameGraphTextureNamespace.External) {\r\n return;\r\n }\r\n\r\n entry.texture?.dispose();\r\n entry.texture = null;\r\n\r\n if (releaseAll || entry.namespace === FrameGraphTextureNamespace.Task) {\r\n this._textures.delete(handle);\r\n }\r\n });\r\n\r\n this._historyTextures.forEach((entry) => {\r\n for (let i = 0; i < entry.handles.length; i++) {\r\n entry.textures[i] = null;\r\n }\r\n });\r\n\r\n if (releaseAll) {\r\n this._textures.clear();\r\n this._historyTextures.clear();\r\n this._addSystemTextures();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _updateHistoryTextures(): void {\r\n this._historyTextures.forEach((entry) => {\r\n entry.index = entry.index ^ 1;\r\n const currentTexture = entry.textures[entry.index];\r\n if (currentTexture) {\r\n for (const { renderTargetWrapper, textureIndex } of entry.references) {\r\n renderTargetWrapper.setTexture(currentTexture, textureIndex, false);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _addSystemTextures() {\r\n const size = { width: this.engine.getRenderWidth(true), height: this.engine.getRenderHeight(true) };\r\n\r\n this._textures.set(backbufferColorTextureHandle, {\r\n name: \"backbuffer color\",\r\n texture: null,\r\n creationOptions: {\r\n size,\r\n options: {\r\n createMipMaps: false,\r\n samples: this.engine.getCreationOptions().antialias ? 4 : 1,\r\n types: [Constants.TEXTURETYPE_UNSIGNED_BYTE], // todo? get from engine\r\n formats: [Constants.TEXTUREFORMAT_RGBA], // todo? get from engine\r\n useSRGBBuffers: [false],\r\n creationFlags: [0],\r\n labels: [\"backbuffer color\"],\r\n },\r\n sizeIsPercentage: false,\r\n },\r\n namespace: FrameGraphTextureNamespace.External,\r\n });\r\n\r\n this._textures.set(backbufferDepthStencilTextureHandle, {\r\n name: \"backbuffer depth/stencil\",\r\n texture: null,\r\n creationOptions: {\r\n size,\r\n options: {\r\n createMipMaps: false,\r\n samples: this.engine.getCreationOptions().antialias ? 4 : 1,\r\n types: [Constants.TEXTURETYPE_UNSIGNED_BYTE], // todo? get from engine\r\n formats: [Constants.TEXTUREFORMAT_DEPTH24], // todo? get from engine\r\n useSRGBBuffers: [false],\r\n creationFlags: [0],\r\n labels: [\"backbuffer depth/stencil\"],\r\n },\r\n sizeIsPercentage: false,\r\n },\r\n namespace: FrameGraphTextureNamespace.External,\r\n });\r\n }\r\n\r\n private _createDebugTexture(name: string, texture: InternalTexture): Texture | undefined {\r\n if (!this._debugTextures) {\r\n return;\r\n }\r\n\r\n const textureDebug = new Texture(null, this._scene);\r\n\r\n textureDebug.name = name;\r\n textureDebug._texture = texture;\r\n textureDebug._texture.incrementReferences();\r\n\r\n return textureDebug;\r\n }\r\n\r\n private _freeEntry(handle: number): void {\r\n const entry = this._textures.get(handle);\r\n\r\n if (entry) {\r\n entry.debug?.dispose();\r\n this._textures.delete(handle);\r\n }\r\n }\r\n\r\n private _createHandleForTexture(\r\n name: string,\r\n texture: Nullable<InternalTexture>,\r\n creationOptions: FrameGraphTextureCreationOptions,\r\n namespace: FrameGraphTextureNamespace,\r\n handle?: FrameGraphTextureHandle,\r\n textureIndex?: number\r\n ): FrameGraphTextureHandle {\r\n handle = handle ?? FrameGraphTextureManager._Counter++;\r\n textureIndex = textureIndex || 0;\r\n\r\n const textureName = creationOptions.isHistoryTexture ? `${name} ping` : name;\r\n\r\n let label = creationOptions.options.labels?.[textureIndex] ?? \"\";\r\n if (label === textureName) {\r\n label = \"\";\r\n }\r\n\r\n const textureEntry: TextureEntry = {\r\n texture,\r\n name: `${textureName}${label ? \" \" + label : \"\"}`,\r\n creationOptions: {\r\n size: textureSizeIsObject(creationOptions.size) ? creationOptions.size : { width: creationOptions.size, height: creationOptions.size },\r\n options: creationOptions.options,\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n isHistoryTexture: creationOptions.isHistoryTexture,\r\n },\r\n namespace,\r\n textureIndex,\r\n textureDescriptionHash: this._createTextureDescriptionHash(creationOptions),\r\n lifespan: {\r\n firstTask: Number.MAX_VALUE,\r\n lastTask: 0,\r\n },\r\n };\r\n\r\n this._textures.set(handle, textureEntry);\r\n\r\n if (namespace === FrameGraphTextureNamespace.External) {\r\n return handle;\r\n }\r\n\r\n if (creationOptions.isHistoryTexture) {\r\n const pongCreationOptions: FrameGraphTextureCreationOptions = {\r\n size: { ...(textureEntry.creationOptions.size as { width: number; height: number }) },\r\n options: { ...textureEntry.creationOptions.options },\r\n sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,\r\n isHistoryTexture: false,\r\n };\r\n\r\n const pongTexture = this._createHandleForTexture(`${name} pong`, null, pongCreationOptions, namespace);\r\n\r\n this._historyTextures.set(handle, { textures: [null, null], handles: [handle, pongTexture], index: 0, references: [] });\r\n\r\n return handle;\r\n }\r\n\r\n if (creationOptions.options.types && creationOptions.options.types.length > 1 && textureIndex === 0) {\r\n const textureCount = creationOptions.options.types.length;\r\n const creationOptionsForTexture: FrameGraphTextureCreationOptions = {\r\n size: textureSizeIsObject(creationOptions.size) ? creationOptions.size : { width: creationOptions.size, height: creationOptions.size },\r\n options: creationOptions.options,\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n };\r\n\r\n for (let i = 1; i < textureCount; i++) {\r\n this._createHandleForTexture(textureName, null, creationOptionsForTexture, namespace, handle + i, i);\r\n }\r\n\r\n FrameGraphTextureManager._Counter += textureCount - 1;\r\n }\r\n\r\n return handle;\r\n }\r\n\r\n private _createTextureDescriptionHash(options: FrameGraphTextureCreationOptions): string {\r\n const hash: string[] = [];\r\n\r\n hash.push(textureSizeIsObject(options.size) ? `${options.size.width}_${options.size.height}` : `${options.size}`);\r\n hash.push(options.sizeIsPercentage ? \"%\" : \"A\");\r\n hash.push(options.options.createMipMaps ? \"M\" : \"N\");\r\n hash.push(options.options.samples ? `${options.options.samples}` : \"S1\");\r\n hash.push(options.options.types ? options.options.types.join(\"_\") : `${Constants.TEXTURETYPE_UNSIGNED_BYTE}`);\r\n hash.push(options.options.formats ? options.options.formats.join(\"_\") : `${Constants.TEXTUREFORMAT_RGBA}`);\r\n hash.push(options.options.useSRGBBuffers ? options.options.useSRGBBuffers.join(\"_\") : \"false\");\r\n hash.push(options.options.creationFlags ? options.options.creationFlags.join(\"_\") : \"0\");\r\n\r\n return hash.join(\"_\");\r\n }\r\n\r\n private _optimizeTextureAllocation(tasks: FrameGraphTask[]): void {\r\n this._computeTextureLifespan(tasks);\r\n\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`================== Optimization of texture allocation ==================`);\r\n }\r\n\r\n const cache: Map<string, Array<[FrameGraphTextureHandle, Array<TextureLifespan>]>> = new Map();\r\n\r\n const iterator = this._textures.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const textureHandle = key.value;\r\n const textureEntry = this._textures.get(textureHandle)!;\r\n if (textureEntry.refHandle !== undefined || textureEntry.namespace === FrameGraphTextureNamespace.External || this._historyTextures.has(textureHandle)) {\r\n continue;\r\n }\r\n\r\n const textureHash = textureEntry.textureDescriptionHash!;\r\n const textureLifespan = textureEntry.lifespan!;\r\n\r\n const cacheEntries = cache.get(textureHash);\r\n if (cacheEntries) {\r\n let cacheEntryFound = false;\r\n for (const cacheEntry of cacheEntries) {\r\n const [sourceHandle, lifespanArray] = cacheEntry;\r\n\r\n let overlapped = false;\r\n for (const lifespan of lifespanArray) {\r\n if (lifespan.firstTask <= textureLifespan.lastTask && lifespan.lastTask >= textureLifespan.firstTask) {\r\n overlapped = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!overlapped) {\r\n // No overlap between texture lifespan and all lifespans in the array, this texture can reuse the same entry cache\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`Texture ${textureHandle} (${textureEntry.name}) reuses cache entry ${sourceHandle}`);\r\n }\r\n\r\n lifespanArray.push(textureLifespan);\r\n textureEntry.aliasHandle = sourceHandle;\r\n cacheEntryFound = true;\r\n break;\r\n }\r\n }\r\n if (!cacheEntryFound) {\r\n cacheEntries.push([textureHandle, [textureLifespan]]);\r\n }\r\n } else {\r\n cache.set(textureHash, [[textureHandle, [textureLifespan]]]);\r\n }\r\n }\r\n }\r\n\r\n // Loop through all task/pass dependencies and compute the lifespan of each texture (that is, the first task/pass that uses it and the last task/pass that uses it)\r\n private _computeTextureLifespan(tasks: FrameGraphTask[]): void {\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`================== Dump of texture dependencies for all tasks/passes ==================`);\r\n }\r\n\r\n for (let t = 0; t < tasks.length; ++t) {\r\n const task = tasks[t];\r\n\r\n if (task.passes.length > 0) {\r\n this._computeTextureLifespanForPasses(task, t, task.passes);\r\n }\r\n\r\n if (task.passesDisabled.length > 0) {\r\n this._computeTextureLifespanForPasses(task, t, task.passesDisabled);\r\n }\r\n\r\n if (task.dependencies) {\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`task#${t} (${task.name}), global dependencies`);\r\n }\r\n\r\n this._updateLifespan(t * 100 + 99, task.dependencies);\r\n }\r\n }\r\n\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`================== Texture lifespans ==================`);\r\n const iterator = this._textures.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const textureHandle = key.value;\r\n const textureEntry = this._textures.get(textureHandle)!;\r\n if (textureEntry.refHandle !== undefined || textureEntry.namespace === FrameGraphTextureNamespace.External || this._historyTextures.has(textureHandle)) {\r\n continue;\r\n }\r\n Logger.Log(`${textureHandle} (${textureEntry.name}): ${textureEntry.lifespan!.firstTask} - ${textureEntry.lifespan!.lastTask}`);\r\n }\r\n }\r\n }\r\n\r\n private _computeTextureLifespanForPasses(task: FrameGraphTask, taskIndex: number, passes: IFrameGraphPass[]): void {\r\n for (let p = 0; p < passes.length; ++p) {\r\n const dependencies = new Set<FrameGraphTextureHandle>();\r\n const pass = passes[p];\r\n\r\n if (!FrameGraphRenderPass.IsRenderPass(pass)) {\r\n continue;\r\n }\r\n\r\n pass.collectDependencies(dependencies);\r\n\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(`task#${taskIndex} (${task.name}), pass#${p} (${pass.name})`);\r\n }\r\n\r\n this._updateLifespan(taskIndex * 100 + p, dependencies);\r\n }\r\n }\r\n\r\n private _updateLifespan(passOrderNum: number, dependencies: Set<FrameGraphTextureHandle>) {\r\n const iterator = dependencies.keys();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const textureHandle = key.value;\r\n let textureEntry = this._textures.get(textureHandle);\r\n if (!textureEntry) {\r\n throw new Error(`FrameGraph._computeTextureLifespan: Texture handle \"${textureHandle}\" not found in the texture manager.`);\r\n }\r\n let handle = textureHandle;\r\n while (textureEntry.refHandle !== undefined) {\r\n handle = textureEntry.refHandle;\r\n textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n throw new Error(`FrameGraph._computeTextureLifespan: Texture handle \"${handle}\" not found in the texture manager (source handle=\"${textureHandle}\").`);\r\n }\r\n }\r\n if (textureEntry.namespace === FrameGraphTextureNamespace.External || this._historyTextures.has(handle)) {\r\n continue;\r\n }\r\n\r\n if (this.showDebugLogsForTextureAllcationOptimization) {\r\n Logger.Log(` ${handle} (${textureEntry.name})`);\r\n }\r\n\r\n textureEntry.lifespan!.firstTask = Math.min(textureEntry.lifespan!.firstTask, passOrderNum);\r\n textureEntry.lifespan!.lastTask = Math.max(textureEntry.lifespan!.lastTask, passOrderNum);\r\n }\r\n }\r\n\r\n /**\r\n * Clones a texture options\r\n * @param options The options to clone\r\n * @param textureIndex The index of the texture in the types, formats, etc array of FrameGraphTextureOptions. If not provided, all options are cloned.\r\n * @param preserveLabels True if the labels should be preserved (default: false)\r\n * @returns The cloned options\r\n */\r\n public static CloneTextureOptions(options: FrameGraphTextureOptions, textureIndex?: number, preserveLabels?: boolean): FrameGraphTextureOptions {\r\n return textureIndex !== undefined\r\n ? {\r\n createMipMaps: options.createMipMaps,\r\n samples: options.samples,\r\n types: options.types ? [options.types[textureIndex]] : undefined,\r\n formats: options.formats ? [options.formats[textureIndex]] : undefined,\r\n useSRGBBuffers: options.useSRGBBuffers ? [options.useSRGBBuffers[textureIndex]] : undefined,\r\n creationFlags: options.creationFlags ? [options.creationFlags[textureIndex]] : undefined,\r\n labels: options.labels ? [options.labels[textureIndex]] : undefined,\r\n }\r\n : {\r\n createMipMaps: options.createMipMaps,\r\n samples: options.samples,\r\n types: options.types ? [...options.types] : undefined,\r\n formats: options.formats ? [...options.formats] : undefined,\r\n useSRGBBuffers: options.useSRGBBuffers ? [...options.useSRGBBuffers] : undefined,\r\n creationFlags: options.creationFlags ? [...options.creationFlags] : undefined,\r\n labels: options.labels && preserveLabels ? [...options.labels] : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the texture block information.\r\n * @param type Type of the texture.\r\n * @param format Format of the texture.\r\n * @returns The texture block information. You can calculate the byte size of the texture by doing: Math.ceil(width / blockInfo.width) * Math.ceil(height / blockInfo.height) * blockInfo.length\r\n */\r\n private static _GetTextureBlockInformation(type: number, format: number): { width: number; height: number; length: number } {\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_DEPTH16:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTUREFORMAT_DEPTH24:\r\n return { width: 1, height: 1, length: 3 };\r\n case Constants.TEXTUREFORMAT_DEPTH24_STENCIL8:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_DEPTH32_FLOAT:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_DEPTH32FLOAT_STENCIL8:\r\n return { width: 1, height: 1, length: 5 };\r\n case Constants.TEXTUREFORMAT_STENCIL8:\r\n return { width: 1, height: 1, length: 1 };\r\n\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_BPTC_UNORM:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_BPTC_SIGNED_FLOAT:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT5:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT3:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT1:\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_S3TC_DXT1:\r\n return { width: 4, height: 4, length: 8 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA_ASTC_4x4:\r\n return { width: 4, height: 4, length: 16 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB_ETC1_WEBGL:\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGB8_ETC2:\r\n return { width: 4, height: 4, length: 8 };\r\n case Constants.TEXTUREFORMAT_COMPRESSED_RGBA8_ETC2_EAC:\r\n return { width: 4, height: 4, length: 16 };\r\n }\r\n\r\n switch (type) {\r\n case Constants.TEXTURETYPE_BYTE:\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_R:\r\n case Constants.TEXTUREFORMAT_R_INTEGER:\r\n case Constants.TEXTUREFORMAT_ALPHA:\r\n case Constants.TEXTUREFORMAT_LUMINANCE:\r\n case Constants.TEXTUREFORMAT_LUMINANCE_ALPHA:\r\n return { width: 1, height: 1, length: 1 };\r\n case Constants.TEXTUREFORMAT_RG:\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTUREFORMAT_RGB:\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return { width: 1, height: 1, length: 3 };\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n default:\r\n return { width: 1, height: 1, length: 4 };\r\n }\r\n case Constants.TEXTURETYPE_SHORT:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return { width: 1, height: 1, length: 6 };\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 8 };\r\n default:\r\n return { width: 1, height: 1, length: 8 };\r\n }\r\n case Constants.TEXTURETYPE_INT:\r\n case Constants.TEXTURETYPE_UNSIGNED_INTEGER: // Refers to UNSIGNED_INT\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_RG_INTEGER:\r\n return { width: 1, height: 1, length: 8 };\r\n case Constants.TEXTUREFORMAT_RGB_INTEGER:\r\n return { width: 1, height: 1, length: 12 };\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 16 };\r\n default:\r\n return { width: 1, height: 1, length: 16 };\r\n }\r\n case Constants.TEXTURETYPE_FLOAT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_RG:\r\n return { width: 1, height: 1, length: 8 };\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return { width: 1, height: 1, length: 12 };\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return { width: 1, height: 1, length: 16 };\r\n default:\r\n return { width: 1, height: 1, length: 16 };\r\n }\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RED:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTUREFORMAT_RG:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_RGB:\r\n return { width: 1, height: 1, length: 6 };\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return { width: 1, height: 1, length: 8 };\r\n default:\r\n return { width: 1, height: 1, length: 8 };\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n default:\r\n return { width: 1, height: 1, length: 4 };\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n default:\r\n return { width: 1, height: 1, length: 4 };\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n return { width: 1, height: 1, length: 2 };\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV:\r\n switch (format) {\r\n case Constants.TEXTUREFORMAT_RGBA:\r\n return { width: 1, height: 1, length: 4 };\r\n case Constants.TEXTUREFORMAT_RGBA_INTEGER:\r\n return { width: 1, height: 1, length: 4 };\r\n default:\r\n return { width: 1, height: 1, length: 4 };\r\n }\r\n }\r\n\r\n return { width: 1, height: 1, length: 4 };\r\n }\r\n}\r\n"]}
@@ -60,6 +60,7 @@ export interface IEffectLayerOptions {
60
60
  */
61
61
  export declare abstract class EffectLayer {
62
62
  private _effectLayerOptions;
63
+ private _mainTextureCreatedSize;
63
64
  protected _scene: Scene;
64
65
  protected _engine: AbstractEngine;
65
66
  protected _maxSize: number;
@@ -147,6 +147,7 @@ export class EffectLayer {
147
147
  constructor(
148
148
  /** The Friendly of the effect in the scene */
149
149
  name, scene, forceGLSL = false, thinEffectLayer) {
150
+ this._mainTextureCreatedSize = { width: 0, height: 0 };
150
151
  this._maxSize = 0;
151
152
  this._mainTextureDesiredSize = { width: 0, height: 0 };
152
153
  this._postProcesses = [];
@@ -345,9 +346,8 @@ export class EffectLayer {
345
346
  return;
346
347
  }
347
348
  // Handle size changes.
348
- const size = this._mainTexture.getSize();
349
349
  this._setMainTextureSize();
350
- if ((size.width !== this._mainTextureDesiredSize.width || size.height !== this._mainTextureDesiredSize.height) &&
350
+ if ((this._mainTextureCreatedSize.width !== this._mainTextureDesiredSize.width || this._mainTextureCreatedSize.height !== this._mainTextureDesiredSize.height) &&
351
351
  this._mainTextureDesiredSize.width !== 0 &&
352
352
  this._mainTextureDesiredSize.height !== 0) {
353
353
  // Recreate RTT and post processes on size change.
@@ -355,6 +355,8 @@ export class EffectLayer {
355
355
  this._disposeTextureAndPostProcesses();
356
356
  this._createMainTexture();
357
357
  this._createTextureAndPostProcesses();
358
+ this._mainTextureCreatedSize.width = this._mainTextureDesiredSize.width;
359
+ this._mainTextureCreatedSize.height = this._mainTextureDesiredSize.height;
358
360
  }
359
361
  }
360
362
  /**