diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md index baac38961..9dbb50137 100644 --- a/platform/android/CHANGELOG.md +++ b/platform/android/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog MapLibre Native for Android +## 12.3.1 + +- Fix issue caused by frustum offset when map is resized [#4015](https://github.com/maplibre/maplibre-native/pull/4015). + ## 12.3.0 ### ✨ Features and improvements diff --git a/platform/android/VERSION b/platform/android/VERSION index 4d23cb8e0..9c028e25d 100644 --- a/platform/android/VERSION +++ b/platform/android/VERSION @@ -1 +1 @@ -12.3.0 +12.3.1 diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index 64e536fb5..8f05ed355 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -2,6 +2,10 @@ MapLibre welcomes participation and contributions from everyone. Please read [`MapLibre iOS Developer Guide`](https://maplibre.org/maplibre-native/docs/book/ios/index.html) to get started. +## 6.22.1 + +- Fix issue caused by frustum offset when map is resized [#4015](https://github.com/maplibre/maplibre-native/pull/4015). + ## 6.22.0 - Implemented synchronous update for GeoJSON source ([#3968](https://github.com/maplibre/maplibre-native/pull/3968)). diff --git a/platform/ios/VERSION b/platform/ios/VERSION index fe6750473..261151bf6 100644 --- a/platform/ios/VERSION +++ b/platform/ios/VERSION @@ -1 +1 @@ -6.22.0 +6.22.1 diff --git a/src/mbgl/mtl/render_pass.cpp b/src/mbgl/mtl/render_pass.cpp index cd9b1e818..6e52f1ebc 100644 --- a/src/mbgl/mtl/render_pass.cpp +++ b/src/mbgl/mtl/render_pass.cpp @@ -230,7 +230,9 @@ void RenderPass::setScissorRect(MTL::ScissorRect rect) { if (rect.height + rect.y > height) { rect.height = height - rect.y; } - encoder->setScissorRect(rect); + if (rect.x != 0 || rect.y != 0 || rect.width != 0 || rect.height != 0) { + encoder->setScissorRect(rect); + } currentScissorRect = rect; } } diff --git a/src/mbgl/renderer/render_target.cpp b/src/mbgl/renderer/render_target.cpp index da38478a9..db08d743b 100644 --- a/src/mbgl/renderer/render_target.cpp +++ b/src/mbgl/renderer/render_target.cpp @@ -71,9 +71,8 @@ void RenderTarget::render(RenderOrchestrator& orchestrator, const RenderTree& re .clearDepth = {}, .clearStencil = {}}); - const gfx::ScissorRect prevSicssorRect = parameters.scissorRect; - const auto& size = getTexture()->getSize(); - parameters.scissorRect = {.x = 0, .y = 0, .width = size.width, .height = size.height}; + const gfx::ScissorRect prevScissorRect = parameters.scissorRect; + parameters.scissorRect = {.x = 0, .y = 0, .width = 0, .height = 0}; // Run layer tweakers to update any dynamic elements parameters.currentLayer = 0; @@ -109,7 +108,7 @@ void RenderTarget::render(RenderOrchestrator& orchestrator, const RenderTree& re parameters.renderPass.reset(); parameters.encoder->present(*offscreenTexture); - parameters.scissorRect = prevSicssorRect; + parameters.scissorRect = prevScissorRect; } } // namespace mbgl diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 0a14b3c46..d7d5f0822 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -188,16 +188,20 @@ 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(); - const gfx::ScissorRect scissorRect = { - .x = static_cast(frustumOffset.left() * pixelRatio), + gfx::ScissorRect scissorRect = {.x = 0, .y = 0, .width = 0, .height = 0}; + if (!frustumOffset.isFlush()) { + 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 b0a65e2aa..aacc3cc94 100644 --- a/src/mbgl/vulkan/pipeline.cpp +++ b/src/mbgl/vulkan/pipeline.cpp @@ -429,7 +429,10 @@ 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); - buffer->setScissor(0, scissorRect, dispatcher); + if (scissorRect.offset.x != 0 || scissorRect.offset.y != 0 || scissorRect.extent.width != 0 || + scissorRect.extent.height != 0) { + buffer->setScissor(0, scissorRect, dispatcher); + } } std::vector PipelineInfo::getDynamicStates(const RendererBackend& backend) const { @@ -450,7 +453,10 @@ std::vector PipelineInfo::getDynamicStates(const RendererBacke } dynamicStates.push_back(vk::DynamicState::eViewport); - dynamicStates.push_back(vk::DynamicState::eScissor); + if (scissorRect.offset.x != 0 || scissorRect.offset.y != 0 || scissorRect.extent.width != 0 || + scissorRect.extent.height != 0) { + dynamicStates.push_back(vk::DynamicState::eScissor); + } return dynamicStates; } diff --git a/src/mbgl/webgpu/drawable.cpp b/src/mbgl/webgpu/drawable.cpp index 42756cf8c..10c5ad24b 100644 --- a/src/mbgl/webgpu/drawable.cpp +++ b/src/mbgl/webgpu/drawable.cpp @@ -841,11 +841,14 @@ void Drawable::draw(PaintParameters& parameters) const { return; } - wgpuRenderPassEncoderSetScissorRect(renderPassEncoder, - parameters.scissorRect.x, - parameters.scissorRect.y, - parameters.scissorRect.width, - parameters.scissorRect.height); + 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); + } 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 0930607a4..de19bcc65 100644 --- a/src/mbgl/webgpu/render_pass.cpp +++ b/src/mbgl/webgpu/render_pass.cpp @@ -175,7 +175,6 @@ 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;