Add workaround for android emulator as crash on Android emulation is still presented (#3310)

This commit is contained in:
Tetiana Gubanova
2025-03-20 14:44:57 +02:00
committed by GitHub
parent 92e9a46c1d
commit 52b9e3270f
8 changed files with 62 additions and 5 deletions

View File

@@ -67,6 +67,7 @@ private:
/// Remove all the drawables for tiles
/// @return The number of drawables actually removed.
std::size_t removeAllDrawables() override;
#endif
// Paint properties

View File

@@ -98,6 +98,10 @@ public:
const std::shared_ptr<UpdateParameters>&,
const RenderTree&,
UniqueChangeRequestVec&) override;
/// Remove all the drawables for tiles
std::size_t removeAllDrawables() override;
#endif // MLN_DRAWABLE_RENDERER
protected:
@@ -120,8 +124,6 @@ protected:
/// Remove all drawables for the tile from the layer group
std::size_t removeTile(RenderPass, const OverscaledTileID&) override;
/// Remove all the drawables for tiles
std::size_t removeAllDrawables() override;
#endif // MLN_DRAWABLE_RENDERER
private:

View File

@@ -191,6 +191,9 @@ public:
/// Returns the current renderability mode of the layer
bool isLayerRenderable() const noexcept { return isRenderable; }
/// Remove all the drawables for tiles
virtual std::size_t removeAllDrawables();
#endif
using Dependency = style::expression::Dependency;
@@ -247,9 +250,6 @@ protected:
/// @return The number of drawables actually removed.
virtual std::size_t removeTile(RenderPass, const OverscaledTileID&);
/// Remove all the drawables for tiles
virtual std::size_t removeAllDrawables();
/// Update `renderTileIDs` from `renderTiles`
void updateRenderTileIDs();

View File

@@ -983,6 +983,13 @@ void RenderOrchestrator::updateLayers(gfx::ShaderRegistry& shaders,
for (const auto& item : items) {
auto& renderLayer = item.layer.get();
#if MLN_RENDER_BACKEND_OPENGL
// Android Emulator: Goldfish is *very* broken. This will prevent a crash
// inside the GL translation layer at the cost of emulator performance.
if (androidGoldfishMitigationEnabled) {
renderLayer.removeAllDrawables();
}
#endif
renderLayer.update(shaders, context, state, updateParameters, renderTree, changes);
}
addChanges(changes);

View File

@@ -61,6 +61,10 @@ public:
const std::optional<std::string>& localFontFamily_);
~RenderOrchestrator() override;
#if MLN_RENDER_BACKEND_OPENGL
void enableAndroidEmulatorGoldfishMitigation(bool enable) { androidGoldfishMitigationEnabled = enable; }
#endif
void markContextLost() { contextLost = true; };
// TODO: Introduce RenderOrchestratorObserver.
void setObserver(RendererObserver*);
@@ -220,6 +224,10 @@ private:
bool placedSymbolDataCollected = false;
bool tileCacheEnabled = true;
#if MLN_RENDER_BACKEND_OPENGL
bool androidGoldfishMitigationEnabled{false};
#endif
// Vectors with reserved capacity of layerImpls->size() to avoid
// reallocation on each frame.
std::vector<Immutable<style::LayerProperties>> filteredLayersForSource;

View File

@@ -152,4 +152,10 @@ void Renderer::clearData() {
impl->orchestrator.clearData();
}
#if MLN_RENDER_BACKEND_OPENGL
void Renderer::enableAndroidEmulatorGoldfishMitigation(bool enable) {
impl->orchestrator.enableAndroidEmulatorGoldfishMitigation(enable);
}
#endif
} // namespace mbgl