[core] Synchronize render passes and render tiles
Before this change render passes were assigned for the whole layer at properties evaluation stage. This caused problems, as layer render data are bound to the tile and these data might differ from tile to tile, depending on which tile has been updated by the tile worker and which has not been yet updated. This change takes into consideration the actual render passes required for each tile and combines them for the layer render passes. Naturally, this change also introduces render pass check for each render layer in `RenderLayer::render()` implementations.
This commit is contained in:
@@ -48,7 +48,7 @@ bool RenderLayer::supportsZoom(float zoom) const {
|
||||
void RenderLayer::prepare(const LayerPrepareParameters& params) {
|
||||
assert(params.source);
|
||||
renderTiles = params.source->getRenderTiles();
|
||||
assert(renderTiles);
|
||||
addRenderPassesFromTiles();
|
||||
}
|
||||
|
||||
optional<Color> RenderLayer::getSolidBackground() const {
|
||||
@@ -86,5 +86,21 @@ void RenderLayer::checkRenderability(const PaintParameters& parameters,
|
||||
}
|
||||
}
|
||||
|
||||
void RenderLayer::addRenderPassesFromTiles() {
|
||||
assert(renderTiles);
|
||||
for (const RenderTile& tile : *renderTiles) {
|
||||
if (const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl)) {
|
||||
passes |= RenderPass(renderData->layerProperties->renderPasses);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const LayerRenderData* RenderLayer::getRenderDataForPass(const RenderTile& tile, RenderPass pass) const {
|
||||
if (const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl)) {
|
||||
return bool(RenderPass(renderData->layerProperties->renderPasses) & pass) ? renderData : nullptr;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} //namespace mbgl
|
||||
|
||||
|
||||
Reference in New Issue
Block a user