[RFC] drm: add hint to userspace about whether a plane can scale
Brian Starkey
brian.starkey at arm.com
Fri Oct 21 08:58:45 UTC 2016
Hi Rob,
On Thu, Oct 20, 2016 at 04:17:14PM -0400, Rob Clark wrote:
>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.
Somewhat related to what Daniel mentioned on IRC about driver
consistency - how about making it "cannot_scale". This is then opt-in
for drivers, and should mean userspace can always trust it if it's
set.
i.e. if cannot_scale == false, userspace can give it a shot, but if
cannot_scale == true it should never bother.
Either way, even with a device-specific planner we would want this
hint to manage different HW versions so I'm in favour. But...
>---
> 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;
... 32 bits for a bool does seem a bit wasteful.
Thanks,
Brian
>+ __u32 pad;
> };
>
> struct drm_mode_get_plane_res {
>--
>2.7.4
>
>_______________________________________________
>dri-devel mailing list
>dri-devel at lists.freedesktop.org
>https://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list