Repository navigation
[iOS] Delete software rendering fallback in iOS embedder #190041
Copy link
Copy link
Closed
Labels
P2Important issues not at the top of the work listImportant issues not at the top of the work listc: tech-debtTechnical debt, code quality, testing, etc.Technical debt, code quality, testing, etc.engineflutter/engine related. See also e: labels.flutter/engine related. See also e: labels.platform-iosiOS applications specificallyiOS applications specificallyteam-iosOwned by iOS platform teamOwned by iOS platform teamtriaged-iosTriaged by iOS platform teamTriaged by iOS platform team
Description
Currently, the iOS embedder has a fallback mechanism to use software rendering (IOSRenderingAPI::kSoftware / CALayer) if MTLCreateSystemDefaultDevice() fails to initialize a Metal device. Most of this logic lives in engine/src/flutter/shell/platform/darwin/ios/rendering_api_selection.mm.
This fallback was historically necessary for the iOS Simulator running in older CI environments or on host machines that lacked GPU paravirtualization (pre-macOS Catalina/Xcode 11).
We can safely remove this fallback and enforce IOSRenderingAPI::kMetal since:
- Impeller Migration: Flutter has fully migrated iOS to Impeller, which strictly requires a hardware-accelerated graphics API (Metal) and possesses no CPU software backend like Skia did. As the legacy Skia backend is removed from the engine, this Skia-dependent software fallback becomes dead code.
- Universal CI Metal Support: All modern CI environments capable of running Xcode 14+ (which requires macOS 12+) use Apple's modern virtualisation framework. This framework natively supports paravirtualised graphics and Metal on the iOS Simulator.
- Parity with macOS Embedder: The macOS desktop embedder (
FlutterRenderer.mm) already hardcodes its configuration to Metal and successfully operates without any software rendering fallback.
This issue is the iOS equivalent of #156628, which tracks removing the software rendering fallback on Android.
Proposed Changes:
- Remove
IOSRenderingAPI::kSoftwarefromrendering_api_selection.hand.mm. - Remove the
TARGET_OS_SIMULATORfallback logic inGetRenderingAPIForProcess(). - Remove the
CALayerreturn path inGetCoreAnimationLayerClassForRenderingAPI(). - Clean up any associated Skia software surface manager code specific to iOS.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
P2Important issues not at the top of the work listImportant issues not at the top of the work listc: tech-debtTechnical debt, code quality, testing, etc.Technical debt, code quality, testing, etc.engineflutter/engine related. See also e: labels.flutter/engine related. See also e: labels.platform-iosiOS applications specificallyiOS applications specificallyteam-iosOwned by iOS platform teamOwned by iOS platform teamtriaged-iosTriaged by iOS platform teamTriaged by iOS platform team
Activity
iOS: Hardcode rendering API to Metal in tests (no-op) (flutter#190422)
iOS: Eliminate use of IOSContextNoop in platform view tests (flutter#…
Revert: iOS: Eliminate use of IOSContextNoop in platform view tests (f…
iOS: Eliminate use of IOSContextNoop in platform view tests (reland) (f…
iOS: Remove software renderer/headless fallback
iOS: Remove the software renderer fallback
3 remaining items
iOS: Remove the software renderer fallback
iOS: Remove software renderer/headless fallback (flutter#190590)
Remove the unused GPUSurfaceNoop
gpu: Remove unused GPUSurfaceNoop (flutter#190610)
Remove the unused GPUSurfaceNoop
iOS: Remove the IOSRenderingAPI selection code
iOS: Remove the IOSRenderingAPI selection code
iOS: Remove the IOSRenderingAPI selection code
iOS: Remove the IOSRenderingAPI selection code (flutter#190636)
Scenarios: Remove the Skia golden test option
iOS: Remove the Scenarios app Skia golden test option (flutter#190827)
cbracken commentedon Aug 14, 2026
This is now complete.
github-actions commentedon Aug 28, 2026
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 -vand a minimal reproduction of the issue.