VTK  9.7.1
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 
16 class vtkAbstractMapper;
17 class vtkRenderState;
20 VTK_ABI_NAMESPACE_BEGIN
21 
23 
24 class VTKRENDERINGWEBGPU_EXPORT VTK_MARSHALAUTO vtkWebGPURenderer : public vtkRenderer
25 {
26 public:
27  static vtkWebGPURenderer* New();
29  static vtkOverrideAttribute* CreateOverrideAttributes();
31  void PrintSelf(ostream& os, vtkIndent indent) override;
32 
33  // get the complexity of the current lights as a int
34  // 0 = no lighting
35  // 1 = headlight
36  // 2 = directional lights
37  // 3 = positional lights
39  {
40  NoLighting = 0,
41  Headlight = 1,
42  Directional = 2,
43  Positional = 3
44  };
45  vtkGetMacro(LightingComplexity, int);
46 
48  {
53  RenderPostRasterization
54  };
55 
59  void Clear() override;
60 
64  void DeviceRender() override;
65 
71  void UpdateBuffers();
72 
78  int UpdateGeometry(vtkFrameBufferObjectBase* fbo = nullptr) override;
79 
87  void ConfigureComputeRenderBuffers(vtkSmartPointer<vtkWebGPUComputePipeline> computePipeline);
88 
93  void ConfigureComputePipelines();
94 
96 
100  const std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>>& GetSetupPreRenderComputePipelines();
101  const std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>>&
102  GetSetupPostRenderComputePipelines();
104 
105  int UpdateLights() override;
106 
107  void SetEnvironmentTexture(vtkTexture* texture, bool isSRGB = false) override;
108 
109  void ReleaseGraphicsResources(vtkWindow* w) override;
110 
111  wgpu::RenderPassEncoder GetRenderPassEncoder() { return this->WGPURenderEncoder; }
112  wgpu::RenderBundleEncoder GetRenderBundleEncoder() { return this->WGPUBundleEncoder; }
113  wgpu::BindGroup GetSceneBindGroup() { return this->SceneBindGroup; }
114 
115  void PopulateBindgroupLayouts(std::vector<wgpu::BindGroupLayout>& layouts)
116  {
117  layouts.emplace_back(this->SceneBindGroupLayout);
118  }
119 
121 
125  void AddPreRenderComputePipeline(vtkSmartPointer<vtkWebGPUComputePipeline> pipeline);
126  void AddPostRenderComputePipeline(vtkSmartPointer<vtkWebGPUComputePipeline> pipeline);
128 
132  std::unordered_set<vtkProp*> GetPropsRendered() { return this->PropsRendered; }
133 
135 
139  void SetUserLightTransform(vtkTransform* transform);
140  vtkTransform* GetUserLightTransform();
142 
144 
149  vtkSetMacro(UseRenderBundles, bool);
150  vtkBooleanMacro(UseRenderBundles, bool);
151  vtkGetMacro(UseRenderBundles, bool);
153 
163  vtkGetEnumMacro(RenderStage, RenderStageEnum);
164 
190  {
191  this->RebuildRenderBundle = true;
192  this->Bundle = nullptr;
193  }
194 
198  vtkGetMacro(RebuildRenderBundle, bool);
199 
200 protected:
202  ~vtkWebGPURenderer() override;
203 
210  int UpdateOpaquePolygonalGeometry() override;
211  int UpdateTranslucentPolygonalGeometry() override;
212 
213 private:
215  // For the mapper to access 'AddPostRasterizationActor'
217  // For render window accessing PostRenderComputePipelines()
218  friend class vtkWebGPURenderWindow;
219 
220  vtkWebGPURenderer(const vtkWebGPURenderer&) = delete;
221  void operator=(const vtkWebGPURenderer&) = delete;
222 
223  // Setup scene and actor bindgroups. Actor has dynamic offsets.
224  void SetupBindGroupLayouts();
225  // Create buffers for the bind groups.
226  void CreateBuffers();
227  // Create scene bind group.
228  void SetupSceneBindGroup();
229 
230  // Start, finish recording commands.
231  void BeginRecording();
232  void EndRecording();
233 
234  std::size_t WriteLightsBuffer(std::size_t offset = 0);
235  std::size_t WriteSceneTransformsBuffer(std::size_t offset = 0);
236 
240  void InitComputePipeline(vtkSmartPointer<vtkWebGPUComputePipeline> pipeline);
241 
243 
250  void PreRenderComputePipelines();
251  void PostRenderComputePipelines();
253 
264  void PostRasterizationRender();
265 
269  void AddPostRasterizationActor(vtkActor* actor);
270 
275  std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> SetupPreRenderComputePipelines;
276  std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> SetupPostRenderComputePipelines;
277 
281  std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> NotSetupPreRenderComputePipelines;
282  std::vector<vtkSmartPointer<vtkWebGPUComputePipeline>> NotSetupPostRenderComputePipelines;
283 
291  std::vector<vtkActor*> PostRasterizationActors;
292 
296  wgpu::CommandBuffer EncodePropListRenderCommand(vtkProp** propList, int listLength);
297 
303  void RecordRenderCommands();
304 
305  wgpu::RenderPassEncoder WGPURenderEncoder;
306  wgpu::RenderBundleEncoder WGPUBundleEncoder;
307  wgpu::Buffer SceneTransformBuffer;
308  wgpu::Buffer SceneLightsBuffer;
309 
310  wgpu::BindGroup SceneBindGroup;
311  wgpu::BindGroupLayout SceneBindGroupLayout;
312 
313  // Render bundles enable faster rendering.
314  bool UseRenderBundles = true;
315  bool RebuildRenderBundle = false;
316  // the commands in bundle get reused every frame.
317  wgpu::RenderBundle Bundle;
318 
319  int LightingComplexity = 0;
320  std::size_t NumberOfLightsUsed = 0;
321  std::vector<std::size_t> LightIDs;
322  std::size_t AllocatedLightsBufferSize = 0;
323  std::size_t PreviousLightCount = 0;
324 
325  vtkMTimeType LightingUpdateTime;
326  vtkTimeStamp LightingUploadTimestamp;
327 
331  vtkSmartPointer<vtkTransform> UserLightTransform;
332 
337  bool ComputeBuffersInitialized = false;
338 
343  RenderStageEnum RenderStage = RenderStageEnum::AwaitingPreparation;
344 
348  bool DrawBackgroundInClearPass = true;
349 
356  std::unordered_set<vtkProp*> PropsRendered;
357 };
358 
359 #define vtkWebGPURenderer_OVERRIDE_ATTRIBUTES vtkWebGPURenderer::CreateOverrideAttributes()
360 VTK_ABI_NAMESPACE_END
361 #endif
abstract superclass for all actors, volumes and annotations
Definition: vtkProp.h:49
Attribute for vtkObjectFactory overrides.
represents an object (geometry & properties) in a rendered scene
Definition: vtkActor.h:41
void PopulateBindgroupLayouts(std::vector< wgpu::BindGroupLayout > &layouts)
virtual void ReleaseGraphicsResources(vtkWindow *)
void InvalidateBundle()
Forces the renderer to re-record draw commands into a render bundle.
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:318
record modification and/or execution time
Definition: vtkTimeStamp.h:24
The point cloud renderer uses WebGPU compute shaders to render the point cells of a polydata onto the...
abstract specification for renderers
Definition: vtkRenderer.h:63
describes linear transformations via a 4x4 matrix
Definition: vtkTransform.h:50
virtual void SetEnvironmentTexture(vtkTexture *texture, bool isSRGB=false)
Set/Get the environment texture used for image based lighting.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
window superclass for vtkRenderWindow
Definition: vtkWindow.h:41
Context in which a vtkRenderPass will render.
abstract interface to OpenGL FBOs
a simple class to control print indentation
Definition: vtkIndent.h:28
wgpu::BindGroup GetSceneBindGroup()
virtual int UpdateLights()
Ask all lights to load themselves into rendering pipeline.
Definition: vtkRenderer.h:1145
handles properties associated with a texture map
Definition: vtkTexture.h:58
wgpu::RenderPassEncoder GetRenderPassEncoder()
virtual int UpdateGeometry(vtkFrameBufferObjectBase *fbo=nullptr)
Ask all props to update and draw any opaque and translucent geometry.
#define VTK_NEWINSTANCE
abstract class specifies interface to map data
std::unordered_set< vtkProp * > GetPropsRendered()
Returns the list of the actors that were rendered last frame.
wgpu::RenderBundleEncoder GetRenderBundleEncoder()
virtual void DeviceRender()
Create an image.
Definition: vtkRenderer.h:307
virtual int UpdateTranslucentPolygonalGeometry()
Ask all props to update and draw any translucent polygonal geometry.
This culler does both frustum culling and occlusion culling.
static vtkRenderer * New()
Create a vtkRenderer with a black background, a white ambient light, two-sided lighting turned on...
#define VTK_MARSHALAUTO
WebGPU rendering window.
virtual int UpdateOpaquePolygonalGeometry()
Ask all props to update and draw any opaque polygonal geometry.
virtual void Clear()
Clear the image to the background color.
Definition: vtkRenderer.h:337
vtkGetEnumMacro(GradientMode, GradientModes)
Specify the direction of the gradient background.