When you have a mix of planes that can scale and those that cannot
scale, userspace really wants to have some hint to know which planes
can definitely not scale so it knows to assign them to unscaled layers.
I don't think it is fully possible to describe scaling constraints in
a generic way, so I don't think it is even worth trying, so this is
not a substitute for atomic TESTONLY step, but it does reduce the
search-space for userspace.  In the common case, most layers will not
be scaled so knowing the best planes to pick for those layers is
useful.
---
 drivers/gpu/drm/drm_crtc.c                | 1 +
 drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 1 +
 include/drm/drm_crtc.h                    | 2 ++
 include/uapi/drm/drm_mode.h               | 3 +++
 4 files changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index b4b973f..d7e0e0d 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -2389,6 +2389,7 @@ int drm_mode_getplane(struct drm_device *dev, void *data,
        plane_resp->plane_id = plane->base.id;
        plane_resp->possible_crtcs = plane->possible_crtcs;
        plane_resp->gamma_size = 0;
+       plane_resp->can_scale = plane->can_scale;

        /*
         * This ioctl is called twice, once to determine how much space is
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c 
b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
index 692c888..2061c83 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
@@ -908,6 +908,7 @@ struct drm_plane *mdp5_plane_init(struct drm_device *dev,
        mdp5_plane->pipe = pipe;
        mdp5_plane->name = pipe2name(pipe);
        mdp5_plane->caps = caps;
+       plane->can_scale = !!(caps & MDP_PIPE_CAP_SCALE);

        mdp5_plane->nformats = mdp_get_formats(mdp5_plane->formats,
                ARRAY_SIZE(mdp5_plane->formats),
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index d74d47a..6e290b6 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1679,6 +1679,7 @@ enum drm_plane_type {
  * @format_types: array of formats supported by this plane
  * @format_count: number of formats supported
  * @format_default: driver hasn't supplied supported formats for the plane
+ * @can_scale: a hint to userspace that this plane can (or cannot) scale
  * @crtc: currently bound CRTC
  * @fb: currently bound fb
  * @old_fb: Temporary tracking of the old fb while a modeset is ongoing. Used 
by
@@ -1710,6 +1711,7 @@ struct drm_plane {
        uint32_t *format_types;
        unsigned int format_count;
        bool format_default;
+       bool can_scale;

        struct drm_crtc *crtc;
        struct drm_framebuffer *fb;
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index ce71ad5..5bf9361 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -191,6 +191,9 @@ struct drm_mode_get_plane {

        __u32 count_format_types;
        __u64 format_type_ptr;
+
+       __u32 can_scale;
+       __u32 pad;
 };

 struct drm_mode_get_plane_res {
-- 
2.7.4

Reply via email to