From b5e685c80916fe99ec78b5717667ac82de1b9735 Mon Sep 17 00:00:00 2001 From: Spiri0 <69024222+Spiri0@users.noreply.github.com> Date: Mon, 2 Dec 2024 07:48:53 +0100 Subject: [PATCH 1/4] Update WGSLNodeBuilder.js Arrays are not currently taken into account by the wgslTypeLib. However, with the struct extension #29908, arrays will also become important as a type. --- src/renderers/webgpu/nodes/WGSLNodeBuilder.js | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js index 74fb78f2445c2e..18ca6b15ecb6f1 100644 --- a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +++ b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js @@ -73,7 +73,28 @@ const wgslTypeLib = { mat2: 'mat2x2', mat3: 'mat3x3', - mat4: 'mat4x4' + mat4: 'mat4x4', + + //because arrays with their two degrees of freedom are special + array( elementType, count ) { + + const isValidType = ( type ) => !! this[ type ]; + + if ( ! isValidType( elementType ) ) { + + throw new Error( `Unknown type: ${elementType}` ); + + } + + if ( typeof count !== 'number' || ! Number.isInteger( count ) || count < 1 ) { + + throw new Error( `Invalid size: ${count}. Size must be a positive integer` ); + + } + + return `array<${this[ elementType ]}, ${count}>`; + + } }; const wgslCodeCache = {}; From 8f2e365c922c442c6b64598ee12fb0ca5495178c Mon Sep 17 00:00:00 2001 From: Spiri0 <69024222+Spiri0@users.noreply.github.com> Date: Wed, 4 Dec 2024 09:37:11 +0100 Subject: [PATCH 2/4] enables the use of samplers in compute shaders Since textureSampleLevel is usable in compute shaders, this small PR allows sampler to be used in compute shaders for this purpose --- src/renderers/webgpu/nodes/WGSLNodeBuilder.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js index c0f845d05f683f..d922563ab1e4f1 100644 --- a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +++ b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js @@ -244,7 +244,7 @@ class WGSLNodeBuilder extends NodeBuilder { _generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, shaderStage = this.shaderStage ) { - if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false ) { + if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false ) { return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`; @@ -613,7 +613,7 @@ class WGSLNodeBuilder extends NodeBuilder { texture.store = node.isStorageTextureNode === true; texture.setVisibility( gpuShaderStageLib[ shaderStage ] ); - if ( shaderStage === 'fragment' && this.isUnfilterable( node.value ) === false && texture.store === false ) { + if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( node.value ) === false && texture.store === false ) { const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node, group ); sampler.setVisibility( gpuShaderStageLib[ shaderStage ] ); @@ -1125,7 +1125,7 @@ ${ flowData.code } const texture = uniform.node.value; - if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) { + if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) { if ( this.isSampleCompare( texture ) ) { From 2bafcdf07075b2313f9990d01825da8a777509a6 Mon Sep 17 00:00:00 2001 From: Spiri0 <69024222+Spiri0@users.noreply.github.com> Date: Wed, 4 Dec 2024 09:50:16 +0100 Subject: [PATCH 3/4] Update WGSLNodeBuilder.js --- src/renderers/webgpu/nodes/WGSLNodeBuilder.js | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js index d922563ab1e4f1..4c9d2b9a69d8ea 100644 --- a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +++ b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js @@ -73,28 +73,8 @@ const wgslTypeLib = { mat2: 'mat2x2', mat3: 'mat3x3', - mat4: 'mat4x4', + mat4: 'mat4x4' - //because arrays with their two degrees of freedom are special - array( elementType, count ) { - - const isValidType = ( type ) => !! this[ type ]; - - if ( ! isValidType( elementType ) ) { - - throw new Error( `Unknown type: ${elementType}` ); - - } - - if ( typeof count !== 'number' || ! Number.isInteger( count ) || count < 1 ) { - - throw new Error( `Invalid size: ${count}. Size must be a positive integer` ); - - } - - return `array<${this[ elementType ]}, ${count}>`; - - } }; const wgslCodeCache = {}; From a7a03869b35aa9a1cd6dca432707e53da6204c6f Mon Sep 17 00:00:00 2001 From: Spiri0 <69024222+Spiri0@users.noreply.github.com> Date: Wed, 4 Dec 2024 09:50:41 +0100 Subject: [PATCH 4/4] Update WGSLNodeBuilder.js --- src/renderers/webgpu/nodes/WGSLNodeBuilder.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js index 4c9d2b9a69d8ea..497499f2d918be 100644 --- a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +++ b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js @@ -74,7 +74,6 @@ const wgslTypeLib = { mat2: 'mat2x2', mat3: 'mat3x3', mat4: 'mat4x4' - }; const wgslCodeCache = {};