[PATCH V3] Do not assume 64x64 cursor, added support for other sizes (like in AMD Kaveri, 128x128).

Jason Ekstrand jason at jlekstrand.net
Tue Jul 29 00:01:32 PDT 2014


Couple thoughs.  First, we need to also update
drm_output_prepare_cursor_view to check against the size coming from GBM
instead of against the hard-coded 64x64 it's currently checking against.
Without changing that, we are still restricted to 64x64 regardless of the
GBM checking.

Other questions below.


On Mon, Jul 28, 2014 at 2:30 PM, 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>
> ---
>  src/compositor-drm.c | 41 ++++++++++++++++++++++++++++++++++-------
>  1 file changed, 34 insertions(+), 7 deletions(-)
>
> diff --git a/src/compositor-drm.c b/src/compositor-drm.c
> index 7d514e4..9c83b1a 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
>

Is GBM_BO_USE_CURSOR a valid vallback for GBM_BO_USE_CURSOR_64x64?  What
happens if drmGetCap fails but GBM_BO_USE_CURSOR is defined?  Is that going
to be ok?


> +
>  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;
> +
>

I think this was asked before, but never answered.  Do we have known bounds
on these values?  I guess they come from GBM so we can probably trust that
they're reasonable, but what are the guarantees?

        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) {
> --
> 2.0.3
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20140729/15f8e754/attachment.html>


More information about the wayland-devel mailing list