Repository navigation
[Linux] Use fences to synchronize frames between OpenGL contexts - #192098
Conversation
|
Land this after the #192094 as that is simpler and fixes the crash, but this PR is more complex and more performant. We can then consider if we want to cherry-pick one or both of these changes. |
There was a problem hiding this comment.
Code Review
This pull request introduces OpenGL fence synchronization (FlGLFence) on Linux to synchronize frames rendered in the engine's context before they are read and presented by GTK or a subsurface context. The review feedback recommends simplifying the extension-checking logic by replacing the custom string parser with Epoxy's built-in epoxy_has_egl_extension function, and adding a defensive validation check in fl_gl_fence_new to ensure the OpenGL manager is valid.
Frames are rendered in the engine's OpenGL context and read by whoever presents them using a different context, so the rendering has to have completed before the other context uses the texture. This was done by waiting for the rendering to complete on the raster thread, which is correct but stalls that thread until the GPU has caught up, stopping it from rendering the next frame while it waits. Take a fence after the frame is rendered instead, and wait for it where the frame is used: - The subsurface renderer presents using the subsurface's context, which it makes current itself. Make that context wait for the fence, so the wait happens on the GPU and the raster thread doesn't block at all. - Frames drawn by GTK are read on the main thread, and GTK draws them using the window's paint context rather than the one that is current when the frame is handed over. A wait issued there would only order the context it was issued in, so block until the fence is reached. That wait happens on the main thread rather than the raster thread, and by the time the frame is drawn the rendering has normally completed. Fences are an extension, so add fl_opengl_manager_can_fence() to check for it. Drivers without fences wait for the rendering to complete as before. Drivers that support fences but not waiting on the GPU block instead of waiting on the GPU. See flutter#191775
fl_opengl_manager_has_extension() parsed the extension string itself, which epoxy already does. Use epoxy instead of repeating it. The mock has to provide epoxy_has_egl_extension() for this, in the same way it already provides epoxy_has_gl_extension(). Tests can now say which extension they want to be missing rather than having to build an extension string that parses to that.
Matches the precondition checks the other constructors in the embedder have.
692239a to
17fa974
Compare
mattkae
left a comment
There was a problem hiding this comment.
Left some non-blocking food for thought, but this looks like a solid implementation to me 👍
The EGL extension the fences use was wrapped but the one waiting for them on the GPU wasn't, so one was accessed through a generic extension check and the other through a named method. Wrap both and make the generic check private, as nothing else needs it.
The waits were named fl_gl_fence_wait() and fl_gl_fence_wait_gpu(), which was the opposite way around to the calls they make - OpenGL uses the plain name for the wait that doesn't block the caller and qualifies the one that does. The name also described the wait as being done by the GPU, which OpenGL is allowed to do on the CPU instead. Rename them to fl_gl_fence_client_wait() and fl_gl_fence_wait() to match.
Conflicts came from "[Linux] Remove frame sharing between OpenGL contexts" (flutter#192150) landing on master. fl_opengl_frame no longer shares a texture between the rendering context and the one GTK draws with - the frame is read back with glReadPixels() and uploaded again as a new texture. glReadPixels() waits for the rendering to complete, so the fence this branch added there is no longer needed and has been dropped, along with the tests covering it. The fence is still used where buffers really are passed between contexts, in fl_view_renderer_subsurface, which is what it was written for. mock_epoxy keeps the EGL fence mocks and drops the EGLImage ones master removed with the sharing.
The only caller of fl_gl_fence_client_wait() outside fl_gl_fence was fl_opengl_frame, which handed the frame to GTK to draw with a different context and so couldn't let OpenGL do the waiting. Frames are no longer shared between contexts, so the only thing left that blocks is the fallback fl_gl_fence_wait() uses when the driver has no EGL_KHR_wait_sync. Make it a static function. The fallback is still covered by the WaitUnsupported test, so the test that called it directly goes away.
…12760) Manual roll Flutter from 70797e15325e to 5a6cfa7f3d26 (52 revisions) Manual roll requested by bensonluk@google.com flutter/flutter@70797e1...5a6cfa7 2026-09-04 bkonyi@google.com [tool] Migrate ScreenshotCommand to modular dependency injection (flutter/flutter#190767) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from 8fce167bdded to 93ac1e630d1d (3 revisions) (flutter/flutter#192306) 2026-09-04 okorohelijah@google.com Add iOS Universal Link integration test (Simulator) (flutter/flutter#191443) 2026-09-04 269567208+reidbaker-agent@users.noreply.github.com [AGP 9.1.0 Migration #5] Delete getLegacyAndroidExtension and migrate NDK fallback to public DSL (flutter/flutter#192116) 2026-09-04 bkonyi@google.com Reland "[tool_tests] Remove bringup from Windows tool_tests_commands_2_2" (#191732) (flutter/flutter#191802) 2026-09-04 bkonyi@google.com [flutter_tools] Fix unhandled DebugAdapterException on early process termination (flutter/flutter#192294) 2026-09-04 engine-flutter-autoroll@skia.org Roll Packages from f9b3954 to 9af9c60 (4 revisions) (flutter/flutter#192292) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from 2e3f7e07eee6 to 8fce167bdded (5 revisions) (flutter/flutter#192283) 2026-09-04 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from GTZNkoIR_WegRPWgL... to FgDQeF6jb1dVRVh3K... (flutter/flutter#192276) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from b6b00df360e5 to 2e3f7e07eee6 (2 revisions) (flutter/flutter#192275) 2026-09-04 cetinibrahim.ci@gmail.com [iOS] TextField should support typing accented words with external keyboard (flutter/flutter#191062) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from 1f68c0b16f17 to b6b00df360e5 (7 revisions) (flutter/flutter#192269) 2026-09-04 kevmoo@users.noreply.github.com [flutter_tools] add typed enum and defaulted option descriptors (flutter/flutter#191760) 2026-09-04 engine-flutter-autoroll@skia.org Roll Dart SDK from c2edc382a4f8 to 5501d02b583d (1 revision) (flutter/flutter#192263) 2026-09-04 robert.ancell@canonical.com [Linux] Use fences to synchronize frames between OpenGL contexts (flutter/flutter#192098) 2026-09-03 brunocorona.alcantar@gmail.com Defer semantics geometry updates for blocked branches (flutter/flutter#192146) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 8d3e197531c6 to 1f68c0b16f17 (8 revisions) (flutter/flutter#192244) 2026-09-03 57765714+Vi-debug@users.noreply.github.com Fix DeleteSurrounding splitting UTF-16 surrogate pairs (flutter/flutter#190514) 2026-09-03 32538273+ValentinVignal@users.noreply.github.com Remove no-shuffle from progress indicator test (flutter/flutter#186655) 2026-09-03 srawlins@google.com [material] Remove unused parameters from constructors of generic test class (flutter/flutter#191764) 2026-09-03 97480502+b-luk@users.noreply.github.com Handle linear and radial gradients in UberSDF (re-implement after fix) (flutter/flutter#192124) 2026-09-03 engine-flutter-autoroll@skia.org Roll Dart SDK from fcbfb64f42a1 to c2edc382a4f8 (2 revisions) (flutter/flutter#192240) 2026-09-03 34871572+gmackall@users.noreply.github.com Fix parsing of --enable-hcpp-and-surface-control switch and add --no-enable-hcpp tests (flutter/flutter#192202) 2026-09-03 97480502+b-luk@users.noreply.github.com Fix issue where shapes rendered with gradient+blur+rotation end up incorrectly cut off (flutter/flutter#192136) 2026-09-03 47866232+chunhtai@users.noreply.github.com Fix sibling nodes crash under MergeSemantics (flutter/flutter#191587) 2026-09-03 30870216+gaaclarke@users.noreply.github.com Makes backdrop groups operate on the union. (flutter/flutter#191838) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 008936396810 to 8d3e197531c6 (1 revision) (flutter/flutter#192236) 2026-09-03 parlough@gmail.com [docs] Remove superseded AI rules for Flutter (flutter/flutter#192185) 2026-09-03 15619084+vashworth@users.noreply.github.com Collect analytics about SwiftPM errors and warnings (flutter/flutter#191746) 2026-09-03 engine-flutter-autoroll@skia.org Roll Packages from 18fe786 to f9b3954 (7 revisions) (flutter/flutter#192235) 2026-09-03 robert.ancell@canonical.com [Linux] Remove frame sharing between OpenGL contexts (flutter/flutter#192150) 2026-09-03 engine-flutter-autoroll@skia.org Roll Dart SDK from cf79067a1e44 to fcbfb64f42a1 (1 revision) (flutter/flutter#192228) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 731fe9af4c0b to 008936396810 (3 revisions) (flutter/flutter#192225) 2026-09-03 engine-flutter-autoroll@skia.org Roll Dart SDK from 700ab60bfe53 to cf79067a1e44 (2 revisions) (flutter/flutter#192219) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 823f82e18177 to 731fe9af4c0b (5 revisions) (flutter/flutter#192217) 2026-09-03 louisehsu@google.com Fixes OverlayPortal semantics bounds corruption (flutter/flutter#192139) 2026-09-03 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from idslm9FikVLy2K_A-... to GTZNkoIR_WegRPWgL... (flutter/flutter#192215) 2026-09-03 engine-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from u_fSMsPU22VvUsvSo... to VObjlh3xw2P9sEbC_... (flutter/flutter#192212) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from ae22da2e8308 to 823f82e18177 (13 revisions) (flutter/flutter#192209) 2026-09-02 ishaquehassan@gmail.com Expose skipTraversal in FocusableActionDetector (flutter/flutter#191308) 2026-09-02 97480502+b-luk@users.noreply.github.com Add `IsProgram` mock method to `MockGLESImpl`, use it in `BufferBindingsGLESTest` (flutter/flutter#192196) 2026-09-02 uros.radulovic23@gmail.com Fix nested scroll view fling crash (flutter/flutter#191130) 2026-09-02 brunocorona.alcantar@gmail.com Fix TabBarView/PageView edge auto-scroll during mouse text selection (flutter/flutter#189544) 2026-09-02 30870216+gaaclarke@users.noreply.github.com Bypass gamma correction when alpha >= 1.0 (flutter/flutter#192193) ...
…lutter#12760) Manual roll Flutter from 70797e15325e to 5a6cfa7f3d26 (52 revisions) Manual roll requested by bensonluk@google.com flutter/flutter@70797e1...5a6cfa7 2026-09-04 bkonyi@google.com [tool] Migrate ScreenshotCommand to modular dependency injection (flutter/flutter#190767) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from 8fce167bdded to 93ac1e630d1d (3 revisions) (flutter/flutter#192306) 2026-09-04 okorohelijah@google.com Add iOS Universal Link integration test (Simulator) (flutter/flutter#191443) 2026-09-04 269567208+reidbaker-agent@users.noreply.github.com [AGP 9.1.0 Migration flutter#5] Delete getLegacyAndroidExtension and migrate NDK fallback to public DSL (flutter/flutter#192116) 2026-09-04 bkonyi@google.com Reland "[tool_tests] Remove bringup from Windows tool_tests_commands_2_2" (#191732) (flutter/flutter#191802) 2026-09-04 bkonyi@google.com [flutter_tools] Fix unhandled DebugAdapterException on early process termination (flutter/flutter#192294) 2026-09-04 engine-flutter-autoroll@skia.org Roll Packages from f9b3954 to 9af9c60 (4 revisions) (flutter/flutter#192292) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from 2e3f7e07eee6 to 8fce167bdded (5 revisions) (flutter/flutter#192283) 2026-09-04 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from GTZNkoIR_WegRPWgL... to FgDQeF6jb1dVRVh3K... (flutter/flutter#192276) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from b6b00df360e5 to 2e3f7e07eee6 (2 revisions) (flutter/flutter#192275) 2026-09-04 cetinibrahim.ci@gmail.com [iOS] TextField should support typing accented words with external keyboard (flutter/flutter#191062) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from 1f68c0b16f17 to b6b00df360e5 (7 revisions) (flutter/flutter#192269) 2026-09-04 kevmoo@users.noreply.github.com [flutter_tools] add typed enum and defaulted option descriptors (flutter/flutter#191760) 2026-09-04 engine-flutter-autoroll@skia.org Roll Dart SDK from c2edc382a4f8 to 5501d02b583d (1 revision) (flutter/flutter#192263) 2026-09-04 robert.ancell@canonical.com [Linux] Use fences to synchronize frames between OpenGL contexts (flutter/flutter#192098) 2026-09-03 brunocorona.alcantar@gmail.com Defer semantics geometry updates for blocked branches (flutter/flutter#192146) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 8d3e197531c6 to 1f68c0b16f17 (8 revisions) (flutter/flutter#192244) 2026-09-03 57765714+Vi-debug@users.noreply.github.com Fix DeleteSurrounding splitting UTF-16 surrogate pairs (flutter/flutter#190514) 2026-09-03 32538273+ValentinVignal@users.noreply.github.com Remove no-shuffle from progress indicator test (flutter/flutter#186655) 2026-09-03 srawlins@google.com [material] Remove unused parameters from constructors of generic test class (flutter/flutter#191764) 2026-09-03 97480502+b-luk@users.noreply.github.com Handle linear and radial gradients in UberSDF (re-implement after fix) (flutter/flutter#192124) 2026-09-03 engine-flutter-autoroll@skia.org Roll Dart SDK from fcbfb64f42a1 to c2edc382a4f8 (2 revisions) (flutter/flutter#192240) 2026-09-03 34871572+gmackall@users.noreply.github.com Fix parsing of --enable-hcpp-and-surface-control switch and add --no-enable-hcpp tests (flutter/flutter#192202) 2026-09-03 97480502+b-luk@users.noreply.github.com Fix issue where shapes rendered with gradient+blur+rotation end up incorrectly cut off (flutter/flutter#192136) 2026-09-03 47866232+chunhtai@users.noreply.github.com Fix sibling nodes crash under MergeSemantics (flutter/flutter#191587) 2026-09-03 30870216+gaaclarke@users.noreply.github.com Makes backdrop groups operate on the union. (flutter/flutter#191838) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 008936396810 to 8d3e197531c6 (1 revision) (flutter/flutter#192236) 2026-09-03 parlough@gmail.com [docs] Remove superseded AI rules for Flutter (flutter/flutter#192185) 2026-09-03 15619084+vashworth@users.noreply.github.com Collect analytics about SwiftPM errors and warnings (flutter/flutter#191746) 2026-09-03 engine-flutter-autoroll@skia.org Roll Packages from 18fe786 to f9b3954 (7 revisions) (flutter/flutter#192235) 2026-09-03 robert.ancell@canonical.com [Linux] Remove frame sharing between OpenGL contexts (flutter/flutter#192150) 2026-09-03 engine-flutter-autoroll@skia.org Roll Dart SDK from cf79067a1e44 to fcbfb64f42a1 (1 revision) (flutter/flutter#192228) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 731fe9af4c0b to 008936396810 (3 revisions) (flutter/flutter#192225) 2026-09-03 engine-flutter-autoroll@skia.org Roll Dart SDK from 700ab60bfe53 to cf79067a1e44 (2 revisions) (flutter/flutter#192219) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 823f82e18177 to 731fe9af4c0b (5 revisions) (flutter/flutter#192217) 2026-09-03 louisehsu@google.com Fixes OverlayPortal semantics bounds corruption (flutter/flutter#192139) 2026-09-03 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from idslm9FikVLy2K_A-... to GTZNkoIR_WegRPWgL... (flutter/flutter#192215) 2026-09-03 engine-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from u_fSMsPU22VvUsvSo... to VObjlh3xw2P9sEbC_... (flutter/flutter#192212) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from ae22da2e8308 to 823f82e18177 (13 revisions) (flutter/flutter#192209) 2026-09-02 ishaquehassan@gmail.com Expose skipTraversal in FocusableActionDetector (flutter/flutter#191308) 2026-09-02 97480502+b-luk@users.noreply.github.com Add `IsProgram` mock method to `MockGLESImpl`, use it in `BufferBindingsGLESTest` (flutter/flutter#192196) 2026-09-02 uros.radulovic23@gmail.com Fix nested scroll view fling crash (flutter/flutter#191130) 2026-09-02 brunocorona.alcantar@gmail.com Fix TabBarView/PageView edge auto-scroll during mouse text selection (flutter/flutter#189544) 2026-09-02 30870216+gaaclarke@users.noreply.github.com Bypass gamma correction when alpha >= 1.0 (flutter/flutter#192193) ...
…lutter#12760) Manual roll Flutter from 70797e15325e to 5a6cfa7f3d26 (52 revisions) Manual roll requested by bensonluk@google.com flutter/flutter@70797e1...5a6cfa7 2026-09-04 bkonyi@google.com [tool] Migrate ScreenshotCommand to modular dependency injection (flutter/flutter#190767) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from 8fce167bdded to 93ac1e630d1d (3 revisions) (flutter/flutter#192306) 2026-09-04 okorohelijah@google.com Add iOS Universal Link integration test (Simulator) (flutter/flutter#191443) 2026-09-04 269567208+reidbaker-agent@users.noreply.github.com [AGP 9.1.0 Migration flutter#5] Delete getLegacyAndroidExtension and migrate NDK fallback to public DSL (flutter/flutter#192116) 2026-09-04 bkonyi@google.com Reland "[tool_tests] Remove bringup from Windows tool_tests_commands_2_2" (#191732) (flutter/flutter#191802) 2026-09-04 bkonyi@google.com [flutter_tools] Fix unhandled DebugAdapterException on early process termination (flutter/flutter#192294) 2026-09-04 engine-flutter-autoroll@skia.org Roll Packages from f9b3954 to 9af9c60 (4 revisions) (flutter/flutter#192292) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from 2e3f7e07eee6 to 8fce167bdded (5 revisions) (flutter/flutter#192283) 2026-09-04 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from GTZNkoIR_WegRPWgL... to FgDQeF6jb1dVRVh3K... (flutter/flutter#192276) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from b6b00df360e5 to 2e3f7e07eee6 (2 revisions) (flutter/flutter#192275) 2026-09-04 cetinibrahim.ci@gmail.com [iOS] TextField should support typing accented words with external keyboard (flutter/flutter#191062) 2026-09-04 engine-flutter-autoroll@skia.org Roll Skia from 1f68c0b16f17 to b6b00df360e5 (7 revisions) (flutter/flutter#192269) 2026-09-04 kevmoo@users.noreply.github.com [flutter_tools] add typed enum and defaulted option descriptors (flutter/flutter#191760) 2026-09-04 engine-flutter-autoroll@skia.org Roll Dart SDK from c2edc382a4f8 to 5501d02b583d (1 revision) (flutter/flutter#192263) 2026-09-04 robert.ancell@canonical.com [Linux] Use fences to synchronize frames between OpenGL contexts (flutter/flutter#192098) 2026-09-03 brunocorona.alcantar@gmail.com Defer semantics geometry updates for blocked branches (flutter/flutter#192146) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 8d3e197531c6 to 1f68c0b16f17 (8 revisions) (flutter/flutter#192244) 2026-09-03 57765714+Vi-debug@users.noreply.github.com Fix DeleteSurrounding splitting UTF-16 surrogate pairs (flutter/flutter#190514) 2026-09-03 32538273+ValentinVignal@users.noreply.github.com Remove no-shuffle from progress indicator test (flutter/flutter#186655) 2026-09-03 srawlins@google.com [material] Remove unused parameters from constructors of generic test class (flutter/flutter#191764) 2026-09-03 97480502+b-luk@users.noreply.github.com Handle linear and radial gradients in UberSDF (re-implement after fix) (flutter/flutter#192124) 2026-09-03 engine-flutter-autoroll@skia.org Roll Dart SDK from fcbfb64f42a1 to c2edc382a4f8 (2 revisions) (flutter/flutter#192240) 2026-09-03 34871572+gmackall@users.noreply.github.com Fix parsing of --enable-hcpp-and-surface-control switch and add --no-enable-hcpp tests (flutter/flutter#192202) 2026-09-03 97480502+b-luk@users.noreply.github.com Fix issue where shapes rendered with gradient+blur+rotation end up incorrectly cut off (flutter/flutter#192136) 2026-09-03 47866232+chunhtai@users.noreply.github.com Fix sibling nodes crash under MergeSemantics (flutter/flutter#191587) 2026-09-03 30870216+gaaclarke@users.noreply.github.com Makes backdrop groups operate on the union. (flutter/flutter#191838) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 008936396810 to 8d3e197531c6 (1 revision) (flutter/flutter#192236) 2026-09-03 parlough@gmail.com [docs] Remove superseded AI rules for Flutter (flutter/flutter#192185) 2026-09-03 15619084+vashworth@users.noreply.github.com Collect analytics about SwiftPM errors and warnings (flutter/flutter#191746) 2026-09-03 engine-flutter-autoroll@skia.org Roll Packages from 18fe786 to f9b3954 (7 revisions) (flutter/flutter#192235) 2026-09-03 robert.ancell@canonical.com [Linux] Remove frame sharing between OpenGL contexts (flutter/flutter#192150) 2026-09-03 engine-flutter-autoroll@skia.org Roll Dart SDK from cf79067a1e44 to fcbfb64f42a1 (1 revision) (flutter/flutter#192228) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 731fe9af4c0b to 008936396810 (3 revisions) (flutter/flutter#192225) 2026-09-03 engine-flutter-autoroll@skia.org Roll Dart SDK from 700ab60bfe53 to cf79067a1e44 (2 revisions) (flutter/flutter#192219) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from 823f82e18177 to 731fe9af4c0b (5 revisions) (flutter/flutter#192217) 2026-09-03 louisehsu@google.com Fixes OverlayPortal semantics bounds corruption (flutter/flutter#192139) 2026-09-03 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from idslm9FikVLy2K_A-... to GTZNkoIR_WegRPWgL... (flutter/flutter#192215) 2026-09-03 engine-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from u_fSMsPU22VvUsvSo... to VObjlh3xw2P9sEbC_... (flutter/flutter#192212) 2026-09-03 engine-flutter-autoroll@skia.org Roll Skia from ae22da2e8308 to 823f82e18177 (13 revisions) (flutter/flutter#192209) 2026-09-02 ishaquehassan@gmail.com Expose skipTraversal in FocusableActionDetector (flutter/flutter#191308) 2026-09-02 97480502+b-luk@users.noreply.github.com Add `IsProgram` mock method to `MockGLESImpl`, use it in `BufferBindingsGLESTest` (flutter/flutter#192196) 2026-09-02 uros.radulovic23@gmail.com Fix nested scroll view fling crash (flutter/flutter#191130) 2026-09-02 brunocorona.alcantar@gmail.com Fix TabBarView/PageView edge auto-scroll during mouse text selection (flutter/flutter#189544) 2026-09-02 30870216+gaaclarke@users.noreply.github.com Bypass gamma correction when alpha >= 1.0 (flutter/flutter#192193) ...
[Linux] Use fences to synchronize frames between OpenGL contexts
Frames are rendered in the engine's OpenGL context and read by whoever
presents them using a different context, so the rendering has to have
completed before the other context uses the texture. This was done by
waiting for the rendering to complete on the raster thread, which is
correct but stalls that thread until the GPU has caught up, stopping it
from rendering the next frame while it waits.
Take a fence after the frame is rendered instead, and wait for it where
the frame is used:
it makes current itself. Make that context wait for the fence, so the
wait happens on the GPU and the raster thread doesn't block at all.
using the window's paint context rather than the one that is current
when the frame is handed over. A wait issued there would only order the
context it was issued in, so block until the fence is reached. That
wait happens on the main thread rather than the raster thread, and by
the time the frame is drawn the rendering has normally completed.
Fences are an extension, so add fl_opengl_manager_can_fence() to check
for it. Drivers without fences wait for the rendering to complete as
before. Drivers that support fences but not waiting on the GPU block
instead of waiting on the GPU.
See #191775