summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2017-07-06 08:06:12 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2017-07-17 09:19:02 -0700
commitde91e68090a8b246eb161cc8dfdc5b0f40e5bdc0 (patch)
tree42b12455dd032a4b478cc0627f5805e21c85f582
parentd7bdc7a60d330094dd8af8431e0b1d6f588d9f07 (diff)
downloadqtlocation-mapboxgl-de91e68090a8b246eb161cc8dfdc5b0f40e5bdc0.tar.gz
[core] Per-segment-per-layer vertex arrays
Reduces rebinding, matches gl-js, and works around the buggy VAO implementation on PowerVR SGX544 GPUs.
-rw-r--r--src/mbgl/programs/program.hpp11
-rw-r--r--src/mbgl/programs/segment.hpp9
-rw-r--r--src/mbgl/programs/symbol_program.hpp11
-rw-r--r--src/mbgl/renderer/painter.cpp15
-rw-r--r--src/mbgl/renderer/painter_background.cpp6
-rw-r--r--src/mbgl/renderer/painter_circle.cpp3
-rw-r--r--src/mbgl/renderer/painter_clipping.cpp3
-rw-r--r--src/mbgl/renderer/painter_debug.cpp3
-rw-r--r--src/mbgl/renderer/painter_fill.cpp6
-rw-r--r--src/mbgl/renderer/painter_fill_extrusion.cpp6
-rw-r--r--src/mbgl/renderer/painter_line.cpp3
-rw-r--r--src/mbgl/renderer/painter_raster.cpp3
-rw-r--r--src/mbgl/renderer/painter_symbol.cpp6
13 files changed, 59 insertions, 26 deletions
diff --git a/src/mbgl/programs/program.hpp b/src/mbgl/programs/program.hpp
index 3ff6e59c6b..8cd6c07322 100644
--- a/src/mbgl/programs/program.hpp
+++ b/src/mbgl/programs/program.hpp
@@ -58,7 +58,8 @@ public:
const SegmentVector<Attributes>& segments,
const PaintPropertyBinders& paintPropertyBinders,
const typename PaintProperties::Evaluated& currentProperties,
- float currentZoom) {
+ float currentZoom,
+ const std::string& layerID) {
typename AllUniforms::Values allUniformValues = uniformValues
.concat(paintPropertyBinders.uniformValues(currentZoom, currentProperties));
@@ -66,8 +67,10 @@ public:
.concat(paintPropertyBinders.attributeBindings(currentProperties));
for (auto& segment : segments) {
- if (!segment.vertexArray) {
- segment.vertexArray = context.createVertexArray();
+ optional<gl::VertexArray>& vertexArray = segment.vertexArrays[layerID];
+
+ if (!vertexArray) {
+ vertexArray = context.createVertexArray();
}
program.draw(
@@ -77,7 +80,7 @@ public:
std::move(stencilMode),
std::move(colorMode),
allUniformValues,
- *segment.vertexArray,
+ *vertexArray,
Attributes::offsetBindings(allAttributeBindings, segment.vertexOffset),
indexBuffer,
segment.indexOffset,
diff --git a/src/mbgl/programs/segment.hpp b/src/mbgl/programs/segment.hpp
index d8cc9679d7..74bf4a75c5 100644
--- a/src/mbgl/programs/segment.hpp
+++ b/src/mbgl/programs/segment.hpp
@@ -28,7 +28,14 @@ public:
std::size_t vertexLength;
std::size_t indexLength;
- mutable optional<gl::VertexArray> vertexArray;
+ // One VertexArray per layer ID. This minimizes rebinding in cases where
+ // several layers share buckets but have different sets of active attributes.
+ // This can happen:
+ // * when two layers have the same layout properties, but differing
+ // data-driven paint properties
+ // * when two fill layers have the same layout properties, but one
+ // uses fill-color and the other uses fill-pattern
+ mutable std::map<std::string, optional<gl::VertexArray>> vertexArrays;
};
template <class Attributes>
diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp
index 2fddebde09..3bf82009e2 100644
--- a/src/mbgl/programs/symbol_program.hpp
+++ b/src/mbgl/programs/symbol_program.hpp
@@ -360,7 +360,8 @@ public:
const SegmentVector<Attributes>& segments,
const PaintPropertyBinders& paintPropertyBinders,
const typename PaintProperties::Evaluated& currentProperties,
- float currentZoom) {
+ float currentZoom,
+ const std::string& layerID) {
typename AllUniforms::Values allUniformValues = uniformValues
.concat(symbolSizeBinder.uniformValues(currentZoom))
.concat(paintPropertyBinders.uniformValues(currentZoom, currentProperties));
@@ -370,8 +371,10 @@ public:
.concat(paintPropertyBinders.attributeBindings(currentProperties));
for (auto& segment : segments) {
- if (!segment.vertexArray) {
- segment.vertexArray = context.createVertexArray();
+ optional<gl::VertexArray>& vertexArray = segment.vertexArrays[layerID];
+
+ if (!vertexArray) {
+ vertexArray = context.createVertexArray();
}
program.draw(
@@ -381,7 +384,7 @@ public:
std::move(stencilMode),
std::move(colorMode),
allUniformValues,
- *segment.vertexArray,
+ *vertexArray,
Attributes::offsetBindings(allAttributeBindings, segment.vertexOffset),
indexBuffer,
segment.indexOffset,
diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp
index da3268ed76..fbaf40d5c0 100644
--- a/src/mbgl/renderer/painter.cpp
+++ b/src/mbgl/renderer/painter.cpp
@@ -353,16 +353,23 @@ void Painter::renderPass(PaintParameters& parameters,
const PaintProperties<>::Evaluated properties{};
parameters.programs.extrusionTexture.draw(
- context, gl::Triangles(), gl::DepthMode::disabled(), gl::StencilMode::disabled(),
+ context,
+ gl::Triangles(),
+ gl::DepthMode::disabled(),
+ gl::StencilMode::disabled(),
colorModeForRenderPass(),
ExtrusionTextureProgram::UniformValues{
uniforms::u_matrix::Value{ viewportMat }, uniforms::u_world::Value{ size },
uniforms::u_image::Value{ 0 },
uniforms::u_opacity::Value{ layer.as<RenderFillExtrusionLayer>()
->evaluated.get<FillExtrusionOpacity>() } },
- extrusionTextureVertexBuffer, quadTriangleIndexBuffer, extrusionTextureSegments,
- ExtrusionTextureProgram::PaintPropertyBinders{ properties, 0 }, properties,
- state.getZoom());
+ extrusionTextureVertexBuffer,
+ quadTriangleIndexBuffer,
+ extrusionTextureSegments,
+ ExtrusionTextureProgram::PaintPropertyBinders{ properties, 0 },
+ properties,
+ state.getZoom(),
+ layer.getID());
} else {
for (auto& tileRef : item.tiles) {
auto& tile = tileRef.get();
diff --git a/src/mbgl/renderer/painter_background.cpp b/src/mbgl/renderer/painter_background.cpp
index d01696ee3e..9bd9431082 100644
--- a/src/mbgl/renderer/painter_background.cpp
+++ b/src/mbgl/renderer/painter_background.cpp
@@ -53,7 +53,8 @@ void Painter::renderBackground(PaintParameters& parameters, const RenderBackgrou
tileTriangleSegments,
paintAttibuteData,
properties,
- state.getZoom()
+ state.getZoom(),
+ layer.getID()
);
}
} else {
@@ -73,7 +74,8 @@ void Painter::renderBackground(PaintParameters& parameters, const RenderBackgrou
tileTriangleSegments,
paintAttibuteData,
properties,
- state.getZoom()
+ state.getZoom(),
+ layer.getID()
);
}
}
diff --git a/src/mbgl/renderer/painter_circle.cpp b/src/mbgl/renderer/painter_circle.cpp
index 13acb5f7fe..ecd7598de9 100644
--- a/src/mbgl/renderer/painter_circle.cpp
+++ b/src/mbgl/renderer/painter_circle.cpp
@@ -50,7 +50,8 @@ void Painter::renderCircle(PaintParameters& parameters,
bucket.segments,
bucket.paintPropertyBinders.at(layer.getID()),
properties,
- state.getZoom()
+ state.getZoom(),
+ layer.getID()
);
}
diff --git a/src/mbgl/renderer/painter_clipping.cpp b/src/mbgl/renderer/painter_clipping.cpp
index b3a2d77b1a..162f3b1d96 100644
--- a/src/mbgl/renderer/painter_clipping.cpp
+++ b/src/mbgl/renderer/painter_clipping.cpp
@@ -30,7 +30,8 @@ void Painter::renderClippingMask(const UnwrappedTileID& tileID, const ClipID& cl
tileTriangleSegments,
paintAttibuteData,
properties,
- state.getZoom()
+ state.getZoom(),
+ "clipping"
);
}
diff --git a/src/mbgl/renderer/painter_debug.cpp b/src/mbgl/renderer/painter_debug.cpp
index 37fa3bcb12..9a24ab5422 100644
--- a/src/mbgl/renderer/painter_debug.cpp
+++ b/src/mbgl/renderer/painter_debug.cpp
@@ -39,7 +39,8 @@ void Painter::renderTileDebug(const RenderTile& renderTile) {
segments,
paintAttibuteData,
properties,
- state.getZoom()
+ state.getZoom(),
+ "debug"
);
};
diff --git a/src/mbgl/renderer/painter_fill.cpp b/src/mbgl/renderer/painter_fill.cpp
index e1b59d8839..cad76ace4f 100644
--- a/src/mbgl/renderer/painter_fill.cpp
+++ b/src/mbgl/renderer/painter_fill.cpp
@@ -60,7 +60,8 @@ void Painter::renderFill(PaintParameters& parameters,
segments,
bucket.paintPropertyBinders.at(layer.getID()),
properties,
- state.getZoom()
+ state.getZoom(),
+ layer.getID()
);
};
@@ -104,7 +105,8 @@ void Painter::renderFill(PaintParameters& parameters,
segments,
bucket.paintPropertyBinders.at(layer.getID()),
properties,
- state.getZoom()
+ state.getZoom(),
+ layer.getID()
);
};
diff --git a/src/mbgl/renderer/painter_fill_extrusion.cpp b/src/mbgl/renderer/painter_fill_extrusion.cpp
index 95617525c7..5581cfe983 100644
--- a/src/mbgl/renderer/painter_fill_extrusion.cpp
+++ b/src/mbgl/renderer/painter_fill_extrusion.cpp
@@ -59,7 +59,8 @@ void Painter::renderFillExtrusion(PaintParameters& parameters,
bucket.triangleSegments,
bucket.paintPropertyBinders.at(layer.getID()),
properties,
- state.getZoom());
+ state.getZoom(),
+ layer.getID());
} else {
parameters.programs.fillExtrusion.get(properties).draw(
@@ -80,7 +81,8 @@ void Painter::renderFillExtrusion(PaintParameters& parameters,
bucket.triangleSegments,
bucket.paintPropertyBinders.at(layer.getID()),
properties,
- state.getZoom());
+ state.getZoom(),
+ layer.getID());
};
}
diff --git a/src/mbgl/renderer/painter_line.cpp b/src/mbgl/renderer/painter_line.cpp
index 9152ac8512..209b1447d0 100644
--- a/src/mbgl/renderer/painter_line.cpp
+++ b/src/mbgl/renderer/painter_line.cpp
@@ -36,7 +36,8 @@ void Painter::renderLine(PaintParameters& parameters,
bucket.segments,
bucket.paintPropertyBinders.at(layer.getID()),
properties,
- state.getZoom()
+ state.getZoom(),
+ layer.getID()
);
};
diff --git a/src/mbgl/renderer/painter_raster.cpp b/src/mbgl/renderer/painter_raster.cpp
index fbe025b5b0..f0e5399f4a 100644
--- a/src/mbgl/renderer/painter_raster.cpp
+++ b/src/mbgl/renderer/painter_raster.cpp
@@ -81,7 +81,8 @@ void Painter::renderRaster(PaintParameters& parameters,
rasterSegments,
paintAttributeData,
properties,
- state.getZoom()
+ state.getZoom(),
+ layer.getID()
);
}
diff --git a/src/mbgl/renderer/painter_symbol.cpp b/src/mbgl/renderer/painter_symbol.cpp
index c9ed8cc570..6462eebdcc 100644
--- a/src/mbgl/renderer/painter_symbol.cpp
+++ b/src/mbgl/renderer/painter_symbol.cpp
@@ -58,7 +58,8 @@ void Painter::renderSymbol(PaintParameters& parameters,
buffers.segments,
binders,
paintProperties,
- state.getZoom()
+ state.getZoom(),
+ layer.getID()
);
};
@@ -156,7 +157,8 @@ void Painter::renderSymbol(PaintParameters& parameters,
bucket.collisionBox.segments,
paintAttributeData,
properties,
- state.getZoom()
+ state.getZoom(),
+ layer.getID()
);
}
}