#include #include #include #include #include #include #include #include #include namespace mbgl { using namespace style; RenderLayer::RenderLayer(Immutable properties) : evaluatedProperties(std::move(properties)), baseImpl(evaluatedProperties->baseImpl) { } void RenderLayer::transition(const TransitionParameters& parameters, Immutable newImpl) { baseImpl = std::move(newImpl); transition(parameters); } bool RenderLayer::needsPlacement() const { return baseImpl->getTypeInfo()->crossTileIndex == style::LayerTypeInfo::CrossTileIndex::Required && !placementData.empty(); } const std::string& RenderLayer::getID() const { return baseImpl->id; } bool RenderLayer::hasRenderPass(RenderPass pass) const { return passes & pass; } bool RenderLayer::needsRendering() const { return passes != RenderPass::None && baseImpl->visibility != style::VisibilityType::None; } bool RenderLayer::supportsZoom(float zoom) const { // TODO: shall we use rounding or epsilon comparisons? return baseImpl->minZoom <= zoom && baseImpl->maxZoom >= zoom; } void RenderLayer::prepare(const LayerPrepareParameters& params) { assert(params.source); assert(params.source->isEnabled()); renderTiles = params.source->getRenderTiles(); addRenderPassesFromTiles(); } optional RenderLayer::getSolidBackground() const { return nullopt; } void RenderLayer::markContextDestroyed() { // no-op } void RenderLayer::checkRenderability(const PaintParameters& parameters, const uint32_t activeBindingCount) { // Only warn once for every layer. if (hasRenderFailures) { return; } if (activeBindingCount > parameters.context.maximumVertexBindingCount) { Log::Error(Event::OpenGL, "The layer '%s' uses more data-driven properties than the current device " "supports, and will have rendering errors. To ensure compatibility with this " "device, use %d fewer data driven properties in this layer.", getID().c_str(), activeBindingCount - gfx::Context::minimumRequiredVertexBindingCount); hasRenderFailures = true; } else if (activeBindingCount > gfx::Context::minimumRequiredVertexBindingCount) { Log::Warning(Event::OpenGL, "The layer '%s' uses more data-driven properties than some devices may support. " "Though it will render correctly on this device, it may have rendering errors " "on other devices. To ensure compatibility with all devices, use %d fewer " "data-driven properties in this layer.", getID().c_str(), activeBindingCount - gfx::Context::minimumRequiredVertexBindingCount); hasRenderFailures = true; } } 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