Pick up the correct source rectangle from framebuffer. Without this multihead setups are not working correctly. Signed-off-by: Gerd Hoffmann <kraxel at redhat.com> --- drivers/gpu/drm/virtio/virtgpu_plane.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c index b7778a7..925ca25 100644 --- a/drivers/gpu/drm/virtio/virtgpu_plane.c +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c @@ -85,27 +85,32 @@ static void virtio_gpu_primary_plane_update(struct drm_plane *plane, if (bo->dumb) { virtio_gpu_cmd_transfer_to_host_2d (vgdev, handle, 0, - cpu_to_le32(plane->state->crtc_w), - cpu_to_le32(plane->state->crtc_h), - plane->state->crtc_x, plane->state->crtc_y, NULL); + cpu_to_le32(plane->state->src_w >> 16), + cpu_to_le32(plane->state->src_h >> 16), + plane->state->src_x >> 16, + plane->state->src_y >> 16, NULL); } } else { handle = 0; } - DRM_DEBUG("handle 0x%x, crtc %dx%d+%d+%d\n", handle, + DRM_DEBUG("handle 0x%x, crtc %dx%d+%d+%d, src %dx%d+%d+%d\n", handle, plane->state->crtc_w, plane->state->crtc_h, - plane->state->crtc_x, plane->state->crtc_y); + 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, 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_resource_flush(vgdev, handle, - plane->state->crtc_x, - plane->state->crtc_y, - plane->state->crtc_w, - plane->state->crtc_h); + plane->state->src_x >> 16, + plane->state->src_y >> 16, + plane->state->src_w >> 16, + plane->state->src_h >> 16); } static void virtio_gpu_cursor_plane_update(struct drm_plane *plane, -- 1.8.3.1
Hi On Tue, May 31, 2016 at 2:52 PM, Gerd Hoffmann <kraxel at redhat.com> wrote:> Pick up the correct source rectangle from framebuffer. > Without this multihead setups are not working correctly. > > Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>Reviewed-by: Marc-Andr? Lureau <marcandre.lureau at redhat.com> Additionally, I had to modify the page_flip() function to take the plane source coordinates for virgl/3d multihead to work. Feel free to squash. --- a/drivers/gpu/drm/virtio/virtgpu_display.c +++ b/drivers/gpu/drm/virtio/virtgpu_display.c @@ -68,11 +68,16 @@ static int virtio_gpu_page_flip(struct drm_crtc *crtc, 0, 0, NULL); } virtio_gpu_cmd_set_scanout(vgdev, output->index, handle, - crtc->mode.hdisplay, - crtc->mode.vdisplay, 0, 0); - virtio_gpu_cmd_resource_flush(vgdev, handle, 0, 0, - crtc->mode.hdisplay, - crtc->mode.vdisplay); + 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, handle, + plane->state->src_x >> 16, + plane->state->src_y >> 16, + plane->state->src_w >> 16, + plane->state->src_h);> --- > drivers/gpu/drm/virtio/virtgpu_plane.c | 31 ++++++++++++++++++------------- > 1 file changed, 18 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c > index b7778a7..925ca25 100644 > --- a/drivers/gpu/drm/virtio/virtgpu_plane.c > +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c > @@ -85,27 +85,32 @@ static void virtio_gpu_primary_plane_update(struct drm_plane *plane, > if (bo->dumb) { > virtio_gpu_cmd_transfer_to_host_2d > (vgdev, handle, 0, > - cpu_to_le32(plane->state->crtc_w), > - cpu_to_le32(plane->state->crtc_h), > - plane->state->crtc_x, plane->state->crtc_y, NULL); > + cpu_to_le32(plane->state->src_w >> 16), > + cpu_to_le32(plane->state->src_h >> 16), > + plane->state->src_x >> 16, > + plane->state->src_y >> 16, NULL); > } > } else { > handle = 0; > } > > - DRM_DEBUG("handle 0x%x, crtc %dx%d+%d+%d\n", handle, > + DRM_DEBUG("handle 0x%x, crtc %dx%d+%d+%d, src %dx%d+%d+%d\n", handle, > plane->state->crtc_w, plane->state->crtc_h, > - plane->state->crtc_x, plane->state->crtc_y); > + 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, 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_resource_flush(vgdev, handle, > - plane->state->crtc_x, > - plane->state->crtc_y, > - plane->state->crtc_w, > - plane->state->crtc_h); > + plane->state->src_x >> 16, > + plane->state->src_y >> 16, > + plane->state->src_w >> 16, > + plane->state->src_h >> 16); > } > > static void virtio_gpu_cursor_plane_update(struct drm_plane *plane, > -- > 1.8.3.1 >-- Marc-Andr? Lureau
On Di, 2016-06-14 at 12:13 +0200, Marc-Andr? Lureau wrote:> Hi > > On Tue, May 31, 2016 at 2:52 PM, Gerd Hoffmann <kraxel at redhat.com> wrote: > > Pick up the correct source rectangle from framebuffer. > > Without this multihead setups are not working correctly. > > > > Signed-off-by: Gerd Hoffmann <kraxel at redhat.com> > > Reviewed-by: Marc-Andr? Lureau <marcandre.lureau at redhat.com> > > Additionally, I had to modify the page_flip() function to take the > plane source coordinates for virgl/3d multihead to work. Feel free to > squash.This is in progress of being sorted, by dropping the virtio_gpu_page_flip function altogether in favor of atomic helpers, which will use the (already fixed) plane callbacks instead. See nonblocking commit support patches by Daniel Vetter on this list. cheers, Gerd
Reasonably Related Threads
- [PATCH] virtio-gpu: use src not crtc
- [PATCH] virtio-gpu: use src not crtc
- [PATCH 1/3] drm/virtio: skip set_scanout if framebuffer didn't change
- [PATCH v2 1/3] drm/virtio: skip set_scanout if framebuffer didn't change
- [PATCH 4/5] drm/virtio: Simplify virtio_gpu_primary_plane_update workflow.