|
@@ -45,7 +45,6 @@ class WebGPUBackend extends Backend {
|
|
|
|
|
|
this.trackTimestamp = ( parameters.trackTimestamp === true );
|
|
|
|
|
|
- this.adapter = null;
|
|
|
this.device = null;
|
|
|
this.context = null;
|
|
|
this.colorBuffer = null;
|
|
@@ -68,44 +67,55 @@ class WebGPUBackend extends Backend {
|
|
|
|
|
|
const parameters = this.parameters;
|
|
|
|
|
|
- const adapterOptions = {
|
|
|
- powerPreference: parameters.powerPreference
|
|
|
- };
|
|
|
+ // create the device if it is not passed with parameters
|
|
|
|
|
|
- const adapter = await navigator.gpu.requestAdapter( adapterOptions );
|
|
|
+ let device;
|
|
|
|
|
|
- if ( adapter === null ) {
|
|
|
+ if ( parameters.device === undefined ) {
|
|
|
|
|
|
- throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' );
|
|
|
+ const adapterOptions = {
|
|
|
+ powerPreference: parameters.powerPreference
|
|
|
+ };
|
|
|
|
|
|
- }
|
|
|
+ const adapter = await navigator.gpu.requestAdapter( adapterOptions );
|
|
|
|
|
|
- // feature support
|
|
|
+ if ( adapter === null ) {
|
|
|
|
|
|
- const features = Object.values( GPUFeatureName );
|
|
|
+ throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- const supportedFeatures = [];
|
|
|
+ // feature support
|
|
|
|
|
|
- for ( const name of features ) {
|
|
|
+ const features = Object.values( GPUFeatureName );
|
|
|
|
|
|
- if ( adapter.features.has( name ) ) {
|
|
|
+ const supportedFeatures = [];
|
|
|
|
|
|
- supportedFeatures.push( name );
|
|
|
+ for ( const name of features ) {
|
|
|
+
|
|
|
+ if ( adapter.features.has( name ) ) {
|
|
|
+
|
|
|
+ supportedFeatures.push( name );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ const deviceDescriptor = {
|
|
|
+ requiredFeatures: supportedFeatures,
|
|
|
+ requiredLimits: parameters.requiredLimits
|
|
|
+ };
|
|
|
|
|
|
- const deviceDescriptor = {
|
|
|
- requiredFeatures: supportedFeatures,
|
|
|
- requiredLimits: parameters.requiredLimits
|
|
|
- };
|
|
|
+ device = await adapter.requestDevice( deviceDescriptor );
|
|
|
+
|
|
|
+ } else {
|
|
|
|
|
|
- const device = ( parameters.device !== undefined ) ? parameters.device : await adapter.requestDevice( deviceDescriptor );
|
|
|
+ device = parameters.device;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
const context = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgpu' );
|
|
|
|
|
|
- this.adapter = adapter;
|
|
|
this.device = device;
|
|
|
this.context = context;
|
|
|
|
|
@@ -1222,25 +1232,27 @@ class WebGPUBackend extends Backend {
|
|
|
|
|
|
async hasFeatureAsync( name ) {
|
|
|
|
|
|
- const adapter = this.adapter || await WebGPU.getStaticAdapter();
|
|
|
+ const device = this.device || await WebGPU.getStaticAdapter();
|
|
|
|
|
|
//
|
|
|
|
|
|
- return adapter.features.has( name );
|
|
|
+ return device.features.has( name );
|
|
|
|
|
|
}
|
|
|
|
|
|
hasFeature( name ) {
|
|
|
|
|
|
- if ( ! this.adapter ) {
|
|
|
+ const device = this.device;
|
|
|
+
|
|
|
+ if ( ! device ) {
|
|
|
|
|
|
- console.warn( 'WebGPUBackend: WebGPU adapter has not been initialized yet. Please use hasFeatureAsync instead' );
|
|
|
+ console.warn( 'WebGPUBackend: WebGPU device has not been initialized yet. Please use hasFeatureAsync() instead.' );
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
- return this.adapter.features.has( name );
|
|
|
+ return device.features.has( name );
|
|
|
|
|
|
}
|
|
|
|