Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1452785

[PATCH] drm: Don't prepare or cleanup unchanging frame buffers [v2]

From Keith Packard <keithp@keithp.com>
Newsgroups linux.kernel
Subject [PATCH] drm: Don't prepare or cleanup unchanging frame buffers [v2]
Date 2016-07-31 10:10 +0200
Message-ID <s0TYS-5XL-5@gated-at.bofh.it> (permalink)
Organization linux.* mail to news gateway

Show all headers | View 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

Back to linux.kernel | Previous | NextNext in thread | Find similar | Unroll thread


Thread

[PATCH] drm: Don't prepare or cleanup unchanging frame buffers [v2] Keith Packard <keithp@keithp.com> - 2016-07-31 10:10 +0200
  Re: [PATCH] drm: Don't prepare or cleanup unchanging frame buffers  [v2] kbuild test robot <lkp@intel.com> - 2016-07-31 11:30 +0200
  Re: [PATCH] drm: Don't prepare or cleanup unchanging frame buffers  [v2] Daniel Vetter <daniel@ffwll.ch> - 2016-08-02 16:10 +0200
    Re: [PATCH] drm: Don't prepare or cleanup unchanging frame buffers [v2] Keith Packard <keithp@keithp.com> - 2016-08-07 07:30 +0200
      Re: [PATCH] drm: Don't prepare or cleanup unchanging frame buffers  [v2] Daniel Vetter <daniel@ffwll.ch> - 2016-08-08 11:10 +0200
        Re: [PATCH] drm: Don't prepare or cleanup unchanging frame buffers [v2] Keith Packard <keithp@keithp.com> - 2016-08-08 17:20 +0200

csiph-web