Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion drivers/gpu/drm/virtio/virtgpu_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,14 @@ static void virtio_gpu_crtc_atomic_disable(struct drm_crtc *crtc,
static void virtio_gpu_crtc_atomic_begin(struct drm_crtc *crtc,
struct drm_atomic_state *state)
{
struct virtio_gpu_output *output = NULL;
struct virtio_gpu_device *vgdev = crtc->dev->dev_private;
struct drm_device *drm = crtc->dev;
const unsigned pipe = drm_crtc_index(crtc);
struct drm_pending_vblank_event *old_e, *e = crtc->state->event;

output = drm_crtc_to_virtio_gpu_output(crtc);
output->primary_update = false;
if (!vgdev->has_vblank || !crtc->state->event)
return;

Expand Down Expand Up @@ -217,9 +220,20 @@ static void virtio_gpu_crtc_atomic_flush(struct drm_crtc *crtc,
struct drm_device *drm = crtc->dev;
struct virtio_gpu_device *vgdev = drm->dev_private;
const unsigned pipe = drm_crtc_index(crtc);
unsigned long irqflags;
struct drm_pending_vblank_event *e;

if(vgdev->has_multi_plane)
if(vgdev->has_multi_plane) {
virtio_gpu_resource_flush_sync(crtc);
} else {
if (vgdev->has_flip_sequence && !output->primary_update) {
virtio_gpu_cmd_set_scanout(vgdev, output->index, 0, 0, 0, 0, 0);
virtio_gpu_cmd_resource_flush(vgdev, 0, 0, 0,
0, 0, 0, 0);
virtio_gpu_notify(vgdev);
}
}
output->primary_update = false;

if(vgdev->has_scaling)
output->scaler_users = 0;
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/virtio/virtgpu_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ struct virtio_gpu_output {
uint64_t rotation[VIRTIO_GPU_MAX_PLANES];
unsigned scaler_users;
struct virtio_gpu_hdcp hdcp;
bool primary_update;
};
#define drm_crtc_to_virtio_gpu_output(x) \
container_of(x, struct virtio_gpu_output, crtc)
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/virtio/virtgpu_plane.c
Original file line number Diff line number Diff line change
Expand Up @@ -621,6 +621,7 @@ static void virtio_gpu_primary_plane_update(struct drm_plane *plane,
rect.y1,
rect.x2 - rect.x1,
rect.y2 - rect.y1);
output->primary_update = true;
}

static void virtio_gpu_cursor_plane_update(struct drm_plane *plane,
Expand Down
5 changes: 4 additions & 1 deletion drivers/gpu/drm/virtio/virtgpu_vq.c
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,10 @@ void virtio_gpu_cmd_resource_flush(struct virtio_gpu_device *vgdev,
cmd_p->r.x = cpu_to_le32(x);
cmd_p->r.y = cpu_to_le32(y);

virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, fence);
if (fence)
virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, fence);
else
virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
}

void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev,
Expand Down