drm/virtio: Add the fence in resource_flush if present
If the framebuffer associated with the plane contains a fence, then it is added to resource_flush and will be waited upon for a max of 50 msecs or until it is signalled by the Host. Cc: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20210610232456.671905-4-vivek.kasireddy@intel.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
56934baef4
commit
5c68ab9276
|
@ -129,6 +129,40 @@ static void virtio_gpu_update_dumb_bo(struct virtio_gpu_device *vgdev,
|
|||
objs, NULL);
|
||||
}
|
||||
|
||||
static void virtio_gpu_resource_flush(struct drm_plane *plane,
|
||||
uint32_t x, uint32_t y,
|
||||
uint32_t width, uint32_t height)
|
||||
{
|
||||
struct drm_device *dev = plane->dev;
|
||||
struct virtio_gpu_device *vgdev = dev->dev_private;
|
||||
struct virtio_gpu_framebuffer *vgfb;
|
||||
struct virtio_gpu_object *bo;
|
||||
|
||||
vgfb = to_virtio_gpu_framebuffer(plane->state->fb);
|
||||
bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]);
|
||||
if (vgfb->fence) {
|
||||
struct virtio_gpu_object_array *objs;
|
||||
|
||||
objs = virtio_gpu_array_alloc(1);
|
||||
if (!objs)
|
||||
return;
|
||||
virtio_gpu_array_add_obj(objs, vgfb->base.obj[0]);
|
||||
virtio_gpu_array_lock_resv(objs);
|
||||
virtio_gpu_cmd_resource_flush(vgdev, bo->hw_res_handle, x, y,
|
||||
width, height, objs, vgfb->fence);
|
||||
virtio_gpu_notify(vgdev);
|
||||
|
||||
dma_fence_wait_timeout(&vgfb->fence->f, true,
|
||||
msecs_to_jiffies(50));
|
||||
dma_fence_put(&vgfb->fence->f);
|
||||
vgfb->fence = NULL;
|
||||
} else {
|
||||
virtio_gpu_cmd_resource_flush(vgdev, bo->hw_res_handle, x, y,
|
||||
width, height, NULL, NULL);
|
||||
virtio_gpu_notify(vgdev);
|
||||
}
|
||||
}
|
||||
|
||||
static void virtio_gpu_primary_plane_update(struct drm_plane *plane,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
|
@ -198,12 +232,11 @@ static void virtio_gpu_primary_plane_update(struct drm_plane *plane,
|
|||
}
|
||||
}
|
||||
|
||||
virtio_gpu_cmd_resource_flush(vgdev, bo->hw_res_handle,
|
||||
rect.x1,
|
||||
rect.y1,
|
||||
rect.x2 - rect.x1,
|
||||
rect.y2 - rect.y1);
|
||||
virtio_gpu_notify(vgdev);
|
||||
virtio_gpu_resource_flush(plane,
|
||||
rect.x1,
|
||||
rect.y1,
|
||||
rect.x2 - rect.x1,
|
||||
rect.y2 - rect.y1);
|
||||
}
|
||||
|
||||
static int virtio_gpu_plane_prepare_fb(struct drm_plane *plane,
|
||||
|
|
Loading…
Reference in New Issue