|
|
@@ -164,28 +164,13 @@ class Textures extends DataMap {
|
|
|
|
|
|
// dispose
|
|
|
|
|
|
- const onDispose = () => {
|
|
|
+ renderTargetData.onDispose = () => {
|
|
|
|
|
|
- renderTarget.removeEventListener( 'dispose', onDispose );
|
|
|
-
|
|
|
- for ( let i = 0; i < textures.length; i ++ ) {
|
|
|
-
|
|
|
- this._destroyTexture( textures[ i ] );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if ( depthTexture ) {
|
|
|
-
|
|
|
- this._destroyTexture( depthTexture );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- this.delete( renderTarget );
|
|
|
- this.backend.delete( renderTarget );
|
|
|
+ this._destroyRenderTarget( renderTarget );
|
|
|
|
|
|
};
|
|
|
|
|
|
- renderTarget.addEventListener( 'dispose', onDispose );
|
|
|
+ renderTarget.addEventListener( 'dispose', renderTargetData.onDispose );
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -348,15 +333,13 @@ class Textures extends DataMap {
|
|
|
|
|
|
// dispose
|
|
|
|
|
|
- const onDispose = () => {
|
|
|
-
|
|
|
- texture.removeEventListener( 'dispose', onDispose );
|
|
|
+ textureData.onDispose = () => {
|
|
|
|
|
|
this._destroyTexture( texture );
|
|
|
|
|
|
};
|
|
|
|
|
|
- texture.addEventListener( 'dispose', onDispose );
|
|
|
+ texture.addEventListener( 'dispose', textureData.onDispose );
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -484,6 +467,46 @@ class Textures extends DataMap {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Frees internal resources when the given render target isn't
|
|
|
+ * required anymore.
|
|
|
+ *
|
|
|
+ * @param {RenderTarget} renderTarget - The render target to destroy.
|
|
|
+ */
|
|
|
+ _destroyRenderTarget( renderTarget ) {
|
|
|
+
|
|
|
+ if ( this.has( renderTarget ) === true ) {
|
|
|
+
|
|
|
+ const renderTargetData = this.get( renderTarget );
|
|
|
+
|
|
|
+ const textures = renderTargetData.textures;
|
|
|
+ const depthTexture = renderTargetData.depthTexture;
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ renderTarget.removeEventListener( 'dispose', renderTargetData.onDispose );
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ for ( let i = 0; i < textures.length; i ++ ) {
|
|
|
+
|
|
|
+ this._destroyTexture( textures[ i ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( depthTexture ) {
|
|
|
+
|
|
|
+ this._destroyTexture( depthTexture );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ this.delete( renderTarget );
|
|
|
+ this.backend.delete( renderTarget );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Frees internal resource when the given texture isn't
|
|
|
* required anymore.
|
|
|
@@ -494,12 +517,18 @@ class Textures extends DataMap {
|
|
|
|
|
|
if ( this.has( texture ) === true ) {
|
|
|
|
|
|
+ const textureData = this.get( texture );
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ texture.removeEventListener( 'dispose', textureData.onDispose );
|
|
|
+
|
|
|
// if a texture is not ready for use, it falls back to a default texture so it's possible
|
|
|
// to use it for rendering. If a texture in this state is disposed, it's important to
|
|
|
// not destroy/delete the underlying GPU texture object since it is cached and shared with
|
|
|
// other textures.
|
|
|
|
|
|
- const isDefaultTexture = this.get( texture ).isDefaultTexture;
|
|
|
+ const isDefaultTexture = textureData.isDefaultTexture;
|
|
|
this.backend.destroyTexture( texture, isDefaultTexture );
|
|
|
|
|
|
this.delete( texture );
|