From f0d0e7423b610782fdbed576bc2a442b82c8e1f8 Mon Sep 17 00:00:00 2001 From: Asheem Mamoowala Date: Fri, 26 May 2017 16:54:36 -0700 Subject: Refactor RenderLayer and RenderSource to be more friendly for Non-tiled sources (#9058) --- src/mbgl/renderer/painter.cpp | 29 ++++++++++------------------- src/mbgl/renderer/painter.hpp | 4 ++-- src/mbgl/renderer/render_item.hpp | 10 +++++----- src/mbgl/renderer/render_layer.cpp | 27 ++++++++++++++++++++++++++- src/mbgl/renderer/render_layer.hpp | 15 +++++++++++++++ src/mbgl/style/style.cpp | 16 ++++++++-------- 6 files changed, 66 insertions(+), 35 deletions(-) diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 3832403cce..a085f33c4b 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -178,12 +179,7 @@ void Painter::render(const Style& style, const FrameData& frame_, View& view) { frameHistory.upload(context, 0); for (const auto& item : order) { - for (const auto& tileRef : item.tiles) { - const auto& bucket = tileRef.get().tile.getBucket(*item.layer.baseImpl); - if (bucket && bucket->needsUpload()) { - bucket->upload(context); - } - } + item.layer.uploadBuckets(context, item.source); } } @@ -335,13 +331,7 @@ void Painter::renderPass(PaintParameters& parameters, context.setDepthMode(depthModeForSublayer(0, gl::DepthMode::ReadWrite)); context.clear(Color{ 0.0f, 0.0f, 0.0f, 0.0f }, 1.0f, {}); - 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.baseImpl); - bucket->render(*this, parameters, layer, tile); - } + renderItem(parameters, item); parameters.view.bind(); context.bindTexture(extrusionTexture->getTexture()); @@ -363,12 +353,7 @@ void Painter::renderPass(PaintParameters& parameters, ExtrusionTextureProgram::PaintPropertyBinders{ properties, 0 }, properties, state.getZoom()); } else { - 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.baseImpl); - bucket->render(*this, parameters, layer, tile); - } + renderItem(parameters, item); } } @@ -377,6 +362,12 @@ void Painter::renderPass(PaintParameters& parameters, } } +void Painter::renderItem(PaintParameters& parameters, const RenderItem& item) { + RenderLayer& layer = item.layer; + MBGL_DEBUG_GROUP(context, layer.getID()); + layer.render(*this, parameters, item.source); +} + mat4 Painter::matrixForTile(const UnwrappedTileID& tileID) { mat4 matrix; state.matrixFor(matrix, tileID); diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index e2777134d0..5c3a8794a9 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -93,6 +93,8 @@ public: void renderRaster(PaintParameters&, RasterBucket&, const RenderRasterLayer&, const RenderTile&); void renderBackground(PaintParameters&, const RenderBackgroundLayer&); + void renderItem(PaintParameters&, const RenderItem&); + #ifndef NDEBUG // Renders tile clip boundaries, using stencil buffer to calculate fill color. void renderClipMasks(PaintParameters&); @@ -103,8 +105,6 @@ public: bool needsAnimation() const; private: - std::vector determineRenderOrder(const style::Style&); - template void renderPass(PaintParameters&, RenderPass, diff --git a/src/mbgl/renderer/render_item.hpp b/src/mbgl/renderer/render_item.hpp index 787211c30a..4bf5629263 100644 --- a/src/mbgl/renderer/render_item.hpp +++ b/src/mbgl/renderer/render_item.hpp @@ -17,13 +17,13 @@ namespace style { class RenderItem { public: - RenderItem(const RenderLayer& layer_, - std::vector> tiles_ = {}) - : layer(layer_), tiles(std::move(tiles_)) { + RenderItem(RenderLayer& layer_, + RenderSource* renderSource_) + : layer(layer_), source(renderSource_) { } - const RenderLayer& layer; - std::vector> tiles; + RenderLayer& layer; + RenderSource* source; }; class RenderData { diff --git a/src/mbgl/renderer/render_layer.cpp b/src/mbgl/renderer/render_layer.cpp index cf7f772e16..4bffb87cf1 100644 --- a/src/mbgl/renderer/render_layer.cpp +++ b/src/mbgl/renderer/render_layer.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include namespace mbgl { @@ -62,4 +64,27 @@ bool RenderLayer::needsRendering(float zoom) const { && baseImpl->maxZoom >= zoom; } -} // namespace mbgl +void RenderLayer::setRenderTiles(std::vector> tiles) { + renderTiles = std::move(tiles); +} + +void RenderLayer::uploadBuckets(gl::Context& context, RenderSource*) { + for (const auto& tileRef : renderTiles) { + const auto& bucket = tileRef.get().tile.getBucket(*baseImpl); + if (bucket && bucket->needsUpload()) { + bucket->upload(context); + } + } +} + +void RenderLayer::render(Painter& painter, PaintParameters& parameters, RenderSource*) { + for (auto& tileRef : renderTiles) { + auto& tile = tileRef.get(); + auto bucket = tile.tile.getBucket(*baseImpl); + bucket->render(painter, parameters, *this, tile); + } +} + + +} //namespace mbgl + diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp index 263e0039fa..ce71794c07 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; +} // namespace gl 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&, RenderSource* source); + virtual void render(Painter& , PaintParameters& , RenderSource* source); // Check wether the given geometry intersects // with the feature virtual bool queryIntersectsFeature( @@ -69,6 +79,7 @@ public: virtual std::unique_ptr createBucket(const BucketParameters&, const std::vector&) const = 0; + void setRenderTiles(std::vector>); // Private implementation Immutable baseImpl; void setImpl(Immutable); @@ -79,6 +90,10 @@ 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; + + //Stores current set of tiles to be rendered for this layer. + std::vector> renderTiles; + }; } // namespace mbgl diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index 9445772a66..e75925f476 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -535,8 +535,8 @@ RenderData Style::getRenderData(MapDebugOptions debugOptions, float angle) const } } - for (const auto& layerImpl : layerImpls) { - const RenderLayer* layer = getRenderLayer(layerImpl->id); + for (auto& layerImpl : layerImpls) { + RenderLayer* layer = getRenderLayer(layerImpl->id); assert(layer); if (!layer->needsRendering(zoomHistory.lastZoom)) { @@ -546,7 +546,7 @@ RenderData Style::getRenderData(MapDebugOptions debugOptions, float angle) const if (const RenderBackgroundLayer* background = layer->as()) { if (debugOptions & MapDebugOptions::Overdraw) { // We want to skip glClear optimization in overdraw mode. - result.order.emplace_back(*layer); + result.order.emplace_back(*layer, nullptr); continue; } const BackgroundPaintProperties::PossiblyEvaluated& paint = background->evaluated; @@ -555,19 +555,19 @@ RenderData Style::getRenderData(MapDebugOptions debugOptions, float angle) const result.backgroundColor = paint.get() * paint.get(); } else { // This is a textured background, or not the bottommost layer. We need to render it with a quad. - result.order.emplace_back(*layer); + result.order.emplace_back(*layer, nullptr); } continue; } if (layer->is()) { - result.order.emplace_back(*layer); + result.order.emplace_back(*layer, nullptr); continue; } RenderSource* source = getRenderSource(layer->baseImpl->source); if (!source) { - Log::Warning(Event::Render, "can't find source for layer '%s'", layer->baseImpl->id.c_str()); + Log::Warning(Event::Render, "can't find source for layer '%s'", layer->getID().c_str()); continue; } @@ -626,8 +626,8 @@ RenderData Style::getRenderData(MapDebugOptions debugOptions, float angle) const tile.used = true; } } - - result.order.emplace_back(*layer, std::move(sortedTilesForInsertion)); + layer->setRenderTiles(std::move(sortedTilesForInsertion)); + result.order.emplace_back(*layer, source); } return result; -- cgit v1.2.1