mirror of
https://github.com/brl/mutter.git
synced 2025-06-13 16:59:30 +00:00
backend: Move GPU ownership from the monitor manager to the backend
Lets work towards making MetaMonitorManager about managing monitors, and not about managing GPUs. This changes other units to keep a pointer to the backend instead of a monitor manager, in case their ownership changed, or their main usage of the monitor manager was to look up GPUs. https://gitlab.gnome.org/GNOME/mutter/issues/548 https://gitlab.gnome.org/GNOME/mutter/merge_requests/525
This commit is contained in:

committed by
Georges Basile Stavracas Neto

parent
e7fd068a78
commit
5c500ad402
@ -28,6 +28,7 @@
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/x11/meta-cursor-renderer-x11.h"
|
||||
#include "backends/x11/meta-gpu-xrandr.h"
|
||||
#include "backends/x11/meta-input-settings-x11.h"
|
||||
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
||||
#include "backends/x11/cm/meta-renderer-x11-cm.h"
|
||||
@ -389,6 +390,16 @@ meta_backend_x11_cm_translate_crossing_event (MetaBackendX11 *x11,
|
||||
static void
|
||||
meta_backend_x11_cm_init (MetaBackendX11Cm *backend_x11_cm)
|
||||
{
|
||||
MetaGpuXrandr *gpu_xrandr;
|
||||
|
||||
/*
|
||||
* The X server deals with multiple GPUs for us, so we just see what the X
|
||||
* server gives us as one single GPU, even though it may actually be backed
|
||||
* by multiple.
|
||||
*/
|
||||
gpu_xrandr = meta_gpu_xrandr_new (META_BACKEND_X11 (backend_x11_cm));
|
||||
meta_backend_add_gpu (META_BACKEND (backend_x11_cm),
|
||||
META_GPU (gpu_xrandr));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <xcb/randr.h>
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/meta-crtc.h"
|
||||
#include "backends/x11/meta-crtc-xrandr.h"
|
||||
#include "backends/x11/meta-gpu-xrandr.h"
|
||||
@ -60,7 +61,9 @@ meta_crtc_xrandr_set_config (MetaCrtc *crtc,
|
||||
{
|
||||
MetaGpu *gpu = meta_crtc_get_gpu (crtc);
|
||||
MetaGpuXrandr *gpu_xrandr = META_GPU_XRANDR (gpu);
|
||||
MetaMonitorManager *monitor_manager = meta_gpu_get_monitor_manager (gpu);
|
||||
MetaBackend *backend = meta_gpu_get_backend (gpu);
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaMonitorManagerXrandr *monitor_manager_xrandr =
|
||||
META_MONITOR_MANAGER_XRANDR (monitor_manager);
|
||||
Display *xdisplay;
|
||||
|
@ -31,7 +31,9 @@
|
||||
#include <X11/extensions/dpms.h>
|
||||
#include <X11/Xlibint.h>
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/meta-output.h"
|
||||
#include "backends/x11/meta-backend-x11.h"
|
||||
#include "backends/x11/meta-crtc-xrandr.h"
|
||||
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
||||
#include "backends/x11/meta-output-xrandr.h"
|
||||
@ -86,7 +88,9 @@ meta_gpu_xrandr_read_current (MetaGpu *gpu,
|
||||
GError **error)
|
||||
{
|
||||
MetaGpuXrandr *gpu_xrandr = META_GPU_XRANDR (gpu);
|
||||
MetaMonitorManager *monitor_manager = meta_gpu_get_monitor_manager (gpu);
|
||||
MetaBackend *backend = meta_gpu_get_backend (gpu);
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaMonitorManagerXrandr *monitor_manager_xrandr =
|
||||
META_MONITOR_MANAGER_XRANDR (monitor_manager);
|
||||
Display *xdisplay =
|
||||
@ -229,10 +233,10 @@ meta_gpu_xrandr_read_current (MetaGpu *gpu,
|
||||
}
|
||||
|
||||
MetaGpuXrandr *
|
||||
meta_gpu_xrandr_new (MetaMonitorManagerXrandr *monitor_manager_xrandr)
|
||||
meta_gpu_xrandr_new (MetaBackendX11 *backend_x11)
|
||||
{
|
||||
return g_object_new (META_TYPE_GPU_XRANDR,
|
||||
"monitor-manager", monitor_manager_xrandr,
|
||||
"backend", backend_x11,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
||||
#include <X11/extensions/Xrandr.h>
|
||||
|
||||
#include "backends/meta-gpu.h"
|
||||
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
||||
#include "backends/x11/meta-backend-x11.h"
|
||||
|
||||
#define META_TYPE_GPU_XRANDR (meta_gpu_xrandr_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (MetaGpuXrandr, meta_gpu_xrandr, META, GPU_XRANDR, MetaGpu)
|
||||
@ -37,6 +37,6 @@ void meta_gpu_xrandr_get_max_screen_size (MetaGpuXrandr *gpu_xrandr,
|
||||
int *max_width,
|
||||
int *max_height);
|
||||
|
||||
MetaGpuXrandr * meta_gpu_xrandr_new (MetaMonitorManagerXrandr *monitor_manager_xrandr);
|
||||
MetaGpuXrandr * meta_gpu_xrandr_new (MetaBackendX11 *backend_x11);
|
||||
|
||||
#endif /* META_GPU_XRANDR_H */
|
||||
|
@ -73,13 +73,6 @@ struct _MetaMonitorManagerXrandr
|
||||
int rr_error_base;
|
||||
gboolean has_randr15;
|
||||
|
||||
/*
|
||||
* The X server deals with multiple GPUs for us, soe just see what the X
|
||||
* server gives us as one single GPU, even though it may actually be backed
|
||||
* by multiple.
|
||||
*/
|
||||
MetaGpu *gpu;
|
||||
|
||||
xcb_timestamp_t last_xrandr_set_timestamp;
|
||||
|
||||
GHashTable *tiled_monitor_atoms;
|
||||
@ -344,6 +337,15 @@ is_output_assignment_changed (MetaOutput *output,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static MetaGpu *
|
||||
meta_monitor_manager_xrandr_get_gpu (MetaMonitorManagerXrandr *manager_xrandr)
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr);
|
||||
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
|
||||
|
||||
return META_GPU (meta_backend_get_gpus (backend)->data);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_assignments_changed (MetaMonitorManager *manager,
|
||||
MetaCrtcInfo **crtc_infos,
|
||||
@ -353,9 +355,10 @@ is_assignments_changed (MetaMonitorManager *manager,
|
||||
{
|
||||
MetaMonitorManagerXrandr *manager_xrandr =
|
||||
META_MONITOR_MANAGER_XRANDR (manager);
|
||||
MetaGpu *gpu = meta_monitor_manager_xrandr_get_gpu (manager_xrandr);
|
||||
GList *l;
|
||||
|
||||
for (l = meta_gpu_get_crtcs (manager_xrandr->gpu); l; l = l->next)
|
||||
for (l = meta_gpu_get_crtcs (gpu); l; l = l->next)
|
||||
{
|
||||
MetaCrtc *crtc = l->data;
|
||||
|
||||
@ -363,7 +366,7 @@ is_assignments_changed (MetaMonitorManager *manager,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
for (l = meta_gpu_get_outputs (manager_xrandr->gpu); l; l = l->next)
|
||||
for (l = meta_gpu_get_outputs (gpu); l; l = l->next)
|
||||
{
|
||||
MetaOutput *output = l->data;
|
||||
|
||||
@ -387,6 +390,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
||||
unsigned int n_outputs)
|
||||
{
|
||||
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
||||
MetaGpu *gpu = meta_monitor_manager_xrandr_get_gpu (manager_xrandr);
|
||||
unsigned i;
|
||||
GList *l;
|
||||
int width, height, width_mm, height_mm;
|
||||
@ -448,7 +452,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
||||
}
|
||||
|
||||
/* Disable CRTCs not mentioned in the list */
|
||||
for (l = meta_gpu_get_crtcs (manager_xrandr->gpu); l; l = l->next)
|
||||
for (l = meta_gpu_get_crtcs (gpu); l; l = l->next)
|
||||
{
|
||||
MetaCrtc *crtc = l->data;
|
||||
|
||||
@ -568,7 +572,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
||||
}
|
||||
|
||||
/* Disable outputs not mentioned in the list */
|
||||
for (l = meta_gpu_get_outputs (manager_xrandr->gpu); l; l = l->next)
|
||||
for (l = meta_gpu_get_outputs (gpu); l; l = l->next)
|
||||
{
|
||||
MetaOutput *output = l->data;
|
||||
|
||||
@ -1003,8 +1007,9 @@ meta_monitor_manager_xrandr_get_max_screen_size (MetaMonitorManager *manager,
|
||||
{
|
||||
MetaMonitorManagerXrandr *manager_xrandr =
|
||||
META_MONITOR_MANAGER_XRANDR (manager);
|
||||
MetaGpu *gpu = meta_monitor_manager_xrandr_get_gpu (manager_xrandr);
|
||||
|
||||
meta_gpu_xrandr_get_max_screen_size (META_GPU_XRANDR (manager_xrandr->gpu),
|
||||
meta_gpu_xrandr_get_max_screen_size (META_GPU_XRANDR (gpu),
|
||||
max_width, max_height);
|
||||
|
||||
return TRUE;
|
||||
@ -1022,13 +1027,10 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
|
||||
MetaMonitorManagerXrandr *manager_xrandr =
|
||||
META_MONITOR_MANAGER_XRANDR (object);
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr);
|
||||
MetaBackendX11 *backend =
|
||||
META_BACKEND_X11 (meta_monitor_manager_get_backend (manager));
|
||||
MetaBackend *backend = meta_monitor_manager_get_backend (manager);
|
||||
MetaBackendX11 *backend_x11 = META_BACKEND_X11 (backend);
|
||||
|
||||
manager_xrandr->xdisplay = meta_backend_x11_get_xdisplay (backend);
|
||||
|
||||
manager_xrandr->gpu = META_GPU (meta_gpu_xrandr_new (manager_xrandr));
|
||||
meta_monitor_manager_add_gpu (manager, manager_xrandr->gpu);
|
||||
manager_xrandr->xdisplay = meta_backend_x11_get_xdisplay (backend_x11);
|
||||
|
||||
if (!XRRQueryExtension (manager_xrandr->xdisplay,
|
||||
&manager_xrandr->rr_event_base,
|
||||
@ -1068,7 +1070,6 @@ meta_monitor_manager_xrandr_finalize (GObject *object)
|
||||
{
|
||||
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (object);
|
||||
|
||||
g_clear_object (&manager_xrandr->gpu);
|
||||
g_hash_table_destroy (manager_xrandr->tiled_monitor_atoms);
|
||||
g_free (manager_xrandr->supported_scales);
|
||||
|
||||
@ -1115,6 +1116,7 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
|
||||
XEvent *event)
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr);
|
||||
MetaGpu *gpu = meta_monitor_manager_xrandr_get_gpu (manager_xrandr);
|
||||
MetaGpuXrandr *gpu_xrandr;
|
||||
XRRScreenResources *resources;
|
||||
gboolean is_hotplug;
|
||||
@ -1127,7 +1129,7 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
|
||||
|
||||
meta_monitor_manager_read_current_state (manager);
|
||||
|
||||
gpu_xrandr = META_GPU_XRANDR (manager_xrandr->gpu);
|
||||
gpu_xrandr = META_GPU_XRANDR (gpu);
|
||||
resources = meta_gpu_xrandr_get_resources (gpu_xrandr);
|
||||
|
||||
is_hotplug = resources->timestamp < resources->configTimestamp;
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include <X11/Xlib-xcb.h>
|
||||
#include <xcb/randr.h>
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/meta-crtc.h"
|
||||
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
||||
#include "meta/util.h"
|
||||
@ -49,7 +50,9 @@ static Display *
|
||||
xdisplay_from_output (MetaOutput *output)
|
||||
{
|
||||
MetaGpu *gpu = meta_output_get_gpu (output);
|
||||
MetaMonitorManager *monitor_manager = meta_gpu_get_monitor_manager (gpu);
|
||||
MetaBackend *backend = meta_gpu_get_backend (gpu);
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaMonitorManagerXrandr *monitor_manager_xrandr =
|
||||
META_MONITOR_MANAGER_XRANDR (monitor_manager);
|
||||
|
||||
@ -643,7 +646,9 @@ static void
|
||||
output_get_tile_info (MetaOutput *output)
|
||||
{
|
||||
MetaGpu *gpu = meta_output_get_gpu (output);
|
||||
MetaMonitorManager *monitor_manager = meta_gpu_get_monitor_manager (gpu);
|
||||
MetaBackend *backend = meta_gpu_get_backend (gpu);
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaMonitorManagerXrandr *monitor_manager_xrandr =
|
||||
META_MONITOR_MANAGER_XRANDR (monitor_manager);
|
||||
Display *xdisplay = xdisplay_from_output (output);
|
||||
|
@ -28,8 +28,13 @@
|
||||
|
||||
#include "wayland/meta-wayland.h"
|
||||
|
||||
G_DEFINE_TYPE (MetaBackendX11Nested, meta_backend_x11_nested,
|
||||
META_TYPE_BACKEND_X11)
|
||||
typedef struct _MetaBackendX11NestedPrivate
|
||||
{
|
||||
MetaGpu *gpu;
|
||||
} MetaBackendX11NestedPrivate;
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendX11Nested, meta_backend_x11_nested,
|
||||
META_TYPE_BACKEND_X11)
|
||||
|
||||
static MetaRenderer *
|
||||
meta_backend_x11_nested_create_renderer (MetaBackend *backend,
|
||||
@ -182,6 +187,32 @@ meta_backend_x11_nested_translate_device_event (MetaBackendX11 *x11,
|
||||
g_assert (device_event->event == meta_backend_x11_get_xwindow (x11));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_backend_x11_nested_real_init_gpus (MetaBackendX11Nested *backend_x11_nested)
|
||||
{
|
||||
MetaBackendX11NestedPrivate *priv =
|
||||
meta_backend_x11_nested_get_instance_private (backend_x11_nested);
|
||||
|
||||
priv->gpu = g_object_new (META_TYPE_GPU_DUMMY,
|
||||
"backend", backend_x11_nested,
|
||||
NULL);
|
||||
meta_backend_add_gpu (META_BACKEND (backend_x11_nested), priv->gpu);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_backend_x11_nested_constructed (GObject *object)
|
||||
{
|
||||
MetaBackendX11Nested *backend_x11_nested = META_BACKEND_X11_NESTED (object);
|
||||
MetaBackendX11NestedClass *backend_x11_nested_class =
|
||||
META_BACKEND_X11_NESTED_GET_CLASS (backend_x11_nested);
|
||||
GObjectClass *parent_class =
|
||||
G_OBJECT_CLASS (meta_backend_x11_nested_parent_class);
|
||||
|
||||
parent_class->constructed (object);
|
||||
|
||||
backend_x11_nested_class->init_gpus (backend_x11_nested);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_backend_x11_nested_init (MetaBackendX11Nested *backend_x11_nested)
|
||||
{
|
||||
@ -190,9 +221,12 @@ meta_backend_x11_nested_init (MetaBackendX11Nested *backend_x11_nested)
|
||||
static void
|
||||
meta_backend_x11_nested_class_init (MetaBackendX11NestedClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
MetaBackendClass *backend_class = META_BACKEND_CLASS (klass);
|
||||
MetaBackendX11Class *backend_x11_class = META_BACKEND_X11_CLASS (klass);
|
||||
|
||||
object_class->constructed = meta_backend_x11_nested_constructed;
|
||||
|
||||
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;
|
||||
@ -205,4 +239,6 @@ meta_backend_x11_nested_class_init (MetaBackendX11NestedClass *klass)
|
||||
|
||||
backend_x11_class->handle_host_xevent = meta_backend_x11_nested_handle_host_xevent;
|
||||
backend_x11_class->translate_device_event = meta_backend_x11_nested_translate_device_event;
|
||||
|
||||
klass->init_gpus = meta_backend_x11_nested_real_init_gpus;
|
||||
}
|
||||
|
@ -33,6 +33,8 @@ G_DECLARE_DERIVABLE_TYPE (MetaBackendX11Nested, meta_backend_x11_nested,
|
||||
struct _MetaBackendX11NestedClass
|
||||
{
|
||||
MetaBackendX11Class parent_class;
|
||||
|
||||
void (* init_gpus) (MetaBackendX11Nested *backend_x11_nested);
|
||||
};
|
||||
|
||||
#endif /* META_BACKEND_X11_NESTED_H */
|
||||
|
Reference in New Issue
Block a user