Skip to content

[Linux][Impeller] Continuous whole-window flicker / slow incomplete redraws on Mesa SVGA3D (VM) GPU — regression since Impeller became default in 3.47 #192915

Closed

Description

@gkirkendall

Steps to reproduce

  1. On a Linux host whose GPU driver reports as SVGA3D (VMware virtual GPU via Mesa — see flutter doctor -v output below), run flutter create on any app with a moderately complex screen (multiple Text widgets, TextFields, buttons, an icon — e.g. a settings/login form), then flutter run -d linux.
  2. Leave the window open and idle (or with a Timer.periodic triggering setState/rebuilds every 1–3s, as is common for apps polling a backend for status).
  3. Watch the window continuously.

A brand-new flutter create counter app (trivial widget tree: one Text + one FloatingActionButton) does not reproduce this — I used it as a control.

Expected results

The window renders once and stays stable; on rebuild it redraws promptly and completely.

Actual results

The window continuously flickers: content visibly draws in slowly/partially, sometimes the whole window goes blank for a frame or more, then redraws again — repeating indefinitely while the window is open, not tied to any particular user interaction. I confirmed this isn't an app-side fade/opacity animation (grepped the app's source for FadeTransition/AnimatedOpacity/TweenAnimationBuilder — none present on the affected screen); the flicker is purely a rendering/compositing symptom.

I bisected this with flutter downgrade: Flutter 3.44.8 (2026-07-23) does not reproduce it on this same machine/app; Flutter 3.47.4 (2026-09-10) reproduces it reliably. This lines up with #186706, which made Impeller the default Linux desktop renderer around that window. The log confirms Impeller/GLES is active:

[IMPORTANT:flutter/shell/platform/embedder/embedder_surface_gl_impeller.cc(126)] Using the Impeller rendering backend (OpenGLESSDF).

Screenshots taken ~0.6s apart with the app idle (no user interaction), while a Timer.periodic in the app rebuilds the widget tree every 1-3s:

  • Frame A: form fully rendered (title, two text fields, button, labels)
  • Frame B (~0.6s later): same window, entire content area blank
  • Frame C (~0.6s later): content partially back, some text elements still faint/incompletely composited

This is consistent with related reports of Impeller having rendering/performance problems specifically on weak or virtualized/software-ish GPU drivers (Mesa llvmpipe/SVGA3D), e.g. #169508 (Mesa software rendering + backdrop filter glitches on Linux, 3.32.0 regression). It's plausible the trivial counter app simply doesn't have enough paint work per frame to expose slow/incomplete compositing on this GPU, while a real-world screen with normal UI density does.

Related issues

Logs

[IMPORTANT:flutter/shell/platform/embedder/embedder_surface_gl_impeller.cc(126)] Using the Impeller rendering backend (OpenGLESSDF).

No GPU-side errors, crashes, or GDK-CRITICAL assertions logged — the app runs and is usable, just visibly flickering/slow to redraw throughout the session.

Flutter Doctor output

[✓] Flutter (Channel stable, 3.47.4, on Ubuntu 26.04.1 LTS 7.0.0-31-generic, locale en_US.UTF-8) [16ms]
    • Flutter version 3.47.4 on channel stable at /home/gkirkendall/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 9584c6713b (6 days ago), 2026-09-10 15:25:10 -0700
    • Engine revision 06a2e2a110
    • Dart version 3.13.3
    • DevTools version 2.60.0

[✓] Linux toolchain - develop for Linux desktop [143ms]
    • Ubuntu clang version 21.1.8 (6ubuntu1)
    • cmake version 4.2.3
    • ninja version 1.13.2
    • pkg-config version 2.5.1
    • OpenGL core renderer: SVGA3D; build: RELEASE;  LLVM; (X11)
    • OpenGL core version: 4.3 (Core Profile) Mesa 26.0.8-1ubuntu0.3 (X11)
    • OpenGL core shading language version: 4.30 (X11)
    • OpenGL ES renderer: SVGA3D; build: RELEASE;  LLVM; (X11)
    • OpenGL ES version: OpenGL ES 3.1 Mesa 26.0.8-1ubuntu0.3 (X11)
    • OpenGL ES shading language version: OpenGL ES GLSL ES 3.10 (X11)
    • GL_EXT_framebuffer_blit: yes (X11)
    • GL_EXT_texture_format_BGRA8888: yes (X11)

[✓] Connected device (2 available) [90ms]
    • Linux (desktop) • linux  • linux-arm64    • Ubuntu 26.04.1 LTS 7.0.0-31-generic
    • Chrome (web)    • chrome • web-javascript • Chromium 150.0.7871.100 snap

[✓] Network resources [324ms]
    • All expected network resources are available.

This is a VMware virtual machine (arm64 guest), GPU exposed via Mesa's SVGA3D gallium driver — not a real/passthrough GPU.

Activity

  1. suryaKommana2662 commented on Sep 17, 2026

    @suryaKommana2662
    Contributor

    @gkirkendall Thanks for the detailed report. I tested this locally on Flutter 3.47.4 stable using a ChromeOS Linux container with the following environment:
    Mesa OpenGL/ES renderer: llvmpipe
    Impeller rendering backend: OpenGLESSDF

    The reported issue was reproduced in the reporter's environment with a Mesa SVGA3D renderer on a VMware virtual machine. I left the application running and observed it for several minutes, but did not observe the reported continuous whole-window flickering, blank frames, or incomplete redraws in my environment. I also confirmed that Impeller was active during the test:
    Using the Impeller rendering backend (OpenGLESSDF).
    The main difference between the two environments is the graphics renderer: the reporter uses SVGA3D, while my ChromeOS Linux container uses llvmpipe. I have included the file used for this local test below. routing to the team-engine for further investigation

    code

    import 'dart:async';
    
    import 'package:flutter/material.dart';
    
    void main() {
      runApp(const FlickerReproApp());
    }
    
    class FlickerReproApp extends StatelessWidget {
      const FlickerReproApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: const FlickerReproPage(),
        );
      }
    }
    
    class FlickerReproPage extends StatefulWidget {
      const FlickerReproPage({super.key});
    
      @override
      State<FlickerReproPage> createState() => _FlickerReproPageState();
    }
    
    class _FlickerReproPageState extends State<FlickerReproPage> {
      Timer? _timer;
      int _counter = 0;
    
      @override
      void initState() {
        super.initState();
    
        _timer = Timer.periodic(const Duration(seconds: 2), (_) {
          if (mounted) {
            setState(() {
              _counter++;
            });
          }
        });
      }
    
      @override
      void dispose() {
        _timer?.cancel();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: const Text('Impeller Flicker Reproduction')),
          body: Center(
            child: SizedBox(
              width: 600,
              child: Card(
                child: Padding(
                  padding: const EdgeInsets.all(32),
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: [
                      const Text(
                        'Settings',
                        style: TextStyle(fontSize: 32, fontWeight: FontWeight.bold),
                      ),
                      const SizedBox(height: 24),
                      const Text(
                        'Moderately complex Flutter UI for testing rendering.',
                      ),
                      const SizedBox(height: 24),
                      const TextField(
                        decoration: InputDecoration(
                          labelText: 'Username',
                          border: OutlineInputBorder(),
                        ),
                      ),
                      const SizedBox(height: 16),
                      const TextField(
                        obscureText: true,
                        decoration: InputDecoration(
                          labelText: 'Password',
                          border: OutlineInputBorder(),
                        ),
                      ),
                      const SizedBox(height: 24),
                      FilledButton(onPressed: () {}, child: const Text('Sign in')),
                      const SizedBox(height: 24),
                      Row(
                        children: [
                          const Icon(Icons.info_outline),
                          const SizedBox(width: 12),
                          Text('Rebuild count: $_counter'),
                        ],
                      ),
                    ],
                  ),
                ),
              ),
            ),
          ),
        );
      }
    }

    Flutter Doctor Output

    [✓] Flutter (Channel stable, 3.47.4, on Ubuntu 26.04
        LTS 6.6.135-09383-g1140e4f27e24, locale C.UTF-8)
        [43ms]
        • Flutter version 3.47.4 on channel stable at
          /home/suryak2662/flutter
        • Upstream repository
          https://github.com/flutter/flutter.git
        • Framework revision 9584c6713b (6 days ago),
          2026-09-10 15:25:10 -0700
        • Engine revision 06a2e2a110
        • Dart version 3.13.3
        • DevTools version 2.60.0
        • Feature flags: enable-web,
          enable-linux-desktop, enable-macos-desktop,
          enable-windows-desktop, enable-android,
          enable-ios, cli-animations,
          enable-native-assets, enable-record-use,
          enable-swift-package-manager,
          omit-legacy-version-file,
          enable-lldb-debugging, enable-uiscene-migration
    
    [✓] Android toolchain - develop for Android devices
        (Android SDK version 36.0.0) [2.5s]
        • Android SDK at /home/suryak2662/Android/Sdk
        • Emulator version 36.6.11.0 (build_id 15507667)
          (CL:N/A)
        • Platform android-36, build-tools 36.0.0
        ! Multiple adb binaries found. This can cause
          conflicts and device detection issues:
            -
            /home/suryak2662/Android/Sdk/platform-tools/a
            db
            - /usr/lib/android-sdk/platform-tools/adb
        • Java binary at:
          /opt/android-studio/jbr/bin/java
          This JDK is specified in your Flutter
          configuration.
          To change the current JDK, run: `flutter config
          --jdk-dir="path/to/jdk"`.
        • Java version OpenJDK Runtime Environment (build
          21.0.10+-14961533-b1163.108)
        • All Android licenses accepted.
    
    [✓] Chrome - develop for the web [14ms]
        • Chrome at google-chrome
    
    [✓] Linux toolchain - develop for Linux desktop
        [687ms]
        • Ubuntu clang version 21.1.8 (6ubuntu1)
        • cmake version 4.2.3
        • ninja version 1.13.2
        • pkg-config version 2.5.1
        • OpenGL core renderer: llvmpipe (LLVM 21.1.8,
          256 bits)
        • OpenGL core version: 4.5 (Core Profile) Mesa
          26.0.3-1ubuntu1
        • OpenGL core shading language version: 4.50
        • OpenGL ES renderer: llvmpipe (LLVM 21.1.8, 256
          bits)
        • OpenGL ES version: OpenGL ES 3.2 Mesa
          26.0.3-1ubuntu1
        • OpenGL ES shading language version: OpenGL ES
          GLSL ES 3.20
        • GL_EXT_framebuffer_blit: yes
        • GL_EXT_texture_format_BGRA8888: yes
    
    [✓] Connected device (2 available) [189ms]
        • Linux (desktop) • linux  • linux-x64      •
          Ubuntu 26.04 LTS 6.6.135-09383-g1140e4f27e24
        • Chrome (web)    • chrome • web-javascript •
          Google Chrome 150.0.7871.128
    
    [✓] Network resources [9.4s]
        • All expected network resources are available.
    
    • No issues found!
  2. added
    platform-linuxBuilding on or for Linux specifically
    c: renderingUI glitches reported at the engine/skia or impeller rendering level
    e: impellerImpeller rendering backend issues and features requests
    and removed
    in triagePresently being triaged by the triage team
    on Sep 17, 2026
  3. infinite-persistence commented on Sep 17, 2026

    @infinite-persistence

    Environment

    • Flutter default hello world example
    • Linux Mint 22.3 Cinnamon 64-bit in VMWare (Graphics: VMWare SVGA II Adapter)

    Output

    • Flickers when the "+" button is clicked
    • Components go out of place when window is resized ("+" is detached from the button, banner doesn't refresh, etc.)
    • Issue goes away with --no-enable-impeller
    impeller.mp4
  4. added
    P2Important issues not at the top of the work list
    on Sep 21, 2026
  5. daniele-athome commented on Oct 2, 2026

    @daniele-athome

    For people searching the "workaround" keyword within the page 🙃 the workaround is adding this parameter to the run command:

    flutter run --no-enable-impeller
    
  6. added a commit that references this issue on Oct 21, 2026
  7. GVladi commented on Oct 21, 2026

    @GVladi

    6. For people searching the "workaround" keyword within the page 🙃 the workaround is adding this parameter to the run command:
    flutter run --no-enable-impeller

    But you cannot do it, if you are just running a flutter desktop app built by someone else.

    I can confirm the same rendering issue when Impeller is used on my VMWare Kubuntu VM:

    [✓] Flutter (Channel stable, 3.47.7, on Ubuntu 26.04.1 LTS 7.0.0-38-generic, locale en_US.UTF-8) [65ms]
        • Flutter version 3.47.7 on channel stable at /home/.../flutter
        • Upstream repository https://github.com/flutter/flutter.git
        • Framework revision abaf9c5237 (13 days ago), 2026-10-08 09:51:21 -0700
        • Engine revision deb287481e
        • Dart version 3.13.5
        • DevTools version 2.60.0
        • Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file,
          enable-lldb-debugging, enable-uiscene-migration
    
    [✓] Linux toolchain - develop for Linux desktop [818ms]
        • Ubuntu clang version 21.1.8 (6ubuntu1)
        • cmake version 4.2.3
        • ninja version 1.13.2
        • pkg-config version 2.5.1
        • OpenGL core renderer: SVGA3D; build: RELEASE;  LLVM;
        • OpenGL core version: 4.3 (Core Profile) Mesa 26.0.8-1ubuntu0.3
        • OpenGL core shading language version: 4.30
        • OpenGL ES renderer: SVGA3D; build: RELEASE;  LLVM;
        • OpenGL ES version: OpenGL ES 3.1 Mesa 26.0.8-1ubuntu0.3
        • OpenGL ES shading language version: OpenGL ES GLSL ES 3.10
        • GL_EXT_framebuffer_blit: yes
        • GL_EXT_texture_format_BGRA8888: yes
    
    [✓] Connected device (2 available) [795ms]
        • Linux (desktop) • linux  • linux-x64      • Ubuntu 26.04.1 LTS 7.0.0-38-generic
        • Chrome (web)    • chrome • web-javascript • Google Chrome 156.0.8078.47
    
    
  8. robert-ancell commented on Nov 4, 2026

    @robert-ancell
    Contributor

    This is a bug in the SVGA3D driver, see https://gitlab.freedesktop.org/mesa/mesa/-/work_items/16775. The workaround for Flutter apps is to disable impeller.

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 listc: renderingUI glitches reported at the engine/skia or impeller rendering levele: impellerImpeller rendering backend issues and features requestsplatform-linuxBuilding on or for Linux 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