diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2018-07-03 11:05:20 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2018-07-03 11:23:54 +0200 |
commit | da75c4a3247b1f3536a401524c17801fede7b217 (patch) | |
tree | 77515cd73aa1aad1d185643f0996ab0bfee6da1c | |
parent | 3f87f867cfeb53d3d1880c366c14211ad1cb4bb6 (diff) | |
download | qtlocation-mapboxgl-upstream/release-node-v4.0.0-remove-unused-programs.tar.gz |
[core] remove unused generated OpenGL programs after some timeupstream/release-node-v4.0.0-remove-unused-programs
-rw-r--r-- | src/mbgl/programs/program.hpp | 29 | ||||
-rw-r--r-- | src/mbgl/programs/programs.hpp | 18 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_circle_layer.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_fill_layer.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_heatmap_layer.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_line_layer.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_symbol_layer.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/paint_parameters.cpp | 10 | ||||
-rw-r--r-- | src/mbgl/renderer/paint_parameters.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.cpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.hpp | 1 |
12 files changed, 63 insertions, 15 deletions
diff --git a/src/mbgl/programs/program.hpp b/src/mbgl/programs/program.hpp index 4d5de05337..aadbceeb06 100644 --- a/src/mbgl/programs/program.hpp +++ b/src/mbgl/programs/program.hpp @@ -113,22 +113,37 @@ public: parameters(std::move(parameters_)) { } - Program& get(const typename PaintProperties::PossiblyEvaluated& currentProperties) { + Program& get(size_t frameID, const typename PaintProperties::PossiblyEvaluated& currentProperties) { Bitset bits = PaintPropertyBinders::constants(currentProperties); auto it = programs.find(bits); if (it != programs.end()) { - return it->second; + std::get<size_t>(it->second) = frameID; + return std::get<Program>(it->second); + } + return std::get<Program>( + programs.emplace(std::piecewise_construct, + std::forward_as_tuple(bits), + std::forward_as_tuple<Program, size_t>( + { context, parameters.withAdditionalDefines(PaintPropertyBinders::defines(currentProperties)) }, + std::move(frameID) + )).first->second); + } + + // We are periodically removing old Program objects from our cache to prevent them from piling up. + void evictNotUsedSince(const size_t frameID) { + for (auto it = programs.begin(); it != programs.end();) { + if (std::get<size_t>(it->second) < frameID) { + programs.erase(it++); + } else { + ++it; + } } - return programs.emplace(std::piecewise_construct, - std::forward_as_tuple(bits), - std::forward_as_tuple(context, - parameters.withAdditionalDefines(PaintPropertyBinders::defines(currentProperties)))).first->second; } private: gl::Context& context; ProgramParameters parameters; - std::unordered_map<Bitset, Program> programs; + std::unordered_map<Bitset, std::tuple<Program, size_t>> programs; }; } // namespace mbgl diff --git a/src/mbgl/programs/programs.hpp b/src/mbgl/programs/programs.hpp index b703323d9c..e45f9e919b 100644 --- a/src/mbgl/programs/programs.hpp +++ b/src/mbgl/programs/programs.hpp @@ -49,6 +49,24 @@ public: clippingMask(context, programParameters) { } + // We are periodically removing old Program objects from our cache to prevent them from piling up. + void evictNotUsedSince(const size_t frameID) { + circle.evictNotUsedSince(frameID); + fill.evictNotUsedSince(frameID); + fillExtrusion.evictNotUsedSince(frameID); + fillExtrusionPattern.evictNotUsedSince(frameID); + fillPattern.evictNotUsedSince(frameID); + fillOutline.evictNotUsedSince(frameID); + fillOutlinePattern.evictNotUsedSince(frameID); + heatmap.evictNotUsedSince(frameID); + line.evictNotUsedSince(frameID); + lineSDF.evictNotUsedSince(frameID); + linePattern.evictNotUsedSince(frameID); + symbolIcon.evictNotUsedSince(frameID); + symbolIconSDF.evictNotUsedSince(frameID); + symbolGlyph.evictNotUsedSince(frameID); + } + BackgroundProgram background; BackgroundPatternProgram backgroundPattern; ProgramMap<CircleProgram> circle; diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index 4c96137143..e971fbeb49 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -61,7 +61,7 @@ void RenderCircleLayer::render(PaintParameters& parameters, RenderSource*) { const auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); - auto& programInstance = parameters.programs.circle.get(evaluated); + auto& programInstance = parameters.programs.circle.get(parameters.frameID, evaluated); const auto allUniformValues = programInstance.computeAllUniformValues( CircleProgram::UniformValues { diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index 00ab05858f..138f0cb308 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -105,7 +105,7 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource* *reinterpret_cast<FillExtrusionBucket*>(tile.tile.getBucket(*baseImpl)); draw( - parameters.programs.fillExtrusion.get(evaluated), + parameters.programs.fillExtrusion.get(parameters.frameID, evaluated), bucket, FillExtrusionUniforms::values( tile.translatedClipMatrix(evaluated.get<FillExtrusionTranslate>(), @@ -134,7 +134,7 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource* *reinterpret_cast<FillExtrusionBucket*>(tile.tile.getBucket(*baseImpl)); draw( - parameters.programs.fillExtrusionPattern.get(evaluated), + parameters.programs.fillExtrusionPattern.get(parameters.frameID, evaluated), bucket, FillExtrusionPatternUniforms::values( tile.translatedClipMatrix(evaluated.get<FillExtrusionTranslate>(), diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index 2607ebc170..d48e1fd95e 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -69,7 +69,7 @@ void RenderFillLayer::render(PaintParameters& parameters, RenderSource*) { const auto& depthMode, const auto& indexBuffer, const auto& segments) { - auto& programInstance = program.get(evaluated); + auto& programInstance = program.get(parameters.frameID, evaluated); const auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); @@ -154,7 +154,7 @@ void RenderFillLayer::render(PaintParameters& parameters, RenderSource*) { const auto& depthMode, const auto& indexBuffer, const auto& segments) { - auto& programInstance = program.get(evaluated); + auto& programInstance = program.get(parameters.frameID, evaluated); const auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.cpp b/src/mbgl/renderer/layers/render_heatmap_layer.cpp index 86884b01a4..60282a17b2 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.cpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.cpp @@ -94,7 +94,7 @@ void RenderHeatmapLayer::render(PaintParameters& parameters, RenderSource*) { const auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); - auto& programInstance = parameters.programs.heatmap.get(evaluated); + auto& programInstance = parameters.programs.heatmap.get(parameters.frameID, evaluated); const auto allUniformValues = programInstance.computeAllUniformValues( HeatmapProgram::UniformValues { diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index e7fe4d34b2..f817277f46 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -62,7 +62,7 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { LineBucket& bucket = *reinterpret_cast<LineBucket*>(tile.tile.getBucket(*baseImpl)); auto draw = [&] (auto& program, auto&& uniformValues) { - auto& programInstance = program.get(evaluated); + auto& programInstance = program.get(parameters.frameID, evaluated); const auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index e48c0e2f92..6c6e12deba 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -88,7 +88,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { const auto& binders, const auto& paintProperties) { - auto& programInstance = program.get(paintProperties); + auto& programInstance = program.get(parameters.frameID, paintProperties); const auto allUniformValues = programInstance.computeAllUniformValues( std::move(uniformValues), diff --git a/src/mbgl/renderer/paint_parameters.cpp b/src/mbgl/renderer/paint_parameters.cpp index a7f621eb61..11ce6c379c 100644 --- a/src/mbgl/renderer/paint_parameters.cpp +++ b/src/mbgl/renderer/paint_parameters.cpp @@ -2,12 +2,14 @@ #include <mbgl/renderer/update_parameters.hpp> #include <mbgl/renderer/render_static_data.hpp> #include <mbgl/map/transform_state.hpp> +#include <mbgl/util/chrono.hpp> namespace mbgl { PaintParameters::PaintParameters(gl::Context& context_, float pixelRatio_, GLContextMode contextMode_, + const size_t frameID_, RendererBackend& backend_, const UpdateParameters& updateParameters, const EvaluatedLight& evaluatedLight_, @@ -24,6 +26,7 @@ PaintParameters::PaintParameters(gl::Context& context_, mapMode(updateParameters.mode), debugOptions(updateParameters.debugOptions), contextMode(contextMode_), + frameID(frameID_), timePoint(updateParameters.timePoint), pixelRatio(pixelRatio_), #ifndef NDEBUG @@ -51,6 +54,13 @@ PaintParameters::PaintParameters(gl::Context& context_, } } +PaintParameters::~PaintParameters() { + const size_t retention = mapMode == MapMode::Continuous ? 100 : 20; + if (frameID >= retention) { + programs.evictNotUsedSince(frameID - retention); + } +} + mat4 PaintParameters::matrixForTile(const UnwrappedTileID& tileID, bool aligned) const { mat4 matrix; state.matrixFor(matrix, tileID); diff --git a/src/mbgl/renderer/paint_parameters.hpp b/src/mbgl/renderer/paint_parameters.hpp index 41f46ae34e..8846bd92b6 100644 --- a/src/mbgl/renderer/paint_parameters.hpp +++ b/src/mbgl/renderer/paint_parameters.hpp @@ -28,12 +28,14 @@ public: PaintParameters(gl::Context&, float pixelRatio, GLContextMode, + size_t frameID, RendererBackend&, const UpdateParameters&, const EvaluatedLight&, RenderStaticData&, ImageManager&, LineAtlas&); + ~PaintParameters(); gl::Context& context; RendererBackend& backend; @@ -49,6 +51,7 @@ public: MapMode mapMode; MapDebugOptions debugOptions; GLContextMode contextMode; + const size_t frameID; TimePoint timePoint; float pixelRatio; diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 7b25b37cf2..63d0877eb0 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -256,6 +256,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { backend.getContext(), pixelRatio, contextMode, + frameCount++, backend, updateParameters, renderLight.getEvaluated(), diff --git a/src/mbgl/renderer/renderer_impl.hpp b/src/mbgl/renderer/renderer_impl.hpp index 4675ac79ea..8d205d43ae 100644 --- a/src/mbgl/renderer/renderer_impl.hpp +++ b/src/mbgl/renderer/renderer_impl.hpp @@ -98,6 +98,7 @@ private: RenderState renderState = RenderState::Never; ZoomHistory zoomHistory; TransformState transformState; + size_t frameCount = 0; std::unique_ptr<GlyphManager> glyphManager; std::unique_ptr<ImageManager> imageManager; |