hw/display/virtio-gpu.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
From: Dongwon Kim <dongwon.kim@intel.com>
The guest surface needs to be updated with a blob scanout after resumed
from saved vm state if blob is enabled.
v2: Rebased
Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Cc: Vivek Kasireddy <vivek.kasireddy@intel.com>
Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
---
hw/display/virtio-gpu.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 1c1ee230b3..01bc4f9565 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -1422,16 +1422,23 @@ static int virtio_gpu_post_load(void *opaque, int version_id)
if (!res) {
return -EINVAL;
}
- scanout->ds = qemu_create_displaysurface_pixman(res->image);
- if (!scanout->ds) {
- return -EINVAL;
- }
+
+ if (res->blob_size) {
+ assert(g->dmabuf.primary[i] != NULL);
+ g->dmabuf.primary[i]->buf.fd = res->dmabuf_fd;
+ dpy_gl_scanout_dmabuf(scanout->con, &g->dmabuf.primary[i]->buf);
+ } else {
+ scanout->ds = qemu_create_displaysurface_pixman(res->image);
+ if (!scanout->ds) {
+ return -EINVAL;
+ }
#ifdef WIN32
- qemu_displaysurface_win32_set_handle(scanout->ds, res->handle, 0);
+ qemu_displaysurface_win32_set_handle(scanout->ds, res->handle, 0);
#endif
+ dpy_gfx_replace_surface(scanout->con, scanout->ds);
+ dpy_gfx_update_full(scanout->con);
+ }
- dpy_gfx_replace_surface(scanout->con, scanout->ds);
- dpy_gfx_update_full(scanout->con);
if (scanout->cursor.resource_id) {
update_cursor(g, &scanout->cursor);
}
--
2.34.1
Hi
On Thu, Mar 7, 2024 at 2:27 AM <dongwon.kim@intel.com> wrote:
>
> From: Dongwon Kim <dongwon.kim@intel.com>
>
> The guest surface needs to be updated with a blob scanout after resumed
> from saved vm state if blob is enabled.
>
> v2: Rebased
>
This patch conflicts with the already reviewed (and almost in queue)
patch from https://patchew.org/QEMU/20240228122323.962826-1-marcandre.lureau@redhat.com/20240228122323.962826-3-marcandre.lureau@redhat.com/.
There are chances that it solves your problem, since it calls into
virtio_gpu_do_set_scanout() which handles blob resources.
Could you check? And if it doesn't fix it, can you apply your solution
on top of it?
thanks
> Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
> Cc: Vivek Kasireddy <vivek.kasireddy@intel.com>
> Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
> ---
> hw/display/virtio-gpu.c | 21 ++++++++++++++-------
> 1 file changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
> index 1c1ee230b3..01bc4f9565 100644
> --- a/hw/display/virtio-gpu.c
> +++ b/hw/display/virtio-gpu.c
> @@ -1422,16 +1422,23 @@ static int virtio_gpu_post_load(void *opaque, int version_id)
> if (!res) {
> return -EINVAL;
> }
> - scanout->ds = qemu_create_displaysurface_pixman(res->image);
> - if (!scanout->ds) {
> - return -EINVAL;
> - }
> +
> + if (res->blob_size) {
> + assert(g->dmabuf.primary[i] != NULL);
> + g->dmabuf.primary[i]->buf.fd = res->dmabuf_fd;
> + dpy_gl_scanout_dmabuf(scanout->con, &g->dmabuf.primary[i]->buf);
> + } else {
> + scanout->ds = qemu_create_displaysurface_pixman(res->image);
> + if (!scanout->ds) {
> + return -EINVAL;
> + }
> #ifdef WIN32
> - qemu_displaysurface_win32_set_handle(scanout->ds, res->handle, 0);
> + qemu_displaysurface_win32_set_handle(scanout->ds, res->handle, 0);
> #endif
> + dpy_gfx_replace_surface(scanout->con, scanout->ds);
> + dpy_gfx_update_full(scanout->con);
> + }
>
> - dpy_gfx_replace_surface(scanout->con, scanout->ds);
> - dpy_gfx_update_full(scanout->con);
> if (scanout->cursor.resource_id) {
> update_cursor(g, &scanout->cursor);
> }
> --
> 2.34.1
>
>
--
Marc-André Lureau
Hi Marc-André,
Ok, seems like your commit would fix the problem I was trying to solve. I will test it and let you know the results.
> -----Original Message-----
> From: Marc-André Lureau <marcandre.lureau@gmail.com>
> Sent: Tuesday, March 12, 2024 4:35 AM
> To: Kim, Dongwon <dongwon.kim@intel.com>
> Cc: qemu-devel@nongnu.org
> Subject: Re: [PATCH v2] virtio-gpu: first surface update with blob scanout after
> resumed
>
> Hi
>
> On Thu, Mar 7, 2024 at 2:27 AM <dongwon.kim@intel.com> wrote:
> >
> > From: Dongwon Kim <dongwon.kim@intel.com>
> >
> > The guest surface needs to be updated with a blob scanout after
> > resumed from saved vm state if blob is enabled.
> >
> > v2: Rebased
> >
>
> This patch conflicts with the already reviewed (and almost in queue) patch from
> https://patchew.org/QEMU/20240228122323.962826-1-
> marcandre.lureau@redhat.com/20240228122323.962826-3-
> marcandre.lureau@redhat.com/.
>
> There are chances that it solves your problem, since it calls into
> virtio_gpu_do_set_scanout() which handles blob resources.
>
> Could you check? And if it doesn't fix it, can you apply your solution on top of it?
>
> thanks
>
> > Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
> > Cc: Vivek Kasireddy <vivek.kasireddy@intel.com>
> > Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
> > ---
> > hw/display/virtio-gpu.c | 21 ++++++++++++++-------
> > 1 file changed, 14 insertions(+), 7 deletions(-)
> >
> > diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index
> > 1c1ee230b3..01bc4f9565 100644
> > --- a/hw/display/virtio-gpu.c
> > +++ b/hw/display/virtio-gpu.c
> > @@ -1422,16 +1422,23 @@ static int virtio_gpu_post_load(void *opaque, int
> version_id)
> > if (!res) {
> > return -EINVAL;
> > }
> > - scanout->ds = qemu_create_displaysurface_pixman(res->image);
> > - if (!scanout->ds) {
> > - return -EINVAL;
> > - }
> > +
> > + if (res->blob_size) {
> > + assert(g->dmabuf.primary[i] != NULL);
> > + g->dmabuf.primary[i]->buf.fd = res->dmabuf_fd;
> > + dpy_gl_scanout_dmabuf(scanout->con, &g->dmabuf.primary[i]->buf);
> > + } else {
> > + scanout->ds = qemu_create_displaysurface_pixman(res->image);
> > + if (!scanout->ds) {
> > + return -EINVAL;
> > + }
> > #ifdef WIN32
> > - qemu_displaysurface_win32_set_handle(scanout->ds, res->handle, 0);
> > + qemu_displaysurface_win32_set_handle(scanout->ds,
> > + res->handle, 0);
> > #endif
> > + dpy_gfx_replace_surface(scanout->con, scanout->ds);
> > + dpy_gfx_update_full(scanout->con);
> > + }
> >
> > - dpy_gfx_replace_surface(scanout->con, scanout->ds);
> > - dpy_gfx_update_full(scanout->con);
> > if (scanout->cursor.resource_id) {
> > update_cursor(g, &scanout->cursor);
> > }
> > --
> > 2.34.1
> >
> >
>
>
> --
> Marc-André Lureau
© 2016 - 2026 Red Hat, Inc.