From f3815fdfba99fe1eeff48c3bae0b60d783cb4e96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Mon, 10 Jul 2017 21:42:13 +0200 Subject: [core] move RasterBucket to Drawable --- src/mbgl/renderer/buckets/raster_bucket.cpp | 21 +++++++++---------- src/mbgl/renderer/buckets/raster_bucket.hpp | 11 +++++----- src/mbgl/renderer/indexed_primitives.hpp | 4 ++++ src/mbgl/renderer/painter.hpp | 4 +++- src/mbgl/renderer/painters/painter_raster.cpp | 8 ++++---- src/mbgl/renderer/sources/render_image_source.cpp | 25 +++++++++++------------ 6 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/mbgl/renderer/buckets/raster_bucket.cpp b/src/mbgl/renderer/buckets/raster_bucket.cpp index 49ec0065c3..ea35582196 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.cpp +++ b/src/mbgl/renderer/buckets/raster_bucket.cpp @@ -16,34 +16,33 @@ void RasterBucket::upload(gl::Context& context) { if (!texture) { texture = context.createTexture(image); } - if (!vertices.empty()) { - vertexBuffer = context.createVertexBuffer(std::move(vertices)); - indexBuffer = context.createIndexBuffer(std::move(indices)); + if (!primitives.empty()) { + drawable.emplace(context, std::move(primitives)); } uploaded = true; } void RasterBucket::clear() { - vertexBuffer = {}; - indexBuffer = {}; - segments.clear(); - vertices.clear(); - indices.clear(); - + primitives = {}; + drawable = std::experimental::nullopt; uploaded = false; } + void RasterBucket::render(Painter& painter, PaintParameters& parameters, const RenderLayer& layer, const RenderTile& tile) { - painter.renderRaster(parameters, *this, *layer.as(), tile.matrix, false); + painter.renderRaster(parameters, *this, *layer.as(), tile.matrix, + painter.rasterDrawable); } void RasterBucket::render(Painter& painter, PaintParameters& parameters, const RenderLayer& layer, const mat4& matrix) { - painter.renderRaster(parameters, *this, *layer.as(), matrix, true); + if (drawable) { + painter.renderRaster(parameters, *this, *layer.as(), matrix, *drawable); + } } bool RasterBucket::hasData() const { diff --git a/src/mbgl/renderer/buckets/raster_bucket.hpp b/src/mbgl/renderer/buckets/raster_bucket.hpp index b5cf7997d5..286287c0db 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.hpp +++ b/src/mbgl/renderer/buckets/raster_bucket.hpp @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include #include #include @@ -27,14 +29,11 @@ public: UnassociatedImage image; optional texture; + // Bucket specific vertices are used for Image Sources only // Raster Tile Sources use the default buffers from Painter - gl::VertexVector vertices; - gl::IndexVector indices; - gl::SegmentVector segments; - - optional> vertexBuffer; - optional> indexBuffer; + IndexedPrimitives primitives; + optional> drawable; }; } // namespace mbgl diff --git a/src/mbgl/renderer/indexed_primitives.hpp b/src/mbgl/renderer/indexed_primitives.hpp index c75fe61b18..8f76b60c1d 100644 --- a/src/mbgl/renderer/indexed_primitives.hpp +++ b/src/mbgl/renderer/indexed_primitives.hpp @@ -47,6 +47,10 @@ public: segment.indexLength += i.size() * DrawMode::bufferGroupSize; } + bool empty() const { + return segmentInfo.empty(); + } + // Accessors for test suite. const gl::VertexVector& getVertices() const { return vertices; diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index 9e81f50a5a..1aa3c78fce 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -80,6 +80,8 @@ public: void cleanup(); + using RasterDrawable = Drawable; + void renderClippingMask(const UnwrappedTileID&, const ClipID&); void renderTileDebug(const RenderTile&); void renderTileDebug(const mat4& matrix); @@ -88,7 +90,7 @@ public: void renderLine(PaintParameters&, LineBucket&, const RenderLineLayer&, const RenderTile&); void renderCircle(PaintParameters&, CircleBucket&, const RenderCircleLayer&, const RenderTile&); void renderSymbol(PaintParameters&, SymbolBucket&, const RenderSymbolLayer&, const RenderTile&); - void renderRaster(PaintParameters&, RasterBucket&, const RenderRasterLayer&, const mat4&, bool useBucketBuffers /* = false */); + void renderRaster(PaintParameters&, RasterBucket&, const RenderRasterLayer&, const mat4&, const RasterDrawable&); void renderBackground(PaintParameters&, const RenderBackgroundLayer&); void renderItem(PaintParameters&, const RenderItem&); diff --git a/src/mbgl/renderer/painters/painter_raster.cpp b/src/mbgl/renderer/painters/painter_raster.cpp index aa092e94b4..5b5c4cc45c 100644 --- a/src/mbgl/renderer/painters/painter_raster.cpp +++ b/src/mbgl/renderer/painters/painter_raster.cpp @@ -43,7 +43,7 @@ void Painter::renderRaster(PaintParameters& parameters, RasterBucket& bucket, const RenderRasterLayer& layer, const mat4& matrix, - bool useBucketBuffers = false) { + const RasterDrawable& drawable) { if (pass != RenderPass::Translucent) return; if (!bucket.hasData()) @@ -77,9 +77,9 @@ void Painter::renderRaster(PaintParameters& parameters, uniforms::u_scale_parent::Value{ 1.0f }, uniforms::u_tl_parent::Value{ std::array {{ 0.0f, 0.0f }} }, }, - useBucketBuffers ? *bucket.vertexBuffer : rasterDrawable.vertices, - useBucketBuffers ? *bucket.indexBuffer : rasterDrawable.indices, - useBucketBuffers ? bucket.segments : rasterDrawable.segments, + drawable.vertices, + drawable.indices, + drawable.segments, paintAttributeData, properties, state.getZoom() diff --git a/src/mbgl/renderer/sources/render_image_source.cpp b/src/mbgl/renderer/sources/render_image_source.cpp index d9c0355573..c4cb946349 100644 --- a/src/mbgl/renderer/sources/render_image_source.cpp +++ b/src/mbgl/renderer/sources/render_image_source.cpp @@ -147,19 +147,18 @@ void RenderImageSource::update(Immutable baseImpl_, } // Set Bucket Vertices, Indices, and segments - bucket->vertices.emplace_back( - RasterProgram::layoutVertex({ geomCoords[0].x, geomCoords[0].y }, { 0, 0 })); - bucket->vertices.emplace_back( - RasterProgram::layoutVertex({ geomCoords[1].x, geomCoords[1].y }, { 32767, 0 })); - bucket->vertices.emplace_back( - RasterProgram::layoutVertex({ geomCoords[3].x, geomCoords[3].y }, { 0, 32767 })); - bucket->vertices.emplace_back( - RasterProgram::layoutVertex({ geomCoords[2].x, geomCoords[2].y }, { 32767, 32767 })); - - bucket->indices.emplace_back(0, 1, 2); - bucket->indices.emplace_back(1, 2, 3); - - bucket->segments.emplace_back(gl::SegmentInfo{ 0, 0, 4, 6 }); + bucket->primitives.add( + { + RasterProgram::layoutVertex({ geomCoords[0].x, geomCoords[0].y }, { 0, 0 }), + RasterProgram::layoutVertex({ geomCoords[1].x, geomCoords[1].y }, { 32767, 0 }), + RasterProgram::layoutVertex({ geomCoords[3].x, geomCoords[3].y }, { 0, 32767 }), + RasterProgram::layoutVertex({ geomCoords[2].x, geomCoords[2].y }, { 32767, 32767 }), + }, + { + {{ 0, 1, 2 }}, + {{ 1, 2, 3 }}, + } + ); } void RenderImageSource::render(Painter& painter, -- cgit v1.2.1