From: Keith Packard <keithp@keithp.com>
To: linux-kernel@vger.kernel.org
Cc: Keith Packard <keithp@keithp.com>,
dri-devel@lists.freedesktop.org, David Airlie <airlied@linux.ie>
Subject: [PATCH] drm: Don't prepare or cleanup unchanging frame buffers [v2]
Date: Sun, 31 Jul 2016 01:08:54 -0700 [thread overview]
Message-ID: <1469952534-6516-1-git-send-email-keithp@keithp.com> (raw)
When reconfiguring a plane position (as in moving the cursor), the
frame buffer for the cursor isn't changing, so don't call the prepare
or cleanup driver functions.
This avoids making cursor position updates block on all pending rendering.
v2: Track which planes have been prepared to know which to
cleanup. Otherwise, failure paths and success paths would need
different tests in the cleanup code as the plane state points to
different places in the two cases.
cc: dri-devel@lists.freedesktop.org
cc: David Airlie <airlied@linux.ie>
Signed-off-by: Keith Packard <keithp@keithp.com>
---
drivers/gpu/drm/drm_atomic_helper.c | 23 +++++++++++++----------
include/drm/drm_crtc.h | 1 +
2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index ddfa0d1..f7f3a51 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -1246,18 +1246,20 @@ EXPORT_SYMBOL(drm_atomic_helper_commit);
* Returns:
* 0 on success, negative error code on failure.
*/
+
int drm_atomic_helper_prepare_planes(struct drm_device *dev,
struct drm_atomic_state *state)
{
- int nplanes = dev->mode_config.num_total_plane;
+ struct drm_plane *plane;
+ struct drm_plane_state *plane_state;
int ret, i;
- for (i = 0; i < nplanes; i++) {
+ for_each_plane_in_state(state, plane, plane_state, i) {
const struct drm_plane_helper_funcs *funcs;
- struct drm_plane *plane = state->planes[i];
- struct drm_plane_state *plane_state = state->plane_states[i];
- if (!plane)
+ plane->prepared = false;
+
+ if (plane->state->fb == plane_state->fb)
continue;
funcs = plane->helper_private;
@@ -1267,24 +1269,22 @@ int drm_atomic_helper_prepare_planes(struct drm_device *dev,
if (ret)
goto fail;
}
+ plane->prepared = true;
}
return 0;
fail:
- for (i--; i >= 0; i--) {
+ for_each_plane_in_state(state, plane, plane_state, i) {
const struct drm_plane_helper_funcs *funcs;
- struct drm_plane *plane = state->planes[i];
- struct drm_plane_state *plane_state = state->plane_states[i];
- if (!plane)
+ if (!plane->prepared)
continue;
funcs = plane->helper_private;
if (funcs->cleanup_fb)
funcs->cleanup_fb(plane, plane_state);
-
}
return ret;
@@ -1527,6 +1527,9 @@ void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
for_each_plane_in_state(old_state, plane, plane_state, i) {
const struct drm_plane_helper_funcs *funcs;
+ if (!plane->prepared)
+ continue;
+
funcs = plane->helper_private;
if (funcs->cleanup_fb)
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index d1559cd..08b2033 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1531,6 +1531,7 @@ struct drm_plane {
uint32_t *format_types;
unsigned int format_count;
bool format_default;
+ bool prepared;
struct drm_crtc *crtc;
struct drm_framebuffer *fb;
--
2.8.1
next reply other threads:[~2016-07-31 8:09 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-31 8:08 Keith Packard [this message]
2016-07-31 9:20 ` [PATCH] drm: Don't prepare or cleanup unchanging frame buffers [v2] kbuild test robot
2016-08-02 13:54 ` Daniel Vetter
2016-08-07 5:26 ` Keith Packard
2016-08-08 9:00 ` Daniel Vetter
2016-08-08 15:17 ` Keith Packard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1469952534-6516-1-git-send-email-keithp@keithp.com \
--to=keithp@keithp.com \
--cc=airlied@linux.ie \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).