From: Marc-André Lureau <[email protected]> When a blob resource is backed by udmabuf, the dmabuf fd was never propagated to res->share_handle. This meant the D-Bus display listener could not share the buffer mapping with remote clients, falling back to copying pixel data instead.
Set share_handle to the dmabuf fd after successful udmabuf creation, and reset it to SHAREABLE_NONE on teardown. Signed-off-by: Marc-André Lureau <[email protected]> --- hw/display/virtio-gpu-udmabuf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hw/display/virtio-gpu-udmabuf.c b/hw/display/virtio-gpu-udmabuf.c index c230509852ff..5d6daa1f7afc 100644 --- a/hw/display/virtio-gpu-udmabuf.c +++ b/hw/display/virtio-gpu-udmabuf.c @@ -91,6 +91,7 @@ static void virtio_gpu_destroy_udmabuf(struct virtio_gpu_simple_resource *res) if (res->dmabuf_fd >= 0) { close(res->dmabuf_fd); res->dmabuf_fd = -1; + res->share_handle = SHAREABLE_NONE; } } @@ -149,6 +150,7 @@ bool virtio_gpu_init_udmabuf(struct virtio_gpu_simple_resource *res) virtio_gpu_destroy_udmabuf(res); return false; } + res->share_handle = res->dmabuf_fd; pdata = res->remapped; } @@ -182,6 +184,7 @@ void virtio_gpu_fini_udmabuf(VirtIOGPU *g, struct virtio_gpu_simple_resource *re res->dmabuf_fd != -1) { qemu_dmabuf_close(dmabuf->buf); res->dmabuf_fd = -1; + res->share_handle = SHAREABLE_NONE; } } -- 2.55.0.543.g5ebe2ebe4ea8
