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;
default: return -EINVAL; }break;
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