diff options
author | Alvaro Fernando García <alvarofernandogarcia@gmail.com> | 2014-07-28 18:30:17 -0300 |
---|---|---|
committer | Jason Ekstrand <jason.ekstrand@intel.com> | 2014-07-29 00:51:41 -0700 |
commit | dce7c6e5a2fb2e639e1e96ec0eaaf0f6551bc7b6 (patch) | |
tree | f437193bbd1a6b18bff7544406960f05ab36bde8 | |
parent | eb3cf22018beee559d3239e51fdc82610387fc63 (diff) |
Do not assume 64x64 cursor, added support for other sizes (like in AMD Kaveri, 128x128).
Init cursor size to 64x64 if drmGetCap() fails.
Use Mesa GBM_BO_USE_CURSOR define (which removes 64x64 restriction)
Signed-off-by: Alvaro Fernando García <alvarofernandogarcia@gmail.com>
-rw-r--r-- | src/compositor-drm.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 7d514e40..9c83b1a7 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -55,6 +55,18 @@ #define DRM_CAP_TIMESTAMP_MONOTONIC 0x6 #endif +#ifndef DRM_CAP_CURSOR_WIDTH +#define DRM_CAP_CURSOR_WIDTH 0x8 +#endif + +#ifndef DRM_CAP_CURSOR_HEIGHT +#define DRM_CAP_CURSOR_HEIGHT 0x9 +#endif + +#ifndef GBM_BO_USE_CURSOR +#define GBM_BO_USE_CURSOR GBM_BO_USE_CURSOR_64X64 +#endif + static int option_current_mode = 0; enum output_config { @@ -108,6 +120,9 @@ struct drm_compositor { clockid_t clock; struct udev_input input; + + uint32_t cursor_width; + uint32_t cursor_height; }; struct drm_mode { @@ -987,7 +1002,7 @@ drm_output_set_cursor(struct drm_output *output) (struct drm_compositor *) output->base.compositor; EGLint handle, stride; struct gbm_bo *bo; - uint32_t buf[64 * 64]; + uint32_t buf[c->cursor_width * c->cursor_height]; unsigned char *s; int i, x, y; @@ -1010,7 +1025,7 @@ drm_output_set_cursor(struct drm_output *output) s = wl_shm_buffer_get_data(buffer->shm_buffer); wl_shm_buffer_begin_access(buffer->shm_buffer); for (i = 0; i < ev->surface->height; i++) - memcpy(buf + i * 64, s + i * stride, + memcpy(buf + i * c->cursor_width, s + i * stride, ev->surface->width * 4); wl_shm_buffer_end_access(buffer->shm_buffer); @@ -1018,8 +1033,8 @@ drm_output_set_cursor(struct drm_output *output) weston_log("failed update cursor: %m\n"); handle = gbm_bo_get_handle(bo).s32; - if (drmModeSetCursor(c->drm.fd, - output->crtc_id, handle, 64, 64)) { + if (drmModeSetCursor(c->drm.fd, output->crtc_id, handle, + c->cursor_width, c->cursor_height)) { weston_log("failed to set cursor: %m\n"); c->cursors_are_broken = 1; } @@ -1296,6 +1311,18 @@ init_drm(struct drm_compositor *ec, struct udev_device *device) else ec->clock = CLOCK_REALTIME; + ret = drmGetCap(fd, DRM_CAP_CURSOR_WIDTH, &cap); + if (ret == 0) + ec->cursor_width = cap; + else + ec->cursor_width = 64; + + ret = drmGetCap(fd, DRM_CAP_CURSOR_HEIGHT, &cap); + if (ret == 0) + ec->cursor_height = cap; + else + ec->cursor_height = 64; + return 0; } @@ -1554,15 +1581,15 @@ drm_output_init_egl(struct drm_output *output, struct drm_compositor *ec) return -1; } - flags = GBM_BO_USE_CURSOR_64X64 | GBM_BO_USE_WRITE; + flags = GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE; for (i = 0; i < 2; i++) { if (output->cursor_bo[i]) continue; output->cursor_bo[i] = - gbm_bo_create(ec->gbm, 64, 64, GBM_FORMAT_ARGB8888, - flags); + gbm_bo_create(ec->gbm, ec->cursor_width, ec->cursor_height, + GBM_FORMAT_ARGB8888, flags); } if (output->cursor_bo[0] == NULL || output->cursor_bo[1] == NULL) { |