Skip to content
Commits on Source (30)
41.3
====
* Check keyboard serials for activation [Carlos; !2148]
* Fix mixed up refresh rates in multi-monitor setups [Robert; !2169]
* Allow disabling HW cursors [Olivier; !2150]
* Improve damage handling [Robert; !2168]
* Consider xrandr flags for advertised modes [Robert; !2190]
* Ensure constraints after client resize [Sebastian; !2103]
* window-group: Disable culling when rendinging clone to offscreen buffer
[Sebastian; !2080]
* Fix workspace switch animation in default plugin [Mark, Erik; !2076, !2120]
* Fix unfullscreening of window that were mapped fullscreen [Jonas; !2210]
* Fix DMA-BUF screencasts with unredirected fullscreen windows [Georges; !2186]
* Fix orientation changes on devices with 90° [Hans, Marco; !2090]
* Fixed crashes [Jonas; !2147, !2216]
* Plugged leaks [Sebastian, Jonas; !2193, !2225]
* Misc. bug fixes and cleanups [Jonas, Ievgen; !2002, !2162, !2187]
Contributors:
Olivier Fourdan, Carlos Garnacho, Hans de Goede, Sebastian Keller,
Robert Mader, Mark, Erik Massop, Florian Müllner,
Georges Basile Stavracas Neto, Ievgen Popovych, Jonas Ådahl
41.2
====
* Fix blank screen when unplugging docking station [Jonas; !2097]
......
project('mutter', 'c',
version: '41.2',
version: '41.3',
meson_version: '>= 0.53.0',
license: 'GPLv2+'
)
......
......@@ -286,7 +286,7 @@ reset_pointer_position (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
MetaMonitorManager *monitor_manager = priv->monitor_manager;
ClutterSeat *seat = clutter_backend_get_default_seat (priv->clutter_backend);
ClutterSeat *seat = priv->default_seat;
MetaLogicalMonitor *primary;
primary =
......@@ -321,7 +321,7 @@ static void
update_cursors (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
ClutterSeat *seat = clutter_backend_get_default_seat (priv->clutter_backend);
ClutterSeat *seat = priv->default_seat;
MetaCursorRenderer *cursor_renderer;
ClutterInputDevice *pointer, *device;
GList *devices, *l;
......@@ -352,7 +352,7 @@ meta_backend_monitors_changed (MetaBackend *backend)
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
ClutterSeat *seat = clutter_backend_get_default_seat (priv->clutter_backend);
ClutterSeat *seat = priv->default_seat;
ClutterInputDevice *device = clutter_seat_get_pointer (seat);
graphene_point_t point;
......@@ -509,7 +509,7 @@ static void
on_stage_shown_cb (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
ClutterSeat *seat = clutter_backend_get_default_seat (priv->clutter_backend);
ClutterSeat *seat = priv->default_seat;
g_autoptr (GList) devices = NULL;
const GList *l;
......@@ -535,7 +535,7 @@ static void
meta_backend_real_post_init (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
ClutterSeat *seat = clutter_backend_get_default_seat (priv->clutter_backend);
ClutterSeat *seat = priv->default_seat;
MetaInputSettings *input_settings;
priv->stage = meta_stage_new (backend);
......@@ -1225,10 +1225,11 @@ meta_backend_get_cursor_renderer (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
ClutterInputDevice *pointer;
ClutterSeat *seat;
seat = clutter_backend_get_default_seat (priv->clutter_backend);
pointer = clutter_seat_get_pointer (seat);
if (!priv->default_seat)
return NULL;
pointer = clutter_seat_get_pointer (priv->default_seat);
return meta_backend_get_cursor_renderer_for_device (backend, pointer);
}
......
......@@ -326,11 +326,14 @@ meta_cursor_sprite_xcursor_realize_texture (MetaCursorSprite *sprite)
}
MetaCursorSpriteXcursor *
meta_cursor_sprite_xcursor_new (MetaCursor cursor)
meta_cursor_sprite_xcursor_new (MetaCursor cursor,
MetaCursorTracker *cursor_tracker)
{
MetaCursorSpriteXcursor *sprite_xcursor;
sprite_xcursor = g_object_new (META_TYPE_CURSOR_SPRITE_XCURSOR, NULL);
sprite_xcursor = g_object_new (META_TYPE_CURSOR_SPRITE_XCURSOR,
"cursor-tracker", cursor_tracker,
NULL);
sprite_xcursor->cursor = cursor;
return sprite_xcursor;
......
......@@ -23,12 +23,14 @@
#include <X11/Xcursor/Xcursor.h>
#include "backends/meta-cursor.h"
#include "meta/types.h"
#define META_TYPE_CURSOR_SPRITE_XCURSOR meta_cursor_sprite_xcursor_get_type ()
G_DECLARE_FINAL_TYPE (MetaCursorSpriteXcursor, meta_cursor_sprite_xcursor,
META, CURSOR_SPRITE_XCURSOR, MetaCursorSprite)
MetaCursorSpriteXcursor * meta_cursor_sprite_xcursor_new (MetaCursor cursor);
MetaCursorSpriteXcursor * meta_cursor_sprite_xcursor_new (MetaCursor cursor,
MetaCursorTracker *cursor_tracker);
void meta_cursor_sprite_xcursor_set_theme_scale (MetaCursorSpriteXcursor *sprite_xcursor,
int scale);
......
......@@ -53,4 +53,12 @@ void meta_cursor_tracker_notify_cursor_changed (MetaCursorTracker *tracker);
void meta_cursor_tracker_destroy (MetaCursorTracker *tracker);
void meta_cursor_tracker_register_cursor_sprite (MetaCursorTracker *tracker,
MetaCursorSprite *sprite);
void meta_cursor_tracker_unregister_cursor_sprite (MetaCursorTracker *tracker,
MetaCursorSprite *sprite);
GList * meta_cursor_tracker_peek_cursor_sprites (MetaCursorTracker *tracker);
#endif
......@@ -74,6 +74,8 @@ typedef struct _MetaCursorTrackerPrivate
MetaCursorSprite *window_cursor;
MetaCursorSprite *root_cursor;
GList *cursor_sprites;
} MetaCursorTrackerPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorTracker, meta_cursor_tracker,
......@@ -523,6 +525,7 @@ meta_cursor_tracker_set_pointer_visible (MetaCursorTracker *tracker,
g_signal_emit (tracker, signals[VISIBILITY_CHANGED], 0);
}
MetaBackend *
meta_cursor_tracker_get_backend (MetaCursorTracker *tracker)
{
......@@ -531,3 +534,32 @@ meta_cursor_tracker_get_backend (MetaCursorTracker *tracker)
return priv->backend;
}
void
meta_cursor_tracker_register_cursor_sprite (MetaCursorTracker *tracker,
MetaCursorSprite *sprite)
{
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
priv->cursor_sprites = g_list_prepend (priv->cursor_sprites, sprite);
}
void
meta_cursor_tracker_unregister_cursor_sprite (MetaCursorTracker *tracker,
MetaCursorSprite *sprite)
{
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
priv->cursor_sprites = g_list_remove (priv->cursor_sprites, sprite);
}
GList *
meta_cursor_tracker_peek_cursor_sprites (MetaCursorTracker *tracker)
{
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
return priv->cursor_sprites;
}
......@@ -24,6 +24,7 @@
#include "backends/meta-cursor.h"
#include "backends/meta-backend-private.h"
#include "backends/meta-cursor-tracker-private.h"
#include "cogl/cogl.h"
#include "meta/common.h"
......@@ -37,6 +38,17 @@ enum
static guint signals[LAST_SIGNAL];
enum
{
PROP_0,
PROP_CURSOR_TRACKER,
N_PROPS
};
static GParamSpec *obj_props[N_PROPS];
typedef struct _MetaCursorSpritePrivate
{
GObject parent;
......@@ -45,6 +57,8 @@ typedef struct _MetaCursorSpritePrivate
float texture_scale;
MetaMonitorTransform texture_transform;
int hot_x, hot_y;
MetaCursorTracker *cursor_tracker;
} MetaCursorSpritePrivate;
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaCursorSprite,
......@@ -203,6 +217,22 @@ meta_cursor_sprite_init (MetaCursorSprite *sprite)
priv->texture_transform = META_MONITOR_TRANSFORM_NORMAL;
}
static void
meta_cursor_sprite_constructed (GObject *object)
{
MetaCursorSprite *sprite = META_CURSOR_SPRITE (object);
MetaCursorSpritePrivate *priv =
meta_cursor_sprite_get_instance_private (sprite);
g_assert (priv->cursor_tracker);
meta_cursor_tracker_register_cursor_sprite (priv->cursor_tracker, sprite);
g_clear_pointer (&priv->texture, cogl_object_unref);
G_OBJECT_CLASS (meta_cursor_sprite_parent_class)->constructed (object);
}
static void
meta_cursor_sprite_finalize (GObject *object)
{
......@@ -212,15 +242,51 @@ meta_cursor_sprite_finalize (GObject *object)
g_clear_pointer (&priv->texture, cogl_object_unref);
meta_cursor_tracker_unregister_cursor_sprite (priv->cursor_tracker, sprite);
g_clear_object (&priv->cursor_tracker);
G_OBJECT_CLASS (meta_cursor_sprite_parent_class)->finalize (object);
}
static void
meta_cursor_tracker_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
MetaCursorSprite *sprite = META_CURSOR_SPRITE (object);
MetaCursorSpritePrivate *priv =
meta_cursor_sprite_get_instance_private (sprite);
switch (prop_id)
{
case PROP_CURSOR_TRACKER:
g_set_object (&priv->cursor_tracker, g_value_get_object (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
meta_cursor_sprite_class_init (MetaCursorSpriteClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructed = meta_cursor_sprite_constructed;
object_class->finalize = meta_cursor_sprite_finalize;
object_class->set_property = meta_cursor_tracker_set_property;
obj_props[PROP_CURSOR_TRACKER] =
g_param_spec_object ("cursor-tracker",
"cursor tracker",
"MetaCursorTracker",
META_TYPE_CURSOR_TRACKER,
G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_PROPS, obj_props);
signals[PREPARE_AT] = g_signal_new ("prepare-at",
G_TYPE_FROM_CLASS (object_class),
......
......@@ -866,6 +866,7 @@ handle_orientation_change (MetaOrientationManager *orientation_manager,
{
MetaOrientation orientation;
MetaMonitorTransform transform;
MetaMonitorTransform panel_transform;
GError *error = NULL;
MetaMonitorsConfig *config;
MetaMonitor *laptop_panel;
......@@ -882,7 +883,10 @@ handle_orientation_change (MetaOrientationManager *orientation_manager,
transform = meta_monitor_transform_from_orientation (orientation);
laptop_logical_monitor = meta_monitor_get_logical_monitor (laptop_panel);
if (meta_logical_monitor_get_transform (laptop_logical_monitor) == transform)
panel_transform =
meta_monitor_crtc_to_logical_transform (laptop_panel, transform);
if (meta_logical_monitor_get_transform (laptop_logical_monitor) ==
panel_transform)
return;
current_config =
......
......@@ -162,6 +162,7 @@ before_stage_painted (MetaStage *stage,
MetaScreenCastMonitorStreamSrc *monitor_src =
META_SCREEN_CAST_MONITOR_STREAM_SRC (user_data);
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src);
MetaScreenCastRecordFlag flags;
if (monitor_src->maybe_record_idle_id)
return;
......@@ -169,10 +170,8 @@ before_stage_painted (MetaStage *stage,
if (!clutter_stage_view_peek_scanout (view))
return;
monitor_src->maybe_record_idle_id = g_idle_add (maybe_record_frame_on_idle,
src);
g_source_set_name_by_id (monitor_src->maybe_record_idle_id,
"[mutter] maybe_record_frame_on_idle [monitor-src]");
flags = META_SCREEN_CAST_RECORD_FLAG_DMABUF_ONLY;
meta_screen_cast_stream_src_maybe_record_frame (src, flags);
}
static MetaBackend *
......
......@@ -430,15 +430,19 @@ maybe_record_cursor (MetaScreenCastStreamSrc *src,
static gboolean
do_record_frame (MetaScreenCastStreamSrc *src,
MetaScreenCastRecordFlag flags,
struct spa_buffer *spa_buffer,
uint8_t *data,
GError **error)
{
MetaScreenCastStreamSrcPrivate *priv =
meta_screen_cast_stream_src_get_instance_private (src);
gboolean dmabuf_only;
if (spa_buffer->datas[0].data ||
spa_buffer->datas[0].type == SPA_DATA_MemFd)
dmabuf_only = flags & META_SCREEN_CAST_RECORD_FLAG_DMABUF_ONLY;
if (!dmabuf_only &&
(spa_buffer->datas[0].data ||
spa_buffer->datas[0].type == SPA_DATA_MemFd))
{
int width = priv->video_format.size.width;
int height = priv->video_format.size.height;
......@@ -566,7 +570,7 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src,
if (!(flags & META_SCREEN_CAST_RECORD_FLAG_CURSOR_ONLY))
{
g_clear_handle_id (&priv->follow_up_frame_source_id, g_source_remove);
if (do_record_frame (src, spa_buffer, data, &error))
if (do_record_frame (src, flags, spa_buffer, data, &error))
{
struct spa_meta_region *spa_meta_video_crop;
......
......@@ -41,6 +41,7 @@ typedef enum _MetaScreenCastRecordFlag
{
META_SCREEN_CAST_RECORD_FLAG_NONE = 0,
META_SCREEN_CAST_RECORD_FLAG_CURSOR_ONLY = 1 << 0,
META_SCREEN_CAST_RECORD_FLAG_DMABUF_ONLY = 1 << 1,
} MetaScreenCastRecordFlag;
#define META_TYPE_SCREEN_CAST_STREAM_SRC (meta_screen_cast_stream_src_get_type ())
......
......@@ -1864,7 +1864,10 @@ meta_cursor_renderer_native_new (MetaBackend *backend,
priv->backend = backend;
init_hw_cursor_support (cursor_renderer_native);
if (g_strcmp0 (getenv ("MUTTER_DEBUG_DISABLE_HW_CURSORS"), "1"))
init_hw_cursor_support (cursor_renderer_native);
else
g_message ("Disabling hardware cursors because MUTTER_DEBUG_DISABLE_HW_CURSORS is set");
return cursor_renderer_native;
}
......@@ -1873,3 +1876,17 @@ static void
meta_cursor_renderer_native_init (MetaCursorRendererNative *native)
{
}
void
meta_cursor_renderer_native_invalidate_gpu_state (MetaCursorRendererNative *native,
MetaCursorSprite *cursor_sprite,
MetaGpuKms *gpu_kms)
{
MetaCursorNativePrivate *cursor_priv;
cursor_priv = get_cursor_priv (cursor_sprite);
if (!cursor_priv)
return;
g_hash_table_remove (cursor_priv->gpu_states, gpu_kms);
}
......@@ -26,6 +26,7 @@
#define META_CURSOR_RENDERER_NATIVE_H
#include "backends/meta-cursor-renderer.h"
#include "backends/native/meta-backend-native-types.h"
#include "meta/meta-backend.h"
#define META_TYPE_CURSOR_RENDERER_NATIVE (meta_cursor_renderer_native_get_type ())
......@@ -39,4 +40,8 @@ void meta_cursor_renderer_native_prepare_frame (MetaCursorRendererNative *cursor
MetaCursorRendererNative * meta_cursor_renderer_native_new (MetaBackend *backend,
ClutterInputDevice *device);
void meta_cursor_renderer_native_invalidate_gpu_state (MetaCursorRendererNative *native,
MetaCursorSprite *cursor_sprite,
MetaGpuKms *gpu_kms);
#endif /* META_CURSOR_RENDERER_NATIVE_H */
......@@ -181,6 +181,12 @@ struct _MetaKms
G_DEFINE_TYPE (MetaKms, meta_kms, G_TYPE_OBJECT)
void
meta_kms_discard_pending_updates (MetaKms *kms)
{
g_clear_list (&kms->pending_updates, (GDestroyNotify) meta_kms_update_free);
}
static void
meta_kms_add_pending_update (MetaKms *kms,
MetaKmsUpdate *update)
......
......@@ -40,6 +40,8 @@ typedef enum _MetaKmsUpdateFlag
#define META_TYPE_KMS (meta_kms_get_type ())
G_DECLARE_FINAL_TYPE (MetaKms, meta_kms, META, KMS, GObject)
void meta_kms_discard_pending_updates (MetaKms *kms);
MetaKmsUpdate * meta_kms_ensure_pending_update (MetaKms *kms,
MetaKmsDevice *device);
......
......@@ -2122,10 +2122,7 @@ meta_onscreen_native_dispose (GObject *object)
switch (renderer_gpu_data->mode)
{
case META_RENDERER_NATIVE_MODE_GBM:
/* flip state takes a reference on the onscreen so there should
* never be outstanding flips when we reach here. */
g_warn_if_fail (onscreen_native->gbm.next_fb == NULL);
g_clear_object (&onscreen_native->gbm.next_fb);
free_current_bo (onscreen);
break;
case META_RENDERER_NATIVE_MODE_SURFACELESS:
......@@ -2179,3 +2176,9 @@ meta_onscreen_native_class_init (MetaOnscreenNativeClass *klass)
meta_onscreen_native_swap_buffers_with_damage;
onscreen_class->direct_scanout = meta_onscreen_native_direct_scanout;
}
MetaCrtc *
meta_onscreen_native_get_crtc (MetaOnscreenNative *onscreen_native)
{
return onscreen_native->crtc;
}
......@@ -56,4 +56,6 @@ MetaOnscreenNative * meta_onscreen_native_new (MetaRendererNative *renderer_nati
int width,
int height);
MetaCrtc * meta_onscreen_native_get_crtc (MetaOnscreenNative *onscreen_native);
#endif /* META_ONSCREEN_NATIVE_H */
......@@ -50,6 +50,7 @@ typedef struct _MetaRendererNativeGpuData
MetaRendererNative *renderer_native;
MetaDeviceFile *device_file;
MetaGpuKms *gpu_kms;
struct {
struct gbm_device *device;
......
......@@ -46,9 +46,11 @@
#include <string.h>
#include <unistd.h>
#include "backends/meta-cursor-tracker-private.h"
#include "backends/meta-gles3.h"
#include "backends/meta-logical-monitor.h"
#include "backends/native/meta-backend-native-private.h"
#include "backends/native/meta-cursor-renderer-native.h"
#include "backends/native/meta-cogl-utils.h"
#include "backends/native/meta-crtc-kms.h"
#include "backends/native/meta-crtc-virtual.h"
......@@ -85,6 +87,8 @@ struct _MetaRendererNative
gboolean pending_mode_set;
GList *kept_alive_onscreens;
GList *lingering_onscreens;
guint release_unused_gpus_idle_id;
GList *power_save_page_flip_onscreens;
guint power_save_page_flip_source_id;
......@@ -121,6 +125,11 @@ meta_renderer_native_gpu_data_free (MetaRendererNativeGpuData *renderer_gpu_data
{
MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native;
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
MetaRenderer *renderer = META_RENDERER (renderer_gpu_data->renderer_native);
MetaBackend *backend = meta_renderer_get_backend (renderer);
MetaCursorRenderer *cursor_renderer;
MetaGpuKms *gpu_kms;
GList *l;
if (renderer_gpu_data->secondary.egl_context != EGL_NO_CONTEXT)
{
......@@ -130,11 +139,33 @@ meta_renderer_native_gpu_data_free (MetaRendererNativeGpuData *renderer_gpu_data
NULL);
}
cursor_renderer = meta_backend_get_cursor_renderer (backend);
gpu_kms = renderer_gpu_data->gpu_kms;
if (cursor_renderer && gpu_kms)
{
MetaCursorRendererNative *cursor_renderer_native =
META_CURSOR_RENDERER_NATIVE (cursor_renderer);
MetaCursorTracker *cursor_tracker =
meta_backend_get_cursor_tracker (backend);
GList *cursor_sprites =
meta_cursor_tracker_peek_cursor_sprites (cursor_tracker);
for (l = cursor_sprites; l; l = l->next)
{
MetaCursorSprite *cursor_sprite = META_CURSOR_SPRITE (l->data);
meta_cursor_renderer_native_invalidate_gpu_state (cursor_renderer_native,
cursor_sprite,
gpu_kms);
}
}
if (renderer_gpu_data->egl_display != EGL_NO_DISPLAY)
meta_egl_terminate (egl, renderer_gpu_data->egl_display, NULL);
g_clear_pointer (&renderer_gpu_data->gbm.device, gbm_device_destroy);
g_clear_pointer (&renderer_gpu_data->device_file, meta_device_file_release);
g_free (renderer_gpu_data);
}
......@@ -634,13 +665,6 @@ meta_renderer_native_queue_power_save_page_flip (MetaRendererNative *renderer_na
g_object_ref (onscreen));
}
static void
clear_kept_alive_onscreens (MetaRendererNative *renderer_native)
{
g_clear_list (&renderer_native->kept_alive_onscreens,
g_object_unref);
}
static gboolean
is_gpu_unused (gpointer key,
gpointer value,
......@@ -674,11 +698,70 @@ free_unused_gpu_datas (MetaRendererNative *renderer_native)
g_hash_table_add (used_gpus, gpu);
}
for (l = renderer_native->lingering_onscreens; l; l = l->next)
{
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (l->data);
MetaCrtc *crtc = meta_onscreen_native_get_crtc (onscreen_native);
g_hash_table_add (used_gpus, meta_crtc_get_gpu (crtc));
}
g_hash_table_foreach_remove (renderer_native->gpu_datas,
is_gpu_unused,
used_gpus);
}
static gboolean
release_unused_gpus_idle (gpointer user_data)
{
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (user_data);
renderer_native->release_unused_gpus_idle_id = 0;
free_unused_gpu_datas (renderer_native);
return G_SOURCE_REMOVE;
}
static void
old_onscreen_freed (gpointer user_data,
GObject *freed_onscreen)
{
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (user_data);
renderer_native->lingering_onscreens =
g_list_remove (renderer_native->lingering_onscreens, freed_onscreen);
if (!renderer_native->release_unused_gpus_idle_id)
{
renderer_native->release_unused_gpus_idle_id =
g_idle_add (release_unused_gpus_idle, renderer_native);
}
}
static void
clear_kept_alive_onscreens (MetaRendererNative *renderer_native)
{
GList *l;
for (l = renderer_native->kept_alive_onscreens; l; l = l->next)
{
CoglOnscreen *onscreen;
if (!COGL_IS_ONSCREEN (l->data))
continue;
onscreen = COGL_ONSCREEN (l->data);
g_object_weak_ref (G_OBJECT (onscreen),
old_onscreen_freed,
renderer_native);
renderer_native->lingering_onscreens =
g_list_prepend (renderer_native->lingering_onscreens, onscreen);
}
g_clear_list (&renderer_native->kept_alive_onscreens,
g_object_unref);
}
void
meta_renderer_native_post_mode_set_updates (MetaRendererNative *renderer_native)
{
......@@ -1282,6 +1365,7 @@ meta_renderer_native_rebuild_views (MetaRenderer *renderer)
META_RENDERER_CLASS (meta_renderer_native_parent_class);
meta_kms_discard_pending_page_flips (kms);
meta_kms_discard_pending_updates (kms);
keep_current_onscreens_alive (renderer);
......@@ -1588,6 +1672,7 @@ init_gbm_egl_display (MetaRendererNative *renderer_native,
static MetaRendererNativeGpuData *
create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
MetaGpuKms *gpu_kms,
MetaDeviceFile *device_file,
GError **error)
{
......@@ -1607,6 +1692,7 @@ create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
renderer_gpu_data = meta_create_renderer_native_gpu_data ();
renderer_gpu_data->device_file = meta_device_file_acquire (device_file);
renderer_gpu_data->renderer_native = renderer_native;
renderer_gpu_data->gpu_kms = gpu_kms;
renderer_gpu_data->gbm.device = gbm_device;
renderer_gpu_data->mode = META_RENDERER_NATIVE_MODE_GBM;
......@@ -1813,6 +1899,7 @@ count_drm_devices (MetaRendererNative *renderer_native)
static MetaRendererNativeGpuData *
create_renderer_gpu_data_egl_device (MetaRendererNative *renderer_native,
MetaGpuKms *gpu_kms,
MetaDeviceFile *device_file,
GError **error)
{
......@@ -1873,6 +1960,7 @@ create_renderer_gpu_data_egl_device (MetaRendererNative *renderer_native,
renderer_gpu_data->egl.device = egl_device;
renderer_gpu_data->mode = META_RENDERER_NATIVE_MODE_EGL_DEVICE;
renderer_gpu_data->egl_display = egl_display;
renderer_gpu_data->gpu_kms = gpu_kms;
return renderer_gpu_data;
}
......@@ -1911,6 +1999,7 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
return NULL;
gbm_renderer_gpu_data = create_renderer_gpu_data_gbm (renderer_native,
gpu_kms,
device_file,
&gbm_error);
if (gbm_renderer_gpu_data)
......@@ -1922,6 +2011,7 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
#ifdef HAVE_EGL_DEVICE
egl_stream_renderer_gpu_data =
create_renderer_gpu_data_egl_device (renderer_native,
gpu_kms,
device_file,
&egl_device_error);
if (egl_stream_renderer_gpu_data)
......@@ -2235,8 +2325,6 @@ meta_renderer_native_finalize (GObject *object)
{
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (object);
clear_kept_alive_onscreens (renderer_native);
g_clear_list (&renderer_native->power_save_page_flip_onscreens,
g_object_unref);
g_clear_handle_id (&renderer_native->power_save_page_flip_source_id,
......@@ -2244,6 +2332,10 @@ meta_renderer_native_finalize (GObject *object)
g_list_free (renderer_native->pending_mode_set_views);
g_clear_handle_id (&renderer_native->release_unused_gpus_idle_id,
g_source_remove);
clear_kept_alive_onscreens (renderer_native);
g_hash_table_destroy (renderer_native->gpu_datas);
g_clear_object (&renderer_native->gles3);
......