VTK  9.5.20250718
vtkWebGPURenderer.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
3#ifndef vtkWebGPURenderer_h
4#define vtkWebGPURenderer_h
5
6#include "vtkRenderer.h"
7
8#include "vtkRenderingWebGPUModule.h" // for export macro
9#include "vtkSmartPointer.h" // for ivar
10#include "vtkWebGPUComputePipeline.h" // for the compute pipelines used by this renderer
11#include "vtkWrappingHints.h" // For VTK_MARSHALAUTO
12#include "vtk_wgpu.h" // for webgpu
13
14#include <unordered_set> // for the set of actors rendered last frame
15
17class vtkRenderState;
19
20VTK_ABI_NAMESPACE_BEGIN
21
23
24class VTKRENDERINGWEBGPU_EXPORT VTK_MARSHALAUTO vtkWebGPURenderer : public vtkRenderer
25{
26public:
29 void PrintSelf(ostream& os, vtkIndent indent) override;
30
32 {
34 wgpu::RenderPipeline Pipeline;
35 };
36
37 // get the complexity of the current lights as a int
38 // 0 = no lighting
39 // 1 = headlight
40 // 2 = directional lights
41 // 3 = positional lights
43 {
44 NoLighting = 0,
45 Headlight = 1,
46 Directional = 2,
47 Positional = 3
48 };
49 vtkGetMacro(LightingComplexity, int);
50
52 {
57 RenderPostRasterization
58 };
59
63 void Clear() override;
64
68 void DeviceRender() override;
69
76
82 int UpdateGeometry(vtkFrameBufferObjectBase* fbo = nullptr) override;
83
92
98
100
104 const std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>>& GetSetupPreRenderComputePipelines();
105 const std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>>&
108
109 int UpdateLights() override;
110
111 void SetEnvironmentTexture(vtkTexture* texture, bool isSRGB = false) override;
112
114
115 inline wgpu::RenderPassEncoder GetRenderPassEncoder() { return this->WGPURenderEncoder; }
116 inline wgpu::RenderBundleEncoder GetRenderBundleEncoder() { return this->WGPUBundleEncoder; }
117 inline wgpu::BindGroup GetSceneBindGroup() { return this->SceneBindGroup; }
118
119 inline void PopulateBindgroupLayouts(std::vector<wgpu::BindGroupLayout>& layouts)
120 {
121 layouts.emplace_back(this->SceneBindGroupLayout);
122 }
123
125
132
136 std::unordered_set<vtkProp*> GetPropsRendered() { return this->PropsRendered; }
137
139
146
148
154 vtkSetMacro(UseRenderBundles, bool);
155 vtkBooleanMacro(UseRenderBundles, bool);
156 vtkGetMacro(UseRenderBundles, bool);
158
169
176 inline void InvalidateBundle()
177 {
178 this->RebuildRenderBundle = true;
179 this->Bundle = nullptr;
180 }
181
185 vtkGetMacro(RebuildRenderBundle, bool);
186
187protected:
190
199
200 // Setup scene and actor bindgroups. Actor has dynamic offsets.
202 // Create buffers for the bind groups.
204 // Create scene bind group.
206
207 // Start, finish recording commands.
210
211 std::size_t WriteLightsBuffer(std::size_t offset = 0);
212 std::size_t WriteSceneTransformsBuffer(std::size_t offset = 0);
213
214 wgpu::RenderPassEncoder WGPURenderEncoder;
215 wgpu::RenderBundleEncoder WGPUBundleEncoder;
217 wgpu::Buffer SceneLightsBuffer;
218
219 wgpu::BindGroup SceneBindGroup;
220 wgpu::BindGroupLayout SceneBindGroupLayout;
221
222#ifdef __EMSCRIPTEN__
223 bool UseRenderBundles = true;
224#else
225 bool UseRenderBundles = false;
226#endif
227 bool RebuildRenderBundle = false;
228 // the commands in bundle get reused every frame.
229 wgpu::RenderBundle Bundle;
230
231 int LightingComplexity = 0;
232 std::size_t NumberOfLightsUsed = 0;
233 std::vector<std::size_t> LightIDs;
234
237
242
243private:
245 // For the mapper to access 'AddPostRasterizationActor'
247 // For render window accessing PostRenderComputePipelines()
249
250 vtkWebGPURenderer(const vtkWebGPURenderer&) = delete;
251 void operator=(const vtkWebGPURenderer&) = delete;
252
256 void InitComputePipeline(vtkSmartPointer<vtkWebGPUComputePipeline> pipeline);
257
259
266 void PreRenderComputePipelines();
267 void PostRenderComputePipelines();
269
280 void PostRasterizationRender();
281
285 void AddPostRasterizationActor(vtkActor* actor);
286
291 std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> SetupPreRenderComputePipelines;
292 std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> SetupPostRenderComputePipelines;
293
297 std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> NotSetupPreRenderComputePipelines;
298 std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> NotSetupPostRenderComputePipelines;
299
307 std::vector<vtkActor*> PostRasterizationActors;
308
312 wgpu::CommandBuffer EncodePropListRenderCommand(vtkProp** propList, int listLength);
313
319 void RecordRenderCommands();
320
325 bool ComputeBuffersInitialized = false;
326
331 RenderStageEnum RenderStage = RenderStageEnum::AwaitingPreparation;
332
336 bool DrawBackgroundInClearPass = true;
337
344 std::unordered_set<vtkProp*> PropsRendered;
345};
346
347VTK_ABI_NAMESPACE_END
348#endif
abstract class specifies interface to map data
represents an object (geometry & properties) in a rendered scene
Definition vtkActor.h:151
abstract interface to OpenGL FBOs
a simple class to control print indentation
Definition vtkIndent.h:108
abstract superclass for all actors, volumes and annotations
Definition vtkProp.h:66
Context in which a vtkRenderPass will render.
abstract specification for renderers
Hold a reference to a vtkObjectBase instance.
handles properties associated with a texture map
Definition vtkTexture.h:168
record modification and/or execution time
describes linear transformations via a 4x4 matrix
This culler does both frustum culling and occlusion culling.
The point cloud renderer uses WebGPU compute shaders to render the point cells of a polydata onto the...
WebGPU rendering window.
void ConfigureComputeRenderBuffers(vtkSmartPointer< vtkWebGPUComputePipeline > computePipeline)
Set up the buffers of a given vtkWebGPUComputePass.
void SetupSceneBindGroup()
void ReleaseGraphicsResources(vtkWindow *w) override
static vtkWebGPURenderer * New()
wgpu::Buffer SceneTransformBuffer
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void ConfigureComputePipelines()
Sets the adapter and the device of the render window of this renderer to the compute pipelines of thi...
vtkTimeStamp LightingUploadTimestamp
void AddPostRenderComputePipeline(vtkSmartPointer< vtkWebGPUComputePipeline > pipeline)
Adds a compute pipeline to the renderer that will be executed each frame before/after the rendering p...
wgpu::RenderBundle Bundle
wgpu::BindGroup GetSceneBindGroup()
std::size_t WriteSceneTransformsBuffer(std::size_t offset=0)
int UpdateOpaquePolygonalGeometry() override
Request mappers to run the vtkAlgorithm pipeline (if needed) and consequently update device buffers c...
std::size_t WriteLightsBuffer(std::size_t offset=0)
int UpdateTranslucentPolygonalGeometry() override
Ask all props to update and draw any translucent polygonal geometry.
int UpdateGeometry(vtkFrameBufferObjectBase *fbo=nullptr) override
Ask all props to update and draw any opaque and translucent geometry.
int UpdateLights() override
Ask all lights to load themselves into rendering pipeline.
void SetUserLightTransform(vtkTransform *transform)
Set the user light transform applied after the camera transform.
wgpu::RenderPassEncoder WGPURenderEncoder
void PopulateBindgroupLayouts(std::vector< wgpu::BindGroupLayout > &layouts)
wgpu::Buffer SceneLightsBuffer
std::unordered_set< vtkProp * > GetPropsRendered()
Returns the list of the actors that were rendered last frame.
void Clear() override
Clear the image to the background color.
wgpu::RenderBundleEncoder WGPUBundleEncoder
vtkTransform * GetUserLightTransform()
Set the user light transform applied after the camera transform.
void DeviceRender() override
Create an image.
wgpu::BindGroup SceneBindGroup
void InvalidateBundle()
Forces the renderer to re-record draw commands into a render bundle.
vtkSmartPointer< vtkTransform > UserLightTransform
Optional user transform for lights.
void AddPreRenderComputePipeline(vtkSmartPointer< vtkWebGPUComputePipeline > pipeline)
Adds a compute pipeline to the renderer that will be executed each frame before/after the rendering p...
wgpu::RenderBundleEncoder GetRenderBundleEncoder()
~vtkWebGPURenderer() override
std::vector< std::size_t > LightIDs
wgpu::RenderPassEncoder GetRenderPassEncoder()
void UpdateBuffers()
Updates / creates the various buffer necessary for the rendering of the props.
const std::vector< vtkSmartPointer< vtkWebGPUComputePipeline > > & GetSetupPostRenderComputePipelines()
Returns the list of compute pipelines of this renderer that have been setup for execution before/afte...
vtkGetEnumMacro(RenderStage, RenderStageEnum)
Query the stage in the rendering process.
const std::vector< vtkSmartPointer< vtkWebGPUComputePipeline > > & GetSetupPreRenderComputePipelines()
Returns the list of compute pipelines of this renderer that have been setup for execution before/afte...
wgpu::BindGroupLayout SceneBindGroupLayout
void SetEnvironmentTexture(vtkTexture *texture, bool isSRGB=false) override
Set/Get the environment texture used for image based lighting.
vtkMTimeType LightingUpdateTime
void SetupBindGroupLayouts()
window superclass for vtkRenderWindow
Definition vtkWindow.h:48
vtkSmartPointer< vtkPropCollection > Props
vtkTypeUInt32 vtkMTimeType
Definition vtkType.h:287
#define VTK_MARSHALAUTO