summaryrefslogtreecommitdiff
path: root/src/mbgl
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2015-10-01 18:17:31 +0200
committerKonstantin Käfer <mail@kkaefer.com>2015-10-02 15:05:19 +0200
commit3d834b5c40f28cd8fd19fb285435c5cfafd32af4 (patch)
treeeecbc4979a36188909f67802c3753824b411ac7f /src/mbgl
parent6a78a4763d46fe5f0bde4ca72446fd4ccb0ea4bc (diff)
downloadqtlocation-mapboxgl-3d834b5c40f28cd8fd19fb285435c5cfafd32af4.tar.gz
give every bucket its own set of buffers
This allows changing individual buckets without having leftover data
Diffstat (limited to 'src/mbgl')
-rw-r--r--src/mbgl/map/tile_worker.cpp10
-rw-r--r--src/mbgl/map/tile_worker.hpp11
-rw-r--r--src/mbgl/renderer/circle_bucket.cpp11
-rw-r--r--src/mbgl/renderer/circle_bucket.hpp9
-rw-r--r--src/mbgl/renderer/fill_bucket.cpp24
-rw-r--r--src/mbgl/renderer/fill_bucket.hpp16
-rw-r--r--src/mbgl/renderer/line_bucket.cpp20
-rw-r--r--src/mbgl/renderer/line_bucket.hpp9
8 files changed, 33 insertions, 77 deletions
diff --git a/src/mbgl/map/tile_worker.cpp b/src/mbgl/map/tile_worker.cpp
index 06de585a3c..bbbfec1da6 100644
--- a/src/mbgl/map/tile_worker.cpp
+++ b/src/mbgl/map/tile_worker.cpp
@@ -186,17 +186,14 @@ void TileWorker::addBucketGeometries(Bucket& bucket, const GeometryTileLayer& la
std::unique_ptr<Bucket> TileWorker::createFillBucket(const GeometryTileLayer& layer,
const StyleBucket& bucket_desc) {
- auto bucket = std::make_unique<FillBucket>(fillVertexBuffer,
- triangleElementsBuffer,
- lineElementsBuffer);
+ auto bucket = std::make_unique<FillBucket>();
addBucketGeometries(bucket, layer, bucket_desc.filter);
return bucket->hasData() ? std::move(bucket) : nullptr;
}
std::unique_ptr<Bucket> TileWorker::createLineBucket(const GeometryTileLayer& layer,
const StyleBucket& bucket_desc) {
- auto bucket = std::make_unique<LineBucket>(lineVertexBuffer,
- triangleElementsBuffer);
+ auto bucket = std::make_unique<LineBucket>();
const float z = id.z;
auto& layout = bucket->layout;
@@ -212,8 +209,7 @@ std::unique_ptr<Bucket> TileWorker::createLineBucket(const GeometryTileLayer& la
std::unique_ptr<Bucket> TileWorker::createCircleBucket(const GeometryTileLayer& layer,
const StyleBucket& bucket_desc) {
- auto bucket = std::make_unique<CircleBucket>(circleVertexBuffer,
- triangleElementsBuffer);
+ auto bucket = std::make_unique<CircleBucket>();
// Circle does not have layout properties to apply.
diff --git a/src/mbgl/map/tile_worker.hpp b/src/mbgl/map/tile_worker.hpp
index b045ae0f6e..6f5a9d5126 100644
--- a/src/mbgl/map/tile_worker.hpp
+++ b/src/mbgl/map/tile_worker.hpp
@@ -4,10 +4,6 @@
#include <mapbox/variant.hpp>
#include <mbgl/map/tile_data.hpp>
-#include <mbgl/geometry/elements_buffer.hpp>
-#include <mbgl/geometry/fill_buffer.hpp>
-#include <mbgl/geometry/line_buffer.hpp>
-#include <mbgl/geometry/circle_buffer.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/ptr.hpp>
#include <mbgl/style/filter_expression.hpp>
@@ -69,13 +65,6 @@ private:
bool partialParse = false;
- FillVertexBuffer fillVertexBuffer;
- LineVertexBuffer lineVertexBuffer;
- CircleVertexBuffer circleVertexBuffer;
-
- TriangleElementsBuffer triangleElementsBuffer;
- LineElementsBuffer lineElementsBuffer;
-
std::unique_ptr<CollisionTile> collisionTile;
// Contains all the Bucket objects for the tile. Buckets are render
diff --git a/src/mbgl/renderer/circle_bucket.cpp b/src/mbgl/renderer/circle_bucket.cpp
index ae8eeef9dc..a9433eecbc 100644
--- a/src/mbgl/renderer/circle_bucket.cpp
+++ b/src/mbgl/renderer/circle_bucket.cpp
@@ -5,12 +5,7 @@
using namespace mbgl;
-CircleBucket::CircleBucket(CircleVertexBuffer& vertexBuffer,
- TriangleElementsBuffer& elementsBuffer)
- : vertexBuffer_(vertexBuffer)
- , elementsBuffer_(elementsBuffer)
- , vertexStart_(vertexBuffer_.index())
- , elementsStart_(elementsBuffer_.index()) {
+CircleBucket::CircleBucket() {
}
CircleBucket::~CircleBucket() {
@@ -78,8 +73,8 @@ void CircleBucket::addGeometry(const GeometryCollection& geometryCollection) {
}
void CircleBucket::drawCircles(CircleShader& shader) {
- GLbyte *vertexIndex = BUFFER_OFFSET(vertexStart_ * vertexBuffer_.itemSize);
- GLbyte *elementsIndex = BUFFER_OFFSET(elementsStart_ * elementsBuffer_.itemSize);
+ GLbyte* vertexIndex = BUFFER_OFFSET(0);
+ GLbyte* elementsIndex = BUFFER_OFFSET(0);
for (auto& group : triangleGroups_) {
assert(group);
diff --git a/src/mbgl/renderer/circle_bucket.hpp b/src/mbgl/renderer/circle_bucket.hpp
index d25cbdad3b..d7908cf02e 100644
--- a/src/mbgl/renderer/circle_bucket.hpp
+++ b/src/mbgl/renderer/circle_bucket.hpp
@@ -20,7 +20,7 @@ class CircleBucket : public Bucket {
using TriangleGroup = ElementGroup<3>;
public:
- CircleBucket(CircleVertexBuffer &vertexBuffer, TriangleElementsBuffer &elementsBuffer);
+ CircleBucket();
~CircleBucket() override;
void upload() override;
@@ -32,11 +32,8 @@ public:
void drawCircles(CircleShader& shader);
private:
- CircleVertexBuffer& vertexBuffer_;
- TriangleElementsBuffer& elementsBuffer_;
-
- const GLsizei vertexStart_;
- const GLsizei elementsStart_;
+ CircleVertexBuffer vertexBuffer_;
+ TriangleElementsBuffer elementsBuffer_;
std::vector<std::unique_ptr<TriangleGroup>> triangleGroups_;
};
diff --git a/src/mbgl/renderer/fill_bucket.cpp b/src/mbgl/renderer/fill_bucket.cpp
index 38263b3a47..0fbb02e7c1 100644
--- a/src/mbgl/renderer/fill_bucket.cpp
+++ b/src/mbgl/renderer/fill_bucket.cpp
@@ -28,9 +28,7 @@ void FillBucket::free(void *, void *ptr) {
::free(ptr);
}
-FillBucket::FillBucket(FillVertexBuffer &vertexBuffer_,
- TriangleElementsBuffer &triangleElementsBuffer_,
- LineElementsBuffer &lineElementsBuffer_)
+FillBucket::FillBucket()
: allocator(new TESSalloc{
&alloc,
&realloc,
@@ -43,13 +41,7 @@ FillBucket::FillBucket(FillVertexBuffer &vertexBuffer_,
8, // regionBucketSize
128, // extraVertices allocated for the priority queue.
}),
- tesselator(tessNewTess(allocator)),
- vertexBuffer(vertexBuffer_),
- triangleElementsBuffer(triangleElementsBuffer_),
- lineElementsBuffer(lineElementsBuffer_),
- vertex_start(vertexBuffer_.index()),
- triangle_elements_start(triangleElementsBuffer_.index()),
- line_elements_start(lineElementsBuffer.index()) {
+ tesselator(tessNewTess(allocator)) {
assert(tesselator);
}
@@ -216,8 +208,8 @@ bool FillBucket::hasData() const {
}
void FillBucket::drawElements(PlainShader& shader) {
- GLbyte *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);
- GLbyte *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize);
+ GLbyte* vertex_index = BUFFER_OFFSET(0);
+ GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : triangleGroups) {
assert(group);
group->array[0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index);
@@ -228,8 +220,8 @@ void FillBucket::drawElements(PlainShader& shader) {
}
void FillBucket::drawElements(PatternShader& shader) {
- GLbyte *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);
- GLbyte *elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize);
+ GLbyte* vertex_index = BUFFER_OFFSET(0);
+ GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : triangleGroups) {
assert(group);
group->array[1].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index);
@@ -240,8 +232,8 @@ void FillBucket::drawElements(PatternShader& shader) {
}
void FillBucket::drawVertices(OutlineShader& shader) {
- GLbyte *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);
- GLbyte *elements_index = BUFFER_OFFSET(line_elements_start * lineElementsBuffer.itemSize);
+ GLbyte* vertex_index = BUFFER_OFFSET(0);
+ GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : lineGroups) {
assert(group);
group->array[0].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index);
diff --git a/src/mbgl/renderer/fill_bucket.hpp b/src/mbgl/renderer/fill_bucket.hpp
index 1e02852544..10ee65fd01 100644
--- a/src/mbgl/renderer/fill_bucket.hpp
+++ b/src/mbgl/renderer/fill_bucket.hpp
@@ -4,6 +4,7 @@
#include <mbgl/renderer/bucket.hpp>
#include <mbgl/map/geometry_tile.hpp>
#include <mbgl/geometry/elements_buffer.hpp>
+#include <mbgl/geometry/fill_buffer.hpp>
#include <clipper/clipper.hpp>
#include <libtess2/tesselator.h>
@@ -28,9 +29,7 @@ class FillBucket : public Bucket {
typedef ElementGroup<1> LineGroup;
public:
- FillBucket(FillVertexBuffer &vertexBuffer,
- TriangleElementsBuffer &triangleElementsBuffer,
- LineElementsBuffer &lineElementsBuffer);
+ FillBucket();
~FillBucket() override;
void upload() override;
@@ -49,14 +48,9 @@ private:
TESStesselator *tesselator;
ClipperLib::Clipper clipper;
- FillVertexBuffer& vertexBuffer;
- TriangleElementsBuffer& triangleElementsBuffer;
- LineElementsBuffer& lineElementsBuffer;
-
- // hold information on where the vertices are located in the FillBuffer
- const GLsizei vertex_start;
- const GLsizei triangle_elements_start;
- const GLsizei line_elements_start;
+ FillVertexBuffer vertexBuffer;
+ TriangleElementsBuffer triangleElementsBuffer;
+ LineElementsBuffer lineElementsBuffer;
std::vector<std::unique_ptr<TriangleGroup>> triangleGroups;
std::vector<std::unique_ptr<LineGroup>> lineGroups;
diff --git a/src/mbgl/renderer/line_bucket.cpp b/src/mbgl/renderer/line_bucket.cpp
index 9f4d060fce..8824b6fed9 100644
--- a/src/mbgl/renderer/line_bucket.cpp
+++ b/src/mbgl/renderer/line_bucket.cpp
@@ -14,12 +14,8 @@
using namespace mbgl;
-LineBucket::LineBucket(LineVertexBuffer& vertexBuffer_,
- TriangleElementsBuffer& triangleElementsBuffer_)
- : vertexBuffer(vertexBuffer_),
- triangleElementsBuffer(triangleElementsBuffer_),
- vertex_start(vertexBuffer_.index()),
- triangle_elements_start(triangleElementsBuffer_.index()){};
+LineBucket::LineBucket() {
+}
LineBucket::~LineBucket() {
// Do not remove. header file only contains forward definitions to unique pointers.
@@ -403,8 +399,8 @@ bool LineBucket::hasData() const {
}
void LineBucket::drawLines(LineShader& shader) {
- GLbyte* vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);
- GLbyte* elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize);
+ GLbyte* vertex_index = BUFFER_OFFSET(0);
+ GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : triangleGroups) {
assert(group);
if (!group->elements_length) {
@@ -419,8 +415,8 @@ void LineBucket::drawLines(LineShader& shader) {
}
void LineBucket::drawLineSDF(LineSDFShader& shader) {
- GLbyte* vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);
- GLbyte* elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize);
+ GLbyte* vertex_index = BUFFER_OFFSET(0);
+ GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : triangleGroups) {
assert(group);
if (!group->elements_length) {
@@ -435,8 +431,8 @@ void LineBucket::drawLineSDF(LineSDFShader& shader) {
}
void LineBucket::drawLinePatterns(LinepatternShader& shader) {
- GLbyte* vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer.itemSize);
- GLbyte* elements_index = BUFFER_OFFSET(triangle_elements_start * triangleElementsBuffer.itemSize);
+ GLbyte* vertex_index = BUFFER_OFFSET(0);
+ GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : triangleGroups) {
assert(group);
if (!group->elements_length) {
diff --git a/src/mbgl/renderer/line_bucket.hpp b/src/mbgl/renderer/line_bucket.hpp
index 2be0cf3924..ce93cb76f9 100644
--- a/src/mbgl/renderer/line_bucket.hpp
+++ b/src/mbgl/renderer/line_bucket.hpp
@@ -25,7 +25,7 @@ class LineBucket : public Bucket {
using TriangleGroup = ElementGroup<3>;
public:
- LineBucket(LineVertexBuffer &vertexBuffer, TriangleElementsBuffer &triangleElementsBuffer);
+ LineBucket();
~LineBucket() override;
void upload() override;
@@ -55,11 +55,8 @@ public:
StyleLayoutLine layout;
private:
- LineVertexBuffer& vertexBuffer;
- TriangleElementsBuffer& triangleElementsBuffer;
-
- const GLsizei vertex_start;
- const GLsizei triangle_elements_start;
+ LineVertexBuffer vertexBuffer;
+ TriangleElementsBuffer triangleElementsBuffer;
GLint e1;
GLint e2;