Browse Source

Revert "WebGPUBackend: Remove unnecessary use of GPUAdapter (#28208)" (#28215)

This reverts commit 70c132c0157b9e0fa0a61d4d8e193080f1f6da45.
Michael Herzog 1 year ago
parent
commit
6008f61661
1 changed files with 30 additions and 35 deletions
  1. 30 35
      examples/jsm/renderers/webgpu/WebGPUBackend.js

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

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