VTK  9.7.20260711
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
80 void Finalize() override;
81
82 void Start() override;
83
87 void End() override;
88
92 void Render() override;
93
98 void StereoMidpoint() override;
99 void Frame() override;
100
101 const char* GetRenderingBackend() override;
102
106 void* GetGenericContext() override;
107
109
114 unsigned char* GetPixelData(int x, int y, int x2, int y2, int front, int right) override;
116 int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right) override;
118 int x, int y, int x2, int y2, unsigned char* data, int front, int right) override;
120 int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front, int right) override;
122
124
127 float* GetRGBAPixelData(int x, int y, int x2, int y2, int front, int right = 0) override;
129 int x, int y, int x2, int y2, int front, vtkFloatArray* data, int right = 0) override;
131 int x, int y, int x2, int y2, float* data, int front, int blend = 0, int right = 0) override;
132 int SetRGBAPixelData(int x, int y, int x2, int y2, vtkFloatArray* data, int front, int blend = 0,
133 int right = 0) override;
134 void ReleaseRGBAPixelData(float* data) override;
135 unsigned char* GetRGBACharPixelData(
136 int x, int y, int x2, int y2, int front, int right = 0) override;
138 int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right = 0) override;
139 int SetRGBACharPixelData(int x, int y, int x2, int y2, unsigned char* data, int front,
140 int blend = 0, int right = 0) override;
141 int SetRGBACharPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front,
142 int blend = 0, int right = 0) override;
144
146
149 float* GetZbufferData(int x1, int y1, int x2, int y2) override;
150 int GetZbufferData(int x1, int y1, int x2, int y2, float* z) override;
151 int GetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
152 int SetZbufferData(int x1, int y1, int x2, int y2, float* buffer) override;
153 int SetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
155
157
160 vtkTypeUInt32* GetIdsData(int x1, int y1, int x2, int y2);
161 void GetIdsData(int x1, int y1, int x2, int y2, vtkTypeUInt32Array* data);
163
168 int GetColorBufferSizes(int* rgba) override;
172 void WaitForCompletion() override;
173
177 int SupportsOpenGL() override;
178
182 const char* ReportCapabilities() override;
183
189
195
197 vtkGetSmartPointerMacro(WGPUConfiguration, vtkWebGPUConfiguration);
198
205
211
217
222 std::string PreprocessShaderSource(const std::string& source) const;
223
227 wgpu::RenderPassEncoder NewRenderPass(wgpu::RenderPassDescriptor& descriptor);
228
233 wgpu::RenderBundleEncoder NewRenderBundleEncoder(wgpu::RenderBundleEncoderDescriptor& descriptor);
234
239 wgpu::CommandEncoder GetCommandEncoder();
240
245
249 void FlushCommandBuffers(vtkTypeUInt32 count, wgpu::CommandBuffer* buffers);
250
256
260 wgpu::TextureView GetDepthStencilView();
261
265 wgpu::TextureFormat GetDepthStencilFormat();
266
271
275 wgpu::Device GetDevice();
276
280 wgpu::Adapter GetAdapter();
281
285 wgpu::TextureFormat GetPreferredSurfaceTextureFormat();
286
291
293
305
307 std::function<void(const void* mappedData, int bytesPerRow, void* userdata)>;
308
317
321 bool EnsureDisplay() override;
322
326 void* GetGenericDisplayId() override;
327
328protected:
331
340 virtual std::string MakeDefaultWindowNameWithBackend();
341
342private:
343 // For accessing SubmitCommandBuffer to submit custom prop render work
345
347 void operator=(const vtkWebGPURenderWindow&) = delete;
348
353 void InitializeRendererComputePipelines();
354
359 void SubmitCommandBuffer(int count, wgpu::CommandBuffer* commandBuffer);
360
364 void PostRenderComputePipelines();
365
370 void PostRasterizationRender();
371
372 struct ComponentMapping
373 {
374 int Map[4];
375 int InComponents;
376 int OutComponents;
377 bool Valid;
378 };
379
395 ComponentMapping GetComponentMapping(wgpu::TextureFormat format, int desiredOutComponents);
396
397 template <typename TOutput, typename TInput>
398 struct PixelReadbackCallbackData
399 {
400 TOutput* OutputValues;
401 uint32_t Width, Height;
402 ComponentMapping Mapping;
403 std::function<TOutput(TInput)> Converter;
404 };
405
420 template <typename TOutput, typename TInput>
421 TOutput* GetTextureDataInternal(wgpu::Texture texture, wgpu::TextureFormat format, int x1, int y1,
422 int x2, int y2, const ComponentMapping& componentMapping,
423 std::function<TOutput(TInput)> converter = nullptr);
424
430 std::uint32_t FlipY(std::uint32_t y);
431
441 void ReadTextureFromGPU(wgpu::Texture& wgpuTexture, wgpu::TextureFormat format,
442 std::size_t mipLevel, wgpu::TextureAspect aspect, wgpu::Origin3D offsets,
443 wgpu::Extent3D extents, TextureMapCallback callback, void* userData);
444
450 void ReadTextureFromGPU(wgpu::Texture& wgpuTexture, wgpu::TextureFormat format,
451 std::size_t mipLevel, wgpu::TextureAspect aspect, TextureMapCallback callback, void* userData);
452
458 bool WGPUInit();
459
463 void WGPUFinalize();
464
470 void CreateSurface();
471
475 void ConfigureSurface();
476
482 void UnconfigureSurface();
483
485
490 void CreateOffscreenColorAttachment();
491 void DestroyOffscreenColorAttachment();
493
495
500 void CreateIdsAttachment();
501 void DestroyIdsAttachment();
503
505
510 void CreateDepthStencilAttachment();
511 void DestroyDepthStencilAttachment();
513
515
519 void CreateColorCopyPipeline();
520 void DestroyColorCopyPipeline();
522
528 void RecreateComputeRenderTextures();
529
536 void RenderOffscreenTexture();
537
542 virtual void SyncWithHardware();
543
544 bool RenderTexturesSetup = false;
545
546 wgpu::Surface Surface;
547 wgpu::CommandEncoder CommandEncoder;
548 int SurfaceConfiguredSize[2];
549 wgpu::TextureFormat PreferredSurfaceTextureFormat = wgpu::TextureFormat::BGRA8Unorm;
550 wgpu::TextureFormat PreferredSelectorIdsTextureFormat = wgpu::TextureFormat::RGBA32Uint;
551 struct vtkWGPUDepthStencil
552 {
553 wgpu::Texture Texture;
554 wgpu::TextureView View;
555 wgpu::TextureFormat Format;
556 bool HasStencil;
557 };
558 vtkWGPUDepthStencil DepthStencilAttachment;
559
560 struct vtkWGPUAttachment
561 {
562 wgpu::Texture Texture;
563 wgpu::TextureView View;
564 wgpu::TextureFormat Format;
565 };
566 vtkWGPUAttachment ColorAttachment;
567 vtkWGPUAttachment IdsAttachment;
568
569 struct vtkWGPUUserStagingPixelData
570 {
571 wgpu::Origin3D Origin;
572 wgpu::Extent3D Extent;
573 wgpu::TexelCopyBufferLayout Layout;
574 wgpu::Buffer Buffer; // for SetPixelData
575 };
576 vtkWGPUUserStagingPixelData StagingPixelData;
577
578 struct vtkWGPUFullScreenQuad
579 {
580 std::string Key;
581 wgpu::BindGroup BindGroup;
582 };
583 vtkWGPUFullScreenQuad ColorCopyRenderPipeline;
584
585 vtkSmartPointer<vtkWebGPUConfiguration> WGPUConfiguration;
586 vtkNew<vtkWebGPUShaderDatabase> WGPUShaderDatabase;
587 vtkNew<vtkWebGPURenderPipelineCache> WGPUPipelineCache;
588 vtkNew<vtkWebGPURenderTextureCache> WGPUTextureCache;
589
590 vtkSmartPointer<vtkWebGPUComputePipeline> DepthCopyPipeline;
591 vtkSmartPointer<vtkWebGPUComputePass> DepthCopyPass;
592 int DepthCopyBufferIndex = 0;
593 int DepthCopyTextureIndex = 0;
594
595 int ScreenSize[2];
596
597 // Render textures acquired by the user on this render window. They are kept here in case the
598 // render window is resized, in which case, we'll need to resize the render textures --> We need
599 // access to the textures
600 std::vector<vtkSmartPointer<vtkWebGPUComputeRenderTexture>> ComputeRenderTextures;
601};
602
603#define vtkWebGPURenderWindow_OVERRIDE_ATTRIBUTES vtkWebGPURenderWindow::CreateOverrideAttributes()
604VTK_ABI_NAMESPACE_END
605#endif
dynamic, self-adjusting array of float
topologically and geometrically regular array of data
a simple class to control print indentation
Definition vtkIndent.h:108
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.
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.
vtkGetNewMacro(WGPUPipelineCache, vtkWebGPURenderPipelineCache)
Get the pipeline cache for this renderer.
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.
vtkGetNewMacro(WGPUTextureCache, vtkWebGPURenderTextureCache)
Get the texture cache for this renderer.
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.
void SetWGPUConfiguration(vtkWebGPUConfiguration *config)
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.
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
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.
void GetIdsData(int x1, int y1, int x2, int y2, vtkTypeUInt32Array *data)
Get the Ids data from the last render.
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_MARSHALAUTO
#define VTK_NEWINSTANCE