Hi On Tue, Sep 8, 2026 at 10:46 AM Akihiko Odaki <[email protected]> wrote: > > On 2026/09/04 22:10, Marc-André Lureau wrote: > > Use the common virtio_gpu_disable_scanout() to reset the scanout state, > > including GL state if any. > > > > Fixes: 7c092f17ccee ("virtio-gpu: Handle resource blob commands") > > Signed-off-by: Marc-André Lureau <[email protected]> > > --- > > hw/display/virtio-gpu-rutabaga.c | 4 +--- > > hw/display/virtio-gpu-virgl.c | 6 ++---- > > hw/display/virtio-gpu.c | 7 +++++-- > > 3 files changed, 8 insertions(+), 9 deletions(-) > > > > diff --git a/hw/display/virtio-gpu-rutabaga.c > > b/hw/display/virtio-gpu-rutabaga.c > > index 8a82e96b7461..8697dd6936ba 100644 > > --- a/hw/display/virtio-gpu-rutabaga.c > > +++ b/hw/display/virtio-gpu-rutabaga.c > > @@ -312,9 +312,7 @@ rutabaga_cmd_set_scanout(VirtIOGPU *g, struct > > virtio_gpu_ctrl_command *cmd) > > scanout = &vb->scanout[ss.scanout_id]; > > > > if (ss.resource_id == 0) { > > - scanout->resource_id = 0; > > - qemu_console_set_surface(scanout->con, NULL); > > - qemu_console_gl_scanout_disable(scanout->con); > > + virtio_gpu_disable_scanout(g, ss.scanout_id); > > return; > > } > > > > diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c > > index 79d4c0b569fb..87d1fc3d5f65 100644 > > --- a/hw/display/virtio-gpu-virgl.c > > +++ b/hw/display/virtio-gpu-virgl.c > > @@ -618,8 +618,7 @@ static void virgl_cmd_set_scanout(VirtIOGPU *g, > > ss.r.x, ss.r.y, ss.r.width, ss.r.height, > > d3d_tex2d); > > } else { > > - qemu_console_set_surface(g->parent_obj.scanout[ss.scanout_id].con, > > NULL); > > - > > qemu_console_gl_scanout_disable(g->parent_obj.scanout[ss.scanout_id].con); > > + virtio_gpu_disable_scanout(g, ss.scanout_id); > > } > > g->parent_obj.scanout[ss.scanout_id].resource_id = ss.resource_id; > > } > > @@ -1426,8 +1425,7 @@ void virtio_gpu_virgl_reset_scanout(VirtIOGPU *g) > > int i; > > > > for (i = 0; i < g->parent_obj.conf.max_outputs; i++) { > > - qemu_console_set_surface(g->parent_obj.scanout[i].con, NULL); > > - qemu_console_gl_scanout_disable(g->parent_obj.scanout[i].con); > > + virtio_gpu_disable_scanout(g, i); > > } > > } > > > > diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c > > index ae1f87ad68b2..cb096cb349cd 100644 > > --- a/hw/display/virtio-gpu.c > > +++ b/hw/display/virtio-gpu.c > > @@ -435,8 +435,11 @@ void virtio_gpu_disable_scanout(VirtIOGPU *g, int > > scanout_id) > > { > > struct virtio_gpu_scanout *scanout = > > &g->parent_obj.scanout[scanout_id]; > > > > - virtio_gpu_release_scanout_dmabuf(g, scanout_id); > > - > > + if (scanout->dmabuf) { > > + virtio_gpu_release_scanout_dmabuf(g, scanout_id); > > + } else { > > + qemu_console_gl_scanout_disable(scanout->con); > > + } > > GL needs to be always disabled when clearing a scanout. >
Ok, I removed the else condition. Are you going to review the remaining 1-23 patches? thanks > Having scanout->dmabuf suppresses the explicit GL-disable callback. This > misses a real reset path: > 1. Reset a Virgl device displaying a hostmem-mapped blob. > 2. virtio_gpu_virgl_resource_unref() starts asynchronous unmapping and > returns before disabling its scanouts. > 3. virtio_gpu_reset_bh() installs placeholder surfaces, changing the > console to SCANOUT_SURFACE; virtio_gpu_base_reset() clears the > resource IDs. > 4. virtio_gpu_gl_reset() calls virtio_gpu_virgl_reset_scanout(). The new > helper releases the retained DMA-BUF, but > qemu_console_gl_release_dmabuf() invokes GL-disable only for > SCANOUT_DMABUF. > 5. GTK’s release callback clears the DMA-BUF pointer but leaves > scanout_mode and its framebuffer. The queued redraw continues through > the old framebuffer path instead of displaying the placeholder, blit > in gd_gl_area_draw(). > > Before this patch, virtio_gpu_virgl_reset_scanout() always called > GL-disable. Please ensure the disable helper actually disables the > frontend even when releasing a wrapper whose console has already > switched to a surface. > > Regards, > Akihiko Odaki > > > qemu_console_set_surface(scanout->con, NULL); > > scanout->resource_id = 0; > > scanout->ds = NULL; > > > >
