diff mbox

[7/7] drm/vmwgfx: Cursor update fixes

Message ID 1516109674-10087-8-git-send-email-thellstrom@vmware.com (mailing list archive)
State New, archived
Headers show

Commit Message

Thomas Hellstrom Jan. 16, 2018, 1:34 p.m. UTC
Use drm_plane_helper_check_update also for the cursor plane.
Avoid uploading a new cursor image on each cursor move and
only upload cursor images on cursor fb changes, assuming that we're
in effect page-flipping the cursor, which is exactly what the
legacy helper does. Cursor front-buffer like rendering using atomic
still needs some kind of atomic damage interface.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 45 ++++++++++++++++++++++++-------------
 1 file changed, 30 insertions(+), 15 deletions(-)
diff mbox

Patch

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index 3f1ed51..34ee856 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -393,21 +393,24 @@  vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
 	du->cursor_surface = vps->surf;
 	du->cursor_dmabuf = vps->dmabuf;
 
-	/* setup new image */
-	if (vps->surf) {
-		du->cursor_age = du->cursor_surface->snooper.age;
-
-		ret = vmw_cursor_update_image(dev_priv,
-					      vps->surf->snooper.image,
-					      64, 64, hotspot_x, hotspot_y);
-	} else if (vps->dmabuf) {
-		ret = vmw_cursor_update_dmabuf(dev_priv, vps->dmabuf,
-					       plane->state->crtc_w,
-					       plane->state->crtc_h,
-					       hotspot_x, hotspot_y);
-	} else {
-		vmw_cursor_update_position(dev_priv, false, 0, 0);
-		return;
+	/* Do we have a new image? */
+	if (!old_state || !old_state->fb || plane->state->fb != old_state->fb) {
+		if (vps->surf) {
+			du->cursor_age = du->cursor_surface->snooper.age;
+
+			ret = vmw_cursor_update_image(dev_priv,
+						      vps->surf->snooper.image,
+						      64, 64, hotspot_x,
+						      hotspot_y);
+		} else if (vps->dmabuf) {
+			ret = vmw_cursor_update_dmabuf(dev_priv, vps->dmabuf,
+						       plane->state->crtc_w,
+						       plane->state->crtc_h,
+						       hotspot_x, hotspot_y);
+		} else {
+			vmw_cursor_update_position(dev_priv, false, 0, 0);
+			return;
+		}
 	}
 
 	if (!ret) {
@@ -503,11 +506,23 @@  int vmw_du_cursor_plane_atomic_check(struct drm_plane *plane,
 	struct vmw_surface *surface = NULL;
 	struct drm_framebuffer *fb = new_state->fb;
 
+	struct drm_rect src = drm_plane_state_src(new_state);
+	struct drm_rect dest = drm_plane_state_dest(new_state);
+	struct drm_rect clip = dest;
 
 	/* Turning off */
 	if (!fb)
 		return ret;
 
+	ret = drm_plane_helper_check_update(plane, new_state->crtc, fb,
+					    &src, &dest, &clip,
+					    DRM_MODE_ROTATE_0,
+					    DRM_PLANE_HELPER_NO_SCALING,
+					    DRM_PLANE_HELPER_NO_SCALING,
+					    true, true, &new_state->visible);
+	if (!ret)
+		return ret;
+
 	/* A lot of the code assumes this */
 	if (new_state->crtc_w != 64 || new_state->crtc_h != 64) {
 		DRM_ERROR("Invalid cursor dimensions (%d, %d)\n",