]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
drm/virtio: implement blob resources: blob display integration
authorGurchetan Singh <gurchetansingh@chromium.org>
Thu, 24 Sep 2020 00:32:09 +0000 (17:32 -0700)
committerGerd Hoffmann <kraxel@redhat.com>
Tue, 29 Sep 2020 09:23:42 +0000 (11:23 +0200)
SCANOUT_BLOB forwards the DRM framebuffer metadata to the host. The
modifier is intentionally left out -- it may be possible to query
the host for that.

We also assume one blob resource per DRM framebuffer.  That too is
an intentional simplification.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Acked-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20200924003214.662-14-gurchetansingh@chromium.org
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
drivers/gpu/drm/virtio/virtgpu_plane.c

index 6a311cd934403914e87ae3b0b2acafcbe40c4032..42ac08ed1442ee4ad078a821143bf1bdb9b997ff 100644 (file)
@@ -174,12 +174,23 @@ static void virtio_gpu_primary_plane_update(struct drm_plane *plane,
                          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 (bo->host3d_blob || bo->guest_blob) {
+                       virtio_gpu_cmd_set_scanout_blob
+                                               (vgdev, output->index, bo,
+                                                plane->state->fb,
+                                                plane->state->src_w >> 16,
+                                                plane->state->src_h >> 16,
+                                                plane->state->src_x >> 16,
+                                                plane->state->src_y >> 16);
+               } else {
+                       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,