Mesa (master): st/egl: Initialize KMS backend from an fd.

Chia-I Wu olv at kemper.freedesktop.org
Sun May 30 03:13:47 UTC 2010


Module: Mesa
Branch: master
Commit: 20c3d7190ed2c748cf959366a963b7dc973c5423
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=20c3d7190ed2c748cf959366a963b7dc973c5423

Author: Chia-I Wu <olv at lunarg.com>
Date:   Sun May 30 10:21:09 2010 +0800

st/egl: Initialize KMS backend from an fd.

Check if the native native is EGL_DEFAULT_DISPLAY.  If not, treat it as
an fd.

---

 src/gallium/state_trackers/egl/kms/native_kms.c |   37 +++++++++++++++++++----
 1 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/src/gallium/state_trackers/egl/kms/native_kms.c b/src/gallium/state_trackers/egl/kms/native_kms.c
index d7e7b2b..27cf84e 100644
--- a/src/gallium/state_trackers/egl/kms/native_kms.c
+++ b/src/gallium/state_trackers/egl/kms/native_kms.c
@@ -28,6 +28,7 @@
 #include "util/u_debug.h"
 #include "util/u_memory.h"
 #include "util/u_inlines.h"
+#include "util/u_pointer.h"
 #include "util/u_string.h"
 #include "egllog.h"
 
@@ -694,7 +695,27 @@ kms_display_init_screen(struct native_display *ndpy)
    struct kms_display *kdpy = kms_display(ndpy);
    int fd;
 
-   fd = drmOpen(kdpy->api->driver_name, NULL);
+   fd = kdpy->fd;
+   if (fd >= 0) {
+      drmVersionPtr version = drmGetVersion(fd);
+      if (!version || strcmp(version->name, kdpy->api->driver_name)) {
+         if (version) {
+            _eglLog(_EGL_WARNING, "unknown driver name %s", version->name);
+            drmFreeVersion(version);
+         }
+         else {
+            _eglLog(_EGL_WARNING, "invalid fd %d", fd);
+         }
+
+         return FALSE;
+      }
+
+      drmFreeVersion(version);
+   }
+   else {
+      fd = drmOpen(kdpy->api->driver_name, NULL);
+   }
+
    if (fd < 0) {
       _eglLog(_EGL_WARNING, "failed to open DRM device");
       return FALSE;
@@ -727,8 +748,7 @@ static struct native_display_modeset kms_display_modeset = {
 };
 
 static struct native_display *
-kms_create_display(EGLNativeDisplayType dpy,
-                   struct native_event_handler *event_handler,
+kms_create_display(int fd, struct native_event_handler *event_handler,
                    struct drm_api *api)
 {
    struct kms_display *kdpy;
@@ -746,7 +766,7 @@ kms_create_display(EGLNativeDisplayType dpy,
       return NULL;
    }
 
-   kdpy->fd = -1;
+   kdpy->fd = fd;
    if (!kms_display_init_screen(&kdpy->base)) {
       kms_display_destroy(&kdpy->base);
       return NULL;
@@ -818,12 +838,17 @@ native_create_display(EGLNativeDisplayType dpy,
                       struct native_event_handler *event_handler)
 {
    struct native_display *ndpy = NULL;
+   int fd;
 
    if (!drm_api)
       drm_api = drm_api_create();
 
-   if (drm_api)
-      ndpy = kms_create_display(dpy, event_handler, drm_api);
+   if (drm_api) {
+      /* well, this makes fd 0 being ignored */
+      fd = (dpy != EGL_DEFAULT_DISPLAY) ?
+         (int) pointer_to_intptr((void *) dpy) : -1;
+      ndpy = kms_create_display(fd, event_handler, drm_api);
+   }
 
    return ndpy;
 }




More information about the mesa-commit mailing list