Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[core] remove unused generated OpenGL programs after some time
Browse files Browse the repository at this point in the history
  • Loading branch information
kkaefer authored and jfirebaugh committed Jul 18, 2018
1 parent f2b498e commit ced0f40
Show file tree
Hide file tree
Showing 12 changed files with 63 additions and 15 deletions.
29 changes: 22 additions & 7 deletions src/mbgl/programs/program.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,22 +113,37 @@ class ProgramMap {
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
18 changes: 18 additions & 0 deletions src/mbgl/programs/programs.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,24 @@ class Programs {
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;
Expand Down
2 changes: 1 addition & 1 deletion src/mbgl/renderer/layers/render_circle_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
4 changes: 2 additions & 2 deletions src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>(),
Expand Down Expand Up @@ -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>(),
Expand Down
4 changes: 2 additions & 2 deletions src/mbgl/renderer/layers/render_fill_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());

Expand Down Expand Up @@ -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());

Expand Down
2 changes: 1 addition & 1 deletion src/mbgl/renderer/layers/render_heatmap_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion src/mbgl/renderer/layers/render_line_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());

Expand Down
2 changes: 1 addition & 1 deletion src/mbgl/renderer/layers/render_symbol_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
10 changes: 10 additions & 0 deletions src/mbgl/renderer/paint_parameters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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_,
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions src/mbgl/renderer/paint_parameters.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@ class PaintParameters {
PaintParameters(gl::Context&,
float pixelRatio,
GLContextMode,
size_t frameID,
RendererBackend&,
const UpdateParameters&,
const EvaluatedLight&,
RenderStaticData&,
ImageManager&,
LineAtlas&);
~PaintParameters();

gl::Context& context;
RendererBackend& backend;
Expand All @@ -49,6 +51,7 @@ class PaintParameters {
MapMode mapMode;
MapDebugOptions debugOptions;
GLContextMode contextMode;
const size_t frameID;
TimePoint timePoint;

float pixelRatio;
Expand Down
1 change: 1 addition & 0 deletions src/mbgl/renderer/renderer_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
backend.getContext(),
pixelRatio,
contextMode,
frameCount++,
backend,
updateParameters,
renderLight.getEvaluated(),
Expand Down
1 change: 1 addition & 0 deletions src/mbgl/renderer/renderer_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ class Renderer::Impl : public GlyphManagerObserver,
RenderState renderState = RenderState::Never;
ZoomHistory zoomHistory;
TransformState transformState;
size_t frameCount = 0;

std::unique_ptr<GlyphManager> glyphManager;
std::unique_ptr<ImageManager> imageManager;
Expand Down

0 comments on commit ced0f40

Please sign in to comment.