[mutter/wayland] cursor: Introduce accessors for the texture / GBM bo
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wayland] cursor: Introduce accessors for the texture / GBM bo
- Date: Mon, 31 Mar 2014 23:15:41 +0000 (UTC)
commit 383d4c7e4e47891a4c7544c1b27a6529e1b4fed5
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Mon Mar 31 15:31:15 2014 -0400
cursor: Introduce accessors for the texture / GBM bo
We want to make this private, and have MetaCursorReference be
backend-defined, with the texture possibly loaded on demand.
We can't make the definition of MetaCursorReference truly private yet
because of the XFixes cursor. A victim of MetaCursorTracker trying to
do too many things at once...
src/core/meta-cursor-private.h | 8 ++++++
src/core/meta-cursor-tracker.c | 50 ++++++++++++++++++++++++---------------
src/core/meta-cursor.c | 24 +++++++++++++++++++
3 files changed, 63 insertions(+), 19 deletions(-)
---
diff --git a/src/core/meta-cursor-private.h b/src/core/meta-cursor-private.h
index 14d3ec6..a5f04a7 100644
--- a/src/core/meta-cursor-private.h
+++ b/src/core/meta-cursor-private.h
@@ -35,4 +35,12 @@ struct _MetaCursorReference {
int hot_x, hot_y;
};
+CoglTexture *meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
+ int *hot_x,
+ int *hot_y);
+
+struct gbm_bo *meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
+ int *hot_x,
+ int *hot_y);
+
#endif /* META_CURSOR_PRIVATE_H */
diff --git a/src/core/meta-cursor-tracker.c b/src/core/meta-cursor-tracker.c
index d038109..7338e2a 100644
--- a/src/core/meta-cursor-tracker.c
+++ b/src/core/meta-cursor-tracker.c
@@ -338,7 +338,7 @@ meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker)
ensure_xfixes_cursor (tracker);
if (tracker->displayed_cursor)
- return COGL_TEXTURE (tracker->displayed_cursor->texture);
+ return meta_cursor_reference_get_cogl_texture (tracker->displayed_cursor, NULL, NULL);
else
return NULL;
}
@@ -361,13 +361,7 @@ meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
ensure_xfixes_cursor (tracker);
if (tracker->displayed_cursor)
- {
- MetaCursorReference *displayed_cursor = tracker->displayed_cursor;
- if (x)
- *x = displayed_cursor->hot_x;
- if (y)
- *y = displayed_cursor->hot_y;
- }
+ meta_cursor_reference_get_cogl_texture (tracker->displayed_cursor, x, y);
else
{
if (x)
@@ -446,6 +440,15 @@ meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
}
}
+static gboolean
+should_have_hw_cursor (MetaCursorTracker *tracker)
+{
+ if (tracker->displayed_cursor)
+ return (meta_cursor_reference_get_gbm_bo (tracker->displayed_cursor, NULL, NULL) != NULL);
+ else
+ return FALSE;
+}
+
static void
update_hw_cursor (MetaCursorTracker *tracker)
{
@@ -454,7 +457,7 @@ update_hw_cursor (MetaCursorTracker *tracker)
unsigned int i, n_crtcs;
gboolean enabled;
- enabled = tracker->displayed_cursor && tracker->displayed_cursor->bo != NULL;
+ enabled = should_have_hw_cursor (tracker);
tracker->has_hw_cursor = enabled;
monitors = meta_monitor_manager_get ();
@@ -521,7 +524,10 @@ update_displayed_cursor (MetaCursorTracker *tracker)
if (meta_is_wayland_compositor ())
{
if (tracker->displayed_cursor)
- cogl_pipeline_set_layer_texture (tracker->pipeline, 0, COGL_TEXTURE (displayed_cursor->texture));
+ {
+ CoglTexture *texture = meta_cursor_reference_get_cogl_texture (tracker->displayed_cursor, NULL,
NULL);
+ cogl_pipeline_set_layer_texture (tracker->pipeline, 0, texture);
+ }
else
cogl_pipeline_set_layer_texture (tracker->pipeline, 0, NULL);
@@ -585,10 +591,15 @@ sync_cursor (MetaCursorTracker *tracker)
if (displayed_cursor)
{
- tracker->current_rect.x = tracker->current_x - displayed_cursor->hot_x;
- tracker->current_rect.y = tracker->current_y - displayed_cursor->hot_y;
- tracker->current_rect.width = cogl_texture_get_width (COGL_TEXTURE (displayed_cursor->texture));
- tracker->current_rect.height = cogl_texture_get_height (COGL_TEXTURE (displayed_cursor->texture));
+ CoglTexture *texture;
+ int hot_x, hot_y;
+
+ texture = meta_cursor_reference_get_cogl_texture (displayed_cursor, &hot_x, &hot_y);
+
+ tracker->current_rect.x = tracker->current_x - hot_x;
+ tracker->current_rect.y = tracker->current_y - hot_y;
+ tracker->current_rect.width = cogl_texture_get_width (COGL_TEXTURE (texture));
+ tracker->current_rect.height = cogl_texture_get_height (COGL_TEXTURE (texture));
}
else
{
@@ -649,15 +660,16 @@ meta_cursor_tracker_set_crtc_has_hw_cursor (MetaCursorTracker *tracker,
if (has)
{
MetaCursorReference *displayed_cursor = tracker->displayed_cursor;
+ struct gbm_bo *bo;
union gbm_bo_handle handle;
int width, height;
int hot_x, hot_y;
- handle = gbm_bo_get_handle (displayed_cursor->bo);
- width = gbm_bo_get_width (displayed_cursor->bo);
- height = gbm_bo_get_height (displayed_cursor->bo);
- hot_x = displayed_cursor->hot_x;
- hot_y = displayed_cursor->hot_y;
+ bo = meta_cursor_reference_get_gbm_bo (displayed_cursor, &hot_x, &hot_y);
+
+ handle = gbm_bo_get_handle (bo);
+ width = gbm_bo_get_width (bo);
+ height = gbm_bo_get_height (bo);
drmModeSetCursor2 (tracker->drm_fd, crtc->crtc_id, handle.u32,
width, height, hot_x, hot_y);
diff --git a/src/core/meta-cursor.c b/src/core/meta-cursor.c
index 5749054..bc1d140 100644
--- a/src/core/meta-cursor.c
+++ b/src/core/meta-cursor.c
@@ -377,3 +377,27 @@ meta_cursor_reference_from_buffer (MetaCursorTracker *tracker,
return self;
}
+
+CoglTexture *
+meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
+ int *hot_x,
+ int *hot_y)
+{
+ if (hot_x)
+ *hot_x = cursor->hot_x;
+ if (hot_y)
+ *hot_y = cursor->hot_y;
+ return COGL_TEXTURE (cursor->texture);
+}
+
+struct gbm_bo *
+meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
+ int *hot_x,
+ int *hot_y)
+{
+ if (hot_x)
+ *hot_x = cursor->hot_x;
+ if (hot_y)
+ *hot_y = cursor->hot_y;
+ return cursor->bo;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]