diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2017-01-10 16:01:46 +0800 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2017-02-07 10:50:29 +0800 |
commit | 8ccbd363159eab7c9394f49dd21d8cef9d4b0b41 (patch) | |
tree | a739fbf32790c200abfff7916331b2d914807c33 | |
parent | 790b386c5ff637faf13c5a7a70025a85fe03b3e6 (diff) | |
download | mutter-8ccbd363159eab7c9394f49dd21d8cef9d4b0b41.tar.gz |
MetaCursorRendererNative: Always force set hw cursor the first time
The initial state of the hardware cursor is not known, so always force
update it the first time we update the cursor. Do this by changing the
'force' flag of update_hw_cursor() to an 'invalidated' hw cursor state.
https://bugzilla.gnome.org/show_bug.cgi?id=771056
-rw-r--r-- | src/backends/native/meta-cursor-renderer-native.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c index 2105d610f..f4ea8d2a9 100644 --- a/src/backends/native/meta-cursor-renderer-native.c +++ b/src/backends/native/meta-cursor-renderer-native.c @@ -63,6 +63,7 @@ static GQuark quark_cursor_sprite = 0; struct _MetaCursorRendererNativePrivate { + gboolean hw_state_invalidated; gboolean has_hw_cursor; MetaCursorSprite *last_cursor; @@ -159,8 +160,7 @@ set_pending_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite, static void set_crtc_cursor (MetaCursorRendererNative *native, MetaCRTC *crtc, - MetaCursorSprite *cursor_sprite, - gboolean force) + MetaCursorSprite *cursor_sprite) { MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native); @@ -177,7 +177,7 @@ set_crtc_cursor (MetaCursorRendererNative *native, else bo = get_active_cursor_sprite_gbm_bo (cursor_sprite); - if (!force && bo == crtc->cursor_renderer_private) + if (!priv->hw_state_invalidated && bo == crtc->cursor_renderer_private) return; crtc->cursor_renderer_private = bo; @@ -197,7 +197,7 @@ set_crtc_cursor (MetaCursorRendererNative *native, } else { - if (force || crtc->cursor_renderer_private != NULL) + if (priv->hw_state_invalidated || crtc->cursor_renderer_private != NULL) { drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, 0, 0, 0, 0, 0); crtc->cursor_renderer_private = NULL; @@ -207,8 +207,7 @@ set_crtc_cursor (MetaCursorRendererNative *native, static void update_hw_cursor (MetaCursorRendererNative *native, - MetaCursorSprite *cursor_sprite, - gboolean force) + MetaCursorSprite *cursor_sprite) { MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native); MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native); @@ -241,7 +240,7 @@ update_hw_cursor (MetaCursorRendererNative *native, else crtc_cursor = NULL; - set_crtc_cursor (native, &crtcs[i], crtc_cursor, force); + set_crtc_cursor (native, &crtcs[i], crtc_cursor); if (crtc_cursor) { @@ -252,6 +251,8 @@ update_hw_cursor (MetaCursorRendererNative *native, } } + priv->hw_state_invalidated = FALSE; + if (painted) meta_cursor_renderer_emit_painted (renderer, cursor_sprite); } @@ -394,7 +395,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer, meta_cursor_renderer_native_trigger_frame (native, cursor_sprite); priv->has_hw_cursor = should_have_hw_cursor (renderer, cursor_sprite); - update_hw_cursor (native, cursor_sprite, FALSE); + update_hw_cursor (native, cursor_sprite); return priv->has_hw_cursor; } @@ -648,8 +649,11 @@ static void force_update_hw_cursor (MetaCursorRendererNative *native) { MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native); + MetaCursorRendererNativePrivate *priv = + meta_cursor_renderer_native_get_instance_private (native); - update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer), TRUE); + priv->hw_state_invalidated = TRUE; + update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer)); } static void @@ -670,6 +674,8 @@ meta_cursor_renderer_native_init (MetaCursorRendererNative *native) g_signal_connect_object (monitors, "monitors-changed", G_CALLBACK (on_monitors_changed), native, 0); + priv->hw_state_invalidated = TRUE; + #if defined(CLUTTER_WINDOWING_EGL) if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL)) { |