78 lines
2.1 KiB
JavaScript
78 lines
2.1 KiB
JavaScript
import { DOMAdapter } from '../../../environment/adapter.mjs';
|
|
import { ExtensionType } from '../../../extensions/Extensions.mjs';
|
|
|
|
"use strict";
|
|
class GpuDeviceSystem {
|
|
/**
|
|
* @param {WebGPURenderer} renderer - The renderer this System works for.
|
|
*/
|
|
constructor(renderer) {
|
|
this._renderer = renderer;
|
|
}
|
|
async init(options) {
|
|
if (this._initPromise)
|
|
return this._initPromise;
|
|
this._initPromise = this._createDeviceAndAdaptor(options).then((gpu) => {
|
|
this.gpu = gpu;
|
|
this._renderer.runners.contextChange.emit(this.gpu);
|
|
});
|
|
return this._initPromise;
|
|
}
|
|
/**
|
|
* Handle the context change event
|
|
* @param gpu
|
|
*/
|
|
contextChange(gpu) {
|
|
this._renderer.gpu = gpu;
|
|
}
|
|
/**
|
|
* Helper class to create a WebGL Context
|
|
* @param {object} options - An options object that gets passed in to the canvas element containing the
|
|
* context attributes
|
|
* @see https://developer.mozilla.org/en/docs/Web/API/HTMLCanvasElement/getContext
|
|
* @returns {WebGLRenderingContext} the WebGL context
|
|
*/
|
|
async _createDeviceAndAdaptor(options) {
|
|
const adapter = await DOMAdapter.get().getNavigator().gpu.requestAdapter({
|
|
powerPreference: options.powerPreference,
|
|
forceFallbackAdapter: options.forceFallbackAdapter
|
|
});
|
|
const requiredFeatures = [
|
|
"texture-compression-bc",
|
|
"texture-compression-astc",
|
|
"texture-compression-etc2"
|
|
].filter((feature) => adapter.features.has(feature));
|
|
const device = await adapter.requestDevice({
|
|
requiredFeatures
|
|
});
|
|
return { adapter, device };
|
|
}
|
|
destroy() {
|
|
this.gpu = null;
|
|
this._renderer = null;
|
|
}
|
|
}
|
|
/** @ignore */
|
|
GpuDeviceSystem.extension = {
|
|
type: [
|
|
ExtensionType.WebGPUSystem
|
|
],
|
|
name: "device"
|
|
};
|
|
/** The default options for the GpuDeviceSystem. */
|
|
GpuDeviceSystem.defaultOptions = {
|
|
/**
|
|
* {@link WebGPUOptions.powerPreference}
|
|
* @default default
|
|
*/
|
|
powerPreference: void 0,
|
|
/**
|
|
* Force the use of the fallback adapter
|
|
* @default false
|
|
*/
|
|
forceFallbackAdapter: false
|
|
};
|
|
|
|
export { GpuDeviceSystem };
|
|
//# sourceMappingURL=GpuDeviceSystem.mjs.map
|