From: "Kasireddy, Vivek" <vivek.kasireddy@intel.com>
To: "Kim, Dongwon" <dongwon.kim@intel.com>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Cc: "Kim, Dongwon" <dongwon.kim@intel.com>
Subject: RE: [PATCH 1/2] virtio-gpu: splitting one extended mode guest fb into n-scanouts
Date: Mon, 19 Jul 2021 06:17:00 +0000 [thread overview]
Message-ID: <a9fa7822fab743d3b391e8b928639f3c@intel.com> (raw)
In-Reply-To: <20210706235255.7575-1-dongwon.kim@intel.com>
Hi DW,
> When guest is running Linux/X11 with extended multiple displays mode enabled,
> the guest shares one scanout resource each time containing whole surface
> rather than sharing individual display output separately. This extended frame
> is properly splited and rendered on the corresponding scanout surfaces but
> not in case of blob-resource (zero copy).
>
> This code change lets the qemu split this one large surface data into multiple
> in case of blob-resource as well so that each sub frame then can be blitted
> properly to each scanout.
>
> Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
> ---
> hw/display/virtio-gpu-udmabuf.c | 19 +++++++++++--------
> hw/display/virtio-gpu.c | 5 +++--
> include/hw/virtio/virtio-gpu.h | 5 +++--
> include/ui/console.h | 4 ++++
> stubs/virtio-gpu-udmabuf.c | 3 ++-
> 5 files changed, 23 insertions(+), 13 deletions(-)
>
> diff --git a/hw/display/virtio-gpu-udmabuf.c b/hw/display/virtio-gpu-udmabuf.c
> index 3c01a415e7..a64194c6de 100644
> --- a/hw/display/virtio-gpu-udmabuf.c
> +++ b/hw/display/virtio-gpu-udmabuf.c
> @@ -171,7 +171,8 @@ static VGPUDMABuf
> *virtio_gpu_create_dmabuf(VirtIOGPU *g,
> uint32_t scanout_id,
> struct virtio_gpu_simple_resource *res,
> - struct virtio_gpu_framebuffer *fb)
> + struct virtio_gpu_framebuffer *fb,
> + struct virtio_gpu_rect *r)
> {
> VGPUDMABuf *dmabuf;
>
> @@ -183,6 +184,10 @@ static VGPUDMABuf
> dmabuf->buf.width = fb->width;
> dmabuf->buf.height = fb->height;
> dmabuf->buf.stride = fb->stride;
> + dmabuf->buf.x = r->x;
> + dmabuf->buf.y = r->y;
> + dmabuf->buf.scanout_width;
> + dmabuf->buf.scanout_height;
[Kasireddy, Vivek] Would you not be able to use buf.width and buf.height?
What is the difference between these and scanout_width/height?
> dmabuf->buf.fourcc = qemu_pixman_to_drm_format(fb->format);
> dmabuf->buf.fd = res->dmabuf_fd;
>
> @@ -195,24 +200,22 @@ static VGPUDMABuf
> int virtio_gpu_update_dmabuf(VirtIOGPU *g,
> uint32_t scanout_id,
> struct virtio_gpu_simple_resource *res,
> - struct virtio_gpu_framebuffer *fb)
> + struct virtio_gpu_framebuffer *fb,
> + struct virtio_gpu_rect *r)
> {
> struct virtio_gpu_scanout *scanout = &g->parent_obj.scanout[scanout_id];
> VGPUDMABuf *new_primary, *old_primary = NULL;
>
> - new_primary = virtio_gpu_create_dmabuf(g, scanout_id, res, fb);
> + new_primary = virtio_gpu_create_dmabuf(g, scanout_id, res, fb, r);
> if (!new_primary) {
> return -EINVAL;
> }
>
> if (g->dmabuf.primary) {
> - old_primary = g->dmabuf.primary;
> + old_primary = g->dmabuf.primary[scanout_id];
> }
>
> - g->dmabuf.primary = new_primary;
> - qemu_console_resize(scanout->con,
> - new_primary->buf.width,
> - new_primary->buf.height);
> + g->dmabuf.primary[scanout_id] = new_primary;
> dpy_gl_scanout_dmabuf(scanout->con, &new_primary->buf);
>
> if (old_primary) {
> diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
> index e183f4ecda..11a87dad79 100644
> --- a/hw/display/virtio-gpu.c
> +++ b/hw/display/virtio-gpu.c
> @@ -523,9 +523,9 @@ static void virtio_gpu_resource_flush(VirtIOGPU *g,
> console_has_gl(scanout->con)) {
> dpy_gl_update(scanout->con, 0, 0, scanout->width,
[Kasireddy, Vivek] Unrelated to your change but shouldn't 0,0 be replaced with
scanout->x and scanout->y?
> scanout->height);
> - return;
> }
> }
> + return;
> }
>
> if (!res->blob &&
> @@ -598,6 +598,7 @@ static void virtio_gpu_update_scanout(VirtIOGPU *g,
> scanout->y = r->y;
> scanout->width = r->width;
> scanout->height = r->height;
> + qemu_console_resize(scanout->con, scanout->width, scanout->height);
[Kasireddy, Vivek] IIRC, there was no qemu_console_resize for the non-blob resources case.
Moving this call to update_scanout means that it will also be called for non-blob resources
Path; not sure if this is OK but you might want restrict this call to only blob.
> }
>
> static void virtio_gpu_do_set_scanout(VirtIOGPU *g,
> @@ -633,7 +634,7 @@ static void virtio_gpu_do_set_scanout(VirtIOGPU *g,
>
> if (res->blob) {
> if (console_has_gl(scanout->con)) {
> - if (!virtio_gpu_update_dmabuf(g, scanout_id, res, fb)) {
> + if (!virtio_gpu_update_dmabuf(g, scanout_id, res, fb, r)) {
[Kasireddy, Vivek] Instead of passing the rectangle "r", you might want to consider using
the scanout object which is specific to each scanout and can be easily retried by:
scanout = &g->parent_obj.scanout[scanout_id];
Thanks,
Vivek
> virtio_gpu_update_scanout(g, scanout_id, res, r);
> return;
> }
> diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
> index bcf54d970f..6372f4bbb5 100644
> --- a/include/hw/virtio/virtio-gpu.h
> +++ b/include/hw/virtio/virtio-gpu.h
> @@ -187,7 +187,7 @@ struct VirtIOGPU {
>
> struct {
> QTAILQ_HEAD(, VGPUDMABuf) bufs;
> - VGPUDMABuf *primary;
> + VGPUDMABuf *primary[VIRTIO_GPU_MAX_SCANOUTS];
> } dmabuf;
> };
>
> @@ -273,7 +273,8 @@ void virtio_gpu_fini_udmabuf(struct virtio_gpu_simple_resource
> *res);
> int virtio_gpu_update_dmabuf(VirtIOGPU *g,
> uint32_t scanout_id,
> struct virtio_gpu_simple_resource *res,
> - struct virtio_gpu_framebuffer *fb);
> + struct virtio_gpu_framebuffer *fb,
> + struct virtio_gpu_rect *r);
>
> /* virtio-gpu-3d.c */
> void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,
> diff --git a/include/ui/console.h b/include/ui/console.h
> index b30b63976a..87316aef83 100644
> --- a/include/ui/console.h
> +++ b/include/ui/console.h
> @@ -167,6 +167,10 @@ typedef struct QemuDmaBuf {
> uint32_t fourcc;
> uint64_t modifier;
> uint32_t texture;
> + uint32_t x;
> + uint32_t y;
> + uint32_t scanout_width;
> + uint32_t scanout_height;
> bool y0_top;
> } QemuDmaBuf;
>
> diff --git a/stubs/virtio-gpu-udmabuf.c b/stubs/virtio-gpu-udmabuf.c
> index 81f661441a..f692e13510 100644
> --- a/stubs/virtio-gpu-udmabuf.c
> +++ b/stubs/virtio-gpu-udmabuf.c
> @@ -20,7 +20,8 @@ void virtio_gpu_fini_udmabuf(struct virtio_gpu_simple_resource
> *res)
> int virtio_gpu_update_dmabuf(VirtIOGPU *g,
> uint32_t scanout_id,
> struct virtio_gpu_simple_resource *res,
> - struct virtio_gpu_framebuffer *fb)
> + struct virtio_gpu_framebuffer *fb,
> + struct virtio_gpu_rect *r)
> {
> /* nothing (stub) */
> return 0;
> --
> 2.17.1
>
next prev parent reply other threads:[~2021-07-19 6:17 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-06 23:52 [PATCH 1/2] virtio-gpu: splitting one extended mode guest fb into n-scanouts Dongwon Kim
2021-07-06 23:52 ` [PATCH 2/2] ui/gtk-egl: blitting partial guest fb to the proper scanout surface Dongwon Kim
2021-07-19 6:35 ` Kasireddy, Vivek
2021-07-20 23:29 ` Dongwon Kim
2021-07-19 6:17 ` Kasireddy, Vivek [this message]
2021-07-20 23:23 ` [PATCH 1/2] virtio-gpu: splitting one extended mode guest fb into n-scanouts Dongwon Kim
2021-07-26 21:59 ` [PATCH v2 " Dongwon Kim
2021-07-26 21:59 ` [PATCH v2 2/2] ui/gtk-egl: blitting partial guest fb to the proper scanout surface Dongwon Kim
2021-11-02 13:51 ` [PATCH v2 1/2] virtio-gpu: splitting one extended mode guest fb into n-scanouts Gerd Hoffmann
2021-11-03 0:41 ` Dongwon Kim
2021-11-03 5:39 ` Gerd Hoffmann
2021-11-04 6:51 ` [PATCH v2 1/6] ui/gtk-egl: un-tab and re-tab should destroy egl surface and context Dongwon Kim
2021-11-04 6:51 ` [PATCH 2/6] ui/gtk-egl: make sure the right context is set as the current Dongwon Kim
2021-11-04 6:51 ` [PATCH v2 3/6] ui/gtk-egl: guest fb texture needs to be regenerated when reinitializing egl Dongwon Kim
2021-11-04 6:51 ` [PATCH 4/6] ui/gtk: gd_draw_event returns FALSE when no cairo surface is bound Dongwon Kim
2021-11-04 6:51 ` [PATCH v3 5/6] virtio-gpu: splitting one extended mode guest fb into n-scanouts Dongwon Kim
2021-11-04 6:51 ` [PATCH v2 6/6] ui/gtk-egl: blitting partial guest fb to the proper scanout surface Dongwon Kim
2021-11-04 7:19 ` [PATCH v2 1/2] virtio-gpu: splitting one extended mode guest fb into n-scanouts Dongwon Kim
2021-11-04 9:30 ` Gerd Hoffmann
2021-09-17 18:16 [PATCH " Dongwon Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a9fa7822fab743d3b391e8b928639f3c@intel.com \
--to=vivek.kasireddy@intel.com \
--cc=dongwon.kim@intel.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).