Browse Source

WebGPURenderer: Fix RenderTarget dispose and MRT (#28912)

sunag 1 year ago
parent
commit
379dddda6e

+ 1 - 1
src/renderers/common/RenderContexts.js

@@ -22,7 +22,7 @@ class RenderContexts {
 		} else {
 
 			const format = renderTarget.texture.format;
-			const count = renderTarget.count;
+			const count = renderTarget.textures.length;
 
 			attachmentState = `${ count }:${ format }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;
 

+ 2 - 0
src/renderers/common/Textures.js

@@ -119,6 +119,8 @@ class Textures extends DataMap {
 
 				this._destroyTexture( depthTexture );
 
+				this.delete( renderTarget );
+
 			};
 
 			renderTarget.addEventListener( 'dispose', onDispose );

+ 14 - 1
src/renderers/webgpu/WebGPUBackend.js

@@ -204,11 +204,24 @@ class WebGPUBackend extends Backend {
 		if ( renderTargetData.width !== renderTarget.width ||
 			renderTargetData.height !== renderTarget.height ||
 			renderTargetData.activeMipmapLevel !== renderTarget.activeMipmapLevel ||
-			renderTargetData.samples !== renderTarget.samples
+			renderTargetData.samples !== renderTarget.samples ||
+			descriptors.length !== renderTarget.textures.length
 		) {
 
 			descriptors.length = 0;
 
+			// dispose
+
+			const onDispose = () => {
+
+				renderTarget.removeEventListener( 'dispose', onDispose );
+
+				this.delete( renderTarget );
+
+			};
+
+			renderTarget.addEventListener( 'dispose', onDispose );
+
 		}
 
 		let descriptor = descriptors[ renderContext.activeCubeFace ];