{"version":3,"file":"GpuDeviceSystem.mjs","sources":["../../../../src/rendering/renderers/gpu/GpuDeviceSystem.ts"],"sourcesContent":["import { DOMAdapter } from '../../../environment/adapter';\nimport { ExtensionType } from '../../../extensions/Extensions';\n\nimport type { System } from '../shared/system/System';\nimport type { GpuPowerPreference } from '../types';\nimport type { WebGPURenderer } from './WebGPURenderer';\n\n/** The GPU object. */\nexport interface GPU\n{\n    /** The GPU adapter */\n    adapter: GPUAdapter;\n    /** The GPU device */\n    device: GPUDevice;\n}\n\n/**\n * Options for the WebGPU context.\n * @property {GpuPowerPreference} [powerPreference=default] - An optional hint indicating what configuration of GPU\n * is suitable for the WebGPU context, 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 * @property {boolean} [forceFallbackAdapter=false] - Force the use of the fallback adapter\n * @memberof rendering\n */\nexport interface GpuContextOptions\n{\n    /**\n     * An optional hint indicating what configuration of GPU is suitable for the WebGPU 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     * @default undefined\n     * @memberof rendering.WebGPUOptions\n     */\n    powerPreference?: GpuPowerPreference;\n    /**\n     * Force the use of the fallback adapter\n     * @default false\n     * @memberof rendering.WebGPUOptions\n     */\n    forceFallbackAdapter: boolean;\n}\n\n/**\n * System plugin to the renderer to manage the context.\n * @class\n * @memberof rendering\n */\nexport class GpuDeviceSystem implements System<GpuContextOptions>\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGPUSystem,\n        ],\n        name: 'device',\n    } as const;\n\n    /** The default options for the GpuDeviceSystem. */\n    public static defaultOptions: GpuContextOptions = {\n        /**\n         * {@link WebGPUOptions.powerPreference}\n         * @default default\n         */\n        powerPreference: undefined,\n        /**\n         * Force the use of the fallback adapter\n         * @default false\n         */\n        forceFallbackAdapter: false,\n    };\n\n    /** The GPU device */\n    public gpu: GPU;\n\n    private _renderer: WebGPURenderer;\n    private _initPromise: Promise<void>;\n\n    /**\n     * @param {WebGPURenderer} renderer - The renderer this System works for.\n     */\n    constructor(renderer: WebGPURenderer)\n    {\n        this._renderer = renderer;\n    }\n\n    public async init(options: GpuContextOptions): Promise<void>\n    {\n        if (this._initPromise) return this._initPromise;\n\n        this._initPromise = this._createDeviceAndAdaptor(options)\n            .then((gpu) =>\n            {\n                this.gpu = gpu;\n\n                this._renderer.runners.contextChange.emit(this.gpu);\n            });\n\n        return this._initPromise;\n    }\n\n    /**\n     * Handle the context change event\n     * @param gpu\n     */\n    protected contextChange(gpu: GPU): void\n    {\n        this._renderer.gpu = gpu;\n    }\n\n    /**\n     * Helper class to create a WebGL Context\n     * @param {object} options - An options object that gets passed in to the canvas element containing the\n     *    context attributes\n     * @see https://developer.mozilla.org/en/docs/Web/API/HTMLCanvasElement/getContext\n     * @returns {WebGLRenderingContext} the WebGL context\n     */\n    private async _createDeviceAndAdaptor(options: GpuContextOptions): Promise<GPU>\n    {\n        // TODO we only need one of these..\n        const adapter = await DOMAdapter.get().getNavigator().gpu.requestAdapter({\n            powerPreference: options.powerPreference,\n            forceFallbackAdapter: options.forceFallbackAdapter,\n        });\n\n        const requiredFeatures = [\n            'texture-compression-bc',\n            'texture-compression-astc',\n            'texture-compression-etc2',\n        ].filter((feature) => adapter.features.has(feature)) as GPUFeatureName[];\n\n        // TODO and one of these!\n        const device = await adapter.requestDevice({\n            requiredFeatures\n        });\n\n        return { adapter, device };\n    }\n\n    public destroy(): void\n    {\n        this.gpu = null;\n        this._renderer = null;\n    }\n}\n"],"names":[],"mappings":";;;;AAiDO,MAAM,eACb,CAAA;AAAA;AAAA;AAAA;AAAA,EAgCI,YAAY,QACZ,EAAA;AACI,IAAA,IAAA,CAAK,SAAY,GAAA,QAAA,CAAA;AAAA,GACrB;AAAA,EAEA,MAAa,KAAK,OAClB,EAAA;AACI,IAAA,IAAI,IAAK,CAAA,YAAA;AAAc,MAAA,OAAO,IAAK,CAAA,YAAA,CAAA;AAEnC,IAAA,IAAA,CAAK,eAAe,IAAK,CAAA,uBAAA,CAAwB,OAAO,CACnD,CAAA,IAAA,CAAK,CAAC,GACP,KAAA;AACI,MAAA,IAAA,CAAK,GAAM,GAAA,GAAA,CAAA;AAEX,MAAA,IAAA,CAAK,SAAU,CAAA,OAAA,CAAQ,aAAc,CAAA,IAAA,CAAK,KAAK,GAAG,CAAA,CAAA;AAAA,KACrD,CAAA,CAAA;AAEL,IAAA,OAAO,IAAK,CAAA,YAAA,CAAA;AAAA,GAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,cAAc,GACxB,EAAA;AACI,IAAA,IAAA,CAAK,UAAU,GAAM,GAAA,GAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,wBAAwB,OACtC,EAAA;AAEI,IAAM,MAAA,OAAA,GAAU,MAAM,UAAW,CAAA,GAAA,GAAM,YAAa,EAAA,CAAE,IAAI,cAAe,CAAA;AAAA,MACrE,iBAAiB,OAAQ,CAAA,eAAA;AAAA,MACzB,sBAAsB,OAAQ,CAAA,oBAAA;AAAA,KACjC,CAAA,CAAA;AAED,IAAA,MAAM,gBAAmB,GAAA;AAAA,MACrB,wBAAA;AAAA,MACA,0BAAA;AAAA,MACA,0BAAA;AAAA,KACJ,CAAE,OAAO,CAAC,OAAA,KAAY,QAAQ,QAAS,CAAA,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA;AAGnD,IAAM,MAAA,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAc,CAAA;AAAA,MACvC,gBAAA;AAAA,KACH,CAAA,CAAA;AAED,IAAO,OAAA,EAAE,SAAS,MAAO,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEO,OACP,GAAA;AACI,IAAA,IAAA,CAAK,GAAM,GAAA,IAAA,CAAA;AACX,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AAAA,GACrB;AACJ,CAAA;AAAA;AAhGa,eAAA,CAGK,SAAY,GAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACF,aAAc,CAAA,YAAA;AAAA,GAClB;AAAA,EACA,IAAM,EAAA,QAAA;AACV,CAAA,CAAA;AAAA;AARS,eAAA,CAWK,cAAoC,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9C,eAAiB,EAAA,KAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjB,oBAAsB,EAAA,KAAA;AAC1B,CAAA;;;;"}