[PATCH 1/2] drm: add hotspot support for cursors.

Daniel Vetter daniel at ffwll.ch
Mon Jun 24 00:22:38 PDT 2013


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


More information about the dri-devel mailing list