Skip to content

Commit d4e13e5

Browse files
WebGPURenderer: Add Offscreen Support (mrdoob#27520)
* add offscreen support * refactor statics webgpu * navigator.gpu should be enough for initial check * fix webgl context ktx2loader * use isAvailable in webgpurenderer * cleanup and should fix pupeeter * return promise * feedbacks * remove unecessary async * removed oversight * cleanup ---------
1 parent f017aa9 commit d4e13e5

File tree

12 files changed

+71
-32
lines changed

12 files changed

+71
-32
lines changed

examples/jsm/capabilities/WebGPU.js

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,30 @@
1-
if ( window.GPUShaderStage === undefined ) {
1+
if ( self.GPUShaderStage === undefined ) {
22

3-
window.GPUShaderStage = { VERTEX: 1, FRAGMENT: 2, COMPUTE: 4 };
3+
self.GPUShaderStage = { VERTEX: 1, FRAGMENT: 2, COMPUTE: 4 };
44

55
}
66

7-
let isAvailable = false;
7+
// statics
88

9-
if ( navigator.gpu !== undefined ) {
9+
let isAvailable = navigator.gpu !== undefined;
1010

11-
const adapter = await navigator.gpu.requestAdapter();
1211

13-
if ( adapter !== null ) {
12+
if ( typeof window !== 'undefined' && isAvailable ) {
1413

15-
isAvailable = true;
16-
17-
}
14+
isAvailable = await navigator.gpu.requestAdapter();
1815

1916
}
2017

2118
class WebGPU {
2219

2320
static isAvailable() {
2421

22+
return Boolean( isAvailable );
23+
24+
}
25+
26+
static getStaticAdapter() {
27+
2528
return isAvailable;
2629

2730
}
@@ -50,4 +53,5 @@ class WebGPU {
5053

5154
}
5255

56+
5357
export default WebGPU;

examples/jsm/loaders/KTX2Loader.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,21 @@ class KTX2Loader extends Loader {
120120

121121
}
122122

123+
async detectSupportAsync( renderer ) {
124+
125+
this.workerConfig = {
126+
astcSupported: await renderer.hasFeatureAsync( 'texture-compression-astc' ),
127+
etc1Supported: await renderer.hasFeatureAsync( 'texture-compression-etc1' ),
128+
etc2Supported: await renderer.hasFeatureAsync( 'texture-compression-etc2' ),
129+
dxtSupported: await renderer.hasFeatureAsync( 'texture-compression-bc' ),
130+
bptcSupported: await renderer.hasFeatureAsync( 'texture-compression-bptc' ),
131+
pvrtcSupported: await renderer.hasFeatureAsync( 'texture-compression-pvrtc' )
132+
};
133+
134+
return this;
135+
136+
}
137+
123138
detectSupport( renderer ) {
124139

125140
if ( renderer.isWebGPURenderer === true ) {

examples/jsm/renderers/common/Backend.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ class Backend {
9090

9191
// utils
9292

93+
hasFeatureAsync( name ) { } // return Boolean
94+
9395
hasFeature( name ) { } // return Boolean
9496

9597
getInstanceCount( renderObject ) {

examples/jsm/renderers/common/Renderer.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,12 @@ class Renderer {
770770

771771
}
772772

773+
hasFeatureAsync( name ) {
774+
775+
return this.backend.hasFeatureAsync( name );
776+
777+
}
778+
773779
hasFeature( name ) {
774780

775781
return this.backend.hasFeature( name );

examples/jsm/renderers/webgl/WebGLBackend.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,12 @@ class WebGLBackend extends Backend {
837837

838838
}
839839

840+
async hasFeatureAsync( name ) {
841+
842+
return this.hasFeature( name );
843+
844+
}
845+
840846
hasFeature( name ) {
841847

842848
const keysMatching = Object.keys( GLFeatureName ).filter( key => GLFeatureName[ key ] === name );

examples/jsm/renderers/webgpu/WebGPUBackend.js

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,7 @@ import WebGPUAttributeUtils from './utils/WebGPUAttributeUtils.js';
1414
import WebGPUBindingUtils from './utils/WebGPUBindingUtils.js';
1515
import WebGPUPipelineUtils from './utils/WebGPUPipelineUtils.js';
1616
import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js';
17-
18-
// statics
19-
20-
let _staticAdapter = null;
21-
22-
if ( navigator.gpu !== undefined ) {
23-
24-
_staticAdapter = await navigator.gpu.requestAdapter();
25-
26-
}
17+
import WebGPU from '../../capabilities/WebGPU.js';
2718

2819
//
2920

@@ -1070,17 +1061,31 @@ class WebGPUBackend extends Backend {
10701061
return 16;
10711062

10721063
}
1064+
1065+
async hasFeatureAsync( name ) {
10731066

1074-
hasFeature( name ) {
1075-
1076-
const adapter = this.adapter || _staticAdapter;
1067+
const adapter = this.adapter || await WebGPU.getStaticAdapter();
10771068

10781069
//
10791070

10801071
return adapter.features.has( name );
10811072

10821073
}
10831074

1075+
hasFeature( name ) {
1076+
1077+
if ( !this.adapter ) {
1078+
1079+
console.warn( 'WebGPUBackend: WebGPU adapter has not been initialized yet. Please use detectSupportAsync instead' );
1080+
1081+
return false;
1082+
1083+
}
1084+
1085+
return this.adapter.features.has( name );
1086+
1087+
}
1088+
10841089
copyFramebufferToTexture( texture, renderContext ) {
10851090

10861091
const renderContextData = this.get( renderContext );

examples/jsm/renderers/webgpu/WebGPURenderer.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import WebGPU from '../../capabilities/WebGPU.js';
2+
13
import Renderer from '../common/Renderer.js';
24
import WebGLBackend from '../webgl/WebGLBackend.js';
35
import WebGPUBackend from './WebGPUBackend.js';
4-
import WebGPU from '../../capabilities/WebGPU.js';
56
/*
67
const debugHandler = {
78

examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { getFormat } from '../utils/WebGPUTextureUtils.js';
1616
import WGSLNodeParser from './WGSLNodeParser.js';
1717

1818
// GPUShaderStage is not defined in browsers not supporting WebGPU
19-
const GPUShaderStage = window.GPUShaderStage;
19+
const GPUShaderStage = self.GPUShaderStage;
2020

2121
const gpuShaderStageLib = {
2222
'vertex': GPUShaderStage ? GPUShaderStage.VERTEX : 1,

examples/webgpu_instance_mesh.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444

4545
init();
4646

47-
function init() {
47+
async function init() {
4848

4949
if ( WebGPU.isAvailable() === false && WebGL.isWebGL2Available() === false ) {
5050

examples/webgpu_loader_gltf_compressed.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@
6767
controls.maxDistance = 6;
6868
controls.update();
6969

70-
const ktx2Loader = new KTX2Loader()
70+
const ktx2Loader = await new KTX2Loader()
7171
.setTranscoderPath( 'jsm/libs/basis/' )
72-
.detectSupport( renderer );
72+
.detectSupportAsync( renderer );
7373

7474
const loader = new GLTFLoader();
7575
loader.setKTX2Loader( ktx2Loader );

0 commit comments

Comments
 (0)