Message ID | 1395188579-17191-10-git-send-email-matthew.d.roper@intel.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
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@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel
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;
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@intel.com> --- 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(-)