{"version":3,"file":"TextureGCSystem.mjs","sources":["../../../../../src/rendering/renderers/shared/texture/TextureGCSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../../extensions/Extensions';\n\nimport type { Renderer } from '../../types';\nimport type { System } from '../system/System';\n\n/**\n * Options for the {@link TextureGCSystem}.\n * @memberof rendering\n * @property {boolean} [textureGCActive=true] - If set to true, this will enable the garbage collector on the GPU.\n * @property {number} [textureGCAMaxIdle=60 * 60] -\n * The maximum idle frames before a texture is destroyed by garbage collection.\n * @property {number} [textureGCCheckCountMax=600] - Frames between two garbage collections.\n */\nexport interface TextureGCSystemOptions\n{\n    /**\n     * If set to true, this will enable the garbage collector on the GPU.\n     * @default true\n     * @memberof rendering.SharedRendererOptions\n     */\n    textureGCActive: boolean;\n    /**\n     * @deprecated since 8.3.0\n     * @see {@link TextureGCSystem.textureGCMaxIdle}\n     * @memberof rendering.SharedRendererOptions\n     */\n    textureGCAMaxIdle: number;\n    /**\n     * The maximum idle frames before a texture is destroyed by garbage collection.\n     * @default 60 * 60\n     * @memberof rendering.SharedRendererOptions\n     */\n    textureGCMaxIdle: number;\n    /**\n     * Frames between two garbage collections.\n     * @default 600\n     * @memberof rendering.SharedRendererOptions\n     */\n    textureGCCheckCountMax: number;\n}\n/**\n * System plugin to the renderer to manage texture garbage collection on the GPU,\n * ensuring that it does not get clogged up with textures that are no longer being used.\n * @memberof rendering\n */\nexport class TextureGCSystem implements System<TextureGCSystemOptions>\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLSystem,\n            ExtensionType.WebGPUSystem,\n        ],\n        name: 'textureGC',\n    } as const;\n\n    /** default options for the TextureGCSystem */\n    public static defaultOptions: TextureGCSystemOptions = {\n        /**\n         * If set to true, this will enable the garbage collector on the GPU.\n         * @default true\n         */\n        textureGCActive: true,\n        /**\n         * @deprecated since 8.3.0\n         * @see {@link TextureGCSystem.textureGCMaxIdle}\n         */\n        textureGCAMaxIdle: null,\n        /**\n         * The maximum idle frames before a texture is destroyed by garbage collection.\n         * @default 60 * 60\n         */\n        textureGCMaxIdle: 60 * 60,\n        /**\n         * Frames between two garbage collections.\n         * @default 600\n         */\n        textureGCCheckCountMax: 600,\n    };\n\n    /**\n     * Frame count since started.\n     * @readonly\n     */\n    public count: number;\n\n    /**\n     * Frame count since last garbage collection.\n     * @readonly\n     */\n    public checkCount: number;\n\n    /**\n     * Maximum idle frames before a texture is destroyed by garbage collection.\n     * @see TextureGCSystem.defaultMaxIdle\n     */\n    public maxIdle: number;\n\n    /**\n     * Frames between two garbage collections.\n     * @see TextureGCSystem.defaultCheckCountMax\n     */\n    public checkCountMax: number;\n\n    /**\n     * Current garbage collection mode.\n     * @see TextureGCSystem.defaultMode\n     */\n    public active: boolean;\n    private _renderer: Renderer;\n\n    /** @param renderer - The renderer this System works for. */\n    constructor(renderer: Renderer)\n    {\n        this._renderer = renderer;\n\n        this.count = 0;\n        this.checkCount = 0;\n    }\n\n    public init(options: TextureGCSystemOptions): void\n    {\n        options = { ...TextureGCSystem.defaultOptions, ...options };\n\n        this.checkCountMax = options.textureGCCheckCountMax;\n        this.maxIdle = options.textureGCAMaxIdle ?? options.textureGCMaxIdle;\n        this.active = options.textureGCActive;\n    }\n\n    /**\n     * Checks to see when the last time a texture was used.\n     * If the texture has not been used for a specified amount of time, it will be removed from the GPU.\n     */\n    protected postrender(): void\n    {\n        if (!this._renderer.renderingToScreen)\n        {\n            return;\n        }\n\n        this.count++;\n\n        if (!this.active) return;\n\n        this.checkCount++;\n\n        if (this.checkCount > this.checkCountMax)\n        {\n            this.checkCount = 0;\n\n            this.run();\n        }\n    }\n\n    /**\n     * Checks to see when the last time a texture was used.\n     * If the texture has not been used for a specified amount of time, it will be removed from the GPU.\n     */\n    public run(): void\n    {\n        const managedTextures = this._renderer.texture.managedTextures;\n\n        for (let i = 0; i < managedTextures.length; i++)\n        {\n            const texture = managedTextures[i];\n\n            // Only supports non generated textures at the moment!\n            if (\n                texture.autoGarbageCollect\n                && texture.resource\n                && texture._touched > -1\n                && this.count - texture._touched > this.maxIdle\n            )\n            {\n                texture._touched = -1;\n                texture.unload();\n            }\n        }\n    }\n\n    public destroy(): void\n    {\n        this._renderer = null as any as Renderer;\n    }\n}\n"],"names":[],"mappings":";;;AA6CO,MAAM,gBAAA,GAAN,MAAM,gBACb,CAAA;AAAA;AAAA,EAkEI,YAAY,QACZ,EAAA;AACI,IAAA,IAAA,CAAK,SAAY,GAAA,QAAA,CAAA;AAEjB,IAAA,IAAA,CAAK,KAAQ,GAAA,CAAA,CAAA;AACb,IAAA,IAAA,CAAK,UAAa,GAAA,CAAA,CAAA;AAAA,GACtB;AAAA,EAEO,KAAK,OACZ,EAAA;AACI,IAAA,OAAA,GAAU,EAAE,GAAG,gBAAgB,CAAA,cAAA,EAAgB,GAAG,OAAQ,EAAA,CAAA;AAE1D,IAAA,IAAA,CAAK,gBAAgB,OAAQ,CAAA,sBAAA,CAAA;AAC7B,IAAK,IAAA,CAAA,OAAA,GAAU,OAAQ,CAAA,iBAAA,IAAqB,OAAQ,CAAA,gBAAA,CAAA;AACpD,IAAA,IAAA,CAAK,SAAS,OAAQ,CAAA,eAAA,CAAA;AAAA,GAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,UACV,GAAA;AACI,IAAI,IAAA,CAAC,IAAK,CAAA,SAAA,CAAU,iBACpB,EAAA;AACI,MAAA,OAAA;AAAA,KACJ;AAEA,IAAK,IAAA,CAAA,KAAA,EAAA,CAAA;AAEL,IAAA,IAAI,CAAC,IAAK,CAAA,MAAA;AAAQ,MAAA,OAAA;AAElB,IAAK,IAAA,CAAA,UAAA,EAAA,CAAA;AAEL,IAAI,IAAA,IAAA,CAAK,UAAa,GAAA,IAAA,CAAK,aAC3B,EAAA;AACI,MAAA,IAAA,CAAK,UAAa,GAAA,CAAA,CAAA;AAElB,MAAA,IAAA,CAAK,GAAI,EAAA,CAAA;AAAA,KACb;AAAA,GACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,GACP,GAAA;AACI,IAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,SAAA,CAAU,OAAQ,CAAA,eAAA,CAAA;AAE/C,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,eAAA,CAAgB,QAAQ,CAC5C,EAAA,EAAA;AACI,MAAM,MAAA,OAAA,GAAU,gBAAgB,CAAC,CAAA,CAAA;AAGjC,MAAA,IACI,OAAQ,CAAA,kBAAA,IACL,OAAQ,CAAA,QAAA,IACR,OAAQ,CAAA,QAAA,GAAW,CACnB,CAAA,IAAA,IAAA,CAAK,KAAQ,GAAA,OAAA,CAAQ,QAAW,GAAA,IAAA,CAAK,OAE5C,EAAA;AACI,QAAA,OAAA,CAAQ,QAAW,GAAA,CAAA,CAAA,CAAA;AACnB,QAAA,OAAA,CAAQ,MAAO,EAAA,CAAA;AAAA,OACnB;AAAA,KACJ;AAAA,GACJ;AAAA,EAEO,OACP,GAAA;AACI,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AAAA,GACrB;AACJ,CAAA,CAAA;AAAA;AA3Ia,gBAAA,CAGK,SAAY,GAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACF,aAAc,CAAA,WAAA;AAAA,IACd,aAAc,CAAA,YAAA;AAAA,GAClB;AAAA,EACA,IAAM,EAAA,WAAA;AACV,CAAA,CAAA;AAAA;AATS,gBAAA,CAYK,cAAyC,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnD,eAAiB,EAAA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjB,iBAAmB,EAAA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnB,kBAAkB,EAAK,GAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvB,sBAAwB,EAAA,GAAA;AAC5B,CAAA,CAAA;AAjCG,IAAM,eAAN,GAAA;;;;"}