From 0a3f2cef1c2fadf51fb1705465a9e33b714a047c Mon Sep 17 00:00:00 2001 From: Aleksandar Stojiljkovic Date: Thu, 1 Aug 2019 12:23:04 +0300 Subject: [core] Enable opaque pass for background layer. fix heatmap+background test. Follow the approach from mapbox-gl-js for enabling opaque pass for background layer (same as for fill layer). Fix combinations/heatmap-translucent--background-opaque render test. --- platform/node/test/ignores.json | 1 - src/mbgl/renderer/layers/render_background_layer.cpp | 20 +++++++++++++++++--- src/mbgl/renderer/layers/render_fill_layer.cpp | 13 ++++--------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/platform/node/test/ignores.json b/platform/node/test/ignores.json index 4e4f537a23..5814114a15 100644 --- a/platform/node/test/ignores.json +++ b/platform/node/test/ignores.json @@ -85,7 +85,6 @@ "render-tests/text-rotate/with-offset": "https://github.com/mapbox/mapbox-gl-native/issues/11872", "render-tests/video/default": "skip - https://github.com/mapbox/mapbox-gl-native/issues/601", "render-tests/background-color/colorSpace-hcl": "needs issue", - "render-tests/combinations/heatmap-translucent--background-opaque": "needs investigation", "render-tests/feature-state/composite-expression": "https://github.com/mapbox/mapbox-gl-native/issues/12613", "render-tests/feature-state/data-expression": "https://github.com/mapbox/mapbox-gl-native/issues/12613", "render-tests/feature-state/vector-source": "https://github.com/mapbox/mapbox-gl-native/issues/12613", diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index 885b6fe9b2..4725bce435 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -37,8 +37,14 @@ void RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters ¶met parameters.getCrossfadeParameters(), unevaluated.evaluate(parameters)); - passes = properties->evaluated.get() > 0 ? RenderPass::Translucent - : RenderPass::None; + passes = properties->evaluated.get() == 0.0f + ? RenderPass::None + : (!unevaluated.get().isUndefined() + || properties->evaluated.get() < 1.0f + || properties->evaluated.get().a < 1.0f) + ? RenderPass::Translucent + // Supply both - evaluated based on opaquePassCutoff in render(). + : RenderPass::Opaque | RenderPass::Translucent; properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); } @@ -77,7 +83,9 @@ void RenderBackgroundLayer::render(PaintParameters& parameters) { parameters.context, *parameters.renderPass, gfx::Triangles(), - parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), + parameters.depthModeForSublayer(0, parameters.pass == RenderPass::Opaque + ? gfx::DepthMaskType::ReadWrite + : gfx::DepthMaskType::ReadOnly), gfx::StencilMode::disabled(), parameters.colorModeForRenderPass(), gfx::CullFaceMode::disabled(), @@ -118,6 +126,12 @@ void RenderBackgroundLayer::render(PaintParameters& parameters) { ); } } else { + auto backgroundRenderPass = (evaluated.get().a >= 1.0f + && evaluated.get() >= 1.0f + && parameters.currentLayer >= parameters.opaquePassCutoff) ? RenderPass::Opaque : RenderPass::Translucent; + if (parameters.pass != backgroundRenderPass) { + return; + } for (const auto& tileID : util::tileCover(parameters.state, parameters.state.getIntegerZoom())) { draw( parameters.programs.getBackgroundLayerPrograms().background, diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index cf31201d77..6a134a398a 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -47,17 +47,12 @@ void RenderFillLayer::evaluate(const PropertyEvaluationParameters& parameters) { evaluated.get() = evaluated.get(); } - passes = RenderPass::None; + passes = RenderPass::Translucent; - if (evaluated.get()) { - passes |= RenderPass::Translucent; - } - - if (!unevaluated.get().isUndefined() + if (!(!unevaluated.get().isUndefined() || evaluated.get().constantOr(Color()).a < 1.0f - || evaluated.get().constantOr(0) < 1.0f) { - passes |= RenderPass::Translucent; - } else { + || evaluated.get().constantOr(0) < 1.0f)) { + // Supply both - evaluated based on opaquePassCutoff in render(). passes |= RenderPass::Opaque; } properties->renderPasses = mbgl::underlying_type(passes); -- cgit v1.2.1