{"version":3,"file":"GlContextSystem.mjs","sources":["../../../../../src/rendering/renderers/gl/context/GlContextSystem.ts"],"sourcesContent":["import { DOMAdapter } from '../../../../environment/adapter';\nimport { ExtensionType } from '../../../../extensions/Extensions';\nimport { warn } from '../../../../utils/logging/warn';\nimport { type GpuPowerPreference } from '../../types';\n\nimport type { System } from '../../shared/system/System';\nimport type { WebGLRenderer } from '../WebGLRenderer';\nimport type { WebGLExtensions } from './WebGLExtensions';\n\n/**\n * Options for the context system.\n * @memberof rendering\n * @property {WebGL2RenderingContext | null} [context=null] - User-provided WebGL rendering context object.\n * @property {GpuPowerPreference} [powerPreference='default'] - An optional hint indicating what configuration\n * of GPU is suitable for the WebGL context, can be `'high-performance'` or `'low-power'`. Setting to `'high-performance'`\n * will prioritize rendering performance over power consumption, while setting to `'low-power'` will prioritize power saving\n * over rendering performance.\n * @property {boolean} [premultipliedAlpha=true] - Whether the compositor will assume the drawing buffer contains\n * colors with premultiplied alpha.\n * @property {boolean} [preserveDrawingBuffer=false] - Whether to enable drawing buffer preservation.\n * If enabled, the drawing buffer will preserve\n * its value until cleared or overwritten. Enable this if you need to call `toDataUrl` on the WebGL context.\n * @property {boolean} [antialias] - Whether to enable antialiasing.\n * @property {1 | 2} [preferWebGLVersion=2] - The preferred WebGL version to use.\n */\nexport interface ContextSystemOptions\n{\n    /**\n     * User-provided WebGL rendering context object.\n     * @default null\n     * @memberof rendering.SharedRendererOptions\n     */\n    context: WebGL2RenderingContext | null;\n    /**\n     * An optional hint indicating what configuration of GPU is suitable for the WebGL context,\n     * can be `'high-performance'` or `'low-power'`.\n     * Setting to `'high-performance'` will prioritize rendering performance over power consumption,\n     * while setting to `'low-power'` will prioritize power saving over rendering performance.\n     * @memberof rendering.SharedRendererOptions\n     * @default undefined\n     */\n    powerPreference?: GpuPowerPreference;\n\n    /**\n     * Whether the compositor will assume the drawing buffer contains colors with premultiplied alpha.\n     * @default true\n     * @memberof rendering.SharedRendererOptions\n     */\n    premultipliedAlpha: boolean;\n    /**\n     * Whether to enable drawing buffer preservation. If enabled, the drawing buffer will preserve\n     * its value until cleared or overwritten. Enable this if you need to call `toDataUrl` on the WebGL context.\n     * @default false\n     * @memberof rendering.SharedRendererOptions\n     */\n    preserveDrawingBuffer: boolean;\n\n    antialias?: boolean;\n\n    /**\n     * The preferred WebGL version to use.\n     * @default 2\n     * @memberof rendering.SharedRendererOptions\n     */\n    preferWebGLVersion?: 1 | 2;\n}\n\n/**\n * System plugin to the renderer to manage the context\n * @memberof rendering\n */\nexport class GlContextSystem implements System<ContextSystemOptions>\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLSystem,\n        ],\n        name: 'context',\n    } as const;\n\n    /** The default options for the system. */\n    public static defaultOptions: ContextSystemOptions = {\n        /**\n         * {@link WebGLOptions.context}\n         * @default null\n         */\n        context: null,\n        /**\n         * {@link WebGLOptions.premultipliedAlpha}\n         * @default true\n         */\n        premultipliedAlpha: true,\n        /**\n         * {@link WebGLOptions.preserveDrawingBuffer}\n         * @default false\n         */\n        preserveDrawingBuffer: false,\n        /**\n         * {@link WebGLOptions.powerPreference}\n         * @default default\n         */\n        powerPreference: undefined,\n        /**\n         * {@link WebGLOptions.webGLVersion}\n         * @default 2\n         */\n        preferWebGLVersion: 2,\n    };\n\n    protected CONTEXT_UID: number;\n    protected gl: WebGL2RenderingContext;\n\n    /**\n     * Features supported by current renderer.\n     * @type {object}\n     * @readonly\n     */\n    public supports = {\n        /** Support for 32-bit indices buffer. */\n        uint32Indices: true,\n        /** Support for UniformBufferObjects */\n        uniformBufferObject: true,\n        /** Support for VertexArrayObjects */\n        vertexArrayObject: true,\n        /** Support for SRGB texture format */\n        srgbTextures: true,\n        /** Support for wrapping modes if a texture is non-power of two */\n        nonPowOf2wrapping: true,\n        /** Support for MSAA (antialiasing of dynamic textures) */\n        msaa: true,\n        /** Support for mipmaps if a texture is non-power of two */\n        nonPowOf2mipmaps: true,\n    };\n\n    /**\n     * Extensions available.\n     * @type {object}\n     * @readonly\n     * @property {WEBGL_draw_buffers} drawBuffers - WebGL v1 extension\n     * @property {WEBGL_depth_texture} depthTexture - WebGL v1 extension\n     * @property {OES_texture_float} floatTexture - WebGL v1 extension\n     * @property {WEBGL_lose_context} loseContext - WebGL v1 extension\n     * @property {OES_vertex_array_object} vertexArrayObject - WebGL v1 extension\n     * @property {EXT_texture_filter_anisotropic} anisotropicFiltering - WebGL v1 and v2 extension\n     */\n    public extensions: WebGLExtensions;\n\n    public webGLVersion: 1 | 2;\n\n    private _renderer: WebGLRenderer;\n    private _contextLossForced: boolean;\n\n    /** @param renderer - The renderer this System works for. */\n    constructor(renderer: WebGLRenderer)\n    {\n        this._renderer = renderer;\n\n        this.extensions = Object.create(null);\n\n        // Bind functions\n        this.handleContextLost = this.handleContextLost.bind(this);\n        this.handleContextRestored = this.handleContextRestored.bind(this);\n    }\n\n    /**\n     * `true` if the context is lost\n     * @readonly\n     */\n    get isLost(): boolean\n    {\n        return (!this.gl || this.gl.isContextLost());\n    }\n\n    /**\n     * Handles the context change event.\n     * @param {WebGLRenderingContext} gl - New WebGL context.\n     */\n    protected contextChange(gl: WebGL2RenderingContext): void\n    {\n        this.gl = gl;\n        this._renderer.gl = gl;\n    }\n\n    public init(options: ContextSystemOptions): void\n    {\n        options = { ...GlContextSystem.defaultOptions, ...options };\n\n        /*\n         * The options passed in to create a new WebGL context.\n         */\n        if (options.context)\n        {\n            this.initFromContext(options.context);\n        }\n        else\n        {\n            const alpha = this._renderer.background.alpha < 1;\n            const premultipliedAlpha = options.premultipliedAlpha ?? true;\n            const antialias = options.antialias && !this._renderer.backBuffer.useBackBuffer;\n\n            this.createContext(options.preferWebGLVersion, {\n                alpha,\n                premultipliedAlpha,\n                antialias,\n                stencil: true,\n                preserveDrawingBuffer: options.preserveDrawingBuffer,\n                powerPreference: options.powerPreference ?? 'default',\n            });\n        }\n    }\n\n    /**\n     * Initializes the context.\n     * @protected\n     * @param {WebGLRenderingContext} gl - WebGL context\n     */\n    protected initFromContext(gl: WebGL2RenderingContext): void\n    {\n        this.gl = gl;\n\n        this.webGLVersion = gl instanceof DOMAdapter.get().getWebGLRenderingContext() ? 1 : 2;\n\n        this.getExtensions();\n\n        this.validateContext(gl);\n\n        this._renderer.runners.contextChange.emit(gl);\n\n        const element = this._renderer.view.canvas;\n\n        (element as any).addEventListener('webglcontextlost', this.handleContextLost, false);\n        element.addEventListener('webglcontextrestored', this.handleContextRestored, false);\n    }\n\n    /**\n     * Initialize from context options\n     * @protected\n     * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext\n     * @param preferWebGLVersion\n     * @param {object} options - context attributes\n     */\n    protected createContext(preferWebGLVersion: 1 | 2, options: WebGLContextAttributes): void\n    {\n        let gl: WebGL2RenderingContext | WebGLRenderingContext;\n        const canvas = this._renderer.view.canvas;\n\n        if (preferWebGLVersion === 2)\n        {\n            gl = canvas.getContext('webgl2', options);\n        }\n\n        if (!gl)\n        {\n            gl = canvas.getContext('webgl', options);\n\n            if (!gl)\n            {\n                // fail, not able to get a context\n                throw new Error('This browser does not support WebGL. Try using the canvas renderer');\n            }\n        }\n\n        this.gl = gl as WebGL2RenderingContext;\n\n        this.initFromContext(this.gl);\n    }\n\n    /** Auto-populate the {@link GlContextSystem.extensions extensions}. */\n    protected getExtensions(): void\n    {\n        // time to set up default extensions that Pixi uses.\n        const { gl } = this;\n\n        const common = {\n            anisotropicFiltering: gl.getExtension('EXT_texture_filter_anisotropic'),\n            floatTextureLinear: gl.getExtension('OES_texture_float_linear'),\n\n            s3tc: gl.getExtension('WEBGL_compressed_texture_s3tc'),\n            s3tc_sRGB: gl.getExtension('WEBGL_compressed_texture_s3tc_srgb'), // eslint-disable-line camelcase\n            etc: gl.getExtension('WEBGL_compressed_texture_etc'),\n            etc1: gl.getExtension('WEBGL_compressed_texture_etc1'),\n            pvrtc: gl.getExtension('WEBGL_compressed_texture_pvrtc')\n                || gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc'),\n            atc: gl.getExtension('WEBGL_compressed_texture_atc'),\n            astc: gl.getExtension('WEBGL_compressed_texture_astc'),\n            bptc: gl.getExtension('EXT_texture_compression_bptc'),\n            rgtc: gl.getExtension('EXT_texture_compression_rgtc'),\n            loseContext: gl.getExtension('WEBGL_lose_context'),\n        };\n\n        if (this.webGLVersion === 1)\n        {\n            this.extensions = {\n                ...common,\n\n                drawBuffers: gl.getExtension('WEBGL_draw_buffers'),\n                depthTexture: gl.getExtension('WEBGL_depth_texture'),\n                vertexArrayObject: gl.getExtension('OES_vertex_array_object')\n                    || gl.getExtension('MOZ_OES_vertex_array_object')\n                    || gl.getExtension('WEBKIT_OES_vertex_array_object'),\n                uint32ElementIndex: gl.getExtension('OES_element_index_uint'),\n                // Floats and half-floats\n                floatTexture: gl.getExtension('OES_texture_float'),\n                floatTextureLinear: gl.getExtension('OES_texture_float_linear'),\n                textureHalfFloat: gl.getExtension('OES_texture_half_float'),\n                textureHalfFloatLinear: gl.getExtension('OES_texture_half_float_linear'),\n                vertexAttribDivisorANGLE: gl.getExtension('ANGLE_instanced_arrays'),\n                srgb: gl.getExtension('EXT_sRGB'),\n            };\n        }\n        else\n        {\n            this.extensions = {\n                ...common,\n                colorBufferFloat: gl.getExtension('EXT_color_buffer_float'),\n            };\n\n            const provokeExt = gl.getExtension('WEBGL_provoking_vertex');\n\n            if (provokeExt)\n            {\n                provokeExt.provokingVertexWEBGL(provokeExt.FIRST_VERTEX_CONVENTION_WEBGL);\n            }\n        }\n    }\n\n    /**\n     * Handles a lost webgl context\n     * @param {WebGLContextEvent} event - The context lost event.\n     */\n    protected handleContextLost(event: WebGLContextEvent): void\n    {\n        event.preventDefault();\n\n        // only restore if we purposefully nuked it\n        if (this._contextLossForced)\n        {\n            this._contextLossForced = false;\n            // Restore the context after this event has exited\n            setTimeout(() =>\n            {\n                if (this.gl.isContextLost())\n                {\n                    this.extensions.loseContext?.restoreContext();\n                }\n            }, 0);\n        }\n    }\n\n    /** Handles a restored webgl context. */\n    protected handleContextRestored(): void\n    {\n        this._renderer.runners.contextChange.emit(this.gl);\n    }\n\n    public destroy(): void\n    {\n        const element = this._renderer.view.canvas;\n\n        this._renderer = null;\n\n        // remove listeners\n        (element as any).removeEventListener('webglcontextlost', this.handleContextLost);\n        element.removeEventListener('webglcontextrestored', this.handleContextRestored);\n\n        this.gl.useProgram(null);\n\n        this.extensions.loseContext?.loseContext();\n    }\n\n    /**\n     * this function can be called to force a webGL context loss\n     * this will release all resources on the GPU.\n     * Useful if you need to put Pixi to sleep, and save some GPU memory\n     *\n     * As soon as render is called - all resources will be created again.\n     */\n    public forceContextLoss(): void\n    {\n        this.extensions.loseContext?.loseContext();\n        this._contextLossForced = true;\n    }\n    /**\n     * Validate context.\n     * @param {WebGLRenderingContext} gl - Render context.\n     */\n    protected validateContext(gl: WebGL2RenderingContext): void\n    {\n        const attributes = gl.getContextAttributes();\n\n        // this is going to be fairly simple for now.. but at least we have room to grow!\n        if (attributes && !attributes.stencil)\n        {\n            // #if _DEBUG\n            /* eslint-disable max-len, no-console */\n            warn('Provided WebGL context does not have a stencil buffer, masks may not render correctly');\n            /* eslint-enable max-len, no-console */\n            // #endif\n        }\n\n        // support\n        const supports = this.supports;\n\n        const isWebGl2 = this.webGLVersion === 2;\n        const extensions = this.extensions;\n\n        supports.uint32Indices = isWebGl2 || !!extensions.uint32ElementIndex;\n        supports.uniformBufferObject = isWebGl2;\n        supports.vertexArrayObject = isWebGl2 || !!extensions.vertexArrayObject;\n        supports.srgbTextures = isWebGl2 || !!extensions.srgb;\n        supports.nonPowOf2wrapping = isWebGl2;\n        supports.nonPowOf2mipmaps = isWebGl2;\n        supports.msaa = isWebGl2;\n\n        if (!supports.uint32Indices)\n        {\n            // #if _DEBUG\n            /* eslint-disable max-len, no-console */\n            warn('Provided WebGL context does not support 32 index buffer, large scenes may not render correctly');\n            /* eslint-enable max-len, no-console */\n            // #endif\n        }\n    }\n}\n"],"names":[],"mappings":"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"}