From 93cf07533893daadfdbbb43e6c671432e4e2b496 Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Wed, 7 Jan 2026 14:21:34 +0200 Subject: [PATCH] Disable scissor test when clearing on OpenGL (#4029) --- src/mbgl/gl/render_pass.cpp | 1 + src/mbgl/mtl/render_pass.cpp | 4 +--- src/mbgl/renderer/render_target.cpp | 3 ++- src/mbgl/renderer/renderer_impl.cpp | 18 +++++++----------- src/mbgl/vulkan/pipeline.cpp | 10 ++-------- src/mbgl/webgpu/drawable.cpp | 13 +++++-------- src/mbgl/webgpu/render_pass.cpp | 1 + 7 files changed, 19 insertions(+), 31 deletions(-) diff --git a/src/mbgl/gl/render_pass.cpp b/src/mbgl/gl/render_pass.cpp index 9d0ffeb10..30aa25e83 100644 --- a/src/mbgl/gl/render_pass.cpp +++ b/src/mbgl/gl/render_pass.cpp @@ -13,6 +13,7 @@ RenderPass::RenderPass(gl::CommandEncoder& commandEncoder_, debugGroup(commandEncoder.createDebugGroup(name)) { descriptor.renderable.getResource().bind(); const auto clearDebugGroup(commandEncoder.createDebugGroup("clear")); + commandEncoder.context.setScissorTest({.x = 0, .y = 0, .width = 0, .height = 0}); commandEncoder.context.clear(descriptor.clearColor, descriptor.clearDepth, descriptor.clearStencil); } diff --git a/src/mbgl/mtl/render_pass.cpp b/src/mbgl/mtl/render_pass.cpp index 6e52f1ebc..cd9b1e818 100644 --- a/src/mbgl/mtl/render_pass.cpp +++ b/src/mbgl/mtl/render_pass.cpp @@ -230,9 +230,7 @@ void RenderPass::setScissorRect(MTL::ScissorRect rect) { if (rect.height + rect.y > height) { rect.height = height - rect.y; } - if (rect.x != 0 || rect.y != 0 || rect.width != 0 || rect.height != 0) { - encoder->setScissorRect(rect); - } + encoder->setScissorRect(rect); currentScissorRect = rect; } } diff --git a/src/mbgl/renderer/render_target.cpp b/src/mbgl/renderer/render_target.cpp index db08d743b..447d57879 100644 --- a/src/mbgl/renderer/render_target.cpp +++ b/src/mbgl/renderer/render_target.cpp @@ -72,7 +72,8 @@ void RenderTarget::render(RenderOrchestrator& orchestrator, const RenderTree& re .clearStencil = {}}); const gfx::ScissorRect prevScissorRect = parameters.scissorRect; - parameters.scissorRect = {.x = 0, .y = 0, .width = 0, .height = 0}; + const auto& size = getTexture()->getSize(); + parameters.scissorRect = {.x = 0, .y = 0, .width = size.width, .height = size.height}; // Run layer tweakers to update any dynamic elements parameters.currentLayer = 0; diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index d7d5f0822..0a14b3c46 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -188,20 +188,16 @@ void Renderer::Impl::render(const RenderTree& renderTree, const std::shared_ptr< const TransformState& state = renderTreeParameters.transformParams.state; const Size& size = state.getSize(); const EdgeInsets& frustumOffset = state.getFrustumOffset(); - gfx::ScissorRect scissorRect = {.x = 0, .y = 0, .width = 0, .height = 0}; - if (!frustumOffset.isFlush()) { - scissorRect = { - .x = static_cast(frustumOffset.left() * pixelRatio), + const gfx::ScissorRect scissorRect = { + .x = static_cast(frustumOffset.left() * pixelRatio), #if MLN_RENDER_BACKEND_OPENGL - .y = static_cast(frustumOffset.bottom() * pixelRatio), + .y = static_cast(frustumOffset.bottom() * pixelRatio), #else - .y = static_cast(frustumOffset.top() * pixelRatio), + .y = static_cast(frustumOffset.top() * pixelRatio), #endif - .width = static_cast((size.width - (frustumOffset.left() + frustumOffset.right())) * pixelRatio), - .height = static_cast((size.height - (frustumOffset.top() + frustumOffset.bottom())) * - pixelRatio), - }; - } + .width = static_cast((size.width - (frustumOffset.left() + frustumOffset.right())) * pixelRatio), + .height = static_cast((size.height - (frustumOffset.top() + frustumOffset.bottom())) * pixelRatio), + }; PaintParameters parameters{ context, diff --git a/src/mbgl/vulkan/pipeline.cpp b/src/mbgl/vulkan/pipeline.cpp index aacc3cc94..b0a65e2aa 100644 --- a/src/mbgl/vulkan/pipeline.cpp +++ b/src/mbgl/vulkan/pipeline.cpp @@ -429,10 +429,7 @@ void PipelineInfo::setDynamicValues(const RendererBackend& backend, const vk::Un const vk::Viewport viewport(0.0f, 0.0f, viewExtent.width, viewExtent.height, 0.0f, 1.0f); buffer->setViewport(0, viewport, dispatcher); - if (scissorRect.offset.x != 0 || scissorRect.offset.y != 0 || scissorRect.extent.width != 0 || - scissorRect.extent.height != 0) { - buffer->setScissor(0, scissorRect, dispatcher); - } + buffer->setScissor(0, scissorRect, dispatcher); } std::vector PipelineInfo::getDynamicStates(const RendererBackend& backend) const { @@ -453,10 +450,7 @@ std::vector PipelineInfo::getDynamicStates(const RendererBacke } dynamicStates.push_back(vk::DynamicState::eViewport); - if (scissorRect.offset.x != 0 || scissorRect.offset.y != 0 || scissorRect.extent.width != 0 || - scissorRect.extent.height != 0) { - dynamicStates.push_back(vk::DynamicState::eScissor); - } + dynamicStates.push_back(vk::DynamicState::eScissor); return dynamicStates; } diff --git a/src/mbgl/webgpu/drawable.cpp b/src/mbgl/webgpu/drawable.cpp index 10c5ad24b..42756cf8c 100644 --- a/src/mbgl/webgpu/drawable.cpp +++ b/src/mbgl/webgpu/drawable.cpp @@ -841,14 +841,11 @@ void Drawable::draw(PaintParameters& parameters) const { return; } - if (parameters.scissorRect.x != 0 || parameters.scissorRect.y != 0 || parameters.scissorRect.width != 0 || - parameters.scissorRect.height != 0) { - wgpuRenderPassEncoderSetScissorRect(renderPassEncoder, - parameters.scissorRect.x, - parameters.scissorRect.y, - parameters.scissorRect.width, - parameters.scissorRect.height); - } + wgpuRenderPassEncoderSetScissorRect(renderPassEncoder, + parameters.scissorRect.x, + parameters.scissorRect.y, + parameters.scissorRect.width, + parameters.scissorRect.height); uint32_t bufferSlot = 0; for (const auto& binding : uniqueBindings) { diff --git a/src/mbgl/webgpu/render_pass.cpp b/src/mbgl/webgpu/render_pass.cpp index de19bcc65..0930607a4 100644 --- a/src/mbgl/webgpu/render_pass.cpp +++ b/src/mbgl/webgpu/render_pass.cpp @@ -175,6 +175,7 @@ RenderPass::RenderPass(CommandEncoder& commandEncoder_, const char* name, const auto size = descriptor.renderable.getSize(); wgpuRenderPassEncoderSetViewport( impl->encoder, 0.0f, 0.0f, static_cast(size.width), static_cast(size.height), 0.0f, 1.0f); + wgpuRenderPassEncoderSetScissorRect(impl->encoder, 0, 0, size.width, size.height); } else { mbgl::Log::Error(mbgl::Event::Render, "WebGPU: Failed to begin render pass"); impl->colorView = nullptr;