[mutter] Create cogl renderer in MetaRenderer



commit 2ceff4ee9b3d9e94f6ad72ac4256786d0c5b62c2
Author: Jonas Ådahl <jadahl gmail com>
Date:   Mon May 9 09:59:54 2016 +0800

    Create cogl renderer in MetaRenderer
    
    Instead of passing around the KMS file descriptor via clutter to cogl,
    just make our own clutter backend create the cogl renderer and set the
    KSM fd.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=768976

 clutter/clutter/clutter-backend.c                 |    8 ----
 clutter/clutter/egl/clutter-backend-eglnative.c   |   45 ---------------------
 src/Makefile.am                                   |    1 +
 src/backends/meta-renderer.c                      |    6 +++
 src/backends/meta-renderer.h                      |    6 +++
 src/backends/native/meta-clutter-backend-native.c |   19 ++++++++-
 src/backends/native/meta-launcher.c               |    1 -
 src/backends/native/meta-renderer-native.c        |   17 ++++++++
 src/backends/x11/meta-clutter-backend-x11.c       |   16 +++++++
 src/backends/x11/meta-renderer-x11.c              |   32 +++++++++++++++
 10 files changed, 95 insertions(+), 56 deletions(-)
---
diff --git a/clutter/clutter/clutter-backend.c b/clutter/clutter/clutter-backend.c
index 7a1b8ae..0f38270 100644
--- a/clutter/clutter/clutter-backend.c
+++ b/clutter/clutter/clutter-backend.c
@@ -242,14 +242,6 @@ clutter_backend_do_real_create_context (ClutterBackend  *backend,
   if (backend->cogl_renderer == NULL)
     goto error;
 
-#ifdef CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT
-  /* If the application is trying to act as a Wayland compositor then
-     it needs to have an EGL-based renderer backend */
-  if (_wayland_compositor_display)
-    cogl_renderer_add_constraint (backend->cogl_renderer,
-                                  COGL_RENDERER_CONSTRAINT_USES_EGL);
-#endif
-
   CLUTTER_NOTE (BACKEND, "Connecting the renderer");
   cogl_renderer_set_driver (backend->cogl_renderer, driver_id);
   if (!cogl_renderer_connect (backend->cogl_renderer, &internal_error))
diff --git a/clutter/clutter/egl/clutter-backend-eglnative.c b/clutter/clutter/egl/clutter-backend-eglnative.c
index 808e46a..649110b 100644
--- a/clutter/clutter/egl/clutter-backend-eglnative.c
+++ b/clutter/clutter/egl/clutter-backend-eglnative.c
@@ -57,10 +57,6 @@
 
 G_DEFINE_TYPE (ClutterBackendEglNative, clutter_backend_egl_native, CLUTTER_TYPE_BACKEND);
 
-#ifdef COGL_HAS_EGL_PLATFORM_KMS_SUPPORT
-static int _kms_fd = -1;
-#endif
-
 static void
 clutter_backend_egl_native_dispose (GObject *gobject)
 {
@@ -75,25 +71,6 @@ clutter_backend_egl_native_dispose (GObject *gobject)
   G_OBJECT_CLASS (clutter_backend_egl_native_parent_class)->dispose (gobject);
 }
 
-static CoglRenderer *
-clutter_backend_egl_native_get_renderer (ClutterBackend  *backend,
-                                         GError         **error)
-{
-  CoglRenderer *renderer;
-
-  renderer = cogl_renderer_new ();
-
-#ifdef COGL_HAS_EGL_PLATFORM_KMS_SUPPORT
-  if (_kms_fd > -1)
-    {
-      cogl_renderer_set_winsys_id (renderer, COGL_WINSYS_ID_EGL_KMS);
-      cogl_kms_renderer_set_kms_fd (renderer, _kms_fd);
-    }
-#endif
-
-  return renderer;
-}
-
 static void
 clutter_backend_egl_native_class_init (ClutterBackendEglNativeClass *klass)
 {
@@ -103,8 +80,6 @@ clutter_backend_egl_native_class_init (ClutterBackendEglNativeClass *klass)
   gobject_class->dispose = clutter_backend_egl_native_dispose;
 
   backend_class->stage_window_type = CLUTTER_TYPE_STAGE_EGL_NATIVE;
-
-  backend_class->get_renderer = clutter_backend_egl_native_get_renderer;
 }
 
 static void
@@ -189,26 +164,6 @@ clutter_egl_get_egl_display (void)
 #endif
 }
 
-#ifdef COGL_HAS_EGL_PLATFORM_KMS_SUPPORT
-/**
- * clutter_egl_set_kms_fd:
- * @fd: The fd to talk to the kms driver with
- *
- * Sets the fd that Cogl should use to talk to the kms driver.
- * Setting this to a negative value effectively reverts this
- * call, making Cogl open the device itself.
- *
- * This can only be called before clutter_init() is called.
- *
- * Since: 1.18
- */
-void
-clutter_egl_set_kms_fd (int fd)
-{
-  _kms_fd = fd;
-}
-#endif
-
 /**
  * clutter_egl_freeze_master_clock:
  *
diff --git a/src/Makefile.am b/src/Makefile.am
index b1ebfcb..a4c7cd0 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -13,6 +13,7 @@ AM_CPPFLAGS = \
        -DCLUTTER_ENABLE_EXPERIMENTAL_API                               \
        -DCOGL_ENABLE_EXPERIMENTAL_API                                  \
        -DCOGL_ENABLE_EXPERIMENTAL_2_0_API                              \
+       -DCOGL_ENABLE_MUTTER_API                                        \
        -DCLUTTER_DISABLE_DEPRECATION_WARNINGS                          \
        -DCOGL_DISABLE_DEPRECATION_WARNINGS                             \
        $(MUTTER_CFLAGS)                                                \
diff --git a/src/backends/meta-renderer.c b/src/backends/meta-renderer.c
index 9759b7e..dd6376d 100644
--- a/src/backends/meta-renderer.c
+++ b/src/backends/meta-renderer.c
@@ -30,6 +30,12 @@
 
 G_DEFINE_TYPE (MetaRenderer, meta_renderer, G_TYPE_OBJECT)
 
+CoglRenderer *
+meta_renderer_create_cogl_renderer (MetaRenderer *renderer)
+{
+  return META_RENDERER_GET_CLASS (renderer)->create_cogl_renderer (renderer);
+}
+
 static void
 meta_renderer_init (MetaRenderer *renderer)
 {
diff --git a/src/backends/meta-renderer.h b/src/backends/meta-renderer.h
index fa0c6cd..3888e60 100644
--- a/src/backends/meta-renderer.h
+++ b/src/backends/meta-renderer.h
@@ -27,12 +27,18 @@
 
 #include <glib-object.h>
 
+#include "cogl/cogl.h"
+
 #define META_TYPE_RENDERER (meta_renderer_get_type ())
 G_DECLARE_DERIVABLE_TYPE (MetaRenderer, meta_renderer, META, RENDERER, GObject)
 
 struct _MetaRendererClass
 {
   GObjectClass parent_class;
+
+  CoglRenderer * (* create_cogl_renderer) (MetaRenderer *renderer);
 };
 
+CoglRenderer * meta_renderer_create_cogl_renderer (MetaRenderer *renderer);
+
 #endif /* META_RENDERER_H */
diff --git a/src/backends/native/meta-clutter-backend-native.c 
b/src/backends/native/meta-clutter-backend-native.c
index b374f4f..4371241 100644
--- a/src/backends/native/meta-clutter-backend-native.c
+++ b/src/backends/native/meta-clutter-backend-native.c
@@ -26,9 +26,11 @@
 
 #include <glib-object.h>
 
-#include "clutter/clutter.h"
-#include "clutter/egl/clutter-backend-eglnative.h"
+#include "backends/meta-backend-private.h"
+#include "backends/meta-renderer.h"
 #include "backends/native/meta-clutter-backend-native.h"
+#include "clutter/clutter.h"
+#include "meta/meta-backend.h"
 
 struct _MetaClutterBackendNative
 {
@@ -38,6 +40,16 @@ struct _MetaClutterBackendNative
 G_DEFINE_TYPE (MetaClutterBackendNative, meta_clutter_backend_native,
                CLUTTER_TYPE_BACKEND_EGL_NATIVE)
 
+static CoglRenderer *
+meta_clutter_backend_native_get_renderer (ClutterBackend  *clutter_backend,
+                                          GError         **error)
+{
+  MetaBackend *backend = meta_get_backend ();
+  MetaRenderer *renderer = meta_backend_get_renderer (backend);
+
+  return meta_renderer_create_cogl_renderer (renderer);
+}
+
 static void
 meta_clutter_backend_native_init (MetaClutterBackendNative *clutter_backend_nativen)
 {
@@ -46,4 +58,7 @@ meta_clutter_backend_native_init (MetaClutterBackendNative *clutter_backend_nati
 static void
 meta_clutter_backend_native_class_init (MetaClutterBackendNativeClass *klass)
 {
+  ClutterBackendClass *clutter_backend_class = CLUTTER_BACKEND_CLASS (klass);
+
+  clutter_backend_class->get_renderer = meta_clutter_backend_native_get_renderer;
 }
diff --git a/src/backends/native/meta-launcher.c b/src/backends/native/meta-launcher.c
index 34e685a..5991fc7 100644
--- a/src/backends/native/meta-launcher.c
+++ b/src/backends/native/meta-launcher.c
@@ -465,7 +465,6 @@ meta_launcher_new (GError **error)
   self->session_active = TRUE;
   self->kms_fd = kms_fd;
 
-  clutter_egl_set_kms_fd (kms_fd);
   clutter_evdev_set_device_callbacks (on_evdev_device_open,
                                       on_evdev_device_close,
                                       self);
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 6e85655..16e2aa4 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -52,6 +52,20 @@ struct _MetaRendererNative
 
 G_DEFINE_TYPE (MetaRendererNative, meta_renderer_native, META_TYPE_RENDERER)
 
+static CoglRenderer *
+meta_renderer_native_create_cogl_renderer (MetaRenderer *renderer)
+{
+  MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
+  CoglRenderer *cogl_renderer;
+
+  cogl_renderer = cogl_renderer_new ();
+  cogl_renderer_set_custom_winsys (cogl_renderer,
+                                   _cogl_winsys_egl_kms_get_vtable);
+  cogl_kms_renderer_set_kms_fd (cogl_renderer, renderer_native->kms_fd);
+
+  return cogl_renderer;
+}
+
 static void
 meta_renderer_native_get_property (GObject    *object,
                                    guint       prop_id,
@@ -99,10 +113,13 @@ static void
 meta_renderer_native_class_init (MetaRendererNativeClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  MetaRendererClass *renderer_class = META_RENDERER_CLASS (klass);
 
   object_class->get_property = meta_renderer_native_get_property;
   object_class->set_property = meta_renderer_native_set_property;
 
+  renderer_class->create_cogl_renderer = meta_renderer_native_create_cogl_renderer;
+
   g_object_class_install_property (object_class,
                                    PROP_KMS_FD,
                                    g_param_spec_int ("kms-fd",
diff --git a/src/backends/x11/meta-clutter-backend-x11.c b/src/backends/x11/meta-clutter-backend-x11.c
index 3b40177..a3b6a50 100644
--- a/src/backends/x11/meta-clutter-backend-x11.c
+++ b/src/backends/x11/meta-clutter-backend-x11.c
@@ -26,8 +26,11 @@
 
 #include <glib-object.h>
 
+#include "backends/meta-backend-private.h"
+#include "backends/meta-renderer.h"
 #include "backends/x11/meta-clutter-backend-x11.h"
 #include "clutter/clutter.h"
+#include "meta/meta-backend.h"
 
 struct _MetaClutterBackendX11
 {
@@ -37,6 +40,16 @@ struct _MetaClutterBackendX11
 G_DEFINE_TYPE (MetaClutterBackendX11, meta_clutter_backend_x11,
                CLUTTER_TYPE_BACKEND_X11)
 
+static CoglRenderer *
+meta_clutter_backend_x11_get_renderer (ClutterBackend  *clutter_backend,
+                                       GError         **error)
+{
+  MetaBackend *backend = meta_get_backend ();
+  MetaRenderer *renderer = meta_backend_get_renderer (backend);
+
+  return meta_renderer_create_cogl_renderer (renderer);
+}
+
 static void
 meta_clutter_backend_x11_init (MetaClutterBackendX11 *clutter_backend_x11)
 {
@@ -45,4 +58,7 @@ meta_clutter_backend_x11_init (MetaClutterBackendX11 *clutter_backend_x11)
 static void
 meta_clutter_backend_x11_class_init (MetaClutterBackendX11Class *klass)
 {
+  ClutterBackendClass *clutter_backend_class = CLUTTER_BACKEND_CLASS (klass);
+
+  clutter_backend_class->get_renderer = meta_clutter_backend_x11_get_renderer;
 }
diff --git a/src/backends/x11/meta-renderer-x11.c b/src/backends/x11/meta-renderer-x11.c
index 3eebdee..9dab81d 100644
--- a/src/backends/x11/meta-renderer-x11.c
+++ b/src/backends/x11/meta-renderer-x11.c
@@ -26,7 +26,14 @@
 
 #include <glib-object.h>
 
+#include "clutter/x11/clutter-x11.h"
+#include "cogl/cogl.h"
+#include "cogl/cogl-xlib.h"
+#include "cogl/winsys/cogl-winsys-glx-private.h"
+#include "cogl/winsys/cogl-winsys-egl-x11-private.h"
+#include "backends/meta-renderer.h"
 #include "backends/x11/meta-renderer-x11.h"
+#include "meta/util.h"
 
 struct _MetaRendererX11
 {
@@ -35,6 +42,28 @@ struct _MetaRendererX11
 
 G_DEFINE_TYPE (MetaRendererX11, meta_renderer_x11, META_TYPE_RENDERER)
 
+static const CoglWinsysVtable *
+get_x11_cogl_winsys_vtable (void)
+{
+  if (meta_is_wayland_compositor ())
+    return _cogl_winsys_egl_xlib_get_vtable ();
+  else
+    return _cogl_winsys_glx_get_vtable ();
+}
+
+static CoglRenderer *
+meta_renderer_x11_create_cogl_renderer (MetaRenderer *renderer)
+{
+  CoglRenderer *cogl_renderer;
+  Display *xdisplay = clutter_x11_get_default_display ();
+
+  cogl_renderer = cogl_renderer_new ();
+  cogl_renderer_set_custom_winsys (cogl_renderer, get_x11_cogl_winsys_vtable);
+  cogl_xlib_renderer_set_foreign_display (cogl_renderer, xdisplay);
+
+  return cogl_renderer;
+}
+
 static void
 meta_renderer_x11_init (MetaRendererX11 *renderer_x11)
 {
@@ -43,4 +72,7 @@ meta_renderer_x11_init (MetaRendererX11 *renderer_x11)
 static void
 meta_renderer_x11_class_init (MetaRendererX11Class *klass)
 {
+  MetaRendererClass *renderer_class = META_RENDERER_CLASS (klass);
+
+  renderer_class->create_cogl_renderer = meta_renderer_x11_create_cogl_renderer;
 }


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