Visitar URL original
[Linux] Add fl_opengl_manager_can_wait_sync() · flutter/flutter@79b892f · GitHub
Skip to content

Commit 79b892f

Browse files
committed
[Linux] Add fl_opengl_manager_can_wait_sync()
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.
1 parent 17fa974 commit 79b892f

3 files changed

Lines changed: 22 additions & 18 deletions

File tree

‎engine/src/flutter/shell/platform/linux/fl_gl_fence.cc‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ FlGLFence* fl_gl_fence_new(FlOpenGLManager* opengl_manager) {
6464

6565
self->display = display;
6666
self->sync = sync;
67-
self->can_wait_gpu =
68-
fl_opengl_manager_has_extension(opengl_manager, "EGL_KHR_wait_sync");
67+
self->can_wait_gpu = fl_opengl_manager_can_wait_sync(opengl_manager);
6968

7069
return self;
7170
}

‎engine/src/flutter/shell/platform/linux/fl_opengl_manager.cc‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,9 @@ gboolean fl_opengl_manager_can_blit(FlOpenGLManager* self) {
163163
epoxy_has_gl_extension("GL_EXT_framebuffer_blit"));
164164
}
165165

166-
gboolean fl_opengl_manager_has_extension(FlOpenGLManager* self,
167-
const gchar* extension) {
166+
// Checks whether @extension is supported by the EGL display the contexts are
167+
// created on.
168+
static gboolean has_extension(FlOpenGLManager* self, const gchar* extension) {
168169
g_return_val_if_fail(FL_IS_OPENGL_MANAGER(self), FALSE);
169170

170171
if (self->display == EGL_NO_DISPLAY) {
@@ -175,5 +176,9 @@ gboolean fl_opengl_manager_has_extension(FlOpenGLManager* self,
175176
}
176177

177178
gboolean fl_opengl_manager_can_fence(FlOpenGLManager* self) {
178-
return fl_opengl_manager_has_extension(self, "EGL_KHR_fence_sync");
179+
return has_extension(self, "EGL_KHR_fence_sync");
180+
}
181+
182+
gboolean fl_opengl_manager_can_wait_sync(FlOpenGLManager* self) {
183+
return has_extension(self, "EGL_KHR_wait_sync");
179184
}

‎engine/src/flutter/shell/platform/linux/fl_opengl_manager.h‎

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -106,19 +106,6 @@ EGLContext fl_opengl_manager_get_context(FlOpenGLManager* manager);
106106
*/
107107
gboolean fl_opengl_manager_can_blit(FlOpenGLManager* manager);
108108

109-
/**
110-
* fl_opengl_manager_has_extension:
111-
* @manager: an #FlOpenGLManager.
112-
* @extension: the name of an EGL extension, e.g. "EGL_KHR_fence_sync".
113-
*
114-
* Checks whether @extension is supported by the EGL display the contexts are
115-
* created on.
116-
*
117-
* Returns: %TRUE if @extension is supported.
118-
*/
119-
gboolean fl_opengl_manager_has_extension(FlOpenGLManager* manager,
120-
const gchar* extension);
121-
122109
/**
123110
* fl_opengl_manager_can_fence:
124111
* @manager: an #FlOpenGLManager.
@@ -132,6 +119,19 @@ gboolean fl_opengl_manager_has_extension(FlOpenGLManager* manager,
132119
*/
133120
gboolean fl_opengl_manager_can_fence(FlOpenGLManager* manager);
134121

122+
/**
123+
* fl_opengl_manager_can_wait_sync:
124+
* @manager: an #FlOpenGLManager.
125+
*
126+
* Checks whether a fence can be waited for by the GPU, i.e. without blocking
127+
* the thread doing the waiting. This is an extension that may be missing on
128+
* some drivers, so callers should fall back to blocking when this returns
129+
* %FALSE.
130+
*
131+
* Returns: %TRUE if fences can be waited for without blocking.
132+
*/
133+
gboolean fl_opengl_manager_can_wait_sync(FlOpenGLManager* manager);
134+
135135
G_END_DECLS
136136

137137
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_OPENGL_MANAGER_H_

0 commit comments

Comments
 (0)