diff --git a/Rendering/WebGPU/vtkWebGPUActor.cxx b/Rendering/WebGPU/vtkWebGPUActor.cxx index 372a767bdd7516175103a8d2b632cd49dd0c102c..ef3e443c1d535ac0b1e6910c0ee28eb386856add 100644 --- a/Rendering/WebGPU/vtkWebGPUActor.cxx +++ b/Rendering/WebGPU/vtkWebGPUActor.cxx @@ -98,7 +98,7 @@ void vtkWebGPUActor::Render(vtkRenderer* renderer, vtkMapper* mapper) case vtkWebGPURenderer::RecordingCommands: if (wgpuRenderer->GetUseRenderBundles() && this->SupportRenderBundles()) { - if (wgpuRenderer->GetBundleInvalidated()) + if (wgpuRenderer->GetRebuildRenderBundle()) { wgpuRenderer->GetRenderBundleEncoder().SetBindGroup(1, this->ActorBindGroup); mapper->Render(renderer, this); diff --git a/Rendering/WebGPU/vtkWebGPUBatchedPolyDataMapper.cxx b/Rendering/WebGPU/vtkWebGPUBatchedPolyDataMapper.cxx index 883e0e164f233a7ac6a56c77fb7f3050f3064ec4..f1127874a16297ef81d291bbe7c573889baf710a 100644 --- a/Rendering/WebGPU/vtkWebGPUBatchedPolyDataMapper.cxx +++ b/Rendering/WebGPU/vtkWebGPUBatchedPolyDataMapper.cxx @@ -145,7 +145,7 @@ void vtkWebGPUBatchedPolyDataMapper::RenderPiece(vtkRenderer* renderer, vtkActor auto& batchElement = *(this->VTKPolyDataToBatchElement.begin()->second); if (this->LastBlockVisibility != batchElement.Visibility) { - wgpuRenderer->SetBundleInvalidated(true); + wgpuRenderer->InvalidateBundle(); } this->LastBlockVisibility = batchElement.Visibility; diff --git a/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx b/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx index cfdc04fa74ba3da70b008cd1871025946cd92493..76e7509142c46e44dca39bca8e5a2226b736c77e 100644 --- a/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx +++ b/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx @@ -306,13 +306,13 @@ void vtkWebGPUPolyDataMapper::RenderPiece(vtkRenderer* renderer, vtkActor* actor if (this->GetNeedToRebuildGraphicsPipelines(actor)) { // render bundle must reference new bind groups and/or pipelines - wgpuRenderer->SetBundleInvalidated(true); + wgpuRenderer->InvalidateBundle(); this->SetupGraphicsPipelines(device, renderer, actor); } // invalidate render bundle when any of the cached properties of an actor have changed. if (this->CacheActorProperties(actor)) { - wgpuRenderer->SetBundleInvalidated(true); + wgpuRenderer->InvalidateBundle(); } break; } diff --git a/Rendering/WebGPU/vtkWebGPURenderer.cxx b/Rendering/WebGPU/vtkWebGPURenderer.cxx index 86409c9417651965686542f4b1bb78cc1702a62f..08dd0687a1556d5d7d9ed308968e49c326096783 100644 --- a/Rendering/WebGPU/vtkWebGPURenderer.cxx +++ b/Rendering/WebGPU/vtkWebGPURenderer.cxx @@ -160,8 +160,18 @@ void vtkWebGPURenderer::UpdateBuffers() this->UpdateLightGeometry(); this->UpdateLights(); - // if any mapper's commands need rebundling, that mapper will set this flag. - this->BundleInvalidated = false; + // Render bundle is rebuilt if any mapper needs to re-record render commands. + if (this->UseRenderBundles) + { + if (this->Bundle != nullptr) + { + this->RebuildRenderBundle = false; + } + else + { + this->RebuildRenderBundle = true; + } + } this->UpdateGeometry(); // mappers prepare geometry SSBO and pipeline layout. this->CreateBuffers(); @@ -695,7 +705,7 @@ void vtkWebGPURenderer::BeginRecording() this->WGPURenderEncoder.PushDebugGroup("Renderer start encoding"); #endif this->WGPURenderEncoder.SetBindGroup(0, this->SceneBindGroup); - if (this->BundleInvalidated) + if (this->RebuildRenderBundle) { // destroy previous bundle. this->Bundle = nullptr; diff --git a/Rendering/WebGPU/vtkWebGPURenderer.h b/Rendering/WebGPU/vtkWebGPURenderer.h index c7333743f84309b4196dd0733b9e1ddc0cc15970..04305df8648b72ad97bb08219582f7ea692c9f05 100644 --- a/Rendering/WebGPU/vtkWebGPURenderer.h +++ b/Rendering/WebGPU/vtkWebGPURenderer.h @@ -10,8 +10,6 @@ #include "vtkWebGPUComputePipeline.h" // for the compute pipelines used by this renderer #include "vtk_wgpu.h" // for webgpu -#include <string> // for ivar -#include <unordered_map> // for ivar #include <unordered_set> // for the set of actors rendered last frame class vtkAbstractMapper; @@ -169,12 +167,12 @@ public: * @note This does not use vtkSetMacro because the actor MTime should not be affected when a * render bundle is invalidated. */ - inline void SetBundleInvalidated(bool value) { this->BundleInvalidated = value; } + inline void InvalidateBundle() { this->RebuildRenderBundle = true; } /** * Get whether the render bundle associated with this actor must be reset by the renderer. */ - vtkGetMacro(BundleInvalidated, bool); + vtkGetMacro(RebuildRenderBundle, bool); protected: vtkWebGPURenderer(); @@ -216,9 +214,9 @@ protected: #ifdef __EMSCRIPTEN__ bool UseRenderBundles = true; #else - bool UseRenderBundles = true; + bool UseRenderBundles = false; #endif - bool BundleInvalidated = false; + bool RebuildRenderBundle = false; // the commands in bundle get reused every frame. wgpu::RenderBundle Bundle;