Skip to content

[Android][Impeller][Regression] WebView renders blurry/low-resolution with Impeller OpenGLES on ARM Mali-G52 (Flutter 3.44.1) #187505

Description

@bartvhooft

Steps to reproduce

  1. Clone https://github.com/bartvhooft/flutter-impeller-webview-repro
  2. Connect Android device with ARM Mali-G52 GPU (tested: Rockchip RK3576, Android 14 API 34)
  3. Run broken build (Impeller enabled):
    flutter run --flavor impellerOn --dart-define=IMPELLER_ENABLED=true
  4. Observe WebView rendering https://flutter.dev
  5. Run fixed build (Impeller disabled):
    flutter run --flavor impellerOff --dart-define=IMPELLER_ENABLED=false
  6. Compare WebView rendering

Expected results

WebView renders at full resolution with sharp text and crisp edges.

Actual results

With Impeller enabled, WebView renders blurry/low-resolution. Text is fuzzy,
button edges are soft, content appears upscaled from a lower resolution.

The degradation is only visible on the physical screen — Android screenshots
partially mask the issue (screenshot capture reads from the composited
framebuffer, not the display output).

Setting EnableImpeller=false (Skia fallback) restores correct rendering
with no other change.

Regression: working on Flutter 3.41.7, broken on 3.44.1.

Impeller backend in use: OpenGLES (not Vulkan). Vulkan layers load on the
device but Flutter never initializes a Vulkan context — goes straight to
OpenGLES. Platform view uses SurfaceProducer with legacy composition strategy.

Code sample

https://github.com/bartvhooft/flutter-impeller-webview-repro

Two Android product flavors control EnableImpeller via AndroidManifest.xml:

  • impellerOn: EnableImpeller=true (broken)
  • impellerOff: EnableImpeller=false (fixed)

Screenshots or Video

Impeller ON
Image

Impeller OFF
Image

Impeller ON
Image

Impeller OFF
Image

Logs

Logs
D vulkan  : added global layer 'VK_LAYER_KHRONOS_validation' ...
D libEGL  : loaded /vendor/lib64/egl/libGLES_mali.so
I flutter : [IMPORTANT:...android_context_gl_impeller.cc(104)] Using the Impeller rendering backend (OpenGLES).
I PlatformViewsChannel: Using legacy platform view rendering strategy.
I PlatformViewsController: PlatformView is using SurfaceProducer backend
I mali_so : arm_release_ver of this mali_so is 'g15p0-01eac0', rk_so_ver is '4'.

Vulkan layers load but no Vulkan context is initialized — Flutter selects OpenGLES directly.

Flutter Doctor output

Doctor output
[✓] Flutter (Channel stable, 3.44.1, on macOS 26.4.1 25E253 darwin-arm64, locale en-US)
    • Flutter version 3.44.1 on channel stable at /Users/bart.vanhooft/.asdf/installs/flutter/3.44.1
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 924134a44c (5 days ago), 2026-05-29 12:13:22 -0400
    • Engine revision c416acfeb8
    • Dart version 3.12.1
    • DevTools version 2.57.0

[✓] Android toolchain - develop for Android devices (Android SDK version 35.0.0)
    • Android SDK at /Users/bart.vanhooft/Library/Android/sdk
    • Platform android-36, build-tools 35.0.0
    • Java binary at: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 17.0.11+0-17.0.11b1207.24-11852314)
    • All Android licenses accepted.

[✓] Connected device (3 available)
    • Kindermann TD 12xx (mobile) • android-arm64 • Android 14 (API 34)
    • GPU: ARM Mali-G52 (GLES: ARM, Mali-G52, OpenGL ES 3.2 v1.g15p0-01eac0)
    • SoC: Rockchip RK3576

Metadata

Metadata

Assignees

No one assigned

    Labels

    c: regressionIt was better in the past than it is nowe: impellerImpeller rendering backend issues and features requestsengineflutter/engine related. See also e: labels.has reproducible stepsThe issue has been confirmed reproducible and is ready to work onteam-engineOwned by Engine team

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions