egl/android: require ANDROID_native_fence_sync for buffer age
authorChia-I Wu <olvaffe@gmail.com>
Thu, 7 Feb 2019 23:14:19 +0000 (15:14 -0800)
committerMarge Bot <eric+marge@anholt.net>
Mon, 9 Mar 2020 18:27:11 +0000 (18:27 +0000)
Querying buffer age requires a buffer to be dequeued.  But dequeuing
without ANDROID_native_fence_sync might imply eglClientWaitSync,
which results in a deadlock as the display lock is already held by
eglQuerySurface.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/221>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/221>

src/egl/drivers/dri2/platform_android.c

index da90c44d601d453b715b68f449bb0a008b5aa3e5..8973017324bdc97f1c73ded82a078ad8a05178b2 100644 (file)
@@ -1645,7 +1645,18 @@ dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp)
    disp->Extensions.ANDROID_framebuffer_target = EGL_TRUE;
    disp->Extensions.ANDROID_image_native_buffer = EGL_TRUE;
    disp->Extensions.ANDROID_recordable = EGL_TRUE;
-   disp->Extensions.EXT_buffer_age = EGL_TRUE;
+
+   /* Querying buffer age requires a buffer to be dequeued.  Without
+    * EGL_ANDROID_native_fence_sync, dequeue might call eglClientWaitSync and
+    * result in a deadlock (the lock is already held by eglQuerySurface).
+    */
+   if (disp->Extensions.ANDROID_native_fence_sync) {
+      disp->Extensions.EXT_buffer_age = EGL_TRUE;
+#if ANDROID_API_LEVEL >= 23
+      disp->Extensions.KHR_partial_update = EGL_TRUE;
+#endif
+   }
+
    disp->Extensions.KHR_image = EGL_TRUE;
 #if ANDROID_API_LEVEL >= 24
    if (dri2_dpy->mutable_render_buffer &&