From 2c2c4bc240bd1a0e006625c532e0ebda548f768d Mon Sep 17 00:00:00 2001
From: Jaswant Panchumarti <jaswant.panchumarti@kitware.com>
Date: Tue, 4 Feb 2025 16:53:18 -0500
Subject: [PATCH] Add EnableBlending and DisableBlending functions in webgpu
 render pass helper

---
 .../vtkWebGPUPolyDataMapper2DInternals.cxx      |  1 +
 ...kWebGPURenderPipelineDescriptorInternals.cxx | 14 +++++++++++++-
 ...vtkWebGPURenderPipelineDescriptorInternals.h |  3 +++
 Rendering/WebGPU/vtkWebGPUGlyph3DMapper.cxx     |  1 +
 Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx    |  1 +
 Rendering/WebGPU/vtkWebGPURenderer.cxx          | 17 +++++++++--------
 6 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/Rendering/WebGPU/Private/vtkWebGPUPolyDataMapper2DInternals.cxx b/Rendering/WebGPU/Private/vtkWebGPUPolyDataMapper2DInternals.cxx
index 744332c60c0..02cce8e7de5 100644
--- a/Rendering/WebGPU/Private/vtkWebGPUPolyDataMapper2DInternals.cxx
+++ b/Rendering/WebGPU/Private/vtkWebGPUPolyDataMapper2DInternals.cxx
@@ -463,6 +463,7 @@ void vtkWebGPUPolyDataMapper2DInternals::UpdateBuffers(
     vtkWebGPURenderPipelineDescriptorInternals descriptor;
     descriptor.vertex.bufferCount = 0;
     descriptor.cFragment.entryPoint = "fragmentMain";
+    descriptor.EnableBlending(0);
     descriptor.cTargets[0].format = wgpuRenderWindow->GetPreferredSurfaceTextureFormat();
     ///@{ TODO: Only for valid depth stencil formats
     auto depthState = descriptor.EnableDepthStencil(wgpuRenderWindow->GetDepthStencilFormat());
diff --git a/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.cxx b/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.cxx
index 10f535e0acb..338d2feae9f 100644
--- a/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.cxx
+++ b/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.cxx
@@ -91,7 +91,6 @@ vtkWebGPURenderPipelineDescriptorInternals::vtkWebGPURenderPipelineDescriptorInt
     for (uint32_t i = 0; i < kMaxColorAttachments; ++i)
     {
       cTargets[i].format = wgpu::TextureFormat::RGBA8Unorm;
-      cTargets[i].blend = &cBlends[i];
       cTargets[i].writeMask = wgpu::ColorWriteMask::All;
 
       cBlends[i].color = blendComponent;
@@ -114,4 +113,17 @@ void vtkWebGPURenderPipelineDescriptorInternals::DisableDepthStencil()
 {
   this->depthStencil = nullptr;
 }
+
+wgpu::BlendState* vtkWebGPURenderPipelineDescriptorInternals::EnableBlending(
+  std::size_t colorTargetId)
+{
+  this->cTargets[colorTargetId].blend = &cBlends[colorTargetId];
+  return &cBlends[colorTargetId];
+}
+
+void vtkWebGPURenderPipelineDescriptorInternals::DisableBlending(std::size_t colorTargetId)
+{
+  this->cTargets[colorTargetId].blend = nullptr;
+}
+
 VTK_ABI_NAMESPACE_END
diff --git a/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.h b/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.h
index 436a5aa73be..6f2b0449105 100644
--- a/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.h
+++ b/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.h
@@ -31,6 +31,9 @@ public:
     wgpu::TextureFormat format = wgpu::TextureFormat::Depth24PlusStencil8);
   void DisableDepthStencil();
 
+  wgpu::BlendState* EnableBlending(std::size_t colorTargetId);
+  void DisableBlending(std::size_t colorTargetId);
+
   std::array<wgpu::VertexBufferLayout, kMaxVertexBuffers> cBuffers;
   std::array<wgpu::VertexAttribute, kMaxVertexAttributes> cAttributes;
   std::array<wgpu::ColorTargetState, kMaxColorAttachments> cTargets;
diff --git a/Rendering/WebGPU/vtkWebGPUGlyph3DMapper.cxx b/Rendering/WebGPU/vtkWebGPUGlyph3DMapper.cxx
index 485d8ea8d91..8a9c092e3c9 100644
--- a/Rendering/WebGPU/vtkWebGPUGlyph3DMapper.cxx
+++ b/Rendering/WebGPU/vtkWebGPUGlyph3DMapper.cxx
@@ -1126,6 +1126,7 @@ public:
     descriptor.vertex.entryPoint = "vertexMain";
     descriptor.vertex.bufferCount = 0;
     descriptor.cFragment.entryPoint = "fragmentMain";
+    descriptor.EnableBlending(0);
     descriptor.cTargets[0].format = wgpuRenderWindow->GetPreferredSurfaceTextureFormat();
     auto depthState = descriptor.EnableDepthStencil(wgpuRenderWindow->GetDepthStencilFormat());
     depthState->depthWriteEnabled = true;
diff --git a/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx b/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx
index 8b6ed22c907..0c6ae49ec7f 100644
--- a/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx
+++ b/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx
@@ -1309,6 +1309,7 @@ void vtkWebGPUPolyDataMapper::SetupGraphicsPipelines(
   descriptor.vertex.entryPoint = "vertexMain";
   descriptor.vertex.bufferCount = 0;
   descriptor.cFragment.entryPoint = "fragmentMain";
+  descriptor.EnableBlending(0);
   descriptor.cTargets[0].format = wgpuRenderWindow->GetPreferredSurfaceTextureFormat();
   ///@{ TODO: Only for valid depth stencil formats
   auto depthState = descriptor.EnableDepthStencil(wgpuRenderWindow->GetDepthStencilFormat());
diff --git a/Rendering/WebGPU/vtkWebGPURenderer.cxx b/Rendering/WebGPU/vtkWebGPURenderer.cxx
index 75777e2d126..444caffafa9 100644
--- a/Rendering/WebGPU/vtkWebGPURenderer.cxx
+++ b/Rendering/WebGPU/vtkWebGPURenderer.cxx
@@ -203,19 +203,20 @@ void vtkWebGPURenderer::Clear()
 
   for (int i = 0; i < vtkWebGPURenderPipelineDescriptorInternals::kMaxColorAttachments; ++i)
   {
+    auto* blendState = bkgPipelineDescriptor.EnableBlending(i);
     if (this->Transparent())
     {
-      bkgPipelineDescriptor.cBlends[i].color.srcFactor = wgpu::BlendFactor::Zero;
-      bkgPipelineDescriptor.cBlends[i].color.dstFactor = wgpu::BlendFactor::One;
-      bkgPipelineDescriptor.cBlends[i].alpha.srcFactor = wgpu::BlendFactor::Zero;
-      bkgPipelineDescriptor.cBlends[i].alpha.dstFactor = wgpu::BlendFactor::One;
+      blendState->color.srcFactor = wgpu::BlendFactor::Zero;
+      blendState->color.dstFactor = wgpu::BlendFactor::One;
+      blendState->alpha.srcFactor = wgpu::BlendFactor::Zero;
+      blendState->alpha.dstFactor = wgpu::BlendFactor::One;
     }
     else
     {
-      bkgPipelineDescriptor.cBlends[i].color.srcFactor = wgpu::BlendFactor::Constant;
-      bkgPipelineDescriptor.cBlends[i].color.dstFactor = wgpu::BlendFactor::Zero;
-      bkgPipelineDescriptor.cBlends[i].alpha.srcFactor = wgpu::BlendFactor::Constant;
-      bkgPipelineDescriptor.cBlends[i].alpha.dstFactor = wgpu::BlendFactor::Zero;
+      blendState->color.srcFactor = wgpu::BlendFactor::Constant;
+      blendState->color.dstFactor = wgpu::BlendFactor::Zero;
+      blendState->alpha.srcFactor = wgpu::BlendFactor::Constant;
+      blendState->alpha.dstFactor = wgpu::BlendFactor::Zero;
     }
   }
   const auto pipelineKey =
-- 
GitLab