Browse Source

WebGPUTextures: Support .dispose() with render targets.

Mugen87 4 years ago
parent
commit
3dcce7a54a
2 changed files with 40 additions and 4 deletions
  1. 37 0
      examples/jsm/renderers/webgpu/WebGPUTextures.js
  2. 3 4
      examples/webgpu_rtt.html

+ 37 - 0
examples/jsm/renderers/webgpu/WebGPUTextures.js

@@ -220,6 +220,15 @@ class WebGPUTextures {
 
 			}
 
+			//
+
+			const disposeCallback = onRenderTargetDispose.bind( this );
+			renderTargetProperties.disposeCallback = disposeCallback;
+
+			renderTarget.addEventListener( 'dispose', disposeCallback );
+
+			//
+
 			renderTargetProperties.initialized = true;
 
 		}
@@ -450,6 +459,34 @@ class WebGPUTextures {
 
 }
 
+function onRenderTargetDispose( event ) {
+
+	const renderTarget = event.target;
+	const properties = this.properties;
+
+	const renderTargetProperties = properties.get( renderTarget );
+
+	renderTarget.removeEventListener( 'dispose', renderTargetProperties.disposeCallback );
+
+	renderTargetProperties.colorTextureGPU.destroy();
+	properties.remove( renderTarget.texture );
+
+	if ( renderTarget.depthBuffer === true ) {
+
+		renderTargetProperties.depthTextureGPU.destroy();
+
+		if ( renderTarget.depthTexture !== null ) {
+
+			properties.remove( renderTarget.depthTexture );
+
+		}
+
+	}
+
+	properties.remove( renderTarget );
+
+}
+
 function onTextureDispose( event ) {
 
 	const texture = event.target;

+ 3 - 4
examples/webgpu_rtt.html

@@ -23,6 +23,8 @@
 
 			let box;
 
+			const dpr = window.devicePixelRatio;
+
 			init().then( animate ).catch( error );
 
 			async function init() {
@@ -54,8 +56,6 @@
 
 				//
 
-				const dpr = window.devicePixelRatio;
-
 				renderer = new WebGPURenderer();
 				renderer.setPixelRatio( dpr );
 				renderer.setSize( window.innerWidth, window.innerHeight );
@@ -93,8 +93,7 @@
 				camera.updateProjectionMatrix();
 
 				renderer.setSize( window.innerWidth, window.innerHeight );
-
-				// @TODO Resize render target, implement respective .dispose()
+				renderTarget.setSize( window.innerWidth * dpr, window.innerHeight * dpr );
 
 			}