From eb8c334628e6ae895fb6c9da4be2d78a2135c38b Mon Sep 17 00:00:00 2001 From: Renaud Rohlinger Date: Thu, 26 Dec 2024 20:32:21 +0900 Subject: [PATCH] WebGPURenderer: Improved Shaders Names For Debug (#30209) --- src/nodes/gpgpu/ComputeNode.js | 22 ++++++++++++++++++++++ src/renderers/common/Pipelines.js | 8 +++++--- src/renderers/common/ProgrammableStage.js | 11 ++++++++++- src/renderers/common/Renderer.js | 2 +- src/renderers/webgpu/WebGPUBackend.js | 2 +- 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/nodes/gpgpu/ComputeNode.js b/src/nodes/gpgpu/ComputeNode.js index eb3695786bdf52..7ca263a227982a 100644 --- a/src/nodes/gpgpu/ComputeNode.js +++ b/src/nodes/gpgpu/ComputeNode.js @@ -73,6 +73,14 @@ class ComputeNode extends Node { */ this.version = 1; + /** + * The name or label of the uniform. + * + * @type {String} + * @default '' + */ + this.name = ''; + /** * The `updateBeforeType` is set to `NodeUpdateType.OBJECT` since {@link ComputeNode#updateBefore} * is executed once per object by default. @@ -102,6 +110,20 @@ class ComputeNode extends Node { } + /** + * Sets the {@link ComputeNode#name} property. + * + * @param {String} name - The name of the uniform. + * @return {ComputeNode} A reference to this node. + */ + label( name ) { + + this.name = name; + + return this; + + } + /** * TODO */ diff --git a/src/renderers/common/Pipelines.js b/src/renderers/common/Pipelines.js index 4cae37d1260006..79b9d26406f472 100644 --- a/src/renderers/common/Pipelines.js +++ b/src/renderers/common/Pipelines.js @@ -52,7 +52,7 @@ class Pipelines extends DataMap { if ( previousPipeline && previousPipeline.computeProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.computeProgram ); - stageCompute = new ProgrammableStage( nodeBuilderState.computeShader, 'compute', nodeBuilderState.transforms, nodeBuilderState.nodeAttributes ); + stageCompute = new ProgrammableStage( nodeBuilderState.computeShader, 'compute', computeNode.name, nodeBuilderState.transforms, nodeBuilderState.nodeAttributes ); this.programs.compute.set( nodeBuilderState.computeShader, stageCompute ); backend.createProgram( stageCompute ); @@ -111,6 +111,8 @@ class Pipelines extends DataMap { const nodeBuilderState = renderObject.getNodeBuilderState(); + const name = renderObject.material ? renderObject.material.name : ''; + // programmable stages let stageVertex = this.programs.vertex.get( nodeBuilderState.vertexShader ); @@ -119,7 +121,7 @@ class Pipelines extends DataMap { if ( previousPipeline && previousPipeline.vertexProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.vertexProgram ); - stageVertex = new ProgrammableStage( nodeBuilderState.vertexShader, 'vertex' ); + stageVertex = new ProgrammableStage( nodeBuilderState.vertexShader, 'vertex', name ); this.programs.vertex.set( nodeBuilderState.vertexShader, stageVertex ); backend.createProgram( stageVertex ); @@ -132,7 +134,7 @@ class Pipelines extends DataMap { if ( previousPipeline && previousPipeline.fragmentProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.fragmentProgram ); - stageFragment = new ProgrammableStage( nodeBuilderState.fragmentShader, 'fragment' ); + stageFragment = new ProgrammableStage( nodeBuilderState.fragmentShader, 'fragment', name ); this.programs.fragment.set( nodeBuilderState.fragmentShader, stageFragment ); backend.createProgram( stageFragment ); diff --git a/src/renderers/common/ProgrammableStage.js b/src/renderers/common/ProgrammableStage.js index f33d92d33060f3..502cba31e23b3e 100644 --- a/src/renderers/common/ProgrammableStage.js +++ b/src/renderers/common/ProgrammableStage.js @@ -14,10 +14,11 @@ class ProgrammableStage { * * @param {String} code - The shader code. * @param {('vertex'|'fragment'|'compute')} stage - The type of stage. + * @param {String} name - The name of the shader. * @param {Array?} [transforms=null] - The transforms (only relevant for compute stages with WebGL 2 which uses Transform Feedback). * @param {Array?} [attributes=null] - The attributes (only relevant for compute stages with WebGL 2 which uses Transform Feedback). */ - constructor( code, stage, transforms = null, attributes = null ) { + constructor( code, stage, name, transforms = null, attributes = null ) { /** * The id of the programmable stage. @@ -40,6 +41,14 @@ class ProgrammableStage { */ this.stage = stage; + /** + * The name of the stage. + * This is used for debugging purposes. + * + * @type {String} + */ + this.name = name; + /** * The transforms (only relevant for compute stages with WebGL 2 which uses Transform Feedback). * diff --git a/src/renderers/common/Renderer.js b/src/renderers/common/Renderer.js index 8ac93c79e6cdc9..06ba43fd259e49 100644 --- a/src/renderers/common/Renderer.js +++ b/src/renderers/common/Renderer.js @@ -414,7 +414,7 @@ class Renderer { * @type {QuadMesh} */ this._quad = new QuadMesh( new NodeMaterial() ); - this._quad.material.type = 'Renderer_output'; + this._quad.material.name = 'Renderer_output'; /** * A reference to the current render context. diff --git a/src/renderers/webgpu/WebGPUBackend.js b/src/renderers/webgpu/WebGPUBackend.js index 694488fdc10d75..9daefb675cc13d 100644 --- a/src/renderers/webgpu/WebGPUBackend.js +++ b/src/renderers/webgpu/WebGPUBackend.js @@ -1288,7 +1288,7 @@ class WebGPUBackend extends Backend { const programGPU = this.get( program ); programGPU.module = { - module: this.device.createShaderModule( { code: program.code, label: program.stage } ), + module: this.device.createShaderModule( { code: program.code, label: program.stage + ( program.name !== '' ? `_${ program.name }` : '' ) } ), entryPoint: 'main' };