[mutter/wip/login1: 134/139] weston-launch: Pass the DRM device to Cogl



commit 941630b561d9d7740cf8c9eeb310bd96ef063047
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Tue Mar 11 16:51:24 2014 -0400

    weston-launch: Pass the DRM device to Cogl
    
    Open the device from weston-launch, and pass it to Cogl/Clutter.
    This is a preliminary cleanup for our login1 integration.

 src/wayland/meta-wayland.c       |   11 -----
 src/wayland/meta-weston-launch.c |   48 ++++++++-------------
 src/wayland/meta-weston-launch.h |    4 --
 src/wayland/weston-launch.c      |   84 +++++++------------------------------
 src/wayland/weston-launch.h      |    5 +-
 5 files changed, 36 insertions(+), 116 deletions(-)
---
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index 8cbe6cf..a13a920 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -653,17 +653,6 @@ meta_wayland_init (void)
   if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS)
     g_error ("Failed to initialize Clutter");
 
-#if defined(CLUTTER_WINDOWING_EGL)
-  if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
-    {
-      ClutterBackend *backend = clutter_get_default_backend ();
-      CoglContext *cogl_context = clutter_backend_get_cogl_context (backend);
-      CoglRenderer *cogl_renderer = cogl_display_get_renderer (cogl_context_get_display (cogl_context));
-      int drm_fd = cogl_kms_renderer_get_kms_fd (cogl_renderer);
-      meta_launcher_set_drm_fd (compositor->launcher, drm_fd, NULL);
-    }
-#endif
-
   meta_monitor_manager_initialize ();
   monitors = meta_monitor_manager_get ();
   g_signal_connect (monitors, "monitors-changed",
diff --git a/src/wayland/meta-weston-launch.c b/src/wayland/meta-weston-launch.c
index 9532110..cfb17c3 100644
--- a/src/wayland/meta-weston-launch.c
+++ b/src/wayland/meta-weston-launch.c
@@ -23,6 +23,7 @@
 #include <gio/gunixfdmessage.h>
 
 #include <clutter/clutter.h>
+#include <clutter/egl/clutter-egl.h>
 #include <clutter/evdev/clutter-evdev.h>
 
 #include <glib.h>
@@ -154,36 +155,11 @@ send_message_to_wl (MetaLauncher           *self,
   return TRUE;
 }
 
-gboolean
-meta_launcher_set_drm_fd (MetaLauncher  *self,
-                         int            drm_fd,
-                         GError       **error)
-{
-  struct weston_launcher_message message;
-  GSocketControlMessage *cmsg;
-  gboolean ok;
-
-  message.opcode = WESTON_LAUNCHER_DRM_SET_FD;
-
-  cmsg = g_unix_fd_message_new ();
-  if (g_unix_fd_message_append_fd (G_UNIX_FD_MESSAGE (cmsg),
-                                  drm_fd, error) == FALSE)
-    {
-      g_object_unref (cmsg);
-      return FALSE;
-    }
-
-  ok = send_message_to_wl (self, &message, sizeof message, cmsg, NULL, error);
-
-  g_object_unref (cmsg);
-  return ok;
-}
-
 static int
-meta_launcher_open_input_device (MetaLauncher  *self,
-                                 const char    *name,
-                                 int            flags,
-                                 GError       **error)
+meta_launcher_open_device (MetaLauncher  *self,
+                           const char    *name,
+                           int            flags,
+                           GError       **error)
 {
   struct weston_launcher_open *message;
   GSocketControlMessage *cmsg;
@@ -259,7 +235,7 @@ on_evdev_device_open (const char  *path,
 {
   MetaLauncher *launcher = user_data;
 
-  return meta_launcher_open_input_device (launcher, path, flags, error);
+  return meta_launcher_open_device (launcher, path, flags, error);
 }
 
 static void
@@ -380,6 +356,18 @@ meta_launcher_new (void)
 
   clutter_evdev_set_open_callback (on_evdev_device_open, self);
 
+#if defined(CLUTTER_WINDOWING_EGL)
+  if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
+    {
+      GError *error = NULL;
+      int fd = meta_launcher_open_device (self, "/dev/dri/card0", O_RDWR, &error);
+      if (error)
+        g_error ("Failed to open /dev/dri/card0: %s", error->message);
+
+      clutter_egl_native_set_kms_fd (fd);
+    }
+#endif
+
   return self;
 }
 
diff --git a/src/wayland/meta-weston-launch.h b/src/wayland/meta-weston-launch.h
index 7fdd03c..b70faf8 100644
--- a/src/wayland/meta-weston-launch.h
+++ b/src/wayland/meta-weston-launch.h
@@ -31,8 +31,4 @@ void              meta_launcher_free                    (MetaLauncher  *self);
 gboolean          meta_launcher_activate_vt             (MetaLauncher  *self,
                                                         signed char    vt,
                                                         GError       **error);
-
-gboolean          meta_launcher_set_drm_fd              (MetaLauncher  *self,
-                                                        int            drm_fd,
-                                                        GError       **error);
 #endif
diff --git a/src/wayland/weston-launch.c b/src/wayland/weston-launch.c
index 240cfef..ae713ed 100644
--- a/src/wayland/weston-launch.c
+++ b/src/wayland/weston-launch.c
@@ -166,69 +166,6 @@ setenv_fd(const char *env, int fd)
 }
 
 static int
-handle_setdrmfd(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
-{
-        struct weston_launcher_reply reply;
-       struct cmsghdr *cmsg;
-       union cmsg_data *data;
-       struct stat s;
-
-       reply.header.opcode = WESTON_LAUNCHER_DRM_SET_FD;
-       reply.ret = -1;
-
-       if (wl->drm_fd != -1) {
-               error(0, 0, "DRM FD already set");
-               reply.ret = -EINVAL;
-               goto out;
-       }
-
-       cmsg = CMSG_FIRSTHDR(msg);
-       if (!cmsg ||
-           cmsg->cmsg_level != SOL_SOCKET ||
-           cmsg->cmsg_type != SCM_RIGHTS) {
-               error(0, 0, "invalid control message");
-               reply.ret = -EINVAL;
-               goto out;
-       }
-
-       data = (union cmsg_data *) CMSG_DATA(cmsg);
-       if (data->fd < 0) {
-               error(0, 0, "missing drm fd in socket request");
-               reply.ret = -EINVAL;
-               goto out;
-       }
-
-       if (fstat(data->fd, &s) < 0) {
-               reply.ret = -errno;
-               goto out;
-       }
-
-       if (major(s.st_rdev) != DRM_MAJOR) {
-               fprintf(stderr, "FD is not for DRM\n");
-               reply.ret = -EPERM;
-               goto out;
-       }
-
-       wl->drm_fd = data->fd;
-       reply.ret = drmSetMaster(data->fd);
-       if (reply.ret < 0)
-               reply.ret = -errno;
-
-       if (wl->verbose)
-               fprintf(stderr, "mutter-launch: set drm FD, ret: %d, fd: %d\n",
-                       reply.ret, data->fd);
-
-out:
-       do {
-               len = send(wl->sock[0], &reply, sizeof reply, 0);
-       } while (len < 0 && errno == EINTR);
-       if (len < 0)
-               return -1;
-
-       return 0;
-}
-
-static int
 handle_confirm_vt_switch(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
 {
         struct weston_launcher_reply reply;
@@ -323,6 +260,7 @@ handle_open(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
        struct iovec iov;
        struct weston_launcher_open *message;
        union cmsg_data *data;
+       int dev_major;
 
        reply.header.opcode = WESTON_LAUNCHER_OPEN;
        reply.ret = -1;
@@ -339,13 +277,22 @@ handle_open(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
                goto err0;
        }
 
-       if (major(s.st_rdev) != INPUT_MAJOR) {
-               fprintf(stderr, "Device %s is not an input device\n",
+       dev_major = major(s.st_rdev);
+
+       if (dev_major != INPUT_MAJOR ||
+           dev_major != DRM_MAJOR) {
+               fprintf(stderr, "Device %s is not an input or DRM device\n",
                        message->path);
                reply.ret = -EPERM;
                goto err0;
        }
 
+       if (dev_major == DRM_MAJOR && wl->drm_fd != -1) {
+               fprintf(stderr, "Already have a DRM device open\n");
+               reply.ret = -EPERM;
+               goto err0;
+       }
+
        fd = open(message->path, message->flags);
        if (fd < 0) {
                fprintf(stderr, "Error opening device %s: %m\n",
@@ -354,6 +301,10 @@ handle_open(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
                goto err0;
        }
 
+       if (dev_major == DRM_MAJOR) {
+               wl->drm_fd = fd;
+       }
+
 err0:
        memset(&nmsg, 0, sizeof nmsg);
        nmsg.msg_iov = &iov;
@@ -419,9 +370,6 @@ handle_socket_msg(struct weston_launch *wl)
        case WESTON_LAUNCHER_OPEN:
                ret = handle_open(wl, &msg, len);
                break;
-       case WESTON_LAUNCHER_DRM_SET_FD:
-               ret = handle_setdrmfd(wl, &msg, len);
-               break;
        case WESTON_LAUNCHER_CONFIRM_VT_SWITCH:
                ret = handle_confirm_vt_switch(wl, &msg, len);
                break;
diff --git a/src/wayland/weston-launch.h b/src/wayland/weston-launch.h
index 968dd74..1e716c5 100644
--- a/src/wayland/weston-launch.h
+++ b/src/wayland/weston-launch.h
@@ -31,9 +31,8 @@ enum weston_launcher_message_type {
 
 enum weston_launcher_opcode {
        WESTON_LAUNCHER_OPEN              = (1 << 1 | WESTON_LAUNCHER_REQUEST),
-       WESTON_LAUNCHER_DRM_SET_FD        = (2 << 1 | WESTON_LAUNCHER_REQUEST),
-       WESTON_LAUNCHER_ACTIVATE_VT       = (3 << 1 | WESTON_LAUNCHER_REQUEST),
-       WESTON_LAUNCHER_CONFIRM_VT_SWITCH = (4 << 1 | WESTON_LAUNCHER_REQUEST),
+       WESTON_LAUNCHER_ACTIVATE_VT       = (2 << 1 | WESTON_LAUNCHER_REQUEST),
+       WESTON_LAUNCHER_CONFIRM_VT_SWITCH = (3 << 1 | WESTON_LAUNCHER_REQUEST),
 };
 
 enum weston_launcher_server_opcode {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]