cursor-renderer/native: Let the backend realize cursor sprite itself
It knows better when it's needed. For now, just do it just as before, before drawing. Eventually, we can conditionalize where to realize depending on the cursor sprite position. https://gitlab.gnome.org/GNOME/mutter/issues/77
This commit is contained in:
parent
6c7c566c6c
commit
ea05d2af49
@ -283,13 +283,3 @@ meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
|
|||||||
|
|
||||||
return priv->displayed_cursor;
|
return priv->displayed_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_cursor_renderer_realize_cursor_sprite (MetaCursorRenderer *renderer,
|
|
||||||
MetaCursorSprite *cursor_sprite)
|
|
||||||
{
|
|
||||||
MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_GET_CLASS (renderer);
|
|
||||||
|
|
||||||
if (renderer_class->realize_cursor_sprite)
|
|
||||||
renderer_class->realize_cursor_sprite (renderer, cursor_sprite);
|
|
||||||
}
|
|
||||||
|
@ -40,8 +40,6 @@ struct _MetaCursorRendererClass
|
|||||||
|
|
||||||
gboolean (* update_cursor) (MetaCursorRenderer *renderer,
|
gboolean (* update_cursor) (MetaCursorRenderer *renderer,
|
||||||
MetaCursorSprite *cursor_sprite);
|
MetaCursorSprite *cursor_sprite);
|
||||||
void (* realize_cursor_sprite) (MetaCursorRenderer *renderer,
|
|
||||||
MetaCursorSprite *cursor_sprite);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MetaCursorRenderer * meta_cursor_renderer_new (void);
|
MetaCursorRenderer * meta_cursor_renderer_new (void);
|
||||||
@ -60,9 +58,6 @@ MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer
|
|||||||
ClutterRect meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
|
ClutterRect meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
|
||||||
MetaCursorSprite *cursor_sprite);
|
MetaCursorSprite *cursor_sprite);
|
||||||
|
|
||||||
void meta_cursor_renderer_realize_cursor_sprite (MetaCursorRenderer *renderer,
|
|
||||||
MetaCursorSprite *cursor_sprite);
|
|
||||||
|
|
||||||
void meta_cursor_renderer_emit_painted (MetaCursorRenderer *renderer,
|
void meta_cursor_renderer_emit_painted (MetaCursorRenderer *renderer,
|
||||||
MetaCursorSprite *cursor_sprite);
|
MetaCursorSprite *cursor_sprite);
|
||||||
|
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
|
|
||||||
#include "backends/meta-cursor-sprite-xcursor.h"
|
#include "backends/meta-cursor-sprite-xcursor.h"
|
||||||
|
|
||||||
#include "backends/meta-backend-private.h"
|
|
||||||
#include "backends/meta-cursor.h"
|
#include "backends/meta-cursor.h"
|
||||||
#include "backends/meta-cursor-renderer.h"
|
#include "backends/meta-cursor-renderer.h"
|
||||||
#include "clutter/clutter.h"
|
#include "clutter/clutter.h"
|
||||||
@ -118,8 +117,6 @@ static void
|
|||||||
load_from_current_xcursor_image (MetaCursorSpriteXcursor *sprite_xcursor)
|
load_from_current_xcursor_image (MetaCursorSpriteXcursor *sprite_xcursor)
|
||||||
{
|
{
|
||||||
MetaCursorSprite *sprite = META_CURSOR_SPRITE (sprite_xcursor);
|
MetaCursorSprite *sprite = META_CURSOR_SPRITE (sprite_xcursor);
|
||||||
MetaBackend *backend = meta_get_backend ();
|
|
||||||
MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (backend);
|
|
||||||
XcursorImage *xc_image;
|
XcursorImage *xc_image;
|
||||||
int width, height, rowstride;
|
int width, height, rowstride;
|
||||||
CoglPixelFormat cogl_format;
|
CoglPixelFormat cogl_format;
|
||||||
@ -160,8 +157,6 @@ load_from_current_xcursor_image (MetaCursorSpriteXcursor *sprite_xcursor)
|
|||||||
xc_image->xhot, xc_image->yhot);
|
xc_image->xhot, xc_image->yhot);
|
||||||
|
|
||||||
g_clear_pointer (&texture, cogl_object_unref);
|
g_clear_pointer (&texture, cogl_object_unref);
|
||||||
|
|
||||||
meta_cursor_renderer_realize_cursor_sprite (renderer, sprite);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -119,6 +119,10 @@ static GQuark quark_cursor_renderer_native_gpu_data = 0;
|
|||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererNative, meta_cursor_renderer_native, META_TYPE_CURSOR_RENDERER);
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererNative, meta_cursor_renderer_native, META_TYPE_CURSOR_RENDERER);
|
||||||
|
|
||||||
|
static void
|
||||||
|
realize_cursor_sprite (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorSprite *cursor_sprite);
|
||||||
|
|
||||||
static MetaCursorNativeGpuState *
|
static MetaCursorNativeGpuState *
|
||||||
get_cursor_gpu_state (MetaCursorNativePrivate *cursor_priv,
|
get_cursor_gpu_state (MetaCursorNativePrivate *cursor_priv,
|
||||||
MetaGpuKms *gpu_kms);
|
MetaGpuKms *gpu_kms);
|
||||||
@ -675,7 +679,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer,
|
|||||||
meta_cursor_renderer_native_get_instance_private (native);
|
meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
|
||||||
if (cursor_sprite)
|
if (cursor_sprite)
|
||||||
meta_cursor_sprite_realize_texture (cursor_sprite);
|
realize_cursor_sprite (renderer, cursor_sprite);
|
||||||
|
|
||||||
maybe_schedule_cursor_sprite_animation_frame (native, cursor_sprite);
|
maybe_schedule_cursor_sprite_animation_frame (native, cursor_sprite);
|
||||||
|
|
||||||
@ -717,6 +721,24 @@ ensure_cursor_gpu_state (MetaCursorNativePrivate *cursor_priv,
|
|||||||
return cursor_gpu_state;
|
return cursor_gpu_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_cursor_sprite_texture_changed (MetaCursorSprite *cursor_sprite)
|
||||||
|
{
|
||||||
|
MetaCursorNativePrivate *cursor_priv = get_cursor_priv (cursor_sprite);
|
||||||
|
GHashTableIter iter;
|
||||||
|
MetaCursorNativeGpuState *cursor_gpu_state;
|
||||||
|
|
||||||
|
g_hash_table_iter_init (&iter, cursor_priv->gpu_states);
|
||||||
|
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &cursor_gpu_state))
|
||||||
|
{
|
||||||
|
guint pending_bo;
|
||||||
|
pending_bo = get_pending_cursor_sprite_gbm_bo_index (cursor_gpu_state);
|
||||||
|
g_clear_pointer (&cursor_gpu_state->bos[pending_bo],
|
||||||
|
(GDestroyNotify) gbm_bo_destroy);
|
||||||
|
cursor_gpu_state->pending_bo_state = META_CURSOR_GBM_BO_STATE_INVALIDATED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cursor_priv_free (MetaCursorNativePrivate *cursor_priv)
|
cursor_priv_free (MetaCursorNativePrivate *cursor_priv)
|
||||||
{
|
{
|
||||||
@ -749,6 +771,9 @@ ensure_cursor_priv (MetaCursorSprite *cursor_sprite)
|
|||||||
cursor_priv,
|
cursor_priv,
|
||||||
(GDestroyNotify) cursor_priv_free);
|
(GDestroyNotify) cursor_priv_free);
|
||||||
|
|
||||||
|
g_signal_connect (cursor_sprite, "texture-changed",
|
||||||
|
G_CALLBACK (on_cursor_sprite_texture_changed), NULL);
|
||||||
|
|
||||||
return cursor_priv;
|
return cursor_priv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -816,26 +841,31 @@ load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
invalidate_pending_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite,
|
is_cursor_hw_state_valid (MetaCursorSprite *cursor_sprite,
|
||||||
MetaGpuKms *gpu_kms)
|
MetaGpuKms *gpu_kms)
|
||||||
{
|
{
|
||||||
MetaCursorNativePrivate *cursor_priv;
|
MetaCursorNativePrivate *cursor_priv;
|
||||||
MetaCursorNativeGpuState *cursor_gpu_state;
|
MetaCursorNativeGpuState *cursor_gpu_state;
|
||||||
guint pending_bo;
|
|
||||||
|
|
||||||
cursor_priv = get_cursor_priv (cursor_sprite);
|
cursor_priv = get_cursor_priv (cursor_sprite);
|
||||||
if (!cursor_priv)
|
if (!cursor_priv)
|
||||||
return;
|
return FALSE;
|
||||||
|
|
||||||
cursor_gpu_state = get_cursor_gpu_state (cursor_priv, gpu_kms);
|
cursor_gpu_state = get_cursor_gpu_state (cursor_priv, gpu_kms);
|
||||||
if (!cursor_gpu_state)
|
if (!cursor_gpu_state)
|
||||||
return;
|
return FALSE;
|
||||||
|
|
||||||
pending_bo = get_pending_cursor_sprite_gbm_bo_index (cursor_gpu_state);
|
switch (cursor_gpu_state->pending_bo_state)
|
||||||
g_clear_pointer (&cursor_gpu_state->bos[pending_bo],
|
{
|
||||||
(GDestroyNotify) gbm_bo_destroy);
|
case META_CURSOR_GBM_BO_STATE_SET:
|
||||||
cursor_gpu_state->pending_bo_state = META_CURSOR_GBM_BO_STATE_INVALIDATED;
|
case META_CURSOR_GBM_BO_STATE_NONE:
|
||||||
|
return TRUE;
|
||||||
|
case META_CURSOR_GBM_BO_STATE_INVALIDATED:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_WAYLAND
|
#ifdef HAVE_WAYLAND
|
||||||
@ -858,10 +888,8 @@ realize_cursor_sprite_from_wl_buffer_for_gpu (MetaCursorRenderer *renderer,
|
|||||||
if (!cursor_renderer_gpu_data || cursor_renderer_gpu_data->hw_cursor_broken)
|
if (!cursor_renderer_gpu_data || cursor_renderer_gpu_data->hw_cursor_broken)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Destroy any previous pending cursor buffer; we'll always either fail (which
|
if (is_cursor_hw_state_valid (cursor_sprite, gpu_kms))
|
||||||
* should unset, or succeed, which will set new buffer.
|
return;
|
||||||
*/
|
|
||||||
invalidate_pending_cursor_sprite_gbm_bo (cursor_sprite, gpu_kms);
|
|
||||||
|
|
||||||
texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||||
width = cogl_texture_get_width (texture);
|
width = cogl_texture_get_width (texture);
|
||||||
@ -990,7 +1018,8 @@ realize_cursor_sprite_from_xcursor_for_gpu (MetaCursorRenderer *renderer,
|
|||||||
if (!cursor_renderer_gpu_data || cursor_renderer_gpu_data->hw_cursor_broken)
|
if (!cursor_renderer_gpu_data || cursor_renderer_gpu_data->hw_cursor_broken)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
invalidate_pending_cursor_sprite_gbm_bo (cursor_sprite, gpu_kms);
|
if (is_cursor_hw_state_valid (cursor_sprite, gpu_kms))
|
||||||
|
return;
|
||||||
|
|
||||||
load_cursor_sprite_gbm_buffer_for_gpu (native,
|
load_cursor_sprite_gbm_buffer_for_gpu (native,
|
||||||
gpu_kms,
|
gpu_kms,
|
||||||
@ -1027,9 +1056,11 @@ realize_cursor_sprite_from_xcursor (MetaCursorRenderer *renderer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_cursor_renderer_native_realize_cursor_sprite (MetaCursorRenderer *renderer,
|
realize_cursor_sprite (MetaCursorRenderer *renderer,
|
||||||
MetaCursorSprite *cursor_sprite)
|
MetaCursorSprite *cursor_sprite)
|
||||||
{
|
{
|
||||||
|
meta_cursor_sprite_realize_texture (cursor_sprite);
|
||||||
|
|
||||||
if (META_IS_CURSOR_SPRITE_XCURSOR (cursor_sprite))
|
if (META_IS_CURSOR_SPRITE_XCURSOR (cursor_sprite))
|
||||||
{
|
{
|
||||||
MetaCursorSpriteXcursor *sprite_xcursor =
|
MetaCursorSpriteXcursor *sprite_xcursor =
|
||||||
@ -1056,8 +1087,6 @@ meta_cursor_renderer_native_class_init (MetaCursorRendererNativeClass *klass)
|
|||||||
|
|
||||||
object_class->finalize = meta_cursor_renderer_native_finalize;
|
object_class->finalize = meta_cursor_renderer_native_finalize;
|
||||||
renderer_class->update_cursor = meta_cursor_renderer_native_update_cursor;
|
renderer_class->update_cursor = meta_cursor_renderer_native_update_cursor;
|
||||||
renderer_class->realize_cursor_sprite =
|
|
||||||
meta_cursor_renderer_native_realize_cursor_sprite;
|
|
||||||
|
|
||||||
quark_cursor_sprite = g_quark_from_static_string ("-meta-cursor-native");
|
quark_cursor_sprite = g_quark_from_static_string ("-meta-cursor-native");
|
||||||
quark_cursor_renderer_native_gpu_data =
|
quark_cursor_renderer_native_gpu_data =
|
||||||
|
@ -71,16 +71,6 @@ update_cursor_sprite_texture (MetaWaylandCursorSurface *cursor_surface)
|
|||||||
buffer->texture,
|
buffer->texture,
|
||||||
priv->hot_x * surface->scale,
|
priv->hot_x * surface->scale,
|
||||||
priv->hot_y * surface->scale);
|
priv->hot_y * surface->scale);
|
||||||
|
|
||||||
if (priv->buffer)
|
|
||||||
{
|
|
||||||
g_assert (priv->buffer == buffer);
|
|
||||||
meta_cursor_renderer_realize_cursor_sprite (priv->cursor_renderer,
|
|
||||||
cursor_sprite);
|
|
||||||
|
|
||||||
meta_wayland_surface_unref_buffer_use_count (surface);
|
|
||||||
g_clear_object (&priv->buffer);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user