[RFCv3 09/14] drm: Allow userspace to ask for full plane list (universal planes)
Daniel Vetter
daniel at ffwll.ch
Wed Mar 19 07:27:21 PDT 2014
On Tue, Mar 18, 2014 at 05:22:54PM -0700, Matt Roper wrote:
> Userspace clients which wish to receive all DRM planes (primary and
> cursor planes in addition to the traditional overlay planes) may set the
> DRM_CLIENT_CAP_UNIVERSAL_PLANES capability.
>
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
I don't see any issues with merging the primary plane stuff early, but I
think we should hold off a bit with exposing all this to userspace, at
least by default. I think we should have the cursor plane issues all
resolved and at least the userspace tests in decent shape before we throw
the big switch here.
-Daniel
> ---
> drivers/gpu/drm/drm_crtc.c | 20 +++++++++++++++-----
> drivers/gpu/drm/drm_ioctl.c | 5 +++++
> include/drm/drmP.h | 5 +++++
> include/uapi/drm/drm.h | 8 ++++++++
> 4 files changed, 33 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 0c395e8..fb8e493 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -2160,6 +2160,7 @@ int drm_mode_getplane_res(struct drm_device *dev, void *data,
> struct drm_plane *plane;
> uint32_t __user *plane_ptr;
> int copied = 0, ret = 0;
> + unsigned num_planes;
>
> if (!drm_core_check_feature(dev, DRIVER_MODESET))
> return -EINVAL;
> @@ -2167,17 +2168,26 @@ int drm_mode_getplane_res(struct drm_device *dev, void *data,
> drm_modeset_lock_all(dev);
> config = &dev->mode_config;
>
> + if (file_priv->universal_planes)
> + num_planes = config->num_total_plane;
> + else
> + num_planes = config->num_overlay_plane;
> +
> /*
> * This ioctl is called twice, once to determine how much space is
> * needed, and the 2nd time to fill it.
> */
> - if (config->num_overlay_plane &&
> - (plane_resp->count_planes >= config->num_overlay_plane)) {
> + if (num_planes &&
> + (plane_resp->count_planes >= num_planes)) {
> plane_ptr = (uint32_t __user *)(unsigned long)plane_resp->plane_id_ptr;
>
> list_for_each_entry(plane, &config->plane_list, head) {
> - /* Only advertise overlays to userspace for now. */
> - if (plane->type != DRM_PLANE_TYPE_OVERLAY)
> + /*
> + * Unless userspace set the 'universal planes'
> + * capability bit, only advertise overlays.
> + */
> + if (plane->type != DRM_PLANE_TYPE_OVERLAY &&
> + !file_priv->universal_planes)
> continue;
>
> if (put_user(plane->base.id, plane_ptr + copied)) {
> @@ -2187,7 +2197,7 @@ int drm_mode_getplane_res(struct drm_device *dev, void *data,
> copied++;
> }
> }
> - plane_resp->count_planes = config->num_overlay_plane;
> + plane_resp->count_planes = num_planes;
>
> out:
> drm_modeset_unlock_all(dev);
> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
> index f4dc9b7..5eb92b6 100644
> --- a/drivers/gpu/drm/drm_ioctl.c
> +++ b/drivers/gpu/drm/drm_ioctl.c
> @@ -328,6 +328,11 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
> return -EINVAL;
> file_priv->stereo_allowed = req->value;
> break;
> + case DRM_CLIENT_CAP_UNIVERSAL_PLANES:
> + if (req->value > 1)
> + return -EINVAL;
> + file_priv->universal_planes = req->value;
> + break;
> default:
> return -EINVAL;
> }
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 3857450..1106297 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -438,6 +438,11 @@ struct drm_file {
> unsigned is_master :1; /* this file private is a master for a minor */
> /* true when the client has asked us to expose stereo 3D mode flags */
> unsigned stereo_allowed :1;
> + /*
> + * true if client understands CRTC primary planes and cursor planes
> + * in the plane list
> + */
> + unsigned universal_planes:1;
>
> struct pid *pid;
> kuid_t uid;
> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
> index b06c8ed..6e4952b 100644
> --- a/include/uapi/drm/drm.h
> +++ b/include/uapi/drm/drm.h
> @@ -637,6 +637,14 @@ struct drm_get_cap {
> */
> #define DRM_CLIENT_CAP_STEREO_3D 1
>
> +/**
> + * DRM_CLIENT_CAP_UNIVERSAL_PLANES
> + *
> + * If set to 1, the DRM core will expose all planes (overlay, primary, and
> + * cursor) to userspace.
> + */
> +#define DRM_CLIENT_CAP_UNIVERSAL_PLANES 2
> +
> /** DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
> struct drm_set_client_cap {
> __u64 capability;
> --
> 1.8.5.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