Skip to content

Commit e87bd65

Browse files
authored
WebGPURenderer: Fix dispose RenderTarget textures (#32131)
1 parent 158c1c4 commit e87bd65

File tree

1 file changed

+52
-23
lines changed

1 file changed

+52
-23
lines changed

src/renderers/common/Textures.js

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -164,28 +164,13 @@ class Textures extends DataMap {
164164

165165
// dispose
166166

167-
const onDispose = () => {
167+
renderTargetData.onDispose = () => {
168168

169-
renderTarget.removeEventListener( 'dispose', onDispose );
170-
171-
for ( let i = 0; i < textures.length; i ++ ) {
172-
173-
this._destroyTexture( textures[ i ] );
174-
175-
}
176-
177-
if ( depthTexture ) {
178-
179-
this._destroyTexture( depthTexture );
180-
181-
}
182-
183-
this.delete( renderTarget );
184-
this.backend.delete( renderTarget );
169+
this._destroyRenderTarget( renderTarget );
185170

186171
};
187172

188-
renderTarget.addEventListener( 'dispose', onDispose );
173+
renderTarget.addEventListener( 'dispose', renderTargetData.onDispose );
189174

190175
}
191176

@@ -348,15 +333,13 @@ class Textures extends DataMap {
348333

349334
// dispose
350335

351-
const onDispose = () => {
352-
353-
texture.removeEventListener( 'dispose', onDispose );
336+
textureData.onDispose = () => {
354337

355338
this._destroyTexture( texture );
356339

357340
};
358341

359-
texture.addEventListener( 'dispose', onDispose );
342+
texture.addEventListener( 'dispose', textureData.onDispose );
360343

361344
}
362345

@@ -484,6 +467,46 @@ class Textures extends DataMap {
484467

485468
}
486469

470+
/**
471+
* Frees internal resources when the given render target isn't
472+
* required anymore.
473+
*
474+
* @param {RenderTarget} renderTarget - The render target to destroy.
475+
*/
476+
_destroyRenderTarget( renderTarget ) {
477+
478+
if ( this.has( renderTarget ) === true ) {
479+
480+
const renderTargetData = this.get( renderTarget );
481+
482+
const textures = renderTargetData.textures;
483+
const depthTexture = renderTargetData.depthTexture;
484+
485+
//
486+
487+
renderTarget.removeEventListener( 'dispose', renderTargetData.onDispose );
488+
489+
//
490+
491+
for ( let i = 0; i < textures.length; i ++ ) {
492+
493+
this._destroyTexture( textures[ i ] );
494+
495+
}
496+
497+
if ( depthTexture ) {
498+
499+
this._destroyTexture( depthTexture );
500+
501+
}
502+
503+
this.delete( renderTarget );
504+
this.backend.delete( renderTarget );
505+
506+
}
507+
508+
}
509+
487510
/**
488511
* Frees internal resource when the given texture isn't
489512
* required anymore.
@@ -494,12 +517,18 @@ class Textures extends DataMap {
494517

495518
if ( this.has( texture ) === true ) {
496519

520+
const textureData = this.get( texture );
521+
522+
//
523+
524+
texture.removeEventListener( 'dispose', textureData.onDispose );
525+
497526
// if a texture is not ready for use, it falls back to a default texture so it's possible
498527
// to use it for rendering. If a texture in this state is disposed, it's important to
499528
// not destroy/delete the underlying GPU texture object since it is cached and shared with
500529
// other textures.
501530

502-
const isDefaultTexture = this.get( texture ).isDefaultTexture;
531+
const isDefaultTexture = textureData.isDefaultTexture;
503532
this.backend.destroyTexture( texture, isDefaultTexture );
504533

505534
this.delete( texture );

0 commit comments

Comments
 (0)