Răsfoiți Sursa

WebGPURenderer: Fix race condition and ensure unbinding buffers (#29293)

Renaud Rohlinger 1 an în urmă
părinte
comite
6e11310fd7

+ 6 - 0
src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js

@@ -233,10 +233,16 @@ class WebGLAttributeUtils {
 
 
 		const dstBuffer = new attribute.array.constructor( array.length );
 		const dstBuffer = new attribute.array.constructor( array.length );
 
 
+		// Ensure the buffer is bound before reading
+		gl.bindBuffer( gl.COPY_WRITE_BUFFER, writeBuffer );
+
 		gl.getBufferSubData( gl.COPY_WRITE_BUFFER, 0, dstBuffer );
 		gl.getBufferSubData( gl.COPY_WRITE_BUFFER, 0, dstBuffer );
 
 
 		gl.deleteBuffer( writeBuffer );
 		gl.deleteBuffer( writeBuffer );
 
 
+		gl.bindBuffer( gl.COPY_READ_BUFFER, null );
+		gl.bindBuffer( gl.COPY_WRITE_BUFFER, null );
+
 		return dstBuffer.buffer;
 		return dstBuffer.buffer;
 
 
 	}
 	}

+ 6 - 16
src/renderers/webgpu/utils/WebGPUAttributeUtils.js

@@ -224,22 +224,12 @@ class WebGPUAttributeUtils {
 		const bufferGPU = data.buffer;
 		const bufferGPU = data.buffer;
 		const size = bufferGPU.size;
 		const size = bufferGPU.size;
 
 
-		let readBufferGPU = data.readBuffer;
-		let needsUnmap = true;
+		const readBufferGPU = device.createBuffer( {
+			label: attribute.name,
+			size,
+			usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
+		} );
 
 
-		if ( readBufferGPU === undefined ) {
-
-			readBufferGPU = device.createBuffer( {
-				label: attribute.name,
-				size,
-				usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
-			} );
-
-			needsUnmap = false;
-
-			data.readBuffer = readBufferGPU;
-
-		}
 
 
 		const cmdEncoder = device.createCommandEncoder( {} );
 		const cmdEncoder = device.createCommandEncoder( {} );
 
 
@@ -251,7 +241,7 @@ class WebGPUAttributeUtils {
 			size
 			size
 		);
 		);
 
 
-		if ( needsUnmap ) readBufferGPU.unmap();
+		readBufferGPU.unmap();
 
 
 		const gpuCommands = cmdEncoder.finish();
 		const gpuCommands = cmdEncoder.finish();
 		device.queue.submit( [ gpuCommands ] );
 		device.queue.submit( [ gpuCommands ] );

粤ICP备19079148号