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
Apparently Analagous Threads
- [PATCH] virtio-gpu: use src not crtc
- [PATCH 1/3] drm/virtio: skip set_scanout if framebuffer didn't change
- [PATCH 0/4] Overlay / format improvements
- [RFC PATCH 0/3] drm/nouveau/dispnv04 overlay and primary fb format fixes
- [PATCH 1/5] drm/nv10/plane: fix format computation