From 24e4275c300b3072a7c5c53715eca97c23f48c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 18 Jul 2012 12:08:37 -0400 Subject: [PATCH] compositor-drm: Only call drmModeMoveCursor() if hw cursor position changed Saves an ioctl per frame. --- src/compositor-drm.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/compositor-drm.c b/src/compositor-drm.c index e4afe5f2..ada4a036 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -108,7 +108,7 @@ struct drm_output { struct gbm_surface *surface; struct gbm_bo *cursor_bo[2]; - int current_cursor, cursor_free; + int current_cursor, cursor_free, cursor_x, cursor_y; EGLSurface egl_surface; struct drm_fb *current, *next; struct backlight *backlight; @@ -675,7 +675,7 @@ drm_output_set_cursor(struct weston_output *output_base, struct gbm_bo *bo; uint32_t buf[64 * 64]; unsigned char *s; - int i; + int i, x, y; if (!output->cursor_free) return; @@ -702,11 +702,15 @@ drm_output_set_cursor(struct weston_output *output_base, return; } - if (drmModeMoveCursor(c->drm.fd, output->crtc_id, - es->geometry.x - output->base.x, - es->geometry.y - output->base.y)) { - weston_log("failed to move cursor: %m\n"); - return; + x = es->geometry.x - output->base.x; + y = es->geometry.y - output->base.y; + if (output->cursor_x != x || output->cursor_y != y) { + if (drmModeMoveCursor(c->drm.fd, output->crtc_id, x, y)) { + weston_log("failed to move cursor: %m\n"); + return; + } + output->cursor_x = x; + output->cursor_y = y; } es->plane = WESTON_PLANE_DRM_CURSOR;