Re: [RFC] drm: add hint to userspace about whether a plane can scale

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/dri-devel




[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux