diff options
author | Asheem Mamoowala <asheem.mamoowala@mapbox.com> | 2017-05-05 15:02:47 -0700 |
---|---|---|
committer | Asheem Mamoowala <asheem.mamoowala@mapbox.com> | 2017-05-18 16:29:06 -0700 |
commit | b8848251cf04ea7c9d6accd9b8b7a92ee0f3be4c (patch) | |
tree | 716ea6b5499e8ba48045debf785dba6cbc1265ea | |
parent | 5f2586e71023a86ef005c9c25e67c47f1684cf6c (diff) | |
download | qtlocation-mapboxgl-b8848251cf04ea7c9d6accd9b8b7a92ee0f3be4c.tar.gz |
Move rendering from Painter to RenderLayer
22 files changed, 205 insertions, 29 deletions
diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index 83ec7bf2db..0e06ac4525 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -1,6 +1,7 @@ #include <mbgl/renderer/layers/render_background_layer.hpp> #include <mbgl/style/layers/background_layer_impl.hpp> #include <mbgl/renderer/bucket.hpp> +#include <mbgl/gl/context.hpp> namespace mbgl { @@ -29,6 +30,14 @@ void RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters ¶met : RenderPass::None; } +void RenderBackgroundLayer::uploadBuckets(gl::Context&) { +} + + +void RenderBackgroundLayer::render(Painter& , PaintParameters& , const RenderSource*) { +} + + bool RenderBackgroundLayer::hasTransition() const { return unevaluated.hasTransition(); } diff --git a/src/mbgl/renderer/layers/render_background_layer.hpp b/src/mbgl/renderer/layers/render_background_layer.hpp index 0fba3d2bb1..1db17e7e33 100644 --- a/src/mbgl/renderer/layers/render_background_layer.hpp +++ b/src/mbgl/renderer/layers/render_background_layer.hpp @@ -15,6 +15,9 @@ public: void evaluate(const PropertyEvaluationParameters&) override; bool hasTransition() const override; + void uploadBuckets(gl::Context&) override; + void render(Painter& , PaintParameters& , const RenderSource*) override; + std::unique_ptr<Bucket> createBucket(const BucketParameters&, const std::vector<const RenderLayer*>&) const override; // Paint properties diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index a8595ce61d..bd313f4816 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -4,6 +4,9 @@ #include <mbgl/geometry/feature_index.hpp> #include <mbgl/util/math.hpp> #include <mbgl/util/intersection_tests.hpp> +#include <mbgl/gl/context.hpp> +#include <mbgl/renderer/render_tile.hpp> +#include <mbgl/tile/tile.hpp> namespace mbgl { @@ -39,6 +42,25 @@ bool RenderCircleLayer::hasTransition() const { return unevaluated.hasTransition(); } +void RenderCircleLayer::uploadBuckets(gl::Context& context) { + for (const auto& tileRef : renderTiles) { + const auto& bucket = tileRef.get().tile.getBucket(*this); + if (bucket && bucket->needsUpload()) { + bucket->upload(context); + } + } +} + +void RenderCircleLayer::render(Painter& painter, PaintParameters& parameters, const RenderSource*) { + for (auto& tileRef : renderTiles) { + auto& tile = tileRef.get(); +// MBGL_DEBUG_GROUP(context, getID() + " - " + util::toString(tile.id)); + auto bucket = tile.tile.getBucket(*this); + bucket->render(painter, parameters, *this, tile); + } +} + + bool RenderCircleLayer::queryIntersectsFeature( const GeometryCoordinates& queryGeometry, const GeometryTileFeature& feature, diff --git a/src/mbgl/renderer/layers/render_circle_layer.hpp b/src/mbgl/renderer/layers/render_circle_layer.hpp index 4ae7399ad1..ef5b2c9756 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.hpp +++ b/src/mbgl/renderer/layers/render_circle_layer.hpp @@ -15,6 +15,9 @@ public: void evaluate(const PropertyEvaluationParameters&) override; bool hasTransition() const override; + void uploadBuckets(gl::Context&) override; + void render(Painter& , PaintParameters& , const RenderSource*) override; + bool queryIntersectsFeature( const GeometryCoordinates&, const GeometryTileFeature&, diff --git a/src/mbgl/renderer/layers/render_custom_layer.cpp b/src/mbgl/renderer/layers/render_custom_layer.cpp index add3d0d5ad..a6e67b3974 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.cpp +++ b/src/mbgl/renderer/layers/render_custom_layer.cpp @@ -1,6 +1,7 @@ #include <mbgl/renderer/layers/render_custom_layer.hpp> #include <mbgl/style/layers/custom_layer_impl.hpp> #include <mbgl/renderer/bucket.hpp> +#include <mbgl/gl/context.hpp> namespace mbgl { @@ -20,6 +21,13 @@ bool RenderCustomLayer::hasTransition() const { return false; } +void RenderCustomLayer::uploadBuckets(gl::Context&) { +} + +void RenderCustomLayer::render(Painter& , PaintParameters& , const RenderSource*) { +} + + std::unique_ptr<Bucket> RenderCustomLayer::createBucket(const BucketParameters&, const std::vector<const RenderLayer*>&) const { assert(false); return nullptr; diff --git a/src/mbgl/renderer/layers/render_custom_layer.hpp b/src/mbgl/renderer/layers/render_custom_layer.hpp index 2f7c2d3239..2b832a7b92 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.hpp +++ b/src/mbgl/renderer/layers/render_custom_layer.hpp @@ -14,6 +14,9 @@ public: void evaluate(const PropertyEvaluationParameters&) override; bool hasTransition() const override; + void uploadBuckets(gl::Context&) override; + void render(Painter& , PaintParameters& , const RenderSource*) override; + std::unique_ptr<Bucket> createBucket(const BucketParameters&, const std::vector<const RenderLayer*>&) const final; const style::CustomLayer::Impl& impl() const; diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index 551fcc5fc9..16198f1ca5 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -4,6 +4,9 @@ #include <mbgl/geometry/feature_index.hpp> #include <mbgl/util/math.hpp> #include <mbgl/util/intersection_tests.hpp> +#include <mbgl/gl/context.hpp> +#include <mbgl/renderer/render_tile.hpp> +#include <mbgl/tile/tile.hpp> namespace mbgl { @@ -34,6 +37,25 @@ bool RenderFillExtrusionLayer::hasTransition() const { return unevaluated.hasTransition(); } +void RenderFillExtrusionLayer::uploadBuckets(gl::Context& context) { + for (const auto& tileRef : renderTiles) { + const auto& bucket = tileRef.get().tile.getBucket(*this); + if (bucket && bucket->needsUpload()) { + bucket->upload(context); + } + } +} + +void RenderFillExtrusionLayer::render(Painter& painter, PaintParameters& parameters, const RenderSource*) { + for (auto& tileRef : renderTiles) { + auto& tile = tileRef.get(); +// MBGL_DEBUG_GROUP(context, getID() + " - " + util::toString(tile.id)); + auto bucket = tile.tile.getBucket(*this); + bucket->render(painter, parameters, *this, tile); + } +} + + bool RenderFillExtrusionLayer::queryIntersectsFeature( const GeometryCoordinates& queryGeometry, const GeometryTileFeature& feature, diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp index 1a55b56836..5265cdb7e8 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp @@ -15,6 +15,9 @@ public: void evaluate(const PropertyEvaluationParameters&) override; bool hasTransition() const override; + void uploadBuckets(gl::Context&) override; + void render(Painter& , PaintParameters& , const RenderSource*) override; + bool queryIntersectsFeature( const GeometryCoordinates&, const GeometryTileFeature&, diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index a36e1688a7..3334371431 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -4,6 +4,9 @@ #include <mbgl/geometry/feature_index.hpp> #include <mbgl/util/math.hpp> #include <mbgl/util/intersection_tests.hpp> +#include <mbgl/gl/context.hpp> +#include <mbgl/renderer/render_tile.hpp> +#include <mbgl/tile/tile.hpp> namespace mbgl { @@ -49,6 +52,24 @@ bool RenderFillLayer::hasTransition() const { return unevaluated.hasTransition(); } +void RenderFillLayer::uploadBuckets(gl::Context& context) { + for (const auto& tileRef : renderTiles) { + const auto& bucket = tileRef.get().tile.getBucket(*this); + if (bucket && bucket->needsUpload()) { + bucket->upload(context); + } + } +} + +void RenderFillLayer::render(Painter& painter, PaintParameters& parameters, const RenderSource*) { + for (auto& tileRef : renderTiles) { + auto& tile = tileRef.get(); +// MBGL_DEBUG_GROUP(context, getID() + " - " + util::toString(tile.id)); + auto bucket = tile.tile.getBucket(*this); + bucket->render(painter, parameters, *this, tile); + } +} + bool RenderFillLayer::queryIntersectsFeature( const GeometryCoordinates& queryGeometry, const GeometryTileFeature& feature, diff --git a/src/mbgl/renderer/layers/render_fill_layer.hpp b/src/mbgl/renderer/layers/render_fill_layer.hpp index 1960fb653f..4748e892be 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.hpp +++ b/src/mbgl/renderer/layers/render_fill_layer.hpp @@ -15,6 +15,9 @@ public: void evaluate(const PropertyEvaluationParameters&) override; bool hasTransition() const override; + void uploadBuckets(gl::Context&) override; + void render(Painter& , PaintParameters& , const RenderSource*) override; + bool queryIntersectsFeature( const GeometryCoordinates&, const GeometryTileFeature&, diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index 076ee77aff..34a18c7584 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -4,6 +4,9 @@ #include <mbgl/geometry/feature_index.hpp> #include <mbgl/util/math.hpp> #include <mbgl/util/intersection_tests.hpp> +#include <mbgl/gl/context.hpp> +#include <mbgl/renderer/render_tile.hpp> +#include <mbgl/tile/tile.hpp> namespace mbgl { @@ -41,6 +44,25 @@ bool RenderLineLayer::hasTransition() const { return unevaluated.hasTransition(); } +void RenderLineLayer::uploadBuckets(gl::Context& context) { + for (const auto& tileRef : renderTiles) { + const auto& bucket = tileRef.get().tile.getBucket(*this); + if (bucket && bucket->needsUpload()) { + bucket->upload(context); + } + } +} + +void RenderLineLayer::render(Painter& painter, PaintParameters& parameters, const RenderSource*) { + for (auto& tileRef : renderTiles) { + auto& tile = tileRef.get(); +// MBGL_DEBUG_GROUP(context, getID() + " - " + util::toString(tile.id)); + auto bucket = tile.tile.getBucket(*this); + bucket->render(painter, parameters, *this, tile); + } +} + + optional<GeometryCollection> offsetLine(const GeometryCollection& rings, const double offset) { if (offset == 0) return {}; diff --git a/src/mbgl/renderer/layers/render_line_layer.hpp b/src/mbgl/renderer/layers/render_line_layer.hpp index 04ba745533..9a76e3b5a1 100644 --- a/src/mbgl/renderer/layers/render_line_layer.hpp +++ b/src/mbgl/renderer/layers/render_line_layer.hpp @@ -15,6 +15,9 @@ public: void evaluate(const PropertyEvaluationParameters&) override; bool hasTransition() const override; + void uploadBuckets(gl::Context&) override; + void render(Painter& , PaintParameters& , const RenderSource*) override; + bool queryIntersectsFeature( const GeometryCoordinates&, const GeometryTileFeature&, diff --git a/src/mbgl/renderer/layers/render_raster_layer.cpp b/src/mbgl/renderer/layers/render_raster_layer.cpp index feb3a4aca9..c42eb5b68e 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.cpp +++ b/src/mbgl/renderer/layers/render_raster_layer.cpp @@ -1,6 +1,9 @@ #include <mbgl/renderer/layers/render_raster_layer.hpp> #include <mbgl/renderer/bucket.hpp> #include <mbgl/style/layers/raster_layer_impl.hpp> +#include <mbgl/gl/context.hpp> +#include <mbgl/renderer/render_tile.hpp> +#include <mbgl/tile/tile.hpp> namespace mbgl { @@ -31,4 +34,23 @@ bool RenderRasterLayer::hasTransition() const { return unevaluated.hasTransition(); } +void RenderRasterLayer::uploadBuckets(gl::Context& context) { + for (const auto& tileRef : renderTiles) { + const auto& bucket = tileRef.get().tile.getBucket(*this); + if (bucket && bucket->needsUpload()) { + bucket->upload(context); + } + } +} + +void RenderRasterLayer::render(Painter& painter, PaintParameters& parameters, const RenderSource*) { + for (auto& tileRef : renderTiles) { + auto& tile = tileRef.get(); +// MBGL_DEBUG_GROUP(context, getID() + " - " + util::toString(tile.id)); + auto bucket = tile.tile.getBucket(*this); + bucket->render(painter, parameters, *this, tile); + } +} + + } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_raster_layer.hpp b/src/mbgl/renderer/layers/render_raster_layer.hpp index eecb0cd02d..0383720592 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.hpp +++ b/src/mbgl/renderer/layers/render_raster_layer.hpp @@ -3,6 +3,7 @@ #include <mbgl/renderer/render_layer.hpp> #include <mbgl/style/layers/raster_layer_impl.hpp> #include <mbgl/style/layers/raster_layer_properties.hpp> +#include <mbgl/renderer/bucket.hpp> namespace mbgl { @@ -15,6 +16,9 @@ public: void evaluate(const PropertyEvaluationParameters&) override; bool hasTransition() const override; + void uploadBuckets(gl::Context&) override; + void render(Painter& , PaintParameters& , const RenderSource*) override; + std::unique_ptr<Bucket> createBucket(const BucketParameters&, const std::vector<const RenderLayer*>&) const override; // Paint properties diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 0054d9f874..bcffd60994 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -5,6 +5,9 @@ #include <mbgl/renderer/property_evaluation_parameters.hpp> #include <mbgl/style/layers/symbol_layer_impl.hpp> #include <mbgl/tile/geometry_tile_data.hpp> +#include <mbgl/renderer/render_tile.hpp> +#include <mbgl/gl/context.hpp> +#include <mbgl/tile/tile.hpp> namespace mbgl { @@ -109,4 +112,22 @@ style::SymbolPropertyValues RenderSymbolLayer::textPropertyValues(const style::S }; } +void RenderSymbolLayer::uploadBuckets(gl::Context& context) { + for (const auto& tileRef : renderTiles) { + const auto& bucket = tileRef.get().tile.getBucket(*this); + if (bucket && bucket->needsUpload()) { + bucket->upload(context); + } + } +} + +void RenderSymbolLayer::render(Painter& painter, PaintParameters& parameters, const RenderSource*) { + for (auto& tileRef : renderTiles) { + auto& tile = tileRef.get(); +// MBGL_DEBUG_GROUP(context, getID() + " - " + util::toString(tile.id)); + auto bucket = tile.tile.getBucket(*this); + bucket->render(painter, parameters, *this, tile); + } +} + } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_symbol_layer.hpp b/src/mbgl/renderer/layers/render_symbol_layer.hpp index 42205496d9..e8ff41c045 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.hpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.hpp @@ -71,6 +71,9 @@ public: style::IconPaintProperties::PossiblyEvaluated iconPaintProperties() const; style::TextPaintProperties::PossiblyEvaluated textPaintProperties() const; + void uploadBuckets(gl::Context&) override; + void render(Painter& , PaintParameters& , const RenderSource*) override; + style::SymbolPropertyValues iconPropertyValues(const style::SymbolLayoutProperties::PossiblyEvaluated&) const; style::SymbolPropertyValues textPropertyValues(const style::SymbolLayoutProperties::PossiblyEvaluated&) const; diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 33fcdeb3ca..18eddc3322 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -179,7 +179,7 @@ void Painter::render(const Style& style, const FrameData& frame_, View& view, Sp annotationSpriteAtlas.upload(context, 0); for (const auto& item : order) { - uploadItem(item); + item.layer.uploadBuckets(context); } } @@ -363,22 +363,10 @@ void Painter::renderPass(PaintParameters& parameters, } void Painter::renderItem(PaintParameters& parameters, const RenderItem& item) { - const RenderLayer& layer = item.layer; - for (auto& tileRef : item.tiles) { - auto& tile = tileRef.get(); - MBGL_DEBUG_GROUP(context, layer.baseImpl.id + " - " + util::toString(tile.id)); - auto bucket = tile.tile.getBucket(layer); - bucket->render(*this, parameters, layer, tile); - } -} - -void Painter::uploadItem(const RenderItem& item) { - for (const auto& tileRef : item.tiles) { - const auto& bucket = tileRef.get().tile.getBucket(item.layer); - if (bucket && bucket->needsUpload()) { - bucket->upload(context); - } - } + RenderLayer& layer = item.layer; + const RenderSource * source = item.source; + MBGL_DEBUG_GROUP(context, layer.getID());// + " - " + util::toString(tile.id)); + layer.render(*this, parameters, source); } mat4 Painter::matrixForTile(const UnwrappedTileID& tileID) { diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index 83f6316737..e0fff37171 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -95,7 +95,7 @@ public: void renderBackground(PaintParameters&, const RenderBackgroundLayer&); void renderItem(PaintParameters&, const RenderItem&); - void uploadItem(const RenderItem& ); + #ifndef NDEBUG // Renders tile clip boundaries, using stencil buffer to calculate fill color. void renderClipMasks(PaintParameters&); diff --git a/src/mbgl/renderer/render_item.hpp b/src/mbgl/renderer/render_item.hpp index 4e557dab26..082bd1b898 100644 --- a/src/mbgl/renderer/render_item.hpp +++ b/src/mbgl/renderer/render_item.hpp @@ -17,15 +17,13 @@ namespace style { class RenderItem { public: - RenderItem(const RenderLayer& layer_, - RenderSource * renderSource_, - std::vector<std::reference_wrapper<RenderTile>> tiles_ = {}) - : layer(layer_), source(renderSource_), tiles(std::move(tiles_)) { + RenderItem(RenderLayer& layer_, + RenderSource * renderSource_) + : layer(layer_), source(renderSource_) { } - const RenderLayer& layer; - const RenderSource* source; - std::vector<std::reference_wrapper<RenderTile>> tiles; + RenderLayer& layer; + const RenderSource * source; }; class RenderData { diff --git a/src/mbgl/renderer/render_layer.cpp b/src/mbgl/renderer/render_layer.cpp index cf7f772e16..d485076473 100644 --- a/src/mbgl/renderer/render_layer.cpp +++ b/src/mbgl/renderer/render_layer.cpp @@ -8,7 +8,7 @@ #include <mbgl/renderer/layers/render_raster_layer.hpp> #include <mbgl/renderer/layers/render_symbol_layer.hpp> #include <mbgl/style/types.hpp> - +#include <mbgl/renderer/render_tile.hpp> namespace mbgl { using namespace style; @@ -62,4 +62,9 @@ bool RenderLayer::needsRendering(float zoom) const { && baseImpl->maxZoom >= zoom; } -} // namespace mbgl +void RenderLayer::setRenderTiles(std::vector<std::reference_wrapper<RenderTile>> tiles) { + renderTiles = std::move(tiles); +} + +} //namespace mbgl + diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp index 263e0039fa..085ad05c8b 100644 --- a/src/mbgl/renderer/render_layer.hpp +++ b/src/mbgl/renderer/render_layer.hpp @@ -14,6 +14,14 @@ class Bucket; class BucketParameters; class TransitionParameters; class PropertyEvaluationParameters; +class Painter; +class PaintParameters; +class RenderSource; +class RenderTile; + +namespace gl { + class Context; +} class RenderLayer { protected: @@ -58,6 +66,8 @@ public: // Checks whether this layer can be rendered. bool needsRendering(float zoom) const; + virtual void uploadBuckets(gl::Context&) = 0; + virtual void render(Painter& , PaintParameters& , const RenderSource* source) = 0; // Check wether the given geometry intersects // with the feature virtual bool queryIntersectsFeature( @@ -69,6 +79,7 @@ public: virtual std::unique_ptr<Bucket> createBucket(const BucketParameters&, const std::vector<const RenderLayer*>&) const = 0; + void setRenderTiles(std::vector<std::reference_wrapper<RenderTile>>); // Private implementation Immutable<style::Layer::Impl> baseImpl; void setImpl(Immutable<style::Layer::Impl>); @@ -79,6 +90,8 @@ protected: // Stores what render passes this layer is currently enabled for. This depends on the // evaluated StyleProperties object and is updated accordingly. RenderPass passes = RenderPass::None; + std::vector<std::reference_wrapper<RenderTile>> renderTiles; + }; } // namespace mbgl diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index 223a967a17..2008f0b5be 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -624,8 +624,8 @@ RenderData Style::getRenderData(MapDebugOptions debugOptions, float angle) const tile.used = true; } } - - result.order.emplace_back(*layer, source, std::move(sortedTilesForInsertion)); + layer->setRenderTiles(std::move(sortedTilesForInsertion)); + result.order.emplace_back(*layer, source); } return result; |