diff --git a/Rendering/WebGPU/CMakeLists.txt b/Rendering/WebGPU/CMakeLists.txt index bfd3f9bebb2e0b9e7bec5d170ddbf20f46e8c1d9..258012a36f4ffdd76dc50dbf2bd5aba339ce5db0 100644 --- a/Rendering/WebGPU/CMakeLists.txt +++ b/Rendering/WebGPU/CMakeLists.txt @@ -9,7 +9,6 @@ set(classes vtkWebGPUBatchedPolyDataMapper vtkWebGPUCamera vtkWebGPUCellToPrimitiveConverter - vtkWebGPUClearDrawPass vtkWebGPUCommandEncoderDebugGroup vtkWebGPUCompositePolyDataMapperDelegator vtkWebGPUComputeBuffer @@ -33,7 +32,6 @@ set(classes vtkWebGPUPolyDataMapper2D vtkWebGPUProperty vtkWebGPURenderer - vtkWebGPURenderPass vtkWebGPUShaderDatabase vtkWebGPUShaderProperty vtkWebGPUTexture diff --git a/Rendering/WebGPU/vtkWebGPUCamera.cxx b/Rendering/WebGPU/vtkWebGPUCamera.cxx index 3e52a238a4e40e38edab7f9c125b0f9bbed3573c..9878636ad24a5d991a9bd9829fa76327ec5b89e9 100644 --- a/Rendering/WebGPU/vtkWebGPUCamera.cxx +++ b/Rendering/WebGPU/vtkWebGPUCamera.cxx @@ -129,10 +129,6 @@ void vtkWebGPUCamera::UpdateViewport(vtkRenderer* renderer) rpassEncoder.SetScissorRect( lowerLeft[0], lowerLeft[1], static_cast<uint32_t>(width), static_cast<uint32_t>(height)); } - if ((renderer->GetRenderWindow())->GetErase() && renderer->GetErase()) - { - renderer->Clear(); - } } //------------------------------------------------------------------------------ diff --git a/Rendering/WebGPU/vtkWebGPUClearDrawPass.cxx b/Rendering/WebGPU/vtkWebGPUClearDrawPass.cxx deleted file mode 100644 index 7fac2cce1c94a450273ed30afddc4b5261f35216..0000000000000000000000000000000000000000 --- a/Rendering/WebGPU/vtkWebGPUClearDrawPass.cxx +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen -// SPDX-License-Identifier: BSD-3-Clause - -#include "vtkWebGPUClearDrawPass.h" -#include "Private/vtkWebGPURenderPassDescriptorInternals.h" -#include "vtkObjectFactory.h" -#include "vtkRenderState.h" -#include "vtkRenderer.h" -#include "vtkWebGPURenderWindow.h" - -VTK_ABI_NAMESPACE_BEGIN - -//------------------------------------------------------------------------------ -vtkStandardNewMacro(vtkWebGPUClearDrawPass); - -//------------------------------------------------------------------------------ -vtkWebGPUClearDrawPass::vtkWebGPUClearDrawPass() = default; - -//------------------------------------------------------------------------------ -vtkWebGPUClearDrawPass::~vtkWebGPUClearDrawPass() = default; - -//------------------------------------------------------------------------------ -void vtkWebGPUClearDrawPass::PrintSelf(ostream& os, vtkIndent indent) -{ - this->Superclass::PrintSelf(os, indent); -} - -//------------------------------------------------------------------------------ -wgpu::RenderPassEncoder vtkWebGPUClearDrawPass::Begin(const vtkRenderState* state) -{ - auto wgpuRenderWindow = - vtkWebGPURenderWindow::SafeDownCast(state->GetRenderer()->GetRenderWindow()); - - std::vector<wgpu::TextureView> backBufferViews = { - wgpuRenderWindow->GetOffscreenColorAttachmentView() - }; - wgpu::TextureView depthStencilView = wgpuRenderWindow->GetDepthStencilView(); - - vtkWebGPURenderPassDescriptorInternals renderPassDescriptor( - backBufferViews, depthStencilView, this->ClearColor, this->ClearDepth, this->ClearStencil); - renderPassDescriptor.label = "vtkWebGPUClearDrawPass::Begin"; - return wgpuRenderWindow->NewRenderPass(renderPassDescriptor); -} - -//------------------------------------------------------------------------------ -void vtkWebGPUClearDrawPass::Render(const vtkRenderState* state) -{ - if (!state->IsValid()) - { - return; - } - this->End(state, this->Begin(state)); -} -VTK_ABI_NAMESPACE_END diff --git a/Rendering/WebGPU/vtkWebGPUClearDrawPass.h b/Rendering/WebGPU/vtkWebGPUClearDrawPass.h deleted file mode 100644 index b205bd2919cd978c518811c515da81e4ab4b3b97..0000000000000000000000000000000000000000 --- a/Rendering/WebGPU/vtkWebGPUClearDrawPass.h +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen -// SPDX-License-Identifier: BSD-3-Clause -#ifndef vtkWebGPUClearDrawPass_h -#define vtkWebGPUClearDrawPass_h - -#include "vtkWebGPURenderPass.h" - -#include "vtkRenderingWebGPUModule.h" // for export macro - -VTK_ABI_NAMESPACE_BEGIN -class VTKRENDERINGWEBGPU_EXPORT vtkWebGPUClearDrawPass : public vtkWebGPURenderPass -{ -public: - static vtkWebGPUClearDrawPass* New(); - vtkTypeMacro(vtkWebGPUClearDrawPass, vtkWebGPURenderPass); - void PrintSelf(ostream& os, vtkIndent indent) override; - - void Render(const vtkRenderState* state) override; - - ///@{ - /** - * Get/set the ClearColor attribute. If true this clear pass will clear the color buffer - * before rendering. If false, this pass will render on top of the existing color buffer - */ - vtkGetMacro(ClearColor, bool); - vtkSetMacro(ClearColor, bool); - ///@} - - ///@{ - /** - * Get/set the ClearDepth attribute. If true this clear pass will clear the depth buffer - * before rendering. If false, this pass will render on top of the existing depth buffer - */ - vtkGetMacro(ClearDepth, bool); - vtkSetMacro(ClearDepth, bool); - ///@} - - ///@{ - /** - * Get/set the ClearStencil attribute. If true this clear pass will clear the stencil buffer - * before rendering. If false, this pass will render on top of the existing stencil buffer - */ - vtkGetMacro(ClearStencil, bool); - vtkSetMacro(ClearStencil, bool); - ///@} - - wgpu::RenderPassEncoder Begin(const vtkRenderState* state) override; - -protected: - vtkWebGPUClearDrawPass(); - ~vtkWebGPUClearDrawPass() override; - -private: - bool ClearColor = true; - bool ClearDepth = true; - bool ClearStencil = true; - - vtkWebGPUClearDrawPass(const vtkWebGPUClearDrawPass&) = delete; - void operator=(const vtkWebGPUClearDrawPass&) = delete; -}; - -VTK_ABI_NAMESPACE_END -#endif diff --git a/Rendering/WebGPU/vtkWebGPUHardwareSelector.h b/Rendering/WebGPU/vtkWebGPUHardwareSelector.h index 6cd2f5fb6bd60c4f3a9eb9d62e3c9499f8aad458..076a0ff0925f9e389ec37906438ed6dbc539fce0 100644 --- a/Rendering/WebGPU/vtkWebGPUHardwareSelector.h +++ b/Rendering/WebGPU/vtkWebGPUHardwareSelector.h @@ -27,6 +27,13 @@ public: vtkTypeMacro(vtkWebGPUHardwareSelector, vtkHardwareSelector); void PrintSelf(ostream& os, vtkIndent indent) override; + /** + * The super class repeatedly renders the frame for different passes. + * We do not wish to do that as it is quite expensive. This class + * leverages webgpu features to achieve selection within a single pass. + */ + bool CaptureBuffers() override{}; + /** * Called by the mapper before and after * rendering each prop. diff --git a/Rendering/WebGPU/vtkWebGPURenderPass.cxx b/Rendering/WebGPU/vtkWebGPURenderPass.cxx deleted file mode 100644 index 7e8464fe273442dd1a03ccc17c4735e2a4606e44..0000000000000000000000000000000000000000 --- a/Rendering/WebGPU/vtkWebGPURenderPass.cxx +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen -// SPDX-License-Identifier: BSD-3-Clause -#include "vtkWebGPURenderPass.h" -#include "vtkRenderState.h" -#include "vtkRenderer.h" -#include "vtkWebGPURenderWindow.h" - -VTK_ABI_NAMESPACE_BEGIN -//------------------------------------------------------------------------------ -vtkWebGPURenderPass::vtkWebGPURenderPass() = default; - -//------------------------------------------------------------------------------ -vtkWebGPURenderPass::~vtkWebGPURenderPass() = default; - -//------------------------------------------------------------------------------ -void vtkWebGPURenderPass::PrintSelf(ostream& os, vtkIndent indent) -{ - this->Superclass::PrintSelf(os, indent); -} - -//------------------------------------------------------------------------------ -void vtkWebGPURenderPass::End(const vtkRenderState*, wgpu::RenderPassEncoder&& pass) -{ - pass.End(); - pass = nullptr; -} - -//------------------------------------------------------------------------------ -void vtkWebGPURenderPass::Render(const vtkRenderState*) {} -VTK_ABI_NAMESPACE_END diff --git a/Rendering/WebGPU/vtkWebGPURenderPass.h b/Rendering/WebGPU/vtkWebGPURenderPass.h deleted file mode 100644 index 92e9f0b72557f27ea1546943f38c37e2191a344b..0000000000000000000000000000000000000000 --- a/Rendering/WebGPU/vtkWebGPURenderPass.h +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen -// SPDX-License-Identifier: BSD-3-Clause -#ifndef vtkWebGPURenderPass_h -#define vtkWebGPURenderPass_h - -#include "vtkRenderPass.h" - -#include "vtkRenderingWebGPUModule.h" // for export macro -#include "vtk_wgpu.h" // for webgpu - -VTK_ABI_NAMESPACE_BEGIN -class VTKRENDERINGWEBGPU_EXPORT vtkWebGPURenderPass : public vtkRenderPass -{ -public: - vtkTypeMacro(vtkWebGPURenderPass, vtkRenderPass); - void PrintSelf(ostream& os, vtkIndent indent) override; - - void Render(const vtkRenderState* state) override; - - virtual wgpu::RenderPassEncoder Begin(const vtkRenderState* state) = 0; - virtual void End(const vtkRenderState* state, wgpu::RenderPassEncoder&& pass); - -protected: - vtkWebGPURenderPass(); - ~vtkWebGPURenderPass() override; - -private: - vtkWebGPURenderPass(const vtkWebGPURenderPass&) = delete; - void operator=(const vtkWebGPURenderPass&) = delete; -}; - -VTK_ABI_NAMESPACE_END -#endif diff --git a/Rendering/WebGPU/vtkWebGPURenderWindow.cxx b/Rendering/WebGPU/vtkWebGPURenderWindow.cxx index 6231915e968cde6b670ac70744254d8bc7c58536..5d1c1caec5585f17b6eb6a7c4b7027ba8fc980d0 100644 --- a/Rendering/WebGPU/vtkWebGPURenderWindow.cxx +++ b/Rendering/WebGPU/vtkWebGPURenderWindow.cxx @@ -19,7 +19,6 @@ #include "vtkRendererCollection.h" #include "vtkTypeUInt8Array.h" #include "vtkUnsignedCharArray.h" -#include "vtkWebGPUClearDrawPass.h" #include "vtkWebGPUConfiguration.h" #include "vtkWebGPURenderer.h" diff --git a/Rendering/WebGPU/vtkWebGPURenderer.cxx b/Rendering/WebGPU/vtkWebGPURenderer.cxx index 444caffafa99022d068e10dff02081e22b5d815a..d927ee2a3dec2da0504880abbc96b9a623171f77 100644 --- a/Rendering/WebGPU/vtkWebGPURenderer.cxx +++ b/Rendering/WebGPU/vtkWebGPURenderer.cxx @@ -4,6 +4,7 @@ #include "Private/vtkWebGPUBindGroupInternals.h" #include "Private/vtkWebGPUBindGroupLayoutInternals.h" #include "Private/vtkWebGPUComputePassInternals.h" +#include "Private/vtkWebGPURenderPassDescriptorInternals.h" #include "Private/vtkWebGPURenderPipelineDescriptorInternals.h" #include "vtkAbstractMapper.h" #include "vtkFrameBufferObjectBase.h" @@ -15,10 +16,8 @@ #include "vtkRenderState.h" #include "vtkRenderer.h" #include "vtkTransform.h" -#include "vtkType.h" #include "vtkWebGPUActor.h" #include "vtkWebGPUCamera.h" -#include "vtkWebGPUClearDrawPass.h" #include "vtkWebGPUComputePass.h" #include "vtkWebGPUComputeRenderBuffer.h" #include "vtkWebGPUConfiguration.h" @@ -64,17 +63,6 @@ const char* backgroundShaderSource = R"( return output; } )"; - -vtkWebGPURenderPass* MakeClearDrawPass() -{ - auto* pass = vtkWebGPUClearDrawPass::New(); - // do not clear color because doing so would erase the contents of the entire - // color attachment, including other renderer's viewports! - pass->SetClearColor(false); - pass->SetClearDepth(false); - pass->SetClearStencil(false); - return pass; -} } //------------------------------------------------------------------------------ @@ -178,7 +166,7 @@ void vtkWebGPURenderer::CreateBuffers() //------------------------------------------------------------------------------ void vtkWebGPURenderer::Clear() { - if (!this->DoClearPass) + if (!this->DrawBackgroundInClearPass) { return; } @@ -247,12 +235,44 @@ void vtkWebGPURenderer::DeviceRender() this->ConfigureComputePipelines(); this->PreRenderComputePipelines(); - this->BeginRecording(); // all pipelines execute in single render pass, for now. - this->ActiveCamera->UpdateViewport(this); - this->UpdateGeometry(); - this->EndRecording(); + this->RecordRenderCommands(); + + this->DrawBackgroundInClearPass = true; +} + +//------------------------------------------------------------------------------ +void vtkWebGPURenderer::RecordRenderCommands() +{ + vtkRenderState state(this); + state.SetPropArrayAndCount(this->PropArray, this->PropArrayCount); + state.SetFrameBuffer(nullptr); - this->DoClearPass = true; + if (auto* wgpuRenderWindow = vtkWebGPURenderWindow::SafeDownCast(this->RenderWindow)) + { + vtkWebGPURenderPassDescriptorInternals renderPassDescriptor( + { wgpuRenderWindow->GetOffscreenColorAttachmentView() }, + wgpuRenderWindow->GetDepthStencilView(), + /*clearColor=*/false, /*clearDepth=*/false, /*clearStencil=*/false); + renderPassDescriptor.label = "vtkWebGPURenderer::RecordRenderCommands"; + this->WGPURenderEncoder = wgpuRenderWindow->NewRenderPass(renderPassDescriptor); + this->BeginRecording(); + // 1. Draw the background color/texture. + // updates viewport and scissor rectangles on the render pass encoder. + this->ActiveCamera->UpdateViewport(this); + // clear the viewport rectangle to background color. + if (this->RenderWindow->GetErase() && this->Erase) + { + this->Clear(); + } + // 2. Now render all opaque and translucent props. + this->UpdateGeometry(); + this->EndRecording(); + } + else + { + vtkErrorMacro( + << "Cannot record render commands because RenderWindow is not a vtkWebGPURenderWindow!"); + } } //------------------------------------------------------------------------------ @@ -288,7 +308,7 @@ int vtkWebGPURenderer::UpdateGeometry(vtkFrameBufferObjectBase* /*fbo=nullptr*/) { int i; - if (this->DoClearPass) + if (this->DrawBackgroundInClearPass) { this->PropsRendered.clear(); this->NumberOfPropsRendered = 0; @@ -771,10 +791,7 @@ wgpu::CommandBuffer vtkWebGPURenderer::EncodePropListRenderCommand( this->PropArray = propList; this->PropArrayCount = listLength; - this->BeginRecording(); - this->ActiveCamera->UpdateViewport(this); - this->UpdateGeometry(); - this->EndRecording(); + this->RecordRenderCommands(); // Restoring this->PropArray = propArrayBackup; @@ -789,7 +806,7 @@ wgpu::CommandBuffer vtkWebGPURenderer::EncodePropListRenderCommand( // it's ready to be used again by someone else renderWindow->CreateCommandEncoder(); - this->DoClearPass = false; + this->DrawBackgroundInClearPass = false; return commandBuffer; } @@ -798,12 +815,8 @@ void vtkWebGPURenderer::BeginRecording() { vtkDebugMacro(<< __func__); this->RenderStage = RenderStageEnum::RecordingCommands; - vtkRenderState state(this); - state.SetPropArrayAndCount(this->PropArray, this->PropArrayCount); - state.SetFrameBuffer(nullptr); - this->Pass = ::MakeClearDrawPass(); + assert(this->WGPURenderEncoder != nullptr); - this->WGPURenderEncoder = vtkWebGPURenderPass::SafeDownCast(this->Pass)->Begin(&state); #ifndef NDEBUG this->WGPURenderEncoder.PushDebugGroup("Renderer start encoding"); #endif @@ -895,8 +908,6 @@ void vtkWebGPURenderer::EndRecording() #endif this->WGPURenderEncoder.End(); this->WGPURenderEncoder = nullptr; - this->Pass->Delete(); - this->Pass = nullptr; } //------------------------------------------------------------------------------ diff --git a/Rendering/WebGPU/vtkWebGPURenderer.h b/Rendering/WebGPU/vtkWebGPURenderer.h index 2db7d6730cffe2e175dfc1e406309b1e9165d7fd..4d78cb1ddfd4c2bcc6258fd7eb425fef1faff0b8 100644 --- a/Rendering/WebGPU/vtkWebGPURenderer.h +++ b/Rendering/WebGPU/vtkWebGPURenderer.h @@ -203,7 +203,7 @@ protected: // Create scene bind group. void SetupSceneBindGroup(); - // Start, finish recording commands with render pass encoder + // Start, finish recording commands. void BeginRecording(); void EndRecording(); @@ -310,6 +310,13 @@ private: */ wgpu::CommandBuffer EncodePropListRenderCommand(vtkProp** propList, int listLength); + /** + * Records commands into a render pass encoder. + * This method records commands which draw the background texture/clear color + * and commands which render all the props contained in this renderer. + */ + void RecordRenderCommands(); + /** * Whether the compute render buffers of the mappers of the actors of this renderer have already * been initialized or not @@ -325,7 +332,7 @@ private: /** * Whether to clear the depth/stencil/color buffer before rendering */ - bool DoClearPass = true; + bool DrawBackgroundInClearPass = true; /** * List of the actors rendered last frame. Mainly used by the occlusion culler when we want to