VTK  9.7.20260805
vtkWebGPURenderWindow.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
18
19#ifndef vtkWebGPURenderWindow_h
20#define vtkWebGPURenderWindow_h
21
22#include "vtkRenderWindow.h"
23
24#include "vtkRenderingWebGPUModule.h" // for export macro
25#include "vtkWebGPUComputePipeline.h" // for the compute pipelines of this render window
26#include "vtkWebGPUComputeRenderTexture.h" // for compute render textures
27#include "vtkWebGPURenderPipelineCache.h" // for vtkWebGPURenderPipelineCache
28#include "vtkWebGPURenderTextureCache.h" // for texture cache
29#include "vtkWebGPUShaderDatabase.h" // for shader database
30#include "vtkWrappingHints.h" // For VTK_MARSHALAUTO
31#include "vtk_wgpu.h" // for webgpu
32
33VTK_ABI_NAMESPACE_BEGIN
34
38class vtkWebGPUTextureCache;
39class vtkImageData;
40class vtkTypeUInt32Array;
41class VTKRENDERINGWEBGPU_EXPORT VTK_MARSHALAUTO vtkWebGPURenderWindow : public vtkRenderWindow
42{
43public:
51 void PrintSelf(ostream& os, vtkIndent indent) override;
52
56 virtual void CreateAWindow();
57
61 virtual void DestroyWindow();
62
75 void Initialize() override;
76
94 void Finalize() override;
95
96 void Start() override;
97
101 void End() override;
102
106 void Render() override;
107
112 void StereoMidpoint() override;
113 void Frame() override;
114
115 const char* GetRenderingBackend() override;
116
120 void* GetGenericContext() override;
121
123
128 unsigned char* GetPixelData(int x, int y, int x2, int y2, int front, int right) override;
130 int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right) override;
132 int x, int y, int x2, int y2, unsigned char* data, int front, int right) override;
134 int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front, int right) override;
136
138
141 float* GetRGBAPixelData(int x, int y, int x2, int y2, int front, int right = 0) override;
143 int x, int y, int x2, int y2, int front, vtkFloatArray* data, int right = 0) override;
145 int x, int y, int x2, int y2, float* data, int front, int blend = 0, int right = 0) override;
146 int SetRGBAPixelData(int x, int y, int x2, int y2, vtkFloatArray* data, int front, int blend = 0,
147 int right = 0) override;
148 void ReleaseRGBAPixelData(float* data) override;
149 unsigned char* GetRGBACharPixelData(
150 int x, int y, int x2, int y2, int front, int right = 0) override;
152 int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right = 0) override;
153 int SetRGBACharPixelData(int x, int y, int x2, int y2, unsigned char* data, int front,
154 int blend = 0, int right = 0) override;
155 int SetRGBACharPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front,
156 int blend = 0, int right = 0) override;
158
160
163 float* GetZbufferData(int x1, int y1, int x2, int y2) override;
164 int GetZbufferData(int x1, int y1, int x2, int y2, float* z) override;
165 int GetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
166 int SetZbufferData(int x1, int y1, int x2, int y2, float* buffer) override;
167 int SetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
169
171
174 vtkTypeUInt32* GetIdsData(int x1, int y1, int x2, int y2);
176 void GetIdsData(int x1, int y1, int x2, int y2, vtkTypeUInt32Array* data);
178
183 int GetColorBufferSizes(int* rgba) override;
187 void WaitForCompletion() override;
188
192 int SupportsOpenGL() override;
193
197 const char* ReportCapabilities() override;
198
204
210
212
223 vtkGetSmartPointerMacro(WGPUConfiguration, vtkWebGPUConfiguration);
225
232
238
244
249 std::string PreprocessShaderSource(const std::string& source) const;
250
254 wgpu::RenderPassEncoder NewRenderPass(wgpu::RenderPassDescriptor& descriptor);
255
260 wgpu::RenderBundleEncoder NewRenderBundleEncoder(wgpu::RenderBundleEncoderDescriptor& descriptor);
261
266 wgpu::CommandEncoder GetCommandEncoder();
267
272
276 void FlushCommandBuffers(vtkTypeUInt32 count, wgpu::CommandBuffer* buffers);
277
283
287 wgpu::TextureView GetDepthStencilView();
288
292 wgpu::TextureFormat GetDepthStencilFormat();
293
298
302 wgpu::Device GetDevice();
303
307 wgpu::Adapter GetAdapter();
308
312 wgpu::TextureFormat GetPreferredSurfaceTextureFormat();
313
318
320
332
334 std::function<void(const void* mappedData, int bytesPerRow, void* userdata)>;
335
344
348 bool EnsureDisplay() override;
349
353 void* GetGenericDisplayId() override;
354
355protected:
358
367 virtual std::string MakeDefaultWindowNameWithBackend();
368
369private:
370 // For accessing SubmitCommandBuffer to submit custom prop render work
372
374 void operator=(const vtkWebGPURenderWindow&) = delete;
375
380 void InitializeRendererComputePipelines();
381
386 void SubmitCommandBuffer(int count, wgpu::CommandBuffer* commandBuffer);
387
391 void PostRenderComputePipelines();
392
397 void PostRasterizationRender();
398
399 struct ComponentMapping
400 {
401 int Map[4];
402 int InComponents;
403 int OutComponents;
404 bool Valid;
405 };
406
422 ComponentMapping GetComponentMapping(wgpu::TextureFormat format, int desiredOutComponents);
423
424 template <typename TOutput, typename TInput>
425 struct PixelReadbackCallbackData
426 {
427 TOutput* OutputValues;
428 uint32_t Width, Height;
429 ComponentMapping Mapping;
430 std::function<TOutput(TInput)> Converter;
431 };
432
447 template <typename TOutput, typename TInput>
448 TOutput* GetTextureDataInternal(wgpu::Texture texture, wgpu::TextureFormat format, int x1, int y1,
449 int x2, int y2, const ComponentMapping& componentMapping,
450 std::function<TOutput(TInput)> converter = nullptr);
451
457 std::uint32_t FlipY(std::uint32_t y);
458
468 void ReadTextureFromGPU(wgpu::Texture& wgpuTexture, wgpu::TextureFormat format,
469 std::size_t mipLevel, wgpu::TextureAspect aspect, wgpu::Origin3D offsets,
470 wgpu::Extent3D extents, TextureMapCallback callback, void* userData);
471
477 void ReadTextureFromGPU(wgpu::Texture& wgpuTexture, wgpu::TextureFormat format,
478 std::size_t mipLevel, wgpu::TextureAspect aspect, TextureMapCallback callback, void* userData);
479
485 bool WGPUInit();
486
494 void WGPUFinalize();
495
501 void CreateSurface();
502
506 void ConfigureSurface();
507
513 void UnconfigureSurface();
514
516
521 void CreateOffscreenColorAttachment();
522 void DestroyOffscreenColorAttachment();
524
526
531 void CreateIdsAttachment();
532 void DestroyIdsAttachment();
534
536
541 void CreateDepthStencilAttachment();
542 void DestroyDepthStencilAttachment();
544
546
550 void CreateColorCopyPipeline();
551 void DestroyColorCopyPipeline();
553
559 void RecreateComputeRenderTextures();
560
567 void RenderOffscreenTexture();
568
573 virtual void SyncWithHardware();
574
575 bool RenderTexturesSetup = false;
576
577 wgpu::Surface Surface;
578 wgpu::CommandEncoder CommandEncoder;
579 int SurfaceConfiguredSize[2];
580 wgpu::TextureFormat PreferredSurfaceTextureFormat = wgpu::TextureFormat::BGRA8Unorm;
581 wgpu::TextureFormat PreferredSelectorIdsTextureFormat = wgpu::TextureFormat::RGBA32Uint;
582 struct vtkWGPUDepthStencil
583 {
584 wgpu::Texture Texture;
585 wgpu::TextureView View;
586 wgpu::TextureFormat Format;
587 bool HasStencil;
588 };
589 vtkWGPUDepthStencil DepthStencilAttachment;
590
591 struct vtkWGPUAttachment
592 {
593 wgpu::Texture Texture;
594 wgpu::TextureView View;
595 wgpu::TextureFormat Format;
596 };
597 vtkWGPUAttachment ColorAttachment;
598 vtkWGPUAttachment IdsAttachment;
599
600 struct vtkWGPUUserStagingPixelData
601 {
602 wgpu::Origin3D Origin;
603 wgpu::Extent3D Extent;
604 wgpu::TexelCopyBufferLayout Layout;
605 wgpu::Buffer Buffer; // for SetPixelData
606 };
607 vtkWGPUUserStagingPixelData StagingPixelData;
608
609 struct vtkWGPUFullScreenQuad
610 {
611 std::string Key;
612 wgpu::BindGroup BindGroup;
613 };
614 vtkWGPUFullScreenQuad ColorCopyRenderPipeline;
615
616 vtkSmartPointer<vtkWebGPUConfiguration> WGPUConfiguration;
617 vtkNew<vtkWebGPUShaderDatabase> WGPUShaderDatabase;
618 vtkNew<vtkWebGPURenderPipelineCache> WGPUPipelineCache;
619 vtkNew<vtkWebGPURenderTextureCache> WGPUTextureCache;
620
621 vtkSmartPointer<vtkWebGPUComputePipeline> DepthCopyPipeline;
622 vtkSmartPointer<vtkWebGPUComputePass> DepthCopyPass;
623 int DepthCopyBufferIndex = 0;
624 int DepthCopyTextureIndex = 0;
625
626 int ScreenSize[2];
627
628 // Render textures acquired by the user on this render window. They are kept here in case the
629 // render window is resized, in which case, we'll need to resize the render textures --> We need
630 // access to the textures
631 std::vector<vtkSmartPointer<vtkWebGPUComputeRenderTexture>> ComputeRenderTextures;
632};
633
634#define vtkWebGPURenderWindow_OVERRIDE_ATTRIBUTES vtkWebGPURenderWindow::CreateOverrideAttributes()
635VTK_ABI_NAMESPACE_END
636#endif
dynamic, self-adjusting array of float
topologically and geometrically regular array of data
a simple class to control print indentation
Definition vtkIndent.h:29
Attribute for vtkObjectFactory overrides.
Hold a reference to a vtkObjectBase instance.
dynamic, self-adjusting array of unsigned char
This culler does both frustum culling and occlusion culling.
Render textures are returned by calls to vtkWebGPUPolyDataMapper::AcquireXXXXRenderTexture() and repr...
Create a webgpu device for use in rendering and compute pipelines.
Class to create and retrieve render pipelines based on a given key.
Class to create and retrieve render Textures based on a given key.
static vtkOverrideAttribute * CreateOverrideAttributes()
virtual void DestroyWindow()
Destroy a not-off-screen window.
void Frame() override
A termination method performed at the end of the rendering process to do things like swapping buffers...
void CreateCommandEncoder()
Initializes a new command encoder.
wgpu::TextureFormat GetPreferredSurfaceTextureFormat()
Get the texture format preferred for the surface.
wgpu::TextureFormat GetPreferredSelectorIdsTextureFormat()
Get the texture format preferred for selector IDs.
wgpu::TextureFormat GetDepthStencilFormat()
Get the texture format of the depth-stencil attachment.
bool EnsureDisplay() override
Ensure RenderWindow's display is opened.
std::string PreprocessShaderSource(const std::string &source) const
Replaces all include statements in the given source code with source code corresponding to the includ...
void End() override
Update the system, if needed, at end of render process.
vtkSmartPointer< vtkImageData > SaveAttachmentToVTI(AttachmentTypeForVTISnapshot type)
int SupportsOpenGL() override
Does this render window support OpenGL?
int SetZbufferData(int x1, int y1, int x2, int y2, float *buffer) override
Set/Get the zbuffer data from an image.
float * GetRGBAPixelData(int x, int y, int x2, int y2, int front, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
wgpu::CommandEncoder GetCommandEncoder()
Get the currently used command encoder.
vtkTypeUInt32 * GetIdsData(int x1, int y1, int x2, int y2)
Get the Ids data from the last render.
const char * ReportCapabilities() override
Get report of capabilities for the render window.
wgpu::Adapter GetAdapter()
Get the webgpu adapter.
std::function< void(const void *mappedData, int bytesPerRow, void *userdata)> TextureMapCallback
void Finalize() override
Call DestroyWindow.
bool HasStencil()
Whether the offscreen render target has stencil capabilities.
int GetPixelData(int x, int y, int x2, int y2, int front, vtkUnsignedCharArray *data, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB... front in this context indicates that the...
friend class vtkWebGPUComputeOcclusionCuller
wgpu::TextureView GetHardwareSelectorAttachmentView()
int GetRGBAPixelData(int x, int y, int x2, int y2, int front, vtkFloatArray *data, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
void ReleaseRGBAPixelData(float *data) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
static vtkWebGPURenderWindow * New()
Instantiate the class.
int GetRGBACharPixelData(int x, int y, int x2, int y2, int front, vtkUnsignedCharArray *data, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
void * GetGenericDisplayId() override
Get the generic display id for the window.
int SetPixelData(int x, int y, int x2, int y2, unsigned char *data, int front, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB... front in this context indicates that the...
unsigned char * GetRGBACharPixelData(int x, int y, int x2, int y2, int front, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
float * GetZbufferData(int x1, int y1, int x2, int y2) override
Set/Get the zbuffer data from an image.
VTK_MAYSUSPEND void SetWGPUConfiguration(vtkWebGPUConfiguration *config)
Set/Get the webgpu configuration instance.
void WaitForCompletion() override
Block the thread until work queue completes all submitted work.
int SetPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray *data, int front, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB... front in this context indicates that the...
void ReleaseGraphicsResources(vtkWindow *) override
Free up any graphics resources associated with this window a value of NULL means the context may alre...
bool InitializeFromCurrentContext() override
Initialize the render window from the information associated with the currently activated OpenGL cont...
vtkGetNewMacro(WGPUShaderDatabase, vtkWebGPUShaderDatabase)
Get a database of all WebGPU shader source codes in VTK.
void Initialize() override
Creates the WebGPU context, swapchain, depth buffer, color attachment, ...
wgpu::TextureView GetDepthStencilView()
Get a view of the depth-stencil attachment used in the offscreen render target.
int SetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray *buffer) override
Set/Get the zbuffer data from an image.
int GetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray *buffer) override
Set/Get the zbuffer data from an image.
void Render() override
Handle opengl specific code and calls superclass.
int SetRGBAPixelData(int x, int y, int x2, int y2, float *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
wgpu::RenderBundleEncoder NewRenderBundleEncoder(wgpu::RenderBundleEncoderDescriptor &descriptor)
Create a new render bundle encoder on the webgpu device.
vtkSmartPointer< vtkWebGPUComputeRenderTexture > AcquireDepthBufferRenderTexture()
Returns a vtkWebGPUComputeRenderTexture ready to be added to a compute pipeline using vtkWebGPUComput...
void FlushCommandBuffers(vtkTypeUInt32 count, wgpu::CommandBuffer *buffers)
Sends a given command buffer to the device queue.
void Start() override
Start the rendering process for a frame.
const char * GetRenderingBackend() override
What rendering backend has the user requested.
vtkSmartPointer< vtkWebGPUComputeRenderTexture > AcquireFramebufferRenderTexture()
Returns a vtkWebGPUComputeRenderTexture ready to be added to a compute pipeline using vtkWebGPUComput...
wgpu::RenderPassEncoder NewRenderPass(wgpu::RenderPassDescriptor &descriptor)
Create a new render pass encoder on the webgpu device.
int SetRGBACharPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
~vtkWebGPURenderWindow() override
VTK_MAYSUSPEND void GetIdsData(int x1, int y1, int x2, int y2, vtkTypeUInt32Array *data)
Get the Ids data from the last render.
void * GetGenericContext() override
Get the generic context pointer.
virtual std::string MakeDefaultWindowNameWithBackend()
Construct the window title as "Visualization Toolkit - <WindowSystem> <GraphicsBackend>" Ex: "Visuali...
int GetZbufferData(int x1, int y1, int x2, int y2, float *z) override
Set/Get the zbuffer data from an image.
wgpu::TextureView GetOffscreenColorAttachmentView()
Get a view of the color attachment used in the offscreen render target.
int SetRGBAPixelData(int x, int y, int x2, int y2, vtkFloatArray *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
void StereoMidpoint() override
Intermediate method performs operations required between the rendering of the left and right eye.
int GetColorBufferSizes(int *rgba) override
Get the size of the color buffer.
wgpu::Device GetDevice()
Get the webgpu device.
int SetRGBACharPixelData(int x, int y, int x2, int y2, unsigned char *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
virtual void CreateAWindow()
Create a not-off-screen window.
unsigned char * GetPixelData(int x, int y, int x2, int y2, int front, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB... front in this context indicates that the...
Class to add and retrieve source code for shader files for a specified key.
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
@ Valid
Cell is in a good state.
#define VTK_MAYSUSPEND
#define VTK_MARSHAL_EXCLUDE_REASON_IS_INTERNAL
#define VTK_MARSHALAUTO
#define VTK_MARSHALEXCLUDE(reason)
#define VTK_NEWINSTANCE