Skip to content

Commit

Permalink
WebGPUBackend: Remove unnecessary use of GPUAdapter (2) (#28217)
Browse files Browse the repository at this point in the history
* 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 <chirsz-ever@outlook.com>
  • Loading branch information
sunag and chirsz-ever committed Apr 25, 2024
1 parent 6008f61 commit 328a460
Showing 1 changed file with 38 additions and 26 deletions.
64 changes: 38 additions & 26 deletions examples/jsm/renderers/webgpu/WebGPUBackend.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -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 );

}

Expand Down

0 comments on commit 328a460

Please sign in to comment.