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
@ -82,7 +82,7 @@ enum
|
||||
{
|
||||
PROP_0,
|
||||
|
||||
PROP_MONITOR_MANAGER,
|
||||
PROP_BACKEND,
|
||||
|
||||
PROP_LAST
|
||||
};
|
||||
@ -200,8 +200,9 @@ struct _MetaRendererNative
|
||||
{
|
||||
MetaRenderer parent;
|
||||
|
||||
MetaMonitorManagerKms *monitor_manager_kms;
|
||||
MetaGpuKms *primary_gpu_kms;
|
||||
|
||||
MetaBackend *backend;
|
||||
MetaGles3 *gles3;
|
||||
|
||||
gboolean use_modifiers;
|
||||
@ -257,15 +258,6 @@ cogl_pixel_format_from_drm_format (uint32_t drm_format,
|
||||
CoglPixelFormat *out_format,
|
||||
CoglTextureComponents *out_components);
|
||||
|
||||
static MetaBackend *
|
||||
backend_from_renderer_native (MetaRendererNative *renderer_native)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
|
||||
return meta_monitor_manager_get_backend (monitor_manager);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_renderer_native_gpu_data_free (MetaRendererNativeGpuData *renderer_gpu_data)
|
||||
{
|
||||
@ -289,9 +281,7 @@ meta_renderer_native_get_gpu_data (MetaRendererNative *renderer_native,
|
||||
static MetaRendererNative *
|
||||
meta_renderer_native_from_gpu (MetaGpuKms *gpu_kms)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_gpu_get_monitor_manager (META_GPU (gpu_kms));
|
||||
MetaBackend *backend = meta_monitor_manager_get_backend (monitor_manager);
|
||||
MetaBackend *backend = meta_gpu_get_backend (META_GPU (gpu_kms));
|
||||
|
||||
return META_RENDERER_NATIVE (meta_backend_get_renderer (backend));
|
||||
}
|
||||
@ -335,11 +325,7 @@ get_secondary_gpu_state (CoglOnscreen *onscreen,
|
||||
static MetaEgl *
|
||||
meta_renderer_native_get_egl (MetaRendererNative *renderer_native)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
MetaBackend *backend = meta_monitor_manager_get_backend (monitor_manager);
|
||||
|
||||
return meta_backend_get_egl (backend);
|
||||
return meta_backend_get_egl (renderer_native->backend);
|
||||
}
|
||||
|
||||
static MetaEgl *
|
||||
@ -1558,7 +1544,7 @@ retry_page_flips (gpointer user_data)
|
||||
MetaOnscreenNative *onscreen_native = user_data;
|
||||
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
meta_backend_get_monitor_manager (renderer_native->backend);
|
||||
uint64_t now_us;
|
||||
MetaPowerSave power_save_mode;
|
||||
GList *l;
|
||||
@ -1650,9 +1636,7 @@ retry_page_flips (gpointer user_data)
|
||||
}
|
||||
else
|
||||
{
|
||||
MetaBackend *backend = backend_from_renderer_native (renderer_native);
|
||||
|
||||
meta_backend_thaw_updates (backend);
|
||||
meta_backend_thaw_updates (renderer_native->backend);
|
||||
g_clear_pointer (&onscreen_native->retry_page_flips_source,
|
||||
g_source_unref);
|
||||
return G_SOURCE_REMOVE;
|
||||
@ -1677,6 +1661,7 @@ schedule_retry_page_flip (MetaOnscreenNative *onscreen_native,
|
||||
uint32_t fb_id,
|
||||
GClosure *flip_closure)
|
||||
{
|
||||
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
|
||||
RetryPageFlipData *retry_page_flip_data;
|
||||
uint64_t now_us;
|
||||
uint64_t retry_time_us;
|
||||
@ -1693,8 +1678,6 @@ schedule_retry_page_flip (MetaOnscreenNative *onscreen_native,
|
||||
|
||||
if (!onscreen_native->retry_page_flips_source)
|
||||
{
|
||||
MetaBackend *backend =
|
||||
backend_from_renderer_native (onscreen_native->renderer_native);
|
||||
GSource *source;
|
||||
|
||||
source = g_source_new (&retry_page_flips_source_funcs, sizeof (GSource));
|
||||
@ -1703,7 +1686,7 @@ schedule_retry_page_flip (MetaOnscreenNative *onscreen_native,
|
||||
g_source_attach (source, NULL);
|
||||
|
||||
onscreen_native->retry_page_flips_source = source;
|
||||
meta_backend_freeze_updates (backend);
|
||||
meta_backend_freeze_updates (renderer_native->backend);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1989,7 +1972,7 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen)
|
||||
MetaRendererView *view = onscreen_native->view;
|
||||
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
meta_backend_get_monitor_manager (renderer_native->backend);
|
||||
GClosure *flip_closure;
|
||||
MetaPowerSave power_save_mode;
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
@ -2319,7 +2302,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
|
||||
MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native;
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
meta_backend_get_monitor_manager (renderer_native->backend);
|
||||
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
||||
MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
|
||||
MetaGpuKms *render_gpu = onscreen_native->render_gpu;
|
||||
@ -2938,6 +2921,7 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
|
||||
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
||||
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
||||
MetaOnscreenNative *onscreen_native;
|
||||
MetaRendererNative *renderer_native;
|
||||
MetaRendererNativeGpuData *renderer_gpu_data;
|
||||
|
||||
/* If we never successfully allocated then there's nothing to do */
|
||||
@ -2945,6 +2929,7 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
|
||||
return;
|
||||
|
||||
onscreen_native = onscreen_egl->platform;
|
||||
renderer_native = onscreen_native->renderer_native;
|
||||
|
||||
if (onscreen_egl->egl_surface != EGL_NO_SURFACE &&
|
||||
(cogl_display_egl->current_draw_surface == onscreen_egl->egl_surface ||
|
||||
@ -2961,16 +2946,13 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
|
||||
(GDestroyNotify) retry_page_flip_data_free);
|
||||
if (onscreen_native->retry_page_flips_source)
|
||||
{
|
||||
MetaBackend *backend =
|
||||
backend_from_renderer_native (onscreen_native->renderer_native);
|
||||
|
||||
meta_backend_thaw_updates (backend);
|
||||
meta_backend_thaw_updates (renderer_native->backend);
|
||||
g_clear_pointer (&onscreen_native->retry_page_flips_source,
|
||||
g_source_destroy);
|
||||
}
|
||||
|
||||
renderer_gpu_data =
|
||||
meta_renderer_native_get_gpu_data (onscreen_native->renderer_native,
|
||||
meta_renderer_native_get_gpu_data (renderer_native,
|
||||
onscreen_native->render_gpu);
|
||||
switch (renderer_gpu_data->mode)
|
||||
{
|
||||
@ -3031,11 +3013,9 @@ _cogl_winsys_egl_vtable = {
|
||||
gboolean
|
||||
meta_renderer_native_supports_mirroring (MetaRendererNative *renderer_native)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
GList *l;
|
||||
|
||||
for (l = monitor_manager->gpus; l; l = l->next)
|
||||
for (l = meta_backend_get_gpus (renderer_native->backend); l; l = l->next)
|
||||
{
|
||||
MetaGpuKms *gpu_kms = META_GPU_KMS (l->data);
|
||||
MetaRendererNativeGpuData *renderer_gpu_data;
|
||||
@ -3284,7 +3264,7 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
|
||||
static CoglContext *
|
||||
cogl_context_from_renderer_native (MetaRendererNative *renderer_native)
|
||||
{
|
||||
MetaBackend *backend = backend_from_renderer_native (renderer_native);
|
||||
MetaBackend *backend = renderer_native->backend;
|
||||
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
|
||||
|
||||
return clutter_backend_get_cogl_context (clutter_backend);
|
||||
@ -3338,8 +3318,9 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
|
||||
MetaLogicalMonitor *logical_monitor)
|
||||
{
|
||||
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
|
||||
MetaBackend *backend = renderer_native->backend;
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
CoglContext *cogl_context =
|
||||
cogl_context_from_renderer_native (renderer_native);
|
||||
CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
|
||||
@ -3429,11 +3410,9 @@ meta_renderer_native_finish_frame (MetaRendererNative *renderer_native)
|
||||
|
||||
if (renderer_native->pending_unset_disabled_crtcs)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
GList *l;
|
||||
|
||||
for (l = meta_monitor_manager_get_gpus (monitor_manager); l; l = l->next)
|
||||
for (l = meta_backend_get_gpus (renderer_native->backend); l; l = l->next)
|
||||
{
|
||||
MetaGpu *gpu = l->data;
|
||||
MetaGpuKms *gpu_kms = META_GPU_KMS (gpu);
|
||||
@ -3470,8 +3449,8 @@ meta_renderer_native_get_property (GObject *object,
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_MONITOR_MANAGER:
|
||||
g_value_set_object (value, renderer_native->monitor_manager_kms);
|
||||
case PROP_BACKEND:
|
||||
g_value_set_object (value, renderer_native->backend);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
@ -3480,7 +3459,7 @@ meta_renderer_native_get_property (GObject *object,
|
||||
}
|
||||
|
||||
static void
|
||||
on_gpu_added (MetaMonitorManager *monitor_manager,
|
||||
on_gpu_added (MetaBackendNative *backend_native,
|
||||
MetaGpuKms *gpu_kms,
|
||||
MetaRendererNative *renderer_native);
|
||||
|
||||
@ -3494,8 +3473,8 @@ meta_renderer_native_set_property (GObject *object,
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_MONITOR_MANAGER:
|
||||
renderer_native->monitor_manager_kms = g_value_get_object (value);
|
||||
case PROP_BACKEND:
|
||||
renderer_native->backend = g_value_get_object (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
@ -3881,10 +3860,7 @@ get_egl_device_display (MetaRendererNative *renderer_native,
|
||||
static int
|
||||
count_drm_devices (MetaRendererNative *renderer_native)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
|
||||
return g_list_length (meta_monitor_manager_get_gpus (monitor_manager));
|
||||
return g_list_length (meta_backend_get_gpus (renderer_native->backend));
|
||||
}
|
||||
|
||||
static MetaRendererNativeGpuData *
|
||||
@ -4031,11 +4007,11 @@ create_renderer_gpu_data (MetaRendererNative *renderer_native,
|
||||
}
|
||||
|
||||
static void
|
||||
on_gpu_added (MetaMonitorManager *monitor_manager,
|
||||
on_gpu_added (MetaBackendNative *backend_native,
|
||||
MetaGpuKms *gpu_kms,
|
||||
MetaRendererNative *renderer_native)
|
||||
{
|
||||
MetaBackend *backend = meta_monitor_manager_get_backend (monitor_manager);
|
||||
MetaBackend *backend = META_BACKEND (backend_native);
|
||||
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
|
||||
CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend);
|
||||
CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
|
||||
@ -4052,10 +4028,10 @@ on_gpu_added (MetaMonitorManager *monitor_manager,
|
||||
}
|
||||
|
||||
static MetaGpuKms *
|
||||
choose_primary_gpu_unchecked (MetaMonitorManager *manager,
|
||||
choose_primary_gpu_unchecked (MetaBackend *backend,
|
||||
MetaRendererNative *renderer_native)
|
||||
{
|
||||
GList *gpus = meta_monitor_manager_get_gpus (manager);
|
||||
GList *gpus = meta_backend_get_gpus (backend);
|
||||
GList *l;
|
||||
int allow_sw;
|
||||
|
||||
@ -4103,14 +4079,14 @@ choose_primary_gpu_unchecked (MetaMonitorManager *manager,
|
||||
}
|
||||
|
||||
static MetaGpuKms *
|
||||
choose_primary_gpu (MetaMonitorManager *manager,
|
||||
choose_primary_gpu (MetaBackend *backend,
|
||||
MetaRendererNative *renderer_native,
|
||||
GError **error)
|
||||
{
|
||||
MetaGpuKms *gpu_kms;
|
||||
MetaRendererNativeGpuData *renderer_gpu_data;
|
||||
|
||||
gpu_kms = choose_primary_gpu_unchecked (manager, renderer_native);
|
||||
gpu_kms = choose_primary_gpu_unchecked (backend, renderer_native);
|
||||
renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
||||
gpu_kms);
|
||||
if (renderer_gpu_data->egl_display == EGL_NO_DISPLAY)
|
||||
@ -4130,14 +4106,11 @@ meta_renderer_native_initable_init (GInitable *initable,
|
||||
GError **error)
|
||||
{
|
||||
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (initable);
|
||||
MetaMonitorManagerKms *monitor_manager_kms =
|
||||
renderer_native->monitor_manager_kms;
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (monitor_manager_kms);
|
||||
MetaBackend *backend = renderer_native->backend;
|
||||
GList *gpus;
|
||||
GList *l;
|
||||
|
||||
gpus = meta_monitor_manager_get_gpus (monitor_manager);
|
||||
gpus = meta_backend_get_gpus (backend);
|
||||
for (l = gpus; l; l = l->next)
|
||||
{
|
||||
MetaGpuKms *gpu_kms = META_GPU_KMS (l->data);
|
||||
@ -4146,7 +4119,7 @@ meta_renderer_native_initable_init (GInitable *initable,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
renderer_native->primary_gpu_kms = choose_primary_gpu (monitor_manager,
|
||||
renderer_native->primary_gpu_kms = choose_primary_gpu (backend,
|
||||
renderer_native,
|
||||
error);
|
||||
if (!renderer_native->primary_gpu_kms)
|
||||
@ -4183,16 +4156,14 @@ static void
|
||||
meta_renderer_native_constructed (GObject *object)
|
||||
{
|
||||
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (object);
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
MetaBackend *backend = meta_monitor_manager_get_backend (monitor_manager);
|
||||
MetaBackend *backend = renderer_native->backend;
|
||||
MetaSettings *settings = meta_backend_get_settings (backend);
|
||||
|
||||
if (meta_settings_is_experimental_feature_enabled (
|
||||
settings, META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS))
|
||||
renderer_native->use_modifiers = TRUE;
|
||||
|
||||
g_signal_connect (renderer_native->monitor_manager_kms, "gpu-added",
|
||||
g_signal_connect (backend, "gpu-added",
|
||||
G_CALLBACK (on_gpu_added), renderer_native);
|
||||
|
||||
G_OBJECT_CLASS (meta_renderer_native_parent_class)->constructed (object);
|
||||
@ -4221,11 +4192,11 @@ meta_renderer_native_class_init (MetaRendererNativeClass *klass)
|
||||
renderer_class->create_cogl_renderer = meta_renderer_native_create_cogl_renderer;
|
||||
renderer_class->create_view = meta_renderer_native_create_view;
|
||||
|
||||
obj_props[PROP_MONITOR_MANAGER] =
|
||||
g_param_spec_object ("monitor-manager",
|
||||
"monitor-manager",
|
||||
"MetaMonitorManagerKms",
|
||||
META_TYPE_MONITOR_MANAGER_KMS,
|
||||
obj_props[PROP_BACKEND] =
|
||||
g_param_spec_object ("backend",
|
||||
"backend",
|
||||
"MetaBackendNative",
|
||||
META_TYPE_BACKEND_NATIVE,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY |
|
||||
G_PARAM_STATIC_STRINGS);
|
||||
@ -4233,12 +4204,12 @@ meta_renderer_native_class_init (MetaRendererNativeClass *klass)
|
||||
}
|
||||
|
||||
MetaRendererNative *
|
||||
meta_renderer_native_new (MetaMonitorManagerKms *monitor_manager_kms,
|
||||
GError **error)
|
||||
meta_renderer_native_new (MetaBackendNative *backend_native,
|
||||
GError **error)
|
||||
{
|
||||
return g_initable_new (META_TYPE_RENDERER_NATIVE,
|
||||
NULL,
|
||||
error,
|
||||
"monitor-manager", monitor_manager_kms,
|
||||
"backend", backend_native,
|
||||
NULL);
|
||||
}
|
||||
|
Reference in New Issue
Block a user