On 2026/08/25 19:20, Marc-André Lureau wrote:
Release the scanout dmabuf before installing the texture. A full
virtio_gpu_disable_scanout() is not used because the scanout is
reassigned immediately afterwards.


Fixes: 7c092f17ccee ("virtio-gpu: Handle resource blob commands")

Signed-off-by: Marc-André Lureau <[email protected]>
---
  hw/display/virtio-gpu-virgl.c  | 3 +++
  hw/display/virtio-gpu.c        | 2 +-
  include/hw/virtio/virtio-gpu.h | 2 ++
  3 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
index 6e298f997d66..532132e46031 100644
--- a/hw/display/virtio-gpu-virgl.c
+++ b/hw/display/virtio-gpu-virgl.c
@@ -586,6 +586,9 @@ static void virgl_cmd_set_scanout(VirtIOGPU *g,
                                               &cmd->error)) {
              return;
          }
+
+        virtio_gpu_release_scanout_dmabuf(g, ss.scanout_id);
+
          qemu_console_resize(g->parent_obj.scanout[ss.scanout_id].con,
                              ss.r.width, ss.r.height);
          virgl_renderer_force_ctx_0();
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index a74475dc6741..c50eb58917e8 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -387,7 +387,7 @@ static void virtio_gpu_resource_create_blob(VirtIOGPU *g,
      QTAILQ_INSERT_HEAD(&g->reslist, res, next);
  }
-static void virtio_gpu_release_scanout_dmabuf(VirtIOGPU *g, int scanout_id)
+void virtio_gpu_release_scanout_dmabuf(VirtIOGPU *g, int scanout_id)
  {
      struct virtio_gpu_scanout *scanout = &g->parent_obj.scanout[scanout_id];
      g_autoptr(QemuDmaBuf) dmabuf = scanout->dmabuf;
diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
index 1816cb21de76..22a38589d63d 100644
--- a/include/hw/virtio/virtio-gpu.h
+++ b/include/hw/virtio/virtio-gpu.h
@@ -360,6 +360,8 @@ bool virtio_gpu_check_scanout_bounds(uint32_t scanout_id, 
uint32_t resource_id,
                                       const struct virtio_gpu_rect *r,
                                       uint32_t *error);
+void virtio_gpu_release_scanout_dmabuf(VirtIOGPU *g, int scanout_id);
+
  /**
   * virtio_gpu_scanout_blob_to_fb() - fill out fb based on scanout data
   * fb: the frame-buffer descriptor to fill out



Reply via email to