From 1174d07040d28ba59306419e295cc8f1d49b4d54 Mon Sep 17 00:00:00 2001 From: Christian Helgeson <62450112+cmhhelgeson@users.noreply.github.com> Date: Tue, 10 Sep 2024 11:29:48 -0700 Subject: [PATCH] WebGPURenderer: Workgroup Arrays and Barrier Support (#29192) * init * barrier, private array, workgroup array support * clean * Implement Renaud suggestions * fix * fix storage buffer example with workgroupBarrier() * add tags and other info * add bitonic sort example * update * Rebase branch * try to fix bitonic sort shader * simplify * fix * bitonic sort now works but local swap is slower than global swap : * cleanup * fix rebase issues * Change display and html to make difference between global and local swap clearer. May want to improve the performance of the fragment shader by writing nextAlgo and nextBlockHeight to uniforms on the CPU side * update (ugly?) screenshot * cleanup --------- --- examples/files.json | 1 + .../webgpu_compute_sort_bitonic.jpg | Bin 0 -> 25044 bytes examples/tags.json | 1 + examples/webgpu_compute_sort_bitonic.html | 565 ++++++++++++++++++ examples/webgpu_storage_buffer.html | 9 +- src/nodes/TSL.js | 2 + src/nodes/gpgpu/BarrierNode.js | 40 ++ src/nodes/gpgpu/WorkgroupInfoNode.js | 100 ++++ src/renderers/webgpu/nodes/WGSLNodeBuilder.js | 45 ++ test/e2e/puppeteer.js | 1 + 10 files changed, 760 insertions(+), 4 deletions(-) create mode 100644 examples/screenshots/webgpu_compute_sort_bitonic.jpg create mode 100644 examples/webgpu_compute_sort_bitonic.html create mode 100644 src/nodes/gpgpu/BarrierNode.js create mode 100644 src/nodes/gpgpu/WorkgroupInfoNode.js diff --git a/examples/files.json b/examples/files.json index 2f8a0d483c19e6..35dff8d5a55d1e 100644 --- a/examples/files.json +++ b/examples/files.json @@ -314,6 +314,7 @@ "webgpu_compute_particles_rain", "webgpu_compute_particles_snow", "webgpu_compute_points", + "webgpu_compute_sort_bitonic", "webgpu_compute_texture", "webgpu_compute_texture_pingpong", "webgpu_compute_water", diff --git a/examples/screenshots/webgpu_compute_sort_bitonic.jpg b/examples/screenshots/webgpu_compute_sort_bitonic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0a4d0c1c210996716cc83f3361da6ef14c4a0aa GIT binary patch literal 25044 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

=4-jN*p}u43&WREeA^#!_ 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 + + three.js webgpu - storage pbo external element + + + + + + +

+ three.js +
This example demonstrates a bitonic sort running step by step in a compute shader. +
The left canvas swaps values within workgroup local arrays. The right swaps values within storage buffers. +
Reference implementation by Tim Gfrerer +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/examples/webgpu_storage_buffer.html b/examples/webgpu_storage_buffer.html index 42fd2300a9509e..98edd3a8da541f 100644 --- a/examples/webgpu_storage_buffer.html +++ b/examples/webgpu_storage_buffer.html @@ -9,8 +9,8 @@
three.js -
This example demonstrate the fetch of external element from a StorageBuffer. -
Left canvas is using WebGPU Backend, right canvas is WebGL Backend. +
This example demonstrates fetching an external element from a StorageBuffer. +
The left canvas uses the WebGPU Backend, while the right uses the WebGL Backend.
import * as THREE from 'three'; - import { storageObject, If, vec3, uv, uint, float, Fn, instanceIndex } from 'three/tsl'; + import { storageObject, If, vec3, uv, uint, float, Fn, instanceIndex, workgroupBarrier } from 'three/tsl'; const timestamps = { webgpu: document.getElementById( 'timestamps' ), @@ -107,7 +107,8 @@ for ( let i = 0; i < type.length; i ++ ) { - const invertIndex = arrayBufferNodes[ i ].element( uint( size - 1 ).sub( instanceIndex ) ); + const invertIndex = arrayBufferNodes[ i ].element( uint( size - 1 ).sub( instanceIndex ) ).toVar(); + workgroupBarrier(); arrayBufferNodes[ i ].element( instanceIndex ).assign( invertIndex ); } diff --git a/src/nodes/TSL.js b/src/nodes/TSL.js index ca0f523abe1b1c..3275e00e9a911c 100644 --- a/src/nodes/TSL.js +++ b/src/nodes/TSL.js @@ -142,6 +142,8 @@ export * from './geometry/RangeNode.js'; // gpgpu export * from './gpgpu/ComputeNode.js'; +export * from './gpgpu/BarrierNode.js'; +export * from './gpgpu/WorkgroupInfoNode.js'; // lighting export * from './lighting/LightNode.js'; diff --git a/src/nodes/gpgpu/BarrierNode.js b/src/nodes/gpgpu/BarrierNode.js new file mode 100644 index 00000000000000..683e8d6472666a --- /dev/null +++ b/src/nodes/gpgpu/BarrierNode.js @@ -0,0 +1,40 @@ +import Node from '../core/Node.js'; +import { nodeProxy } from '../tsl/TSLCore.js'; + +class BarrierNode extends Node { + + constructor( scope ) { + + super(); + + this.scope = scope; + + } + + generate( builder ) { + + const { scope } = this; + const { renderer } = builder; + + if ( renderer.backend.isWebGLBackend === true ) { + + builder.addFlowCode( `\t// ${scope}Barrier \n` ); + + } else { + + builder.addLineFlowCode( `${scope}Barrier()` ); + + } + + } + +} + +export default BarrierNode; + +const barrier = nodeProxy( BarrierNode ); + +export const workgroupBarrier = () => barrier( 'workgroup' ).append(); +export const storageBarrier = () => barrier( 'storage' ).append(); +export const textureBarrier = () => barrier( 'texture' ).append(); + diff --git a/src/nodes/gpgpu/WorkgroupInfoNode.js b/src/nodes/gpgpu/WorkgroupInfoNode.js new file mode 100644 index 00000000000000..2bbe3e8eafdb9a --- /dev/null +++ b/src/nodes/gpgpu/WorkgroupInfoNode.js @@ -0,0 +1,100 @@ +import ArrayElementNode from '../utils/ArrayElementNode.js'; +import { nodeObject } from '../tsl/TSLCore.js'; +import Node from '../core/Node.js'; + +class WorkgroupInfoElementNode extends ArrayElementNode { + + constructor( workgroupInfoNode, indexNode ) { + + super( workgroupInfoNode, indexNode ); + + this.isWorkgroupInfoElementNode = true; + + } + + generate( builder, output ) { + + let snippet; + + const isAssignContext = builder.context.assign; + snippet = super.generate( builder ); + + if ( isAssignContext !== true ) { + + const type = this.getNodeType( builder ); + + snippet = builder.format( snippet, type, output ); + + } + + // TODO: Possibly activate clip distance index on index access rather than from clipping context + + return snippet; + + } + +} + + +class WorkgroupInfoNode extends Node { + + constructor( scope, bufferType, bufferCount = 0 ) { + + super( bufferType ); + + this.bufferType = bufferType; + this.bufferCount = bufferCount; + + this.isWorkgroupInfoNode = true; + + this.scope = scope; + + } + + label( name ) { + + this.name = name; + + return this; + + } + + getHash() { + + return this.uuid; + + } + + setScope( scope ) { + + this.scope = scope; + + return this; + + } + + getInputType( /*builder*/ ) { + + return `${this.scope}Array`; + + } + + element( indexNode ) { + + return nodeObject( new WorkgroupInfoElementNode( this, indexNode ) ); + + } + + generate( builder ) { + + return builder.getScopedArray( this.name || `${this.scope}Array_${this.id}`, this.scope.toLowerCase(), this.bufferType, this.bufferCount ); + + } + +} + +export default WorkgroupInfoNode; + +export const workgroupArray = ( type, count ) => nodeObject( new WorkgroupInfoNode( 'Workgroup', type, count ) ); + + diff --git a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js index 68d3afd224367b..8bab3e7a5e288a 100644 --- a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +++ b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js @@ -171,6 +171,8 @@ class WGSLNodeBuilder extends NodeBuilder { this.directives = {}; + this.scopedArrays = new Map(); + } needsToWorkingColorSpace( texture ) { @@ -766,6 +768,45 @@ ${ flowData.code } } + getScopedArray( name, scope, bufferType, bufferCount ) { + + if ( this.scopedArrays.has( name ) === false ) { + + this.scopedArrays.set( name, { + name, + scope, + bufferType, + bufferCount + } ); + + } + + return name; + + } + + getScopedArrays( shaderStage ) { + + if ( shaderStage !== 'compute' ) { + + return; + + } + + const snippets = []; + + for ( const { name, scope, bufferType, bufferCount } of this.scopedArrays.values() ) { + + const type = this.getType( bufferType ); + + snippets.push( `var<${scope}> ${name}: array< ${type}, ${bufferCount} >;` ); + + } + + return snippets.join( '\n' ); + + } + getAttributes( shaderStage ) { const snippets = []; @@ -1065,6 +1106,7 @@ ${ flowData.code } stageData.vars = this.getVars( shaderStage ); stageData.codes = this.getCodes( shaderStage ); stageData.directives = this.getDirectives( shaderStage ); + stageData.scopedArrays = this.getScopedArrays( shaderStage ); // @@ -1291,6 +1333,9 @@ ${shaderData.directives} // system var instanceIndex : u32; +// locals +${shaderData.scopedArrays} + // uniforms ${shaderData.uniforms} diff --git a/test/e2e/puppeteer.js b/test/e2e/puppeteer.js index d13a933163a0a2..926954c6a40c13 100644 --- a/test/e2e/puppeteer.js +++ b/test/e2e/puppeteer.js @@ -124,6 +124,7 @@ const exceptionList = [ // Awaiting for WebGPU Backend support in Puppeteer 'webgpu_storage_buffer', + 'webgpu_compute_sort_bitonic', // WebGPURenderer: Unknown problem 'webgpu_camera_logarithmicdepthbuffer',