Skip to content

Commit 306706d

Browse files
authored
Examples - Update Compute Fluid to use IndirectStorageBuffer (#32176)
1 parent 192d5c1 commit 306706d

File tree

1 file changed

+32
-11
lines changed

1 file changed

+32
-11
lines changed

examples/webgpu_compute_particles_fluid.html

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
import * as THREE from 'three/webgpu';
3535

36-
import { Fn, If, Return, instancedArray, instanceIndex, uniform, attribute, uint, float, clamp, struct, atomicStore, int, ivec3, array, vec3, atomicAdd, Loop, atomicLoad, max, pow, mat3, vec4, cross, step } from 'three/tsl';
36+
import { Fn, If, Return, instancedArray, instanceIndex, uniform, attribute, uint, float, clamp, struct, atomicStore, int, ivec3, array, vec3, atomicAdd, Loop, atomicLoad, max, pow, mat3, vec4, cross, step, storage } from 'three/tsl';
3737

3838
import { Inspector } from 'three/addons/inspector/Inspector.js';
3939

@@ -48,12 +48,14 @@
4848

4949
const maxParticles = 8192 * 16;
5050
const gridSize1d = 64;
51+
const workgroupSize = 64;
5152
const gridSize = new THREE.Vector3( gridSize1d, gridSize1d, gridSize1d );
5253
const fixedPointMultiplier = 1e7;
5354

5455
let particleCountUniform, stiffnessUniform, restDensityUniform, dynamicViscosityUniform, dtUniform, gravityUniform, gridSizeUniform;
5556
let particleBuffer, cellBuffer, cellBufferFloat;
56-
let clearGridKernel, p2g1Kernel, p2g2Kernel, updateGridKernel, g2pKernel;
57+
let clearGridKernel, p2g1Kernel, p2g2Kernel, updateGridKernel, g2pKernel, workgroupKernel;
58+
let p2g1KernelWorkgroupBuffer, p2g2KernelWorkgroupBuffer, g2pKernelWorkgroupBuffer;
5759
let particleMesh;
5860
const mouseCoord = new THREE.Vector3();
5961
const prevMouseCoord = new THREE.Vector3();
@@ -105,12 +107,29 @@
105107
setupParticles();
106108

107109
const gui = renderer.inspector.createParameters( 'Settings' );
110+
111+
const numWorkgroups = Math.ceil( params.particleCount / workgroupSize );
112+
113+
p2g1KernelWorkgroupBuffer = new THREE.IndirectStorageBufferAttribute( new Uint32Array( [ numWorkgroups, 1, 1 ] ), 1 );
114+
p2g2KernelWorkgroupBuffer = new THREE.IndirectStorageBufferAttribute( new Uint32Array( [ numWorkgroups, 1, 1 ] ), 1 );
115+
g2pKernelWorkgroupBuffer = new THREE.IndirectStorageBufferAttribute( new Uint32Array( [ numWorkgroups, 1, 1 ] ), 1 );
116+
117+
const p2g1WorkgroupStorage = storage( p2g1KernelWorkgroupBuffer, 'uint', 3 );
118+
const p2g2WorkgroupStorage = storage( p2g2KernelWorkgroupBuffer, 'uint', 3 );
119+
const g2pWorkgroupStorage = storage( g2pKernelWorkgroupBuffer, 'uint', 3 );
120+
121+
workgroupKernel = Fn( () => {
122+
123+
const workgroupsToDispatch = ( particleCountUniform.sub( 1 ) ).div( workgroupSize ).add( 1 );
124+
125+
p2g1WorkgroupStorage.element( 0 ).assign( workgroupsToDispatch );
126+
p2g2WorkgroupStorage.element( 0 ).assign( workgroupsToDispatch );
127+
g2pWorkgroupStorage.element( 0 ).assign( workgroupsToDispatch );
128+
129+
} )().compute( 1 );
108130

109131
gui.add( params, 'particleCount', 4096, maxParticles, 4096 ).onChange( value => {
110132

111-
p2g1Kernel.count = value;
112-
p2g2Kernel.count = value;
113-
g2pKernel.count = value;
114133
particleMesh.count = value;
115134
particleCountUniform.value = value;
116135

@@ -258,7 +277,7 @@
258277

259278
} );
260279

261-
} )().compute( params.particleCount ).setName( 'p2g1Kernel' );
280+
} )().compute( params.particleCount, [ workgroupSize, 1, 1 ] ).setName( 'p2g1Kernel' );
262281

263282
p2g2Kernel = Fn( () => {
264283

@@ -329,7 +348,7 @@
329348

330349
} );
331350

332-
} )().compute( params.particleCount ).setName( 'p2g2Kernel' );
351+
} )().compute( params.particleCount, [ workgroupSize, 1, 1 ] ).setName( 'p2g2Kernel' );
333352

334353
updateGridKernel = Fn( () => {
335354

@@ -477,7 +496,7 @@
477496
particleBuffer.element( instanceIndex ).get( 'position' ).assign( particlePosition );
478497
particleBuffer.element( instanceIndex ).get( 'velocity' ).assign( particleVelocity );
479498

480-
} )().compute( params.particleCount ).setName( 'g2pKernel' );
499+
} )().compute( params.particleCount, [ workgroupSize, 1, 1 ] ).setName( 'g2pKernel' );
481500

482501
}
483502

@@ -561,12 +580,14 @@
561580

562581
prevMouseCoord.copy( mouseCoord );
563582

583+
renderer.compute( workgroupKernel );
584+
564585
//renderer.compute( [ clearGridKernel, p2g1Kernel, p2g2Kernel, updateGridKernel, g2pKernel ] );
565586
renderer.compute( clearGridKernel );
566-
renderer.compute( p2g1Kernel );
567-
renderer.compute( p2g2Kernel );
587+
renderer.compute( p2g1Kernel, p2g1KernelWorkgroupBuffer );
588+
renderer.compute( p2g2Kernel, p2g2KernelWorkgroupBuffer );
568589
renderer.compute( updateGridKernel );
569-
renderer.compute( g2pKernel );
590+
renderer.compute( g2pKernel, g2pKernelWorkgroupBuffer );
570591

571592
renderer.render( scene, camera );
572593

0 commit comments

Comments
 (0)