On Thu, Jun 20, 2013 at 11:48:52AM +1000, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> So it looks like for virtual hw cursors on QXL we need to inform
> the "hw" device what the cursor hotspot parameters are. This
> makes sense if you think the host has to draw the cursor and interpret
> clicks from it. However the current modesetting interface doesn't support
> passing the hotspot information from userspace.
> 
> This implements a new cursor ioctl, that takes the hotspot info as well,
> userspace can try calling the new interface and if it -ENOSYS, can just
> fallback to the old non-hotspot interface.

This needs to be updated since your patch implements the fallback to the
old interface transparently already. Otherwise looks sane.

Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>

> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  drivers/gpu/drm/drm_crtc.c  | 35 +++++++++++++++++++++++++++++------
>  drivers/gpu/drm/drm_drv.c   |  1 +
>  include/drm/drm_crtc.h      |  5 +++++
>  include/uapi/drm/drm.h      |  1 +
>  include/uapi/drm/drm_mode.h | 13 +++++++++++++
>  5 files changed, 49 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index e7e9242..cc9eada 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -2099,10 +2099,10 @@ out:
>       return ret;
>  }
>  
> -int drm_mode_cursor_ioctl(struct drm_device *dev,
> -                     void *data, struct drm_file *file_priv)
> +static int drm_mode_cursor_common(struct drm_device *dev,
> +                               struct drm_mode_cursor2 *req,
> +                               struct drm_file *file_priv)
>  {
> -     struct drm_mode_cursor *req = data;
>       struct drm_mode_object *obj;
>       struct drm_crtc *crtc;
>       int ret = 0;
> @@ -2122,13 +2122,17 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,
>  
>       mutex_lock(&crtc->mutex);
>       if (req->flags & DRM_MODE_CURSOR_BO) {
> -             if (!crtc->funcs->cursor_set) {
> +             if (!crtc->funcs->cursor_set && !crtc->funcs->cursor_set2) {
>                       ret = -ENXIO;
>                       goto out;
>               }
>               /* Turns off the cursor if handle is 0 */
> -             ret = crtc->funcs->cursor_set(crtc, file_priv, req->handle,
> -                                           req->width, req->height);
> +             if (crtc->funcs->cursor_set2)
> +                     ret = crtc->funcs->cursor_set2(crtc, file_priv, 
> req->handle,
> +                                                   req->width, req->height, 
> req->hot_x, req->hot_y);
> +             else
> +                     ret = crtc->funcs->cursor_set(crtc, file_priv, 
> req->handle,
> +                                                   req->width, req->height);
>       }
>  
>       if (req->flags & DRM_MODE_CURSOR_MOVE) {
> @@ -2143,6 +2147,25 @@ out:
>       mutex_unlock(&crtc->mutex);
>  
>       return ret;
> +
> +}
> +int drm_mode_cursor_ioctl(struct drm_device *dev,
> +                     void *data, struct drm_file *file_priv)
> +{
> +     struct drm_mode_cursor *req = data;
> +     struct drm_mode_cursor2 new_req;
> +
> +     memcpy(&new_req, req, sizeof(struct drm_mode_cursor));
> +     new_req.hot_x = new_req.hot_y = 0;
> +
> +     return drm_mode_cursor_common(dev, &new_req, file_priv);
> +}
> +
> +int drm_mode_cursor2_ioctl(struct drm_device *dev,
> +                        void *data, struct drm_file *file_priv)
> +{
> +     struct drm_mode_cursor2 *req = data;
> +     return drm_mode_cursor_common(dev, req, file_priv);
>  }
>  
>  /* Original addfb only supported RGB formats, so figure out which one */
> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
> index 9cc247f..99fcd7c 100644
> --- a/drivers/gpu/drm/drm_drv.c
> +++ b/drivers/gpu/drm/drm_drv.c
> @@ -166,6 +166,7 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
>       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, 
> DRM_CONTROL_ALLOW|DRM_UNLOCKED),
>       DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, 
> drm_mode_obj_get_properties_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
>       DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, 
> drm_mode_obj_set_property_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
> +     DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, 
> DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
>  };
>  
>  #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index adb3f9b..093c030 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -339,6 +339,9 @@ struct drm_crtc_funcs {
>       /* cursor controls */
>       int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv,
>                         uint32_t handle, uint32_t width, uint32_t height);
> +     int (*cursor_set2)(struct drm_crtc *crtc, struct drm_file *file_priv,
> +                        uint32_t handle, uint32_t width, uint32_t height,
> +                        int32_t hot_x, int32_t hot_y);
>       int (*cursor_move)(struct drm_crtc *crtc, int x, int y);
>  
>       /* Set gamma on the CRTC */
> @@ -1022,6 +1025,8 @@ extern int drm_mode_setplane(struct drm_device *dev,
>                              void *data, struct drm_file *file_priv);
>  extern int drm_mode_cursor_ioctl(struct drm_device *dev,
>                               void *data, struct drm_file *file_priv);
> +extern int drm_mode_cursor2_ioctl(struct drm_device *dev,
> +                             void *data, struct drm_file *file_priv);
>  extern int drm_mode_addfb(struct drm_device *dev,
>                         void *data, struct drm_file *file_priv);
>  extern int drm_mode_addfb2(struct drm_device *dev,
> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
> index 5a57be6..238a166 100644
> --- a/include/uapi/drm/drm.h
> +++ b/include/uapi/drm/drm.h
> @@ -732,6 +732,7 @@ struct drm_prime_handle {
>  #define DRM_IOCTL_MODE_ADDFB2                DRM_IOWR(0xB8, struct 
> drm_mode_fb_cmd2)
>  #define DRM_IOCTL_MODE_OBJ_GETPROPERTIES     DRM_IOWR(0xB9, struct 
> drm_mode_obj_get_properties)
>  #define DRM_IOCTL_MODE_OBJ_SETPROPERTY       DRM_IOWR(0xBA, struct 
> drm_mode_obj_set_property)
> +#define DRM_IOCTL_MODE_CURSOR2               DRM_IOWR(0xBB, struct 
> drm_mode_cursor2)
>  
>  /**
>   * Device specific ioctls should only be in their respective headers
> diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
> index 090e533..53db7ce 100644
> --- a/include/uapi/drm/drm_mode.h
> +++ b/include/uapi/drm/drm_mode.h
> @@ -388,6 +388,19 @@ struct drm_mode_cursor {
>       __u32 handle;
>  };
>  
> +struct drm_mode_cursor2 {
> +     __u32 flags;
> +     __u32 crtc_id;
> +     __s32 x;
> +     __s32 y;
> +     __u32 width;
> +     __u32 height;
> +     /* driver specific handle */
> +     __u32 handle;
> +     __s32 hot_x;
> +     __s32 hot_y;
> +};
> +
>  struct drm_mode_crtc_lut {
>       __u32 crtc_id;
>       __u32 gamma_size;
> -- 
> 1.8.2.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

Reply via email to