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

Remove unused generated OpenGL programs #12287

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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