Browse Source

WebGPUBackend: Remove unnecessary use of GPUAdapter (#28208)

WebGPUBackend should only need a GPUDevice to
manage resources and check features.
chirsz 1 year ago
parent
commit
70c132c015
1 changed files with 35 additions and 30 deletions
  1. 35 30
      examples/jsm/renderers/webgpu/WebGPUBackend.js

+ 35 - 30
examples/jsm/renderers/webgpu/WebGPUBackend.js

@@ -14,7 +14,6 @@ import WebGPUAttributeUtils from './utils/WebGPUAttributeUtils.js';
 import WebGPUBindingUtils from './utils/WebGPUBindingUtils.js';
 import WebGPUPipelineUtils from './utils/WebGPUPipelineUtils.js';
 import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js';
-import WebGPU from '../../capabilities/WebGPU.js';
 
 //
 
@@ -45,7 +44,6 @@ class WebGPUBackend extends Backend {
 
 		this.trackTimestamp = ( parameters.trackTimestamp === true );
 
-		this.adapter = null;
 		this.device = null;
 		this.context = null;
 		this.colorBuffer = null;
@@ -68,44 +66,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 );
+
+			if ( adapter === null ) {
+
+				throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' );
 
-		// feature support
+			}
+
+			// feature support
 
-		const features = Object.values( GPUFeatureName );
+			const features = Object.values( GPUFeatureName );
 
-		const supportedFeatures = [];
+			const supportedFeatures = [];
 
-		for ( const name of features ) {
+			for ( const name of features ) {
 
-			if ( adapter.features.has( name ) ) {
+				if ( adapter.features.has( name ) ) {
 
-				supportedFeatures.push( name );
+					supportedFeatures.push( name );
+
+				}
 
 			}
 
-		}
+			const deviceDescriptor = {
+				requiredFeatures: supportedFeatures,
+				requiredLimits: parameters.requiredLimits
+			};
 
-		const deviceDescriptor = {
-			requiredFeatures: supportedFeatures,
-			requiredLimits: parameters.requiredLimits
-		};
+			device = await adapter.requestDevice( deviceDescriptor );
 
-		const device = ( parameters.device !== undefined ) ? parameters.device : await adapter.requestDevice( deviceDescriptor );
+		} else {
+
+			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 +1231,21 @@ class WebGPUBackend extends Backend {
 
 	async hasFeatureAsync( name ) {
 
-		const adapter = this.adapter || await WebGPU.getStaticAdapter();
-
-		//
-
-		return adapter.features.has( name );
+		return this.hasFeature( name );
 
 	}
 
 	hasFeature( name ) {
 
-		if ( ! this.adapter ) {
+		if ( ! this.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.' );
 
 			return false;
 
 		}
 
-		return this.adapter.features.has( name );
+		return this.device.features.has( name );
 
 	}