Kaynağa Gözat

WebGPURenderer: Fix WebGPU render bundle reuse across render contexts (#33335)

Renaud Rohlinger 1 hafta önce
ebeveyn
işleme
a6ef8f5702

+ 3 - 1
src/renderers/common/RenderBundle.js

@@ -11,11 +11,13 @@ class RenderBundle {
 	 *
 	 *
 	 * @param {BundleGroup} bundleGroup - The bundle group.
 	 * @param {BundleGroup} bundleGroup - The bundle group.
 	 * @param {Camera} camera - The camera the bundle group is rendered with.
 	 * @param {Camera} camera - The camera the bundle group is rendered with.
+	 * @param {RenderContext} renderContext - The render context the bundle is rendered with.
 	 */
 	 */
-	constructor( bundleGroup, camera ) {
+	constructor( bundleGroup, camera, renderContext ) {
 
 
 		this.bundleGroup = bundleGroup;
 		this.bundleGroup = bundleGroup;
 		this.camera = camera;
 		this.camera = camera;
+		this.renderContext = renderContext;
 
 
 	}
 	}
 
 

+ 5 - 2
src/renderers/common/RenderBundles.js

@@ -29,26 +29,29 @@ class RenderBundles {
 	 *
 	 *
 	 * @param {BundleGroup} bundleGroup - The bundle group.
 	 * @param {BundleGroup} bundleGroup - The bundle group.
 	 * @param {Camera} camera - The camera the bundle group is rendered with.
 	 * @param {Camera} camera - The camera the bundle group is rendered with.
+	 * @param {RenderContext} renderContext - The render context the bundle is rendered with.
 	 * @return {RenderBundle} The render bundle.
 	 * @return {RenderBundle} The render bundle.
 	 */
 	 */
-	get( bundleGroup, camera ) {
+	get( bundleGroup, camera, renderContext ) {
 
 
 		const bundles = this.bundles;
 		const bundles = this.bundles;
 
 
 		_chainKeys[ 0 ] = bundleGroup;
 		_chainKeys[ 0 ] = bundleGroup;
 		_chainKeys[ 1 ] = camera;
 		_chainKeys[ 1 ] = camera;
+		_chainKeys[ 2 ] = renderContext;
 
 
 		let bundle = bundles.get( _chainKeys );
 		let bundle = bundles.get( _chainKeys );
 
 
 		if ( bundle === undefined ) {
 		if ( bundle === undefined ) {
 
 
-			bundle = new RenderBundle( bundleGroup, camera );
+			bundle = new RenderBundle( bundleGroup, camera, renderContext );
 			bundles.set( _chainKeys, bundle );
 			bundles.set( _chainKeys, bundle );
 
 
 		}
 		}
 
 
 		_chainKeys[ 0 ] = null;
 		_chainKeys[ 0 ] = null;
 		_chainKeys[ 1 ] = null;
 		_chainKeys[ 1 ] = null;
+		_chainKeys[ 2 ] = null;
 
 
 		return bundle;
 		return bundle;
 
 

+ 2 - 8
src/renderers/common/Renderer.js

@@ -1213,17 +1213,11 @@ class Renderer {
 
 
 		//
 		//
 
 
-		const renderBundle = this._bundles.get( bundleGroup, camera );
+		const renderBundle = this._bundles.get( bundleGroup, camera, renderContext );
 		const renderBundleData = this.backend.get( renderBundle );
 		const renderBundleData = this.backend.get( renderBundle );
 
 
-		if ( renderBundleData.renderContexts === undefined ) renderBundleData.renderContexts = new Set();
-
-		//
-
 		const needsUpdate = bundleGroup.version !== renderBundleData.version;
 		const needsUpdate = bundleGroup.version !== renderBundleData.version;
-		const renderBundleNeedsUpdate = renderBundleData.renderContexts.has( renderContext ) === false || needsUpdate;
-
-		renderBundleData.renderContexts.add( renderContext );
+		const renderBundleNeedsUpdate = needsUpdate || renderBundleData.bundleGPU === undefined;
 
 
 		if ( renderBundleNeedsUpdate ) {
 		if ( renderBundleNeedsUpdate ) {
 
 

粤ICP备19079148号