compositor-drm: Only call drmModeMoveCursor() if hw cursor position changed

Saves an ioctl per frame.
Kristian Høgsberg 12 years ago
parent f1ea63ff05
commit 24e4275c30
  1. 18
      src/compositor-drm.c

@ -108,7 +108,7 @@ struct drm_output {
struct gbm_surface *surface; struct gbm_surface *surface;
struct gbm_bo *cursor_bo[2]; struct gbm_bo *cursor_bo[2];
int current_cursor, cursor_free; int current_cursor, cursor_free, cursor_x, cursor_y;
EGLSurface egl_surface; EGLSurface egl_surface;
struct drm_fb *current, *next; struct drm_fb *current, *next;
struct backlight *backlight; struct backlight *backlight;
@ -675,7 +675,7 @@ drm_output_set_cursor(struct weston_output *output_base,
struct gbm_bo *bo; struct gbm_bo *bo;
uint32_t buf[64 * 64]; uint32_t buf[64 * 64];
unsigned char *s; unsigned char *s;
int i; int i, x, y;
if (!output->cursor_free) if (!output->cursor_free)
return; return;
@ -702,11 +702,15 @@ drm_output_set_cursor(struct weston_output *output_base,
return; return;
} }
if (drmModeMoveCursor(c->drm.fd, output->crtc_id, x = es->geometry.x - output->base.x;
es->geometry.x - output->base.x, y = es->geometry.y - output->base.y;
es->geometry.y - output->base.y)) { if (output->cursor_x != x || output->cursor_y != y) {
weston_log("failed to move cursor: %m\n"); if (drmModeMoveCursor(c->drm.fd, output->crtc_id, x, y)) {
return; weston_log("failed to move cursor: %m\n");
return;
}
output->cursor_x = x;
output->cursor_y = y;
} }
es->plane = WESTON_PLANE_DRM_CURSOR; es->plane = WESTON_PLANE_DRM_CURSOR;

Loading…
Cancel
Save