OSDN Git Service

egl/android: determine how to open device at runtime android-x86-8.1-r1
authorChih-Wei Huang <cwhuang@linux.org.tw>
Fri, 11 Jan 2019 10:00:40 +0000 (18:00 +0800)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Mon, 14 Jan 2019 10:31:44 +0000 (18:31 +0800)
This allows to build mesa libraries suitable for drm_gralloc and
other grallocs using prime fd.

v3: Handle having hwcomposer case the same as drm_gralloc since
    it works better on QEMU virgl.

Signed-off-by: Chih-Wei Huang <cwhuang@linux.org.tw>
src/egl/drivers/dri2/platform_android.c

index 1e93ab4..5500e50 100644 (file)
@@ -1207,6 +1207,7 @@ droid_open_device_drm_gralloc(_EGLDisplay *disp)
 {
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
    int fd = -1, err = -EINVAL;
+   char buf[PROPERTY_VALUE_MAX];
 
    if (dri2_dpy->gralloc->perform)
          err = dri2_dpy->gralloc->perform(dri2_dpy->gralloc,
@@ -1217,7 +1218,14 @@ droid_open_device_drm_gralloc(_EGLDisplay *disp)
       return EGL_FALSE;
    }
 
-   dri2_dpy->fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
+   if (!strcmp(dri2_dpy->gralloc->common.name, "DRM Memory Allocator") ||
+       property_get("ro.hardware.hwcomposer", buf, NULL) > 0) {
+      dri2_dpy->fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
+   } else {
+      const char *device_name = drmGetRenderDeviceNameFromFd(fd);
+      dri2_dpy->fd = loader_open_device(device_name);
+      free(device_name);
+   }
    if (dri2_dpy->fd < 0)
      return EGL_FALSE;
 
@@ -1453,6 +1461,7 @@ droid_probe_device(_EGLDisplay *disp)
    return EGL_TRUE;
 }
 
+#ifndef HAVE_DRM_GRALLOC
 static EGLBoolean
 droid_open_device(_EGLDisplay *disp)
 {
@@ -1522,6 +1531,7 @@ droid_open_device(_EGLDisplay *disp)
    return EGL_TRUE;
 #undef MAX_DRM_DEVICES
 }
+#endif
 
 EGLBoolean
 dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp)