Răsfoiți Sursa

WebGPUBackend: Remove unnecessary use of GPUAdapter (2) (#28217)

* WebGPUBackend: Remove unnecessary use of GPUAdapter

WebGPUBackend should only need a GPUDevice to
manage resources and check features.

* preserve hasFeatureAsync()

* cleanup

---------

Co-authored-by: chirsz <[email protected]>
sunag 1 an în urmă
părinte
comite
328a460aba
1 a modificat fișierele cu 38 adăugiri și 26 ștergeri
  1. 38 26
      examples/jsm/renderers/webgpu/WebGPUBackend.js

+ 38 - 26
examples/jsm/renderers/webgpu/WebGPUBackend.js

@@ -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 );
 
 	}