|
|
@@ -143,6 +143,9 @@ class Renderer {
|
|
|
|
|
|
this._handleObjectFunction = this._renderObjectDirect;
|
|
|
|
|
|
+ this._isDeviceLost = false;
|
|
|
+ this.onDeviceLost = this._onDeviceLost;
|
|
|
+
|
|
|
this._initialized = false;
|
|
|
this._initPromise = null;
|
|
|
|
|
|
@@ -265,6 +268,8 @@ class Renderer {
|
|
|
|
|
|
async compileAsync( scene, camera, targetScene = null ) {
|
|
|
|
|
|
+ if ( this._isDeviceLost === true ) return;
|
|
|
+
|
|
|
if ( this._initialized === false ) await this.init();
|
|
|
|
|
|
// preserve render tree
|
|
|
@@ -418,6 +423,23 @@ class Renderer {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ _onDeviceLost( info ) {
|
|
|
+
|
|
|
+ let errorMessage = `THREE.WebGPURenderer: ${info.api} Device Lost:\n\nMessage: ${info.message}`;
|
|
|
+
|
|
|
+ if ( info.reason ) {
|
|
|
+
|
|
|
+ errorMessage += `\nReason: ${info.reason}`;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ console.error( errorMessage );
|
|
|
+
|
|
|
+ this._isDeviceLost = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
_renderBundle( bundle, sceneRef, lightsNode ) {
|
|
|
|
|
|
const { bundleGroup, camera, renderList } = bundle;
|
|
|
@@ -552,6 +574,8 @@ class Renderer {
|
|
|
|
|
|
_renderScene( scene, camera, useFrameBufferTarget = true ) {
|
|
|
|
|
|
+ if ( this._isDeviceLost === true ) return;
|
|
|
+
|
|
|
const frameBufferTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : null;
|
|
|
|
|
|
// preserve render tree
|
|
|
@@ -1120,6 +1144,7 @@ class Renderer {
|
|
|
dispose() {
|
|
|
|
|
|
this.info.dispose();
|
|
|
+ this.backend.dispose();
|
|
|
|
|
|
this._animation.dispose();
|
|
|
this._objects.dispose();
|
|
|
@@ -1163,6 +1188,8 @@ class Renderer {
|
|
|
|
|
|
compute( computeNodes ) {
|
|
|
|
|
|
+ if ( this.isDeviceLost === true ) return;
|
|
|
+
|
|
|
if ( this._initialized === false ) {
|
|
|
|
|
|
console.warn( 'THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead.' );
|