[v1,3/3] drm/tegra: dc: Dedicate overlay plane to cursor on older Tegra's

Message ID f48200af36c3358d549fc451fbc754c2a37b0d47.1521075485.git.digetx@gmail.com
State New
Headers show
Series
  • [v1,1/3] drm/tegra: plane: Fix RGB565 plane format on older Tegra's
Related show

Commit Message

Dmitry Osipenko March 15, 2018, 1 a.m.
Older Tegra's do not support RGBA format for the cursor, but instead
overlay plane could be used for it. Since there is no much use for the
overlays on a regular desktop and HW-accelerated cursor is much better
than a SW cursor, let's dedicate one overlay plane to the mouse cursor.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
 drivers/gpu/drm/tegra/dc.c | 28 +++++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)

Comments

Thierry Reding March 15, 2018, 10:45 a.m. | #1
On Thu, Mar 15, 2018 at 04:00:25AM +0300, Dmitry Osipenko wrote:
> Older Tegra's do not support RGBA format for the cursor, but instead
> overlay plane could be used for it. Since there is no much use for the
> overlays on a regular desktop and HW-accelerated cursor is much better
> than a SW cursor, let's dedicate one overlay plane to the mouse cursor.
> 
> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
> ---
>  drivers/gpu/drm/tegra/dc.c | 28 +++++++++++++++++++++++-----
>  1 file changed, 23 insertions(+), 5 deletions(-)

Applied. I'm not entirely happy that we need to sacrifice one of the
overlay windows for this, but you're right, it's probably okay given
how little planes are used on a regular desktop.

We could always provide a module parameter to switch this on and off
if that's ever something we want.

Applied, thanks.

Thierry
Daniel Vetter March 16, 2018, 7:36 a.m. | #2
On Thu, Mar 15, 2018 at 11:45 AM, Thierry Reding
<thierry.reding@gmail.com> wrote:
> On Thu, Mar 15, 2018 at 04:00:25AM +0300, Dmitry Osipenko wrote:
>> Older Tegra's do not support RGBA format for the cursor, but instead
>> overlay plane could be used for it. Since there is no much use for the
>> overlays on a regular desktop and HW-accelerated cursor is much better
>> than a SW cursor, let's dedicate one overlay plane to the mouse cursor.
>>
>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
>> ---
>>  drivers/gpu/drm/tegra/dc.c | 28 +++++++++++++++++++++++-----
>>  1 file changed, 23 insertions(+), 5 deletions(-)
>
> Applied. I'm not entirely happy that we need to sacrifice one of the
> overlay windows for this, but you're right, it's probably okay given
> how little planes are used on a regular desktop.
>
> We could always provide a module parameter to switch this on and off
> if that's ever something we want.

The idea with universal planes is that you can (at least try to) use
the cursor overlay plane as a normal plane. It is only a hint to
userspace, there's no requirement anywhere in atomic that you only use
it as a cursor. That way desktops get a good hint for what the cursor
plane should be, everyone else can still use all the planes.
-Daniel
Dmitry Osipenko March 17, 2018, 3:22 p.m. | #3
On 16.03.2018 10:36, Daniel Vetter wrote:
> On Thu, Mar 15, 2018 at 11:45 AM, Thierry Reding
> <thierry.reding@gmail.com> wrote:
>> On Thu, Mar 15, 2018 at 04:00:25AM +0300, Dmitry Osipenko wrote:
>>> Older Tegra's do not support RGBA format for the cursor, but instead
>>> overlay plane could be used for it. Since there is no much use for the
>>> overlays on a regular desktop and HW-accelerated cursor is much better
>>> than a SW cursor, let's dedicate one overlay plane to the mouse cursor.
>>>
>>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
>>> ---
>>>  drivers/gpu/drm/tegra/dc.c | 28 +++++++++++++++++++++++-----
>>>  1 file changed, 23 insertions(+), 5 deletions(-)
>>
>> Applied. I'm not entirely happy that we need to sacrifice one of the
>> overlay windows for this, but you're right, it's probably okay given
>> how little planes are used on a regular desktop.
>>
>> We could always provide a module parameter to switch this on and off
>> if that's ever something we want.
> 
> The idea with universal planes is that you can (at least try to) use
> the cursor overlay plane as a normal plane. It is only a hint to
> userspace, there's no requirement anywhere in atomic that you only use
> it as a cursor. That way desktops get a good hint for what the cursor
> plane should be, everyone else can still use all the planes.

Indeed, thank you for pointing at it. That is a nice feature.
--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c
index 22bf513612d1..e4d567ec07cc 100644
--- a/drivers/gpu/drm/tegra/dc.c
+++ b/drivers/gpu/drm/tegra/dc.c
@@ -857,9 +857,11 @@  static const u32 tegra124_overlay_formats[] = {
 
 static struct drm_plane *tegra_dc_overlay_plane_create(struct drm_device *drm,
 						       struct tegra_dc *dc,
-						       unsigned int index)
+						       unsigned int index,
+						       bool cursor)
 {
 	unsigned long possible_crtcs = tegra_plane_get_possible_crtcs(drm);
+	enum drm_plane_type type = DRM_PLANE_TYPE_OVERLAY;
 	struct tegra_plane *plane;
 	unsigned int num_formats;
 	const u32 *formats;
@@ -876,10 +878,12 @@  static struct drm_plane *tegra_dc_overlay_plane_create(struct drm_device *drm,
 	num_formats = dc->soc->num_overlay_formats;
 	formats = dc->soc->overlay_formats;
 
+	if (cursor)
+		type = DRM_PLANE_TYPE_CURSOR;
+
 	err = drm_universal_plane_init(drm, &plane->base, possible_crtcs,
 				       &tegra_plane_funcs, formats,
-				       num_formats, NULL,
-				       DRM_PLANE_TYPE_OVERLAY, NULL);
+				       num_formats, NULL, type, NULL);
 	if (err < 0) {
 		kfree(plane);
 		return ERR_PTR(err);
@@ -931,6 +935,7 @@  static struct drm_plane *tegra_dc_add_planes(struct drm_device *drm,
 					     struct tegra_dc *dc)
 {
 	struct drm_plane *planes[2], *primary;
+	unsigned int planes_num;
 	unsigned int i;
 	int err;
 
@@ -938,8 +943,14 @@  static struct drm_plane *tegra_dc_add_planes(struct drm_device *drm,
 	if (IS_ERR(primary))
 		return primary;
 
-	for (i = 0; i < 2; i++) {
-		planes[i] = tegra_dc_overlay_plane_create(drm, dc, 1 + i);
+	if (dc->soc->supports_cursor)
+		planes_num = 2;
+	else
+		planes_num = 1;
+
+	for (i = 0; i < planes_num; i++) {
+		planes[i] = tegra_dc_overlay_plane_create(drm, dc, 1 + i,
+							  false);
 		if (IS_ERR(planes[i])) {
 			err = PTR_ERR(planes[i]);
 
@@ -1857,6 +1868,13 @@  static int tegra_dc_init(struct host1x_client *client)
 			err = PTR_ERR(cursor);
 			goto cleanup;
 		}
+	} else {
+		/* dedicate one overlay to mouse cursor */
+		cursor = tegra_dc_overlay_plane_create(drm, dc, 2, true);
+		if (IS_ERR(cursor)) {
+			err = PTR_ERR(cursor);
+			goto cleanup;
+		}
 	}
 
 	err = drm_crtc_init_with_planes(drm, &dc->base, primary, cursor,