{"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\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;\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\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\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;;;;"}