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