summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-11-14 11:57:02 -0800
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-11-15 13:55:08 -0800
commit377d0fb0d20fa4129d867f0e8762ce208ccee14d (patch)
tree408e883f6ca97ee62cb3aebd2ff243d4df45fa76
parent58877d1b3ddf0e4521d680b85e31b7a4c6287302 (diff)
downloadqtlocation-mapboxgl-377d0fb0d20fa4129d867f0e8762ce208ccee14d.tar.gz
[core] Introduce SegmentVector
-rw-r--r--src/mbgl/gl/program.hpp7
-rw-r--r--src/mbgl/gl/segment.hpp13
-rw-r--r--src/mbgl/programs/circle_program.hpp6
-rw-r--r--src/mbgl/programs/collision_box_program.hpp10
-rw-r--r--src/mbgl/programs/debug_program.hpp8
-rw-r--r--src/mbgl/programs/raster_program.hpp8
-rw-r--r--src/mbgl/renderer/circle_bucket.hpp2
-rw-r--r--src/mbgl/renderer/debug_bucket.cpp3
-rw-r--r--src/mbgl/renderer/debug_bucket.hpp5
-rw-r--r--src/mbgl/renderer/fill_bucket.hpp4
-rw-r--r--src/mbgl/renderer/line_bucket.hpp2
-rw-r--r--src/mbgl/renderer/painter.cpp7
-rw-r--r--src/mbgl/renderer/painter.hpp8
-rw-r--r--src/mbgl/renderer/painter_background.cpp6
-rw-r--r--src/mbgl/renderer/painter_clipping.cpp3
-rw-r--r--src/mbgl/renderer/painter_debug.cpp21
-rw-r--r--src/mbgl/renderer/painter_raster.cpp3
-rw-r--r--src/mbgl/renderer/symbol_bucket.hpp6
18 files changed, 86 insertions, 36 deletions
diff --git a/src/mbgl/gl/program.hpp b/src/mbgl/gl/program.hpp
index 44c16ae671..01fa51e788 100644
--- a/src/mbgl/gl/program.hpp
+++ b/src/mbgl/gl/program.hpp
@@ -42,7 +42,7 @@ public:
UniformValues&& uniformValues,
const VertexBuffer<Vertex>& vertexBuffer,
const IndexBuffer<DrawMode>& indexBuffer,
- const std::vector<Segment>& segments) {
+ const SegmentVector<Attributes>& segments) {
static_assert(std::is_same<Primitive, typename DrawMode::Primitive>::value, "incompatible draw mode");
context.draw({
std::move(drawMode),
@@ -66,7 +66,8 @@ public:
StencilMode stencilMode,
ColorMode colorMode,
UniformValues&& uniformValues,
- const VertexBuffer<Vertex, DrawMode>& vertexBuffer) {
+ const VertexBuffer<Vertex, DrawMode>& vertexBuffer,
+ const SegmentVector<Attributes>& segments) {
static_assert(std::is_same<Primitive, typename DrawMode::Primitive>::value, "incompatible draw mode");
context.draw({
std::move(drawMode),
@@ -76,7 +77,7 @@ public:
program,
vertexBuffer.buffer,
0,
- {{ 0, 0, vertexBuffer.vertexCount, 0 }},
+ segments,
Uniforms::binder(uniformsState, std::move(uniformValues)),
Attributes::binder(attributesState)
});
diff --git a/src/mbgl/gl/segment.hpp b/src/mbgl/gl/segment.hpp
index f65f2a5f7e..283b4f572a 100644
--- a/src/mbgl/gl/segment.hpp
+++ b/src/mbgl/gl/segment.hpp
@@ -23,5 +23,18 @@ public:
std::size_t indexLength;
};
+template <class Attributes>
+class SegmentVector : public std::vector<Segment> {
+public:
+ SegmentVector() = default;
+
+ // This constructor is for unindexed rendering. It creates a SegmentVector with a
+ // single segment having 0 indexes.
+ template <class DrawMode>
+ SegmentVector(const VertexBuffer<typename Attributes::Vertex, DrawMode>& buffer) {
+ emplace_back(0, 0, buffer.vertexCount, 0);
+ }
+};
+
} // namespace gl
} // namespace mbgl
diff --git a/src/mbgl/programs/circle_program.hpp b/src/mbgl/programs/circle_program.hpp
index 75c030b1c8..b428937e33 100644
--- a/src/mbgl/programs/circle_program.hpp
+++ b/src/mbgl/programs/circle_program.hpp
@@ -14,11 +14,13 @@ MBGL_DEFINE_UNIFORM_SCALAR(bool, u_scale_with_map);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_devicepixelratio);
} // namespace uniforms
+using CircleAttributes = gl::Attributes<
+ attributes::a_pos>;
+
class CircleProgram : public Program<
shaders::circle,
gl::Triangle,
- gl::Attributes<
- attributes::a_pos>,
+ CircleAttributes,
gl::Uniforms<
uniforms::u_matrix,
uniforms::u_opacity,
diff --git a/src/mbgl/programs/collision_box_program.hpp b/src/mbgl/programs/collision_box_program.hpp
index 5eda3fefb0..26e38419a4 100644
--- a/src/mbgl/programs/collision_box_program.hpp
+++ b/src/mbgl/programs/collision_box_program.hpp
@@ -15,13 +15,15 @@ MBGL_DEFINE_UNIFORM_SCALAR(float, u_scale);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_maxzoom);
} // namespace uniforms
+using CollisionBoxAttributes = gl::Attributes<
+ attributes::a_pos,
+ attributes::a_extrude,
+ attributes::a_data<2>>;
+
class CollisionBoxProgram : public Program<
shaders::collision_box,
gl::Line,
- gl::Attributes<
- attributes::a_pos,
- attributes::a_extrude,
- attributes::a_data<2>>,
+ CollisionBoxAttributes,
gl::Uniforms<
uniforms::u_matrix,
uniforms::u_scale,
diff --git a/src/mbgl/programs/debug_program.hpp b/src/mbgl/programs/debug_program.hpp
index 3596dc1f7e..cd4e08b1bc 100644
--- a/src/mbgl/programs/debug_program.hpp
+++ b/src/mbgl/programs/debug_program.hpp
@@ -7,11 +7,13 @@
namespace mbgl {
+using DebugAttributes = gl::Attributes<
+ attributes::a_pos>;
+
class DebugProgram : public Program<
shaders::debug,
gl::Line,
- gl::Attributes<
- attributes::a_pos>,
+ DebugAttributes,
gl::Uniforms<
uniforms::u_matrix,
uniforms::u_color>>
@@ -20,4 +22,6 @@ public:
using Program::Program;
};
+using DebugVertex = DebugProgram::Vertex;
+
} // namespace mbgl
diff --git a/src/mbgl/programs/raster_program.hpp b/src/mbgl/programs/raster_program.hpp
index 1bab2d5765..d6179904d2 100644
--- a/src/mbgl/programs/raster_program.hpp
+++ b/src/mbgl/programs/raster_program.hpp
@@ -23,12 +23,14 @@ MBGL_DEFINE_UNIFORM_VECTOR(float, 3, u_spin_weights);
MBGL_DEFINE_UNIFORM_VECTOR(float, 2, u_tl_parent);
} // namespace uniforms
+using RasterAttributes = gl::Attributes<
+ attributes::a_pos,
+ attributes::a_texture_pos>;
+
class RasterProgram : public Program<
shaders::raster,
gl::Triangle,
- gl::Attributes<
- attributes::a_pos,
- attributes::a_texture_pos>,
+ RasterAttributes,
gl::Uniforms<
uniforms::u_matrix,
uniforms::u_image0,
diff --git a/src/mbgl/renderer/circle_bucket.hpp b/src/mbgl/renderer/circle_bucket.hpp
index a93b052d68..af7041a238 100644
--- a/src/mbgl/renderer/circle_bucket.hpp
+++ b/src/mbgl/renderer/circle_bucket.hpp
@@ -22,7 +22,7 @@ public:
gl::VertexVector<CircleVertex> vertices;
gl::IndexVector<gl::Triangles> triangles;
- std::vector<gl::Segment> segments;
+ gl::SegmentVector<CircleAttributes> segments;
optional<gl::VertexBuffer<CircleVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Triangles>> indexBuffer;
diff --git a/src/mbgl/renderer/debug_bucket.cpp b/src/mbgl/renderer/debug_bucket.cpp
index 4beb16a996..deceec6ab7 100644
--- a/src/mbgl/renderer/debug_bucket.cpp
+++ b/src/mbgl/renderer/debug_bucket.cpp
@@ -80,7 +80,8 @@ DebugBucket::DebugBucket(const OverscaledTileID& id,
modified(std::move(modified_)),
expires(std::move(expires_)),
debugMode(debugMode_),
- vertexBuffer(context.createVertexBuffer(buildTextVertices(id, renderable_, complete_, modified_, expires_, debugMode_))) {
+ vertexBuffer(context.createVertexBuffer(buildTextVertices(id, renderable_, complete_, modified_, expires_, debugMode_))),
+ segments(vertexBuffer) {
}
} // namespace mbgl
diff --git a/src/mbgl/renderer/debug_bucket.hpp b/src/mbgl/renderer/debug_bucket.hpp
index 4c173786ae..96703d87d0 100644
--- a/src/mbgl/renderer/debug_bucket.hpp
+++ b/src/mbgl/renderer/debug_bucket.hpp
@@ -6,7 +6,7 @@
#include <mbgl/util/optional.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/gl/vertex_buffer.hpp>
-#include <mbgl/programs/fill_program.hpp>
+#include <mbgl/programs/debug_program.hpp>
namespace mbgl {
@@ -32,7 +32,8 @@ public:
const optional<Timestamp> expires;
const MapDebugOptions debugMode;
- gl::VertexBuffer<FillVertex, gl::Lines> vertexBuffer;
+ gl::VertexBuffer<DebugVertex, gl::Lines> vertexBuffer;
+ gl::SegmentVector<DebugAttributes> segments;
};
} // namespace mbgl
diff --git a/src/mbgl/renderer/fill_bucket.hpp b/src/mbgl/renderer/fill_bucket.hpp
index 4ea558b629..edb1521c1d 100644
--- a/src/mbgl/renderer/fill_bucket.hpp
+++ b/src/mbgl/renderer/fill_bucket.hpp
@@ -22,8 +22,8 @@ public:
gl::VertexVector<FillVertex> vertices;
gl::IndexVector<gl::Lines> lines;
gl::IndexVector<gl::Triangles> triangles;
- std::vector<gl::Segment> lineSegments;
- std::vector<gl::Segment> triangleSegments;
+ gl::SegmentVector<FillAttributes> lineSegments;
+ gl::SegmentVector<FillAttributes> triangleSegments;
optional<gl::VertexBuffer<FillVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Lines>> lineIndexBuffer;
diff --git a/src/mbgl/renderer/line_bucket.hpp b/src/mbgl/renderer/line_bucket.hpp
index 9903ca1842..ae9d7d7f0e 100644
--- a/src/mbgl/renderer/line_bucket.hpp
+++ b/src/mbgl/renderer/line_bucket.hpp
@@ -28,7 +28,7 @@ public:
gl::VertexVector<LineVertex> vertices;
gl::IndexVector<gl::Triangles> triangles;
- std::vector<gl::Segment> segments;
+ gl::SegmentVector<LineAttributes> segments;
optional<gl::VertexBuffer<LineVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Triangles>> indexBuffer;
diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp
index a09e3b73fc..9dee668874 100644
--- a/src/mbgl/renderer/painter.cpp
+++ b/src/mbgl/renderer/painter.cpp
@@ -77,8 +77,11 @@ Painter::Painter(gl::Context& context_, const TransformState& state_)
: context(context_),
state(state_),
tileTriangleVertexBuffer(context.createVertexBuffer(tileTriangles())),
- tileLineStripVertexBuffer(context.createVertexBuffer(tileLineStrip())),
- rasterVertexBuffer(context.createVertexBuffer(rasterTriangleStrip())) {
+ tileTriangleSegments(tileTriangleVertexBuffer),
+ tileBorderVertexBuffer(context.createVertexBuffer(tileLineStrip())),
+ tileBorderSegments(tileBorderVertexBuffer),
+ rasterVertexBuffer(context.createVertexBuffer(rasterTriangleStrip())),
+ rasterSegments(rasterVertexBuffer) {
#ifndef NDEBUG
gl::debugging::enable();
#endif
diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp
index 3f5f28dad1..2aa317f95a 100644
--- a/src/mbgl/renderer/painter.hpp
+++ b/src/mbgl/renderer/painter.hpp
@@ -9,6 +9,7 @@
#include <mbgl/renderer/bucket.hpp>
#include <mbgl/gl/context.hpp>
+#include <mbgl/programs/debug_program.hpp>
#include <mbgl/programs/fill_program.hpp>
#include <mbgl/programs/raster_program.hpp>
@@ -157,8 +158,13 @@ private:
#endif
gl::VertexBuffer<FillVertex, gl::Triangles> tileTriangleVertexBuffer;
- gl::VertexBuffer<FillVertex, gl::LineStrip> tileLineStripVertexBuffer;
+ gl::SegmentVector<FillAttributes> tileTriangleSegments;
+
+ gl::VertexBuffer<DebugVertex, gl::LineStrip> tileBorderVertexBuffer;
+ gl::SegmentVector<DebugAttributes> tileBorderSegments;
+
gl::VertexBuffer<RasterVertex, gl::TriangleStrip> rasterVertexBuffer;
+ gl::SegmentVector<RasterAttributes> rasterSegments;
};
} // namespace mbgl
diff --git a/src/mbgl/renderer/painter_background.cpp b/src/mbgl/renderer/painter_background.cpp
index 5e71cb7b20..4e87829914 100644
--- a/src/mbgl/renderer/painter_background.cpp
+++ b/src/mbgl/renderer/painter_background.cpp
@@ -44,7 +44,8 @@ void Painter::renderBackground(PaintParameters& parameters, const BackgroundLaye
tileID,
state
),
- tileTriangleVertexBuffer
+ tileTriangleVertexBuffer,
+ tileTriangleSegments
);
}
} else {
@@ -62,7 +63,8 @@ void Painter::renderBackground(PaintParameters& parameters, const BackgroundLaye
uniforms::u_outline_color::Value{ properties.backgroundColor.value },
uniforms::u_world::Value{ context.viewport.getCurrentValue().size },
},
- tileTriangleVertexBuffer
+ tileTriangleVertexBuffer,
+ tileTriangleSegments
);
}
}
diff --git a/src/mbgl/renderer/painter_clipping.cpp b/src/mbgl/renderer/painter_clipping.cpp
index 2054424475..2b876667c9 100644
--- a/src/mbgl/renderer/painter_clipping.cpp
+++ b/src/mbgl/renderer/painter_clipping.cpp
@@ -26,7 +26,8 @@ void Painter::renderClippingMask(const UnwrappedTileID& tileID, const ClipID& cl
uniforms::u_outline_color::Value{ Color {} },
uniforms::u_world::Value{ context.viewport.getCurrentValue().size },
},
- tileTriangleVertexBuffer
+ tileTriangleVertexBuffer,
+ tileTriangleSegments
);
}
diff --git a/src/mbgl/renderer/painter_debug.cpp b/src/mbgl/renderer/painter_debug.cpp
index 8969354d23..d0fb9f3435 100644
--- a/src/mbgl/renderer/painter_debug.cpp
+++ b/src/mbgl/renderer/painter_debug.cpp
@@ -18,7 +18,7 @@ void Painter::renderTileDebug(const RenderTile& renderTile) {
MBGL_DEBUG_GROUP(std::string { "debug " } + util::toString(renderTile.id));
- auto draw = [&] (Color color, const auto& vertexBuffer, auto drawMode) {
+ auto draw = [&] (Color color, const auto& vertexBuffer, const auto& segments, auto drawMode) {
programs->debug.draw(
context,
drawMode,
@@ -29,7 +29,8 @@ void Painter::renderTileDebug(const RenderTile& renderTile) {
uniforms::u_matrix::Value{ renderTile.matrix },
uniforms::u_color::Value{ color }
},
- vertexBuffer
+ vertexBuffer,
+ segments
);
};
@@ -45,12 +46,22 @@ void Painter::renderTileDebug(const RenderTile& renderTile) {
tile.expires, frame.debugOptions, context);
}
- draw(Color::white(), tile.debugBucket->vertexBuffer, gl::Lines { 4.0f * frame.pixelRatio });
- draw(Color::black(), tile.debugBucket->vertexBuffer, gl::Lines { 2.0f * frame.pixelRatio });
+ draw(Color::white(),
+ tile.debugBucket->vertexBuffer,
+ tile.debugBucket->segments,
+ gl::Lines { 4.0f * frame.pixelRatio });
+
+ draw(Color::black(),
+ tile.debugBucket->vertexBuffer,
+ tile.debugBucket->segments,
+ gl::Lines { 2.0f * frame.pixelRatio });
}
if (frame.debugOptions & MapDebugOptions::TileBorders) {
- draw(Color::red(), tileLineStripVertexBuffer, gl::LineStrip { 4.0f * frame.pixelRatio });
+ draw(Color::red(),
+ tileBorderVertexBuffer,
+ tileBorderSegments,
+ gl::LineStrip { 4.0f * frame.pixelRatio });
}
}
diff --git a/src/mbgl/renderer/painter_raster.cpp b/src/mbgl/renderer/painter_raster.cpp
index e19cde289a..fe25878016 100644
--- a/src/mbgl/renderer/painter_raster.cpp
+++ b/src/mbgl/renderer/painter_raster.cpp
@@ -75,7 +75,8 @@ void Painter::renderRaster(PaintParameters& parameters,
uniforms::u_scale_parent::Value{ 1.0f },
uniforms::u_tl_parent::Value{ std::array<float, 2> {{ 0.0f, 0.0f }} },
},
- rasterVertexBuffer
+ rasterVertexBuffer,
+ rasterSegments
);
}
diff --git a/src/mbgl/renderer/symbol_bucket.hpp b/src/mbgl/renderer/symbol_bucket.hpp
index 327049b280..e5c44d8a3c 100644
--- a/src/mbgl/renderer/symbol_bucket.hpp
+++ b/src/mbgl/renderer/symbol_bucket.hpp
@@ -36,7 +36,7 @@ public:
struct TextBuffer {
gl::VertexVector<SymbolVertex> vertices;
gl::IndexVector<gl::Triangles> triangles;
- std::vector<gl::Segment> segments;
+ gl::SegmentVector<SymbolAttributes> segments;
optional<gl::VertexBuffer<SymbolVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Triangles>> indexBuffer;
@@ -45,7 +45,7 @@ public:
struct IconBuffer {
gl::VertexVector<SymbolVertex> vertices;
gl::IndexVector<gl::Triangles> triangles;
- std::vector<gl::Segment> segments;
+ gl::SegmentVector<SymbolAttributes> segments;
optional<gl::VertexBuffer<SymbolVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Triangles>> indexBuffer;
@@ -54,7 +54,7 @@ public:
struct CollisionBoxBuffer {
gl::VertexVector<CollisionBoxVertex> vertices;
gl::IndexVector<gl::Lines> lines;
- std::vector<gl::Segment> segments;
+ gl::SegmentVector<CollisionBoxAttributes> segments;
optional<gl::VertexBuffer<CollisionBoxVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Lines>> indexBuffer;