backend: Set up and use ownership chains

This means objects have an owner, where the chain eventually always
leads to a MetaContext. This also means that all objects can find their
way to other object instances via the chain, instead of scattered global
singletons.

This is a squashed commit originally containing the following:

cursor-tracker: Don't get backend from singleton

idle-manager: Don't get backend from singleton

input-device: Pass pointer to backend during construction

The backend is needed during construction to get the wacom database.

input-mapper: Pass backend when constructing

monitor: Don't get backend from singleton

monitor-manager: Get backend directly from monitor manager

remote: Get backend from manager class

For the remote desktop and screen cast implementations, replace getting
the backend from singletons with getting it via the manager classes.

launcher: Pass backend during construction

device-pool: Pass backend during construction

Instead of passing the (maybe null) launcher, pass the backend, and get
the launcher from there. That way we always have a way to some known
context from the device pool.

drm-buffer/gbm: Get backend via device pool

cursor-renderer: Get backend directly from renderer

input-device: Get backend getter

input-settings: Add backend construct property and getter

input-settings/x11: Don't get backend from singleton

renderer: Get backend from renderer itself

seat-impl: Add backend getter

seat/native: Get backend from instance struct

stage-impl: Get backend from stage impl itself

x11/xkb-a11y: Don't get backend from singleton

backend/x11/nested: Don't get Wayland compositor from singleton

crtc: Add backend property

Adding a link to the GPU isn't enough; the virtual CRTCs of virtual
monitors doesn't have one.

cursor-tracker: Don't get display from singleton

remote: Don't get display from singleton

seat: Don't get display from singleton

backend/x11: Don't get display from singleton

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2718>
This commit is contained in:
Jonas Ådahl
2022-05-27 19:35:01 +02:00
committed by Marge Bot
parent c45ab10c0e
commit c390f70edc
54 changed files with 506 additions and 144 deletions

View File

@ -789,12 +789,14 @@ meta_backend_native_initable_init (GInitable *initable,
break;
}
native->launcher = meta_launcher_new (session_id, seat_id, error);
native->launcher = meta_launcher_new (backend,
session_id, seat_id,
error);
if (!native->launcher)
return FALSE;
}
native->device_pool = meta_device_pool_new (native->launcher);
native->device_pool = meta_device_pool_new (native);
native->udev = meta_udev_new (native);
kms_flags = META_KMS_FLAG_NONE;

View File

@ -525,6 +525,7 @@ meta_crtc_kms_new (MetaGpuKms *gpu_kms,
kms_crtc);
crtc_kms = g_object_new (META_TYPE_CRTC_KMS,
"id", (uint64_t) meta_kms_crtc_get_id (kms_crtc),
"backend", meta_gpu_get_backend (gpu),
"gpu", gpu,
NULL);

View File

@ -31,9 +31,11 @@ struct _MetaCrtcVirtual
G_DEFINE_TYPE (MetaCrtcVirtual, meta_crtc_virtual, META_TYPE_CRTC_NATIVE)
MetaCrtcVirtual *
meta_crtc_virtual_new (uint64_t id)
meta_crtc_virtual_new (MetaBackend *backend,
uint64_t id)
{
return g_object_new (META_TYPE_CRTC_VIRTUAL,
"backend", backend,
"id", META_CRTC_VIRTUAL_ID_BIT | id,
NULL);
}

View File

@ -27,6 +27,7 @@ G_DECLARE_FINAL_TYPE (MetaCrtcVirtual, meta_crtc_virtual,
META, CRTC_VIRTUAL,
MetaCrtcNative)
MetaCrtcVirtual * meta_crtc_virtual_new (uint64_t id);
MetaCrtcVirtual * meta_crtc_virtual_new (MetaBackend *backend,
uint64_t id);
#endif /* META_CRTC_VIRTUAL_H */

View File

@ -22,6 +22,7 @@
#include <glib-object.h>
#include "backends/native/meta-backend-native-types.h"
#include "backends/native/meta-device-pool.h"
#include "backends/native/meta-launcher.h"
@ -30,6 +31,6 @@ G_DECLARE_FINAL_TYPE (MetaDevicePool, meta_device_pool,
META, DEVICE_POOL,
GObject)
MetaDevicePool * meta_device_pool_new (MetaLauncher *launcher);
MetaDevicePool * meta_device_pool_new (MetaBackendNative *backend_native);
#endif /* META_DEVICE_POOL_PRIVATE_H */

View File

@ -27,7 +27,9 @@
#include <sys/sysmacros.h>
#include <sys/types.h>
#include "backends/native/meta-backend-native.h"
#include "backends/native/meta-launcher.h"
#include "meta/meta-backend.h"
#include "meta/util.h"
#include "meta-dbus-login1.h"
@ -50,6 +52,8 @@ struct _MetaDevicePool
{
GObject parent;
MetaBackend *backend;
MetaDbusLogin1Session *session_proxy;
GMutex mutex;
@ -351,12 +355,16 @@ release_device_file (MetaDevicePool *pool,
}
MetaDevicePool *
meta_device_pool_new (MetaLauncher *launcher)
meta_device_pool_new (MetaBackendNative *backend_native)
{
MetaDevicePool *pool;
MetaLauncher *launcher;
pool = g_object_new (META_TYPE_DEVICE_POOL, NULL);
pool->backend = META_BACKEND (backend_native);
launcher = meta_backend_native_get_launcher (backend_native);
if (launcher)
pool->session_proxy = meta_launcher_get_session_proxy (launcher);
@ -387,3 +395,9 @@ meta_device_pool_class_init (MetaDevicePoolClass *klass)
object_class->finalize = meta_device_pool_finalize;
}
MetaBackend *
meta_device_pool_get_backend (MetaDevicePool *pool)
{
return pool->backend;
}

View File

@ -68,6 +68,8 @@ MetaDeviceFile * meta_device_pool_open (MetaDevicePool *pool,
MetaDeviceFileFlags flags,
GError **error);
MetaBackend * meta_device_pool_get_backend (MetaDevicePool *pool);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaDeviceFile, meta_device_file_release)
#endif /* META_DEVICE_FILE_POOL_H */

View File

@ -33,6 +33,7 @@
#include "backends/meta-backend-private.h"
#include "backends/native/meta-cogl-utils.h"
#include "backends/native/meta-device-pool.h"
#include "backends/native/meta-drm-buffer-private.h"
struct _MetaDrmBufferGbm
@ -236,7 +237,9 @@ meta_drm_buffer_gbm_fill_timings (MetaDrmBuffer *buffer,
GError **error)
{
MetaDrmBufferGbm *buffer_gbm = META_DRM_BUFFER_GBM (buffer);
MetaBackend *backend = meta_get_backend ();
MetaDeviceFile *device_file = meta_drm_buffer_get_device_file (buffer);
MetaDevicePool *device_pool = meta_device_file_get_pool (device_file);
MetaBackend *backend = meta_device_pool_get_backend (device_pool);
MetaEgl *egl = meta_backend_get_egl (backend);
ClutterBackend *clutter_backend =
meta_backend_get_clutter_backend (backend);
@ -354,7 +357,10 @@ meta_drm_buffer_gbm_blit_to_framebuffer (CoglScanout *scanout,
GError **error)
{
MetaDrmBufferGbm *buffer_gbm = META_DRM_BUFFER_GBM (scanout);
MetaBackend *backend = meta_get_backend ();
MetaDrmBuffer *buffer = META_DRM_BUFFER (buffer_gbm);
MetaDeviceFile *device_file = meta_drm_buffer_get_device_file (buffer);
MetaDevicePool *device_pool = meta_device_file_get_pool (device_file);
MetaBackend *backend = meta_device_pool_get_backend (device_pool);
MetaEgl *egl = meta_backend_get_egl (backend);
ClutterBackend *clutter_backend =
meta_backend_get_clutter_backend (backend);

View File

@ -1461,6 +1461,7 @@ meta_input_device_native_new_in_impl (MetaSeatImpl *seat_impl,
}
device = g_object_new (META_TYPE_INPUT_DEVICE_NATIVE,
"backend", meta_seat_impl_get_backend (seat_impl),
"name", libinput_device_get_name (libinput_device),
"device-type", type,
"capabilities", capabilities,
@ -1532,6 +1533,7 @@ meta_input_device_native_new_virtual (MetaSeatImpl *seat_impl,
};
device = g_object_new (META_TYPE_INPUT_DEVICE_NATIVE,
"backend", meta_seat_impl_get_backend (seat_impl),
"name", name,
"device-type", type,
"device-mode", mode,

View File

@ -831,6 +831,7 @@ MetaInputSettings *
meta_input_settings_native_new_in_impl (MetaSeatImpl *seat_impl)
{
return g_object_new (META_TYPE_INPUT_SETTINGS_NATIVE,
"backend", meta_seat_impl_get_backend (seat_impl),
"seat-impl", seat_impl,
NULL);
}

View File

@ -46,6 +46,8 @@
struct _MetaLauncher
{
MetaBackend *backend;
MetaDbusLogin1Session *session_proxy;
MetaDbusLogin1Seat *seat_proxy;
char *seat_id;
@ -309,7 +311,7 @@ get_seat_proxy (gchar *seat_id,
static void
sync_active (MetaLauncher *self)
{
MetaBackend *backend = meta_get_backend ();
MetaBackend *backend = self->backend;
MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend);
MetaDbusLogin1Session *session_proxy = self->session_proxy;
gboolean active;
@ -371,9 +373,10 @@ meta_launcher_get_session_proxy (MetaLauncher *launcher)
}
MetaLauncher *
meta_launcher_new (const char *fallback_session_id,
const char *fallback_seat_id,
GError **error)
meta_launcher_new (MetaBackend *backend,
const char *fallback_session_id,
const char *fallback_seat_id,
GError **error)
{
MetaLauncher *self = NULL;
g_autoptr (MetaDbusLogin1Session) session_proxy = NULL;
@ -420,6 +423,7 @@ meta_launcher_new (const char *fallback_session_id,
goto fail;
self = g_new0 (MetaLauncher, 1);
self->backend = backend;
self->session_proxy = g_object_ref (session_proxy);
self->seat_proxy = g_object_ref (seat_proxy);
self->seat_id = g_steal_pointer (&seat_id);
@ -455,3 +459,9 @@ meta_launcher_activate_vt (MetaLauncher *launcher,
return meta_dbus_login1_seat_call_switch_to_sync (launcher->seat_proxy, vt,
NULL, error);
}
MetaBackend *
meta_launcher_get_backend (MetaLauncher *launcher)
{
return launcher->backend;
}

View File

@ -22,10 +22,13 @@
#include <glib-object.h>
#include "backends/meta-backend-types.h"
typedef struct _MetaLauncher MetaLauncher;
typedef struct _MetaDbusLogin1Session MetaDbusLogin1Session;
MetaLauncher *meta_launcher_new (const char *session_id,
MetaLauncher *meta_launcher_new (MetaBackend *backend,
const char *session_id,
const char *custom_seat_id,
GError **error);
void meta_launcher_free (MetaLauncher *self);
@ -38,5 +41,7 @@ const char * meta_launcher_get_seat_id (MetaLauncher *launcher)
MetaDbusLogin1Session * meta_launcher_get_session_proxy (MetaLauncher *launcher);
MetaBackend * meta_launcher_get_backend (MetaLauncher *launcher);
#endif /* META_LAUNCHER_H */

View File

@ -310,7 +310,7 @@ meta_monitor_manager_native_apply_monitors_config (MetaMonitorManager *ma
{
if (!manager->in_init)
{
MetaBackend *backend = meta_get_backend ();
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
MetaRenderer *renderer = meta_backend_get_renderer (backend);
meta_renderer_native_reset_modes (META_RENDERER_NATIVE (renderer));
@ -628,13 +628,14 @@ meta_monitor_manager_native_create_virtual_monitor (MetaMonitorManager
const MetaVirtualMonitorInfo *info,
GError **error)
{
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
MetaMonitorManagerNative *manager_native =
META_MONITOR_MANAGER_NATIVE (manager);
MetaVirtualMonitorNative *virtual_monitor_native;
uint64_t id;
id = allocate_virtual_monitor_id (manager_native);
virtual_monitor_native = meta_virtual_monitor_native_new (id, info);
virtual_monitor_native = meta_virtual_monitor_native_new (backend, id, info);
g_signal_connect (virtual_monitor_native, "notify::crtc-mode",
G_CALLBACK (on_virtual_monitor_mode_changed),
manager);

View File

@ -415,7 +415,8 @@ meta_renderer_native_choose_egl_config (CoglDisplay *cogl_display,
{
CoglRenderer *cogl_renderer = cogl_display->renderer;
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
MetaBackend *backend = meta_get_backend ();
MetaRenderer *renderer = cogl_renderer->custom_winsys_user_data;
MetaBackend *backend = meta_renderer_get_backend (renderer);
MetaEgl *egl = meta_backend_get_egl (backend);
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
EGLDisplay egl_display = cogl_renderer_egl->edpy;
@ -486,10 +487,12 @@ meta_renderer_native_destroy_egl_display (CoglDisplay *cogl_display)
}
static EGLSurface
create_dummy_pbuffer_surface (EGLDisplay egl_display,
GError **error)
create_dummy_pbuffer_surface (CoglRenderer *cogl_renderer,
EGLDisplay egl_display,
GError **error)
{
MetaBackend *backend = meta_get_backend ();
MetaRenderer *renderer = cogl_renderer->custom_winsys_user_data;
MetaBackend *backend = meta_renderer_get_backend (renderer);
MetaEgl *egl = meta_backend_get_egl (backend);
EGLConfig pbuffer_config;
static const EGLint pbuffer_config_attribs[] = {
@ -528,7 +531,9 @@ meta_renderer_native_egl_context_created (CoglDisplay *cogl_display,
COGL_EGL_WINSYS_FEATURE_SURFACELESS_CONTEXT) == 0)
{
cogl_display_egl->dummy_surface =
create_dummy_pbuffer_surface (cogl_renderer_egl->edpy, error);
create_dummy_pbuffer_surface (cogl_renderer,
cogl_renderer_egl->edpy,
error);
if (cogl_display_egl->dummy_surface == EGL_NO_SURFACE)
return FALSE;
}

View File

@ -3747,3 +3747,9 @@ meta_seat_impl_get_input_settings (MetaSeatImpl *seat_impl)
{
return seat_impl->input_settings;
}
MetaBackend *
meta_seat_impl_get_backend (MetaSeatImpl *seat_impl)
{
return meta_seat_native_get_backend (seat_impl->seat_native);
}

View File

@ -252,4 +252,6 @@ void meta_seat_impl_queue_main_thread_idle (MetaSeatImpl *seat_impl,
gpointer user_data,
GDestroyNotify destroy_notify);
MetaBackend * meta_seat_impl_get_backend (MetaSeatImpl *seat_impl);
#endif /* META_SEAT_IMPL_H */

View File

@ -261,7 +261,9 @@ meta_seat_native_peek_devices (ClutterSeat *seat)
static void
meta_seat_native_bell_notify (ClutterSeat *seat)
{
MetaDisplay *display = meta_get_display ();
MetaSeatNative *seat_native = META_SEAT_NATIVE (seat);
MetaContext *context = meta_backend_get_context (seat_native->backend);
MetaDisplay *display = meta_context_get_display (context);
meta_bell_notify (display, NULL);
}
@ -595,7 +597,7 @@ meta_seat_native_maybe_ensure_cursor_renderer (MetaSeatNative *seat_native,
MetaCursorRendererNative *cursor_renderer_native;
cursor_renderer_native =
meta_cursor_renderer_native_new (meta_get_backend (),
meta_cursor_renderer_native_new (seat_native->backend,
seat_native->core_pointer);
seat_native->cursor_renderer =
META_CURSOR_RENDERER (cursor_renderer_native);
@ -622,7 +624,7 @@ meta_seat_native_maybe_ensure_cursor_renderer (MetaSeatNative *seat_native,
if (!cursor_renderer)
{
cursor_renderer = meta_cursor_renderer_new (meta_get_backend (),
cursor_renderer = meta_cursor_renderer_new (seat_native->backend,
device);
g_hash_table_insert (seat_native->tablet_cursors,
device, cursor_renderer);

View File

@ -59,7 +59,8 @@ G_DEFINE_TYPE_WITH_CODE (MetaStageNative, meta_stage_native,
void
meta_stage_native_rebuild_views (MetaStageNative *stage_native)
{
MetaBackend *backend = meta_get_backend ();
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_native);
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
MetaRenderer *renderer = meta_backend_get_renderer (backend);
ClutterActor *stage = meta_backend_get_stage (backend);
@ -77,7 +78,8 @@ static void
meta_stage_native_get_geometry (ClutterStageWindow *stage_window,
cairo_rectangle_int_t *geometry)
{
MetaBackend *backend = meta_get_backend ();
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_window);
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
@ -103,7 +105,8 @@ meta_stage_native_get_geometry (ClutterStageWindow *stage_window,
static GList *
meta_stage_native_get_views (ClutterStageWindow *stage_window)
{
MetaBackend *backend = meta_get_backend ();
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_window);
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
MetaRenderer *renderer = meta_backend_get_renderer (backend);
return meta_renderer_get_views (renderer);
@ -114,7 +117,8 @@ meta_stage_native_prepare_frame (ClutterStageWindow *stage_window,
ClutterStageView *stage_view,
ClutterFrame *frame)
{
MetaBackend *backend = meta_get_backend ();
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_window);
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
MetaRenderer *renderer = meta_backend_get_renderer (backend);
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
MetaCursorRenderer *cursor_renderer =
@ -152,7 +156,8 @@ meta_stage_native_finish_frame (ClutterStageWindow *stage_window,
ClutterStageView *stage_view,
ClutterFrame *frame)
{
MetaBackend *backend = meta_get_backend ();
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_window);
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
MetaRenderer *renderer = meta_backend_get_renderer (backend);
meta_renderer_native_finish_frame (META_RENDERER_NATIVE (renderer),

View File

@ -72,7 +72,8 @@ meta_virtual_monitor_native_get_id (MetaVirtualMonitorNative *virtual_monitor_na
}
MetaVirtualMonitorNative *
meta_virtual_monitor_native_new (uint64_t id,
meta_virtual_monitor_native_new (MetaBackend *backend,
uint64_t id,
const MetaVirtualMonitorInfo *info)
{
MetaVirtualMonitorNative *virtual_monitor_native;
@ -80,7 +81,7 @@ meta_virtual_monitor_native_new (uint64_t id,
MetaCrtcModeVirtual *crtc_mode_virtual;
MetaOutputVirtual *output_virtual;
crtc_virtual = meta_crtc_virtual_new (id);
crtc_virtual = meta_crtc_virtual_new (backend, id);
crtc_mode_virtual = meta_crtc_mode_virtual_new (mode_id++, &info->mode_info);
output_virtual = meta_output_virtual_new (id, info,
crtc_virtual,

View File

@ -39,7 +39,8 @@ MetaCrtc * meta_virtual_monitor_native_get_crtc (MetaVirtualMonitorNative *virtu
MetaOutput * meta_virtual_monitor_native_get_output (MetaVirtualMonitorNative *virtual_monitor_native);
MetaVirtualMonitorNative * meta_virtual_monitor_native_new (uint64_t id,
MetaVirtualMonitorNative * meta_virtual_monitor_native_new (MetaBackend *backend,
uint64_t id,
const MetaVirtualMonitorInfo *info);
#endif /* META_VIRTUAL_MONITOR_NATIVE_H */