drm/virtio: skip set_scanout if framebuffer didn't change
authorGerd Hoffmann <kraxel@redhat.com>
Thu, 12 Dec 2019 12:53:44 +0000 (13:53 +0100)
committerGerd Hoffmann <kraxel@redhat.com>
Mon, 16 Dec 2019 11:39:50 +0000 (12:39 +0100)
v2: also check src rect (Chia-I Wu).

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20191212125346.8334-2-kraxel@redhat.com
drivers/gpu/drm/virtio/virtgpu_plane.c

index 947e65b..32de6bd 100644 (file)
@@ -151,20 +151,27 @@ static void virtio_gpu_primary_plane_update(struct drm_plane *plane,
        if (bo->dumb)
                virtio_gpu_update_dumb_bo(vgdev, bo, plane->state);
 
-       DRM_DEBUG("handle 0x%x, crtc %dx%d+%d+%d, src %dx%d+%d+%d\n",
-                 bo->hw_res_handle,
-                 plane->state->crtc_w, plane->state->crtc_h,
-                 plane->state->crtc_x, plane->state->crtc_y,
-                 plane->state->src_w >> 16,
-                 plane->state->src_h >> 16,
-                 plane->state->src_x >> 16,
-                 plane->state->src_y >> 16);
-       virtio_gpu_cmd_set_scanout(vgdev, output->index,
-                                  bo->hw_res_handle,
-                                  plane->state->src_w >> 16,
-                                  plane->state->src_h >> 16,
-                                  plane->state->src_x >> 16,
-                                  plane->state->src_y >> 16);
+       if (plane->state->fb != old_state->fb ||
+           plane->state->src_w != old_state->src_w ||
+           plane->state->src_h != old_state->src_h ||
+           plane->state->src_x != old_state->src_x ||
+           plane->state->src_y != old_state->src_y) {
+               DRM_DEBUG("handle 0x%x, crtc %dx%d+%d+%d, src %dx%d+%d+%d\n",
+                         bo->hw_res_handle,
+                         plane->state->crtc_w, plane->state->crtc_h,
+                         plane->state->crtc_x, plane->state->crtc_y,
+                         plane->state->src_w >> 16,
+                         plane->state->src_h >> 16,
+                         plane->state->src_x >> 16,
+                         plane->state->src_y >> 16);
+               virtio_gpu_cmd_set_scanout(vgdev, output->index,
+                                          bo->hw_res_handle,
+                                          plane->state->src_w >> 16,
+                                          plane->state->src_h >> 16,
+                                          plane->state->src_x >> 16,
+                                          plane->state->src_y >> 16);
+       }
+
        virtio_gpu_cmd_resource_flush(vgdev, bo->hw_res_handle,
                                      plane->state->src_x >> 16,
                                      plane->state->src_y >> 16,