summaryrefslogtreecommitdiff
path: root/src/mbgl/tile/geometry_tile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/tile/geometry_tile.cpp')
-rw-r--r--src/mbgl/tile/geometry_tile.cpp26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp
index 0b9ba263f5..e87d21503a 100644
--- a/src/mbgl/tile/geometry_tile.cpp
+++ b/src/mbgl/tile/geometry_tile.cpp
@@ -6,6 +6,7 @@
#include <mbgl/style/layer_impl.hpp>
#include <mbgl/style/layers/background_layer.hpp>
#include <mbgl/style/layers/custom_layer.hpp>
+#include <mbgl/renderer/render_source.hpp>
#include <mbgl/renderer/tile_parameters.hpp>
#include <mbgl/renderer/layers/render_background_layer.hpp>
#include <mbgl/renderer/layers/render_custom_layer.hpp>
@@ -20,6 +21,8 @@
#include <mbgl/actor/scheduler.hpp>
#include <mbgl/renderer/tile_render_data.hpp>
+#include <mbgl/gfx/upload_pass.hpp>
+
namespace mbgl {
LayerRenderData* GeometryTile::LayoutResult::getLayerRenderData(const style::Layer::Impl& layerImpl) {
@@ -39,11 +42,9 @@ class GeometryTileRenderData final : public TileRenderData {
public:
GeometryTileRenderData(
std::shared_ptr<GeometryTile::LayoutResult> layoutResult_,
- std::shared_ptr<TileAtlasTextures> atlasTextures_,
- ImageManager& imageManager_)
+ std::shared_ptr<TileAtlasTextures> atlasTextures_)
: TileRenderData(std::move(atlasTextures_))
- , layoutResult(std::move(layoutResult_))
- , imageManager(imageManager_) {
+ , layoutResult(std::move(layoutResult_)) {
}
private:
@@ -52,9 +53,10 @@ private:
const LayerRenderData* getLayerRenderData(const style::Layer::Impl&) const override;
Bucket* getBucket(const style::Layer::Impl&) const override;
void upload(gfx::UploadPass&) override;
+ void prepare(const SourcePrepareParameters&) override;
std::shared_ptr<GeometryTile::LayoutResult> layoutResult;
- ImageManager& imageManager;
+ std::vector<ImagePatch> imagePatches;
};
using namespace style;
@@ -95,11 +97,19 @@ void GeometryTileRenderData::upload(gfx::UploadPass& uploadPass) {
layoutResult->iconAtlas.image = {};
}
- if (atlasTextures->icon) {
- layoutResult->iconAtlas.patchUpdatedImages(uploadPass, *atlasTextures->icon, imageManager);
+ if (atlasTextures->icon && !imagePatches.empty()) {
+ for (const auto& imagePatch : imagePatches) { // patch updated images.
+ uploadPass.updateTextureSub(*atlasTextures->icon, imagePatch.image->image, imagePatch.textureRect.x, imagePatch.textureRect.y);
+ }
+ imagePatches.clear();
}
}
+void GeometryTileRenderData::prepare(const SourcePrepareParameters& parameters) {
+ if (!layoutResult) return;
+ imagePatches = layoutResult->iconAtlas.getImagePatchesAndUpdateVersions(parameters.imageManager);
+}
+
Bucket* GeometryTileRenderData::getBucket(const Layer::Impl& layer) const {
const LayerRenderData* data = getLayerRenderData(layer);
return data ? data->bucket.get() : nullptr;
@@ -176,7 +186,7 @@ void GeometryTile::setData(std::unique_ptr<const GeometryTileData> data_) {
}
std::unique_ptr<TileRenderData> GeometryTile::createRenderData() {
- return std::make_unique<GeometryTileRenderData>(layoutResult, atlasTextures, imageManager);
+ return std::make_unique<GeometryTileRenderData>(layoutResult, atlasTextures);
}
void GeometryTile::setLayers(const std::vector<Immutable<LayerProperties>>& layers) {