[mutter] renderer-x11: Split up into CM and Nested renderers



commit 2091df3856939eb80baecce2f41c384fe4ae7a2c
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Mar 17 15:00:54 2017 +0800

    renderer-x11: Split up into CM and Nested renderers
    
    Split up the MetaRendererX11 class into one for when running as a
    X11 compositing manager, and one for when running as a nested Wayland
    compositor.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777732

 src/Makefile.am                                    |    4 +
 src/backends/x11/cm/meta-backend-x11-cm.c          |    8 ++
 src/backends/x11/cm/meta-renderer-x11-cm.c         |   43 +++++++
 src/backends/x11/cm/meta-renderer-x11-cm.h         |   33 +++++
 src/backends/x11/meta-backend-x11.c                |    7 -
 src/backends/x11/meta-renderer-x11.c               |   84 ------------
 src/backends/x11/meta-renderer-x11.h               |   11 ++-
 src/backends/x11/nested/meta-backend-x11-nested.c  |    8 ++
 src/backends/x11/nested/meta-renderer-x11-nested.c |  134 ++++++++++++++++++++
 src/backends/x11/nested/meta-renderer-x11-nested.h |   33 +++++
 10 files changed, 271 insertions(+), 94 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 17354ea..3a154b2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -137,10 +137,14 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES =    \
        backends/x11/meta-cursor-renderer-x11.h         \
        backends/x11/cm/meta-backend-x11-cm.c           \
        backends/x11/cm/meta-backend-x11-cm.h           \
+       backends/x11/cm/meta-renderer-x11-cm.c          \
+       backends/x11/cm/meta-renderer-x11-cm.h          \
        backends/x11/nested/meta-backend-x11-nested.c   \
        backends/x11/nested/meta-backend-x11-nested.h   \
        backends/x11/nested/meta-cursor-renderer-x11-nested.c           \
        backends/x11/nested/meta-cursor-renderer-x11-nested.h           \
+       backends/x11/nested/meta-renderer-x11-nested.c  \
+       backends/x11/nested/meta-renderer-x11-nested.h  \
        backends/x11/meta-idle-monitor-xsync.c          \
        backends/x11/meta-idle-monitor-xsync.h          \
        backends/x11/meta-input-settings-x11.c          \
diff --git a/src/backends/x11/cm/meta-backend-x11-cm.c b/src/backends/x11/cm/meta-backend-x11-cm.c
index 814ca61..69f9cad 100644
--- a/src/backends/x11/cm/meta-backend-x11-cm.c
+++ b/src/backends/x11/cm/meta-backend-x11-cm.c
@@ -29,6 +29,7 @@
 #include "backends/meta-backend-private.h"
 #include "backends/x11/meta-cursor-renderer-x11.h"
 #include "backends/x11/meta-monitor-manager-xrandr.h"
+#include "backends/x11/cm/meta-renderer-x11-cm.h"
 
 struct _MetaBackendX11Cm
 {
@@ -89,6 +90,12 @@ meta_backend_x11_cm_post_init (MetaBackend *backend)
   take_touch_grab (backend);
 }
 
+static MetaRenderer *
+meta_backend_x11_cm_create_renderer (MetaBackend *backend)
+{
+  return g_object_new (META_TYPE_RENDERER_X11_CM, NULL);
+}
+
 static MetaMonitorManager *
 meta_backend_x11_cm_create_monitor_manager (MetaBackend *backend)
 {
@@ -380,6 +387,7 @@ meta_backend_x11_cm_class_init (MetaBackendX11CmClass *klass)
   MetaBackendX11Class *backend_x11_class = META_BACKEND_X11_CLASS (klass);
 
   backend_class->post_init = meta_backend_x11_cm_post_init;
+  backend_class->create_renderer = meta_backend_x11_cm_create_renderer;
   backend_class->create_monitor_manager = meta_backend_x11_cm_create_monitor_manager;
   backend_class->create_cursor_renderer = meta_backend_x11_cm_create_cursor_renderer;
   backend_class->update_screen_size = meta_backend_x11_cm_update_screen_size;
diff --git a/src/backends/x11/cm/meta-renderer-x11-cm.c b/src/backends/x11/cm/meta-renderer-x11-cm.c
new file mode 100644
index 0000000..1bdc206
--- /dev/null
+++ b/src/backends/x11/cm/meta-renderer-x11-cm.c
@@ -0,0 +1,43 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2016 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include "backends/x11/cm/meta-renderer-x11-cm.h"
+
+struct _MetaRendererX11Cm
+{
+  MetaRendererX11 parent;
+};
+
+G_DEFINE_TYPE (MetaRendererX11Cm, meta_renderer_x11_cm,
+               META_TYPE_RENDERER_X11)
+
+static void
+meta_renderer_x11_cm_init (MetaRendererX11Cm *renderer_x11_cm)
+{
+}
+
+static void
+meta_renderer_x11_cm_class_init (MetaRendererX11CmClass *klass)
+{
+}
diff --git a/src/backends/x11/cm/meta-renderer-x11-cm.h b/src/backends/x11/cm/meta-renderer-x11-cm.h
new file mode 100644
index 0000000..e890a3d
--- /dev/null
+++ b/src/backends/x11/cm/meta-renderer-x11-cm.h
@@ -0,0 +1,33 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2016 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ */
+
+#ifndef META_RENDERER_X11_CM_H
+#define META_RENDERER_X11_CM_H
+
+#include "backends/x11/meta-renderer-x11.h"
+
+#define META_TYPE_RENDERER_X11_CM (meta_renderer_x11_cm_get_type ())
+G_DECLARE_FINAL_TYPE (MetaRendererX11Cm, meta_renderer_x11_cm,
+                      META, RENDERER_X11_CM,
+                      MetaRendererX11)
+
+#endif /* META_RENDERER_X11_CM_H */
diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c
index 439fb96..618babf 100644
--- a/src/backends/x11/meta-backend-x11.c
+++ b/src/backends/x11/meta-backend-x11.c
@@ -451,12 +451,6 @@ meta_backend_x11_create_idle_monitor (MetaBackend *backend,
                        NULL);
 }
 
-static MetaRenderer *
-meta_backend_x11_create_renderer (MetaBackend *backend)
-{
-  return g_object_new (META_TYPE_RENDERER_X11, NULL);
-}
-
 static gboolean
 meta_backend_x11_grab_device (MetaBackend *backend,
                               int          device_id,
@@ -600,7 +594,6 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
   backend_class->create_clutter_backend = meta_backend_x11_create_clutter_backend;
   backend_class->post_init = meta_backend_x11_post_init;
   backend_class->create_idle_monitor = meta_backend_x11_create_idle_monitor;
-  backend_class->create_renderer = meta_backend_x11_create_renderer;
   backend_class->grab_device = meta_backend_x11_grab_device;
   backend_class->ungrab_device = meta_backend_x11_ungrab_device;
   backend_class->warp_pointer = meta_backend_x11_warp_pointer;
diff --git a/src/backends/x11/meta-renderer-x11.c b/src/backends/x11/meta-renderer-x11.c
index 5eb81dd..90924e0 100644
--- a/src/backends/x11/meta-renderer-x11.c
+++ b/src/backends/x11/meta-renderer-x11.c
@@ -40,11 +40,6 @@
 #include "meta/meta-backend.h"
 #include "meta/util.h"
 
-struct _MetaRendererX11
-{
-  MetaRenderer parent;
-};
-
 G_DEFINE_TYPE (MetaRendererX11, meta_renderer_x11, META_TYPE_RENDERER)
 
 static const CoglWinsysVtable *
@@ -90,84 +85,6 @@ meta_renderer_x11_create_cogl_renderer (MetaRenderer *renderer)
   return cogl_renderer;
 }
 
-static MetaMonitorTransform
-calculate_view_transform (MetaMonitorManager *monitor_manager,
-                          MetaLogicalMonitor *logical_monitor)
-{
-  MetaMonitor *main_monitor;
-  MetaOutput *main_output;
-  main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data;
-  main_output = meta_monitor_get_main_output (main_monitor);
-
-  /*
-   * Pick any monitor and output and check; all CRTCs of a logical monitor will
-   * always have the same transform assigned to them.
-   */
-
-  if (meta_monitor_manager_is_transform_handled (monitor_manager,
-                                                 main_output->crtc,
-                                                 main_output->crtc->transform))
-    return META_MONITOR_TRANSFORM_NORMAL;
-  else
-    return main_output->crtc->transform;
-}
-
-static MetaRendererView *
-meta_renderer_x11_create_view (MetaRenderer       *renderer,
-                               MetaLogicalMonitor *logical_monitor)
-{
-  MetaBackend *backend = meta_get_backend ();
-  MetaMonitorManager *monitor_manager =
-    meta_backend_get_monitor_manager (backend);
-  ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
-  CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend);
-  MetaMonitorTransform view_transform;
-  int view_scale;
-  int width, height;
-  CoglTexture2D *texture_2d;
-  CoglOffscreen *fake_onscreen;
-  CoglOffscreen *offscreen;
-  GError *error = NULL;
-
-  g_assert (meta_is_wayland_compositor ());
-
-  view_transform = calculate_view_transform (monitor_manager, logical_monitor);
-
-  if (meta_is_stage_views_scaled ())
-    view_scale = logical_monitor->scale;
-  else
-    view_scale = 1;
-
-  width = logical_monitor->rect.width * view_scale;
-  height = logical_monitor->rect.height * view_scale;
-
-  texture_2d = cogl_texture_2d_new_with_size (cogl_context, width, height);
-  fake_onscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (texture_2d));
-
-  if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (fake_onscreen), &error))
-    meta_fatal ("Couldn't allocate framebuffer: %s", error->message);
-
-  if (view_transform != META_MONITOR_TRANSFORM_NORMAL)
-    {
-      texture_2d = cogl_texture_2d_new_with_size (cogl_context, width, height);
-      offscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (texture_2d));
-      if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (offscreen), &error))
-        meta_fatal ("Couldn't allocate offscreen framebuffer: %s", error->message);
-    }
-  else
-    {
-      offscreen = NULL;
-    }
-
-  return g_object_new (META_TYPE_RENDERER_VIEW,
-                       "layout", &logical_monitor->rect,
-                       "framebuffer", COGL_FRAMEBUFFER (fake_onscreen),
-                       "offscreen", COGL_FRAMEBUFFER (offscreen),
-                       "transform", view_transform,
-                       "scale", view_scale,
-                       NULL);
-}
-
 static void
 meta_renderer_x11_init (MetaRendererX11 *renderer_x11)
 {
@@ -179,5 +96,4 @@ 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;
-  renderer_class->create_view = meta_renderer_x11_create_view;
 }
diff --git a/src/backends/x11/meta-renderer-x11.h b/src/backends/x11/meta-renderer-x11.h
index 710137c..5ec0d4b 100644
--- a/src/backends/x11/meta-renderer-x11.h
+++ b/src/backends/x11/meta-renderer-x11.h
@@ -29,9 +29,14 @@
 
 #include "backends/meta-renderer.h"
 
+struct _MetaRendererX11Class
+{
+  MetaRendererClass parent_class;
+};
+
 #define META_TYPE_RENDERER_X11 (meta_renderer_x11_get_type ())
-G_DECLARE_FINAL_TYPE (MetaRendererX11, meta_renderer_x11,
-                      META, RENDERER_X11,
-                      MetaRenderer)
+G_DECLARE_DERIVABLE_TYPE (MetaRendererX11, meta_renderer_x11,
+                          META, RENDERER_X11,
+                          MetaRenderer)
 
 #endif /* META_RENDERER_X11_H */
diff --git a/src/backends/x11/nested/meta-backend-x11-nested.c 
b/src/backends/x11/nested/meta-backend-x11-nested.c
index 7930e3f..3f9486f 100644
--- a/src/backends/x11/nested/meta-backend-x11-nested.c
+++ b/src/backends/x11/nested/meta-backend-x11-nested.c
@@ -24,12 +24,19 @@
 #include "backends/meta-monitor-manager-dummy.h"
 #include "backends/x11/nested/meta-backend-x11-nested.h"
 #include "backends/x11/nested/meta-cursor-renderer-x11-nested.h"
+#include "backends/x11/nested/meta-renderer-x11-nested.h"
 
 #include "wayland/meta-wayland.h"
 
 G_DEFINE_TYPE (MetaBackendX11Nested, meta_backend_x11_nested,
                META_TYPE_BACKEND_X11)
 
+static MetaRenderer *
+meta_backend_x11_nested_create_renderer (MetaBackend *backend)
+{
+  return g_object_new (META_TYPE_RENDERER_X11_NESTED, NULL);
+}
+
 static MetaMonitorManager *
 meta_backend_x11_nested_create_monitor_manager (MetaBackend *backend)
 {
@@ -167,6 +174,7 @@ meta_backend_x11_nested_class_init (MetaBackendX11NestedClass *klass)
   MetaBackendClass *backend_class = META_BACKEND_CLASS (klass);
   MetaBackendX11Class *backend_x11_class = META_BACKEND_X11_CLASS (klass);
 
+  backend_class->create_renderer = meta_backend_x11_nested_create_renderer;
   backend_class->create_monitor_manager = meta_backend_x11_nested_create_monitor_manager;
   backend_class->create_cursor_renderer = meta_backend_x11_nested_create_cursor_renderer;
   backend_class->update_screen_size = meta_backend_x11_nested_update_screen_size;
diff --git a/src/backends/x11/nested/meta-renderer-x11-nested.c 
b/src/backends/x11/nested/meta-renderer-x11-nested.c
new file mode 100644
index 0000000..abd6a53
--- /dev/null
+++ b/src/backends/x11/nested/meta-renderer-x11-nested.c
@@ -0,0 +1,134 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2016 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include "backends/x11/nested/meta-renderer-x11-nested.h"
+
+#include <glib-object.h>
+
+#include "clutter/x11/clutter-x11.h"
+#include "backends/meta-backend-private.h"
+#include "backends/meta-logical-monitor.h"
+#include "backends/meta-renderer.h"
+#include "backends/meta-renderer-view.h"
+#include "core/boxes-private.h"
+#include "meta/meta-backend.h"
+#include "meta/util.h"
+
+struct _MetaRendererX11Nested
+{
+  MetaRendererX11 parent;
+};
+
+G_DEFINE_TYPE (MetaRendererX11Nested, meta_renderer_x11_nested,
+               META_TYPE_RENDERER_X11)
+
+static MetaMonitorTransform
+calculate_view_transform (MetaMonitorManager *monitor_manager,
+                          MetaLogicalMonitor *logical_monitor)
+{
+  MetaMonitor *main_monitor;
+  MetaOutput *main_output;
+  main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data;
+  main_output = meta_monitor_get_main_output (main_monitor);
+
+  /*
+   * Pick any monitor and output and check; all CRTCs of a logical monitor will
+   * always have the same transform assigned to them.
+   */
+
+  if (meta_monitor_manager_is_transform_handled (monitor_manager,
+                                                 main_output->crtc,
+                                                 main_output->crtc->transform))
+    return META_MONITOR_TRANSFORM_NORMAL;
+  else
+    return main_output->crtc->transform;
+}
+
+static MetaRendererView *
+meta_renderer_x11_nested_create_view (MetaRenderer       *renderer,
+                                      MetaLogicalMonitor *logical_monitor)
+{
+  MetaBackend *backend = meta_get_backend ();
+  MetaMonitorManager *monitor_manager =
+    meta_backend_get_monitor_manager (backend);
+  ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
+  CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend);
+  MetaMonitorTransform view_transform;
+  int view_scale;
+  int width, height;
+  CoglTexture2D *texture_2d;
+  CoglOffscreen *fake_onscreen;
+  CoglOffscreen *offscreen;
+  GError *error = NULL;
+
+  view_transform = calculate_view_transform (monitor_manager, logical_monitor);
+
+  if (meta_is_stage_views_scaled ())
+    view_scale = logical_monitor->scale;
+  else
+    view_scale = 1;
+
+  width = logical_monitor->rect.width * view_scale;
+  height = logical_monitor->rect.height * view_scale;
+
+  texture_2d = cogl_texture_2d_new_with_size (cogl_context, width, height);
+  fake_onscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (texture_2d));
+
+  if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (fake_onscreen), &error))
+    meta_fatal ("Couldn't allocate framebuffer: %s", error->message);
+
+  if (view_transform != META_MONITOR_TRANSFORM_NORMAL)
+    {
+      texture_2d = cogl_texture_2d_new_with_size (cogl_context, width, height);
+      offscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (texture_2d));
+      if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (offscreen), &error))
+        meta_fatal ("Couldn't allocate offscreen framebuffer: %s", error->message);
+    }
+  else
+    {
+      offscreen = NULL;
+    }
+
+  return g_object_new (META_TYPE_RENDERER_VIEW,
+                       "layout", &logical_monitor->rect,
+                       "framebuffer", COGL_FRAMEBUFFER (fake_onscreen),
+                       "offscreen", COGL_FRAMEBUFFER (offscreen),
+                       "transform", view_transform,
+                       "scale", view_scale,
+                       NULL);
+}
+
+static void
+meta_renderer_x11_nested_init (MetaRendererX11Nested *renderer_x11_nested)
+{
+}
+
+static void
+meta_renderer_x11_nested_class_init (MetaRendererX11NestedClass *klass)
+{
+  MetaRendererClass *renderer_class = META_RENDERER_CLASS (klass);
+
+  renderer_class->create_view = meta_renderer_x11_nested_create_view;
+}
+
diff --git a/src/backends/x11/nested/meta-renderer-x11-nested.h 
b/src/backends/x11/nested/meta-renderer-x11-nested.h
new file mode 100644
index 0000000..c766db8
--- /dev/null
+++ b/src/backends/x11/nested/meta-renderer-x11-nested.h
@@ -0,0 +1,33 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2016 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ */
+
+#ifndef META_RENDERER_X11_NESTED_H
+#define META_RENDERER_X11_NESTED_H
+
+#include "backends/x11/meta-renderer-x11.h"
+
+#define META_TYPE_RENDERER_X11_NESTED (meta_renderer_x11_nested_get_type ())
+G_DECLARE_FINAL_TYPE (MetaRendererX11Nested, meta_renderer_x11_nested,
+                      META, RENDERER_X11_NESTED,
+                      MetaRendererX11)
+
+#endif /* META_RENDERER_X11_NESTED_H */


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