[PATCH V2] Do not assume 64x64 cursor, added support for other sizes (like in AMD Kaveri, 128x128).
Alex Deucher
alexdeucher at gmail.com
Wed Jun 25 08:02:37 PDT 2014
On Wed, Jun 25, 2014 at 10:09 AM, Alvaro Fernando García
<alvarofernandogarcia at gmail.com> wrote:
> 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 at gmail.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> src/compositor-drm.c | 43 ++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 36 insertions(+), 7 deletions(-)
>
> diff --git a/src/compositor-drm.c b/src/compositor-drm.c
> index 7d514e4..61ddea1 100644
> --- a/src/compositor-drm.c
> +++ b/src/compositor-drm.c
> @@ -55,6 +55,14 @@
> #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
> +
> static int option_current_mode = 0;
>
> enum output_config {
> @@ -108,6 +116,9 @@ struct drm_compositor {
>
> clockid_t clock;
> struct udev_input input;
> +
> + uint32_t cursor_width;
> + uint32_t cursor_height;
> };
>
> struct drm_mode {
> @@ -987,7 +998,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 +1021,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 +1029,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 +1307,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 +1577,21 @@ drm_output_init_egl(struct drm_output *output, struct drm_compositor *ec)
> return -1;
> }
>
> - flags = GBM_BO_USE_CURSOR_64X64 | GBM_BO_USE_WRITE;
> +#ifdef GBM_BO_USE_CURSOR
> + flags = GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE;
> +#else
> + flags = GBM_BO_USE_WRITE;
> + if (ec->cursor_width == 64 && ec->cursor_height == 64)
> + flags = GBM_BO_USE_CURSOR_64X64 | flags;
> +#endif
>
> 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) {
> --
> 2.0.0
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list