Skip to content

[Impeller] Impeller (OpenGLES) is far slower than Skia on PowerVR Rogue GE8320 (MT6765) — 100% of scroll frames late and raster-bound, Flutter 3.47.1 #193009

Closed

Description

@codewithsuperior

Related to #192364, but a different GPU vendor and — importantly — the OpenGLES backend rather than Vulkan, so the "poorly implemented Vulkan driver" hypothesis raised there does not cover this case. @gaaclarke asked on that issue whether the regression reproduces on another device; this is that data point.

Steps to reproduce

  1. Build a release APK of a portrait phone app whose main screen is a scrolling column of translucent cards over a full-screen background. The background is four stacked full-screen layers: a linear gradient, a JPEG (~900×1350, BoxFit.cover), a flat scrim Container, and a second linear gradient. No BackdropFilter, no blur, no ShaderMask, no custom shaders. The cards are alpha fill, not blur.
  2. Install on an Infinix X6532C (MediaTek MT6765, PowerVR Rogue GE8320, OpenGL ES 3.2, Android 14, armeabi-v7a, 720×1600 running its 60 Hz mode).
  3. Drive an identical scripted scroll so the input is the same at every build:
for i in $(seq 1 12); do
  adb shell input swipe 360 1250 360 450 220
  adb shell input swipe 360 450 360 1250 220
done
  1. Collect frame timings in-app from SchedulerBinding.instance.addTimingsCallback, counting a frame late when FrameTiming.totalSpan exceeds 16.667 ms, and separately counting frames whose buildDuration or rasterDuration alone exceeds it.
  2. Add the opt-out to AndroidManifest.xml, rebuild, and run the same script again:
<meta-data
    android:name="io.flutter.embedding.android.EnableImpeller"
    android:value="false" />

Expected results

Impeller performs at least as well as Skia, so that removing the opt-out — which is deprecated, and which the engine warns about on every launch — is safe.

Actual results

Under Impeller, every single frame of a scroll is late, and it is raster-bound. Same APK contents, same device, same scripted scroll, three consecutive runs alternating the renderer:

Renderer frames late (totalSpan > 16.667 ms) buildDuration over budget rasterDuration over budget
Impeller (OpenGLES) 400 400 (100%) 4 393
Skia 1000 64 (6.4%) 2 9
Impeller (OpenGLES), again 400 400 (100%) 4 393

Mean frame span under Impeller was 32.8 ms — about 30 fps on a 60 Hz panel — against a smooth result on Skia from identical Dart code.

Mean buildDuration was 1.5 ms in every run, on both renderers, so the framework side and the widget tree are not involved. The entire difference is raster.

The engine selects the GLES backend on this device on its own; this is not a forced configuration. Relevant log line:

[IMPORTANT:flutter/shell/platform/android/android_context_gl_impeller.cc(104)] Using the Impeller rendering backend (OpenGLES).

Notes

  • This is a release build. Unlike [Impeller] Impeller is significantly slower than Skia on Adreno 702 (QCM2290) — 3.5x worse raster, Flutter 3.47.2 #192364, no profile-mode comparison is offered, because the Impeller profile-mode engine artifacts could not be fetched here; everything above is release-to-release.
  • Wrapping the static four-layer background in a RepaintBoundary moved mean raster only from 21.7 ms to 20.6 ms — inside the noise between sessions. So the cost does not appear to be re-rasterising a cacheable background, and I could not find an application-side mitigation that recovered the frame rate. Disabling Impeller was the only thing that worked.
  • PowerVR Rogue GE8320 on MT6765 is a very common low-end Android part, and GLES-only devices are the floor of the Android market. Together with [Impeller] Impeller is significantly slower than Skia on Adreno 702 (QCM2290) — 3.5x worse raster, Flutter 3.47.2 #192364 (Adreno 702, Vulkan), that is two different GPU vendors and two different backends showing Impeller materially slower than Skia on low-end hardware, which argues against an e: device-specific reading.
  • The practical concern is the deprecation: when the opt-out is removed, an app in this position has no mitigation left in its own hands.

Flutter Doctor output

Flutter 3.47.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 6655482ec0 • 2026-08-19
Engine • hash 11d79658c444477b06513d32b52c8c4ccb7276b0 (revision 5d53178869) • 2026-08-18
Tools • Dart 3.13.1 • DevTools 2.60.0

Device, for completeness:

ro.product.model      Infinix X6532C
ro.build.version.release  14
ro.product.cpu.abi    armeabi-v7a
ro.hardware           mt6765
SurfaceFlinger GLES   Imagination Technologies, PowerVR Rogue GE8320,
                      OpenGL ES 3.2 build 1.15@6070602

Activity

  1. gaaclarke commented on Sep 18, 2026

    @gaaclarke
    Member

    Thanks @codewithsuperior, can you please provide a minimal reproduction. Any one of those elements that you list may be the one thing that is misbehaving. By trimming it down to a minimal reproduction we can get a better idea of what could be going wrong.

  2. added
    needs repro infoAutomated crash report whose cause isn't yet known
    waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds
    P2Important issues not at the top of the work list
    on Sep 18, 2026
  3. github-actions commented on Oct 9, 2026

    @github-actions

    Without additional information, we are unfortunately not sure how to resolve this issue. We are therefore reluctantly going to close this bug for now.

    If you find this problem please file a new issue with the same description, what happens, logs and the output of 'flutter doctor -v'. All system setups can be slightly different so it's always better to open new issues and reference the related ones.

    Thanks for your contribution.

  4. github-actions commented on Oct 23, 2026

    @github-actions

    This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new bug, including the output of flutter doctor -v and a minimal reproduction of the issue.

  5. locked as resolved and limited conversation to collaborators on Oct 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Important issues not at the top of the work listneeds repro infoAutomated crash report whose cause isn't yet knownteam-engineOwned by Engine teamtriaged-engineTriaged by Engine teamwaiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions