st/egl: Initialize KMS backend from an fd.
authorChia-I Wu <olv@lunarg.com>
Sun, 30 May 2010 02:21:09 +0000 (10:21 +0800)
committerChia-I Wu <olv@lunarg.com>
Sun, 30 May 2010 02:52:50 +0000 (10:52 +0800)
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

index d7e7b2b..27cf84e 100644 (file)
@@ -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;
 }