[mutter] renderer-x11: Split up into CM and Nested renderers
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] renderer-x11: Split up into CM and Nested renderers
- Date: Fri, 7 Apr 2017 14:35:20 +0000 (UTC)
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]