Repository navigation
Closed
Labels
P3Issues that are less important to the Flutter projectIssues that are less important to the Flutter projectc: new featureNothing broken; request for a new capabilityNothing broken; request for a new capabilityc: proposalA detailed proposal for a change to FlutterA detailed proposal for a change to Fluttercustomer: goinge: embedderUsers of the Embedder APIUsers of the Embedder APIengineflutter/engine related. See also e: labels.flutter/engine related. See also e: labels.team-engineOwned by Engine teamOwned by Engine teamtriaged-engineTriaged by Engine teamTriaged by Engine team
Description
Use case
Per discussion on Discord - Use case gaps in order to switch to external embedder Vulkan backend
Vulkan external VkImage Support
- GL interop. Same or different process. Source could be anything that inherently requires GL/GLES/EGL.
- GStreamer pipeline output. Pipeline creates Vulkan objects directly via vulkanupload pipeline stage. Same or different process. Example pipeline which exposes VkImage to CPU:
https://gist.github.com/jwinarske/dda0f7154a0bf34c3e7b6606907ad0f7 - Present render target (VkImage) from (Unity, Filament, etc).
- libcamera - source format is determined by the Camera sensor, and has to be determined at runtime.
External processes would have an array of VkImages available to present.
Proposal
The proposal is to adopt the OpenGL external Texture pattern for Vulkan. This would allow re-use of the TextureWidget.
GL Texture API:
FlutterEngineRegisterExternalTexture
FlutterEngineUnregisterExternalTexture
FlutterEngineMarkExternalTextureFrameAvailable
TextureFrameCallback would need to be updated to include VkImageInfo which describes the backing VkImage. Skia GrVkImageInfo is used to construct a GrBackendTexture.
Reacted by Hitesh Kumar Saini, Andreas Monitzer, Marc Julien Bach, seungha-kim, Perkele, Payam Zahedi, ניר and Noah Rahm
Metadata
Metadata
Assignees
Labels
P3Issues that are less important to the Flutter projectIssues that are less important to the Flutter projectc: new featureNothing broken; request for a new capabilityNothing broken; request for a new capabilityc: proposalA detailed proposal for a change to FlutterA detailed proposal for a change to Fluttercustomer: goinge: embedderUsers of the Embedder APIUsers of the Embedder APIengineflutter/engine related. See also e: labels.flutter/engine related. See also e: labels.team-engineOwned by Engine teamOwned by Engine teamtriaged-engineTriaged by Engine teamTriaged by Engine team
Activity
jonahwilliams commentedon Mar 12, 2024
@jwinarske is this something you are intending to work on yourself that you would like guidance on, or is this a feature request for the engine team?
perkele1989 commentedon Apr 27, 2024
This is something I'll likely need for day job in near future. Curious about progress on this, and if there's any way I could contribute.
jonahwilliams commentedon May 9, 2024
The flutter engine/impeller teams have no plans to work on this in the near future. If someone contributed a working implementation (with tests) I think we could accept it?
perkele1989 commentedon May 9, 2024
Thank you for responding. may look into it going forward. for now leaning to do a CPU roundtrip and see if its performant enough. Seems like most of the work/time investment would involve setting up a development environment. The actual codebase seems very ready for it already to accept external Vulkan VkImages/VkImageViews via something like VK_KHR_external_memory, the same way it can do so from Java.
jwinarske commentedon Sep 15, 2026
Superseded. Splitting this into the pieces that are actually moving:
Leaving the policy note here for anyone who finds this later: per @jonahwilliams above, the engine team has no plans to do this work but would take a contributed implementation with tests. #188855 is that route working.
GL interop stays the embedder's job before hand-off; nothing in the engine blocks it.
github-actions commentedon Sep 30, 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.