VTK  9.6.20260221
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;
20VTK_ABI_NAMESPACE_BEGIN
21
23
24class VTKRENDERINGWEBGPU_EXPORT VTK_MARSHALAUTO vtkWebGPURenderer : public vtkRenderer
25{
26public:
31 void PrintSelf(ostream& os, vtkIndent indent) override;
32
38
39 // get the complexity of the current lights as a int
40 // 0 = no lighting
41 // 1 = headlight
42 // 2 = directional lights
43 // 3 = positional lights
51 vtkGetMacro(LightingComplexity, int);
52
61
65 void Clear() override;
66
70 void DeviceRender() override;
71
78
84 int UpdateGeometry(vtkFrameBufferObjectBase* fbo = nullptr) override;
85
94
100
102
106 const std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>>& GetSetupPreRenderComputePipelines();
107 const std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>>&
110
111 int UpdateLights() override;
112
113 void SetEnvironmentTexture(vtkTexture* texture, bool isSRGB = false) override;
114
116
117 inline wgpu::RenderPassEncoder GetRenderPassEncoder() { return this->WGPURenderEncoder; }
118 inline wgpu::RenderBundleEncoder GetRenderBundleEncoder() { return this->WGPUBundleEncoder; }
119 inline wgpu::BindGroup GetSceneBindGroup() { return this->SceneBindGroup; }
120
121 inline void PopulateBindgroupLayouts(std::vector<wgpu::BindGroupLayout>& layouts)
122 {
123 layouts.emplace_back(this->SceneBindGroupLayout);
124 }
125
127
134
138 std::unordered_set<vtkProp*> GetPropsRendered() { return this->PropsRendered; }
139
141
148
150
156 vtkSetMacro(UseRenderBundles, bool);
157 vtkBooleanMacro(UseRenderBundles, bool);
158 vtkGetMacro(UseRenderBundles, bool);
160
171
178 inline void InvalidateBundle()
179 {
180 this->RebuildRenderBundle = true;
181 this->Bundle = nullptr;
182 }
183
187 vtkGetMacro(RebuildRenderBundle, bool);
188
189protected:
192
201
202 // Setup scene and actor bindgroups. Actor has dynamic offsets.
204 // Create buffers for the bind groups.
206 // Create scene bind group.
208
209 // Start, finish recording commands.
212
213 std::size_t WriteLightsBuffer(std::size_t offset = 0);
214 std::size_t WriteSceneTransformsBuffer(std::size_t offset = 0);
215
216 wgpu::RenderPassEncoder WGPURenderEncoder;
217 wgpu::RenderBundleEncoder WGPUBundleEncoder;
219 wgpu::Buffer SceneLightsBuffer;
220
221 wgpu::BindGroup SceneBindGroup;
222 wgpu::BindGroupLayout SceneBindGroupLayout;
223
224#ifdef __EMSCRIPTEN__
225 bool UseRenderBundles = true;
226#else
227 bool UseRenderBundles = false;
228#endif
230 // the commands in bundle get reused every frame.
231 wgpu::RenderBundle Bundle;
232
234 std::size_t NumberOfLightsUsed = 0;
235 std::vector<std::size_t> LightIDs;
236
239
244
245private:
247 // For the mapper to access 'AddPostRasterizationActor'
249 // For render window accessing PostRenderComputePipelines()
251
252 vtkWebGPURenderer(const vtkWebGPURenderer&) = delete;
253 void operator=(const vtkWebGPURenderer&) = delete;
254
258 void InitComputePipeline(vtkSmartPointer<vtkWebGPUComputePipeline> pipeline);
259
261
268 void PreRenderComputePipelines();
269 void PostRenderComputePipelines();
271
282 void PostRasterizationRender();
283
287 void AddPostRasterizationActor(vtkActor* actor);
288
293 std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> SetupPreRenderComputePipelines;
294 std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> SetupPostRenderComputePipelines;
295
299 std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> NotSetupPreRenderComputePipelines;
300 std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> NotSetupPostRenderComputePipelines;
301
309 std::vector<vtkActor*> PostRasterizationActors;
310
314 wgpu::CommandBuffer EncodePropListRenderCommand(vtkProp** propList, int listLength);
315
321 void RecordRenderCommands();
322
327 bool ComputeBuffersInitialized = false;
328
334
338 bool DrawBackgroundInClearPass = true;
339
346 std::unordered_set<vtkProp*> PropsRendered;
347};
348
349#define vtkWebGPURenderer_OVERRIDE_ATTRIBUTES vtkWebGPURenderer::CreateOverrideAttributes()
350VTK_ABI_NAMESPACE_END
351#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
Attribute for vtkObjectFactory overrides.
abstract superclass for all actors, volumes and annotations
Definition vtkProp.h:69
Context in which a vtkRenderPass will render.
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.
void ConfigureComputeRenderBuffers(vtkSmartPointer< vtkWebGPUComputePipeline > computePipeline)
Set up the buffers of a given vtkWebGPUComputePass.
void SetupSceneBindGroup()
friend class vtkWebGPUComputePointCloudMapper
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
std::size_t NumberOfLightsUsed
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.
friend class vtkWebGPUComputeOcclusionCuller
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.
static vtkOverrideAttribute * CreateOverrideAttributes()
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...
friend class vtkWebGPURenderWindow
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:61
vtkSmartPointer< vtkPropCollection > Props
vtkTypeUInt32 vtkMTimeType
Definition vtkType.h:318
#define VTK_MARSHALAUTO
#define VTK_NEWINSTANCE