From 46d5f5e699388ebd46dcb36ab0d53c5466cb9729 Mon Sep 17 00:00:00 2001 From: Alexander Shalamov Date: Fri, 17 May 2019 07:11:43 +0300 Subject: [PATCH] [core] Check if pattern dependencies or pattern positions are missing Add check for optional pattern dependencies and don't bind empty vertex buffers if pattern positions are missing. --- src/mbgl/renderer/paint_property_binder.hpp | 26 ++++++++++++++------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp index 5cd75645f43..63d821f964c 100644 --- a/src/mbgl/renderer/paint_property_binder.hpp +++ b/src/mbgl/renderer/paint_property_binder.hpp @@ -324,7 +324,7 @@ class CompositeCrossFadedPaintPropertyBinder final : public PaintPropertyBinder< void populateVertexVector(const GeometryTileFeature&, std::size_t length, const ImagePositions& patternPositions, const optional& patternDependencies, const style::expression::Value&) override { - if (patternDependencies->mid.empty()) { + if (!patternDependencies || patternDependencies->mid.empty()) { // Unlike other propperties with expressions that evaluate to null, the default value for `*-pattern` properties is an empty // string and will not have a valid entry in patternPositions. We still need to populate the attribute buffers to avoid crashes // when we try to draw the layer because we don't know at draw time if all features were evaluated to valid pattern dependencies. @@ -354,19 +354,29 @@ class CompositeCrossFadedPaintPropertyBinder final : public PaintPropertyBinder< } void upload(gfx::UploadPass& uploadPass) override { - patternToVertexBuffer = uploadPass.createVertexBuffer(std::move(patternToVertexVector)); - zoomInVertexBuffer = uploadPass.createVertexBuffer(std::move(zoomInVertexVector)); - zoomOutVertexBuffer = uploadPass.createVertexBuffer(std::move(zoomOutVertexVector)); + if (!patternToVertexVector.empty()) { + assert(!zoomInVertexVector.empty()); + assert(!zoomOutVertexVector.empty()); + patternToVertexBuffer = uploadPass.createVertexBuffer(std::move(patternToVertexVector)); + zoomInVertexBuffer = uploadPass.createVertexBuffer(std::move(zoomInVertexVector)); + zoomOutVertexBuffer = uploadPass.createVertexBuffer(std::move(zoomOutVertexVector)); + } } std::tuple, optional> attributeBinding(const PossiblyEvaluatedPropertyValue>& currentValue) const override { if (currentValue.isConstant()) { return {}; } else { - return std::tuple, optional>{ - gfx::attributeBinding(*patternToVertexBuffer), - gfx::attributeBinding(crossfade.fromScale == 2 ? *zoomInVertexBuffer : *zoomOutVertexBuffer) - }; + if (patternToVertexBuffer) { + assert(zoomInVertexBuffer); + assert(zoomOutVertexBuffer); + return std::tuple, optional>{ + gfx::attributeBinding(*patternToVertexBuffer), + gfx::attributeBinding(crossfade.fromScale == 2 ? *zoomInVertexBuffer : *zoomOutVertexBuffer) + }; + } + + return std::tuple, optional>{{}, {}}; } }