Skip to content

[Impeller] Severe performance degradation on Adreno 840 #180958

Open

Description

@edTheGuy00

Steps to reproduce

  1. Clone the repro project
https://github.com/edTheGuy00/bubble_perf_test
  1. Run the app with Impeller enabled on a Snapdragon 8 Elite Gen 5 device
flutter run 
  1. Observe 5 - 20 FPS

  2. Run the app on the same device without Impeller

flutter run --no-enable-impeller
  1. Observe results

Cause

Rendering Animated bubbles using RadialGradient shaders and TextPainters, from my testing it works fine on all my devices:

60 - 120 FPS

Xiaomi 12 - Snapdragon 8 Gen 1 Adreno 730 ~ 120 FPS
iPhone SE 2 ~ 60 FPS
iPhone 13 mini ~ 60 FPS

But there is severe performance issues on the brand new OnePlus 15

5 - 20 FPS

Device affected: OnePlus 15 (Snapdragon 8 Elite Gen 5, Adreno 840 GPU)
Android version: 16
Flutter version: 3.38.4 (Impeller renderer)

CONFIRMED FINDINGS:

  • Impeller on Adreno 840: ~5-20 fps (BROKEN)
  • Skia on Adreno 840: ~120 fps (WORKS)
  • This is NOT a debug vs release issue - both have the same problem
  • Works fine on older devices (Snapdragon 8 Gen1 / Adreno 730) with Impeller
  • Works fine on same device with Skia renderer
  • Works fine on Simulator and Emulator

All recommended Flutter performance optimizations are implemented:

  1. Shader caching: RadialGradient.createShader() cached per bubble, only recreated on radius/color change
  2. TextPainter caching: Reused across frames, only recreated on style change
  3. TextStyle caching: Stored to prevent identity comparison failures
  4. Paint object reuse: Single Paint instance per bubble
  5. RepaintBoundary: Isolates painting from widget tree
  6. Position-independent shaders: Canvas transform used, shaders created at origin
  7. Settled state detection: Stops repainting when bubbles settle
  8. Small bubble optimization: Solid color for bubbles < 20px (no gradient)

Additional context

The Adreno 840 (Snapdragon 8 Elite) moved from Tile-Based Rendering (TBR) to Immediate Mode Rendering (IMR):

  • Higher sensitivity to frequent shader state changes
  • Different memory/cache behavior than older TBR GPUs
  • Penalizes per-frame allocations more heavily

Expected results

Newer devices with the Snapdragon 8 Elite Gen 5 should see smooth 120 FPS

Actual results

5 - 20 FPS

Code sample

Code sample

https://github.com/edTheGuy00/bubble_perf_test

Screenshots or Video

Screenshots / Video demonstration
[OnePlus 15] [Xiaomi 12]
Record_2026-01-14-12-39-40_6591e8d729632762c0d2c9c34b8ad961.mp4
screen-20260114-123310.mp4

Logs

Logs
[Paste your logs here]

Flutter Doctor output

Doctor output
$ flutter doctor
[✓] Flutter (Channel stable, 3.38.4, on macOS 26.2 25C56 darwin-arm64)
[✓] Android toolchain - develop for Android devices (Android SDK version 36.1.0-rc1)
[✓] Xcode - develop for iOS and macOS (Xcode 26.2)
[✓] Chrome - develop for the web
[✓] Connected device (5 available)
[✓] Network resources

$ flutter --version
Flutter 3.38.4 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 66dd93f9a2 (6 weeks ago) • 2025-12-03 14:56:10 -0800
Engine • hash 360877569ab6632a564a0a8a815b2e0fe5ae294a (revision a5cb96369e) (1
months ago) • 2025-12-03 20:56:06.000Z
Tools • Dart 3.10.3 • DevTools 2.51.1

Activity

  1. danagbemava-nc commented on Jan 14, 2026

    @danagbemava-nc
    Member

    Hi @edTheGuy00, what version of flutter were you using initially?

    Can you test on the master/beta channels to see if this still reproduces over there?

    Unfortunately, all my devices use a Mali GPU and I can't reproduce this issue on them.

  2. added
    waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds
    on Jan 14, 2026
  3. edTheGuy00 commented on Jan 14, 2026

    @edTheGuy00
    Author

    Hi @danagbemava-nc , I'm Running my attached sample app https://github.com/edTheGuy00/bubble_perf_test

    seeing the exact same results across the board only on my OnePlus 15:

    Impeller ON ~ 5 - 15 FPS

    --no-enable-impeller ~ 90 FPS

    • Flutter 3.38.6 • channel stable
    • Flutter 3.40.0-0.2.pre • channel beta
    • Flutter 3.40.0-1.0.pre-570 • channel master
  4. removed
    waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds
    on Jan 14, 2026
  5. danagbemava-nc commented on Jan 15, 2026

    @danagbemava-nc
    Member

    Thanks for the update.

    @edTheGuy00, one final thing, from what version of flutter did you start experiencing this issue?

  6. added
    waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds
    on Jan 15, 2026
  7. edTheGuy00 commented on Jan 15, 2026

    @edTheGuy00
    Author

    @danagbemava-nc I started seeing the issue when I got my new OnePlus 15, I guessing the issue was always there but I Was building on Flutter 3.38.4 at the time.

  8. removed
    waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds
    on Jan 15, 2026
  9. edTheGuy00 commented on Jan 15, 2026

    @edTheGuy00
    Author

    @danagbemava-nc I suspect this issue might affect all Adreno 800 series chips, I added this fix-around on my app for now to see 120 FPS on my OnePlus 15 and for anyone else experiencing the same issue.

        companion object {
            private const val TAG = "ImpellerConfig"
        }
    
        override fun createFlutterFragment(): FlutterFragment {
            val shellArgs = FlutterShellArgs.fromIntent(intent)
    
            if (isAdreno800Series()) {
                // Force Skia (disable Impeller) for this specific hardware
                // Adreno 800 series uses IMR (Immediate Mode Rendering) instead of TBR (Tile-Based Rendering)
                // which causes severe performance degradation with Impeller's rendering approach
                shellArgs.add(FlutterShellArgs.ARG_DISABLE_IMPELLER)
                Log.w(TAG, "Adreno 800 series detected. Disabling Impeller to avoid IMR performance degradation.")
            }
    
            return FlutterFragment.withNewEngine()
                .flutterShellArgs(shellArgs)
                .shouldAutomaticallyHandleOnBackPressed(true)
                .build()
        }
    
        /**
         * Detects if the device has an Adreno 800 series GPU (Snapdragon 8 Elite / Gen 5).
         * These GPUs use IMR (Immediate Mode Rendering) which has performance issues with Impeller.
         *
         * Known affected GPUs:
         * - Adreno 830 (Snapdragon 8 Elite, SM8750)
         * - Adreno 840 (Snapdragon 8 Gen 5, SM8850 - expected)
         */
        private fun isAdreno800Series(): Boolean {
            // 1. Check strict SOC model names (Android 12+)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                val socModel = Build.SOC_MODEL ?: ""
                // SM8750 = Snapdragon 8 Elite (Adreno 830)
                // SM8850 = Snapdragon 8 Gen 5 (Adreno 840 - likely)
                if (socModel.contains("SM8750") || socModel.contains("SM8850")) {
                    Log.d(TAG, "Detected Adreno 800 series via SOC_MODEL: $socModel")
                    return true
                }
            }
    
            // 2. Check hardware codenames (Fallback for older Android versions or missing SOC_MODEL)
            val hardware = Build.HARDWARE ?: ""
            // "sun" is the codename for Snapdragon 8 Elite
            // "pakala" is another known codename
            if (hardware.equals("sun", ignoreCase = true) || hardware.equals("pakala", ignoreCase = true)) {
                Log.d(TAG, "Detected Adreno 800 series via HARDWARE: $hardware")
                return true
            }
    
            return false
        }
  10. danagbemava-nc commented on Jan 16, 2026

    @danagbemava-nc
    Member

    Thanks for the update.

    Labeling this for further investigation

  11. added
    platform-androidAndroid applications specifically
    engineflutter/engine related. See also e: labels.
    c: performanceRelates to speed or footprint issues (see "perf:" labels)
    perf: speedPerformance issues related to (mostly rendering) speed
    e: impellerImpeller rendering backend issues and features requests
    and removed
    in triagePresently being triaged by the triage team
    on Jan 16, 2026
  12. added
    P1High-priority issues at the top of the work list
    on Jan 27, 2026
  13. ain-py commented on Apr 22, 2026

    @ain-py

    face same issue after enabling impeller on Adreno 710

    Device data:

    Field Value
    Device Motorola Moto G96 5G
    Chipset Qualcomm Snapdragon 7s Gen 2 (4nm)
    GPU Adreno 710
    RAM 8GB LPDDR4X
    Display 6.67" pOLED, 144Hz, 10-bit color
    Android version 15
    Flutter version 3.41.6 (stable)
    Engine hash 5cdd32777948fa7a648fac915f8da7120ac7e97a
    Impeller enabled Yes (opt-in via manifest)
  14. flutter-triage-bot commented on Jun 2, 2026

    @flutter-triage-bot

    This issue is marked P1 but has had no recent status updates.

    The P1 label indicates high-priority issues that are at the top of the work list. This is the highest priority level a bug can have if it isn't affecting a top-tier customer or breaking the build. Bugs marked P1 are generally actively being worked on unless the assignee is dealing with a P0 bug (or another P1 bug). Issues at this level should be resolved in a matter of months and should have monthly updates on GitHub.

    Please consider where this bug really falls in our current priorities, and label it or assign it accordingly. This allows people to have a clearer picture of what work is actually planned. Thanks!

  15. gaaclarke commented on Sep 24, 2026

    @gaaclarke
    Member

    The first thing to check would be:

    1. Is that device running with the opengles backend or vulkan backend? (seen in the log)
    2. If it is running vulkan, does manually dropping it to opengles fix the performance? [Impeller] Severe performance degradation on Adreno 840 #180958
    3. There have been a lot of changes since this has be filed, is it reproduced on main?

    That GPU is recent enough that it isn't something we'd want to opt out of vulkan as a long term solution.

    Another thing that would help would be capturing an accompanying perfetto trace: https://perfetto.dev/

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

    P1High-priority issues at the top of the work listc: performanceRelates to speed or footprint issues (see "perf:" labels)e: device-specificOnly manifests on certain devicese: impellerImpeller rendering backend issues and features requestsengineflutter/engine related. See also e: labels.perf: speedPerformance issues related to (mostly rendering) speedplatform-androidAndroid applications specificallyteam-engineOwned by Engine teamtriaged-engineTriaged by Engine team

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions