Commit 9f1f607789 for qemu.org
commit 9f1f607789c61640a25eb73e6ff78b5012116845
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date: Sat Aug 22 15:55:05 2026 +0400
virtio-gpu: drop scanout_bitmask bookkeeping
The per-resource scanout_bitmask is a reverse index of which
scanouts reference a given resource. The information is already
available from scanout->resource_id. Performance impact should be
negligible.
Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index bcde65b503..6e021b78b8 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -434,12 +434,6 @@ static void virtio_gpu_release_scanout_dmabuf(VirtIOGPU *g, int scanout_id)
void virtio_gpu_disable_scanout(VirtIOGPU *g, int scanout_id)
{
struct virtio_gpu_scanout *scanout = &g->parent_obj.scanout[scanout_id];
- struct virtio_gpu_simple_resource *res;
-
- res = virtio_gpu_find_resource(g, scanout->resource_id);
- if (res) {
- res->scanout_bitmask &= ~(1 << scanout_id);
- }
virtio_gpu_release_scanout_dmabuf(g, scanout_id);
@@ -456,11 +450,9 @@ static void virtio_gpu_resource_destroy(VirtIOGPU *g,
{
int i;
- if (res->scanout_bitmask) {
- for (i = 0; i < g->parent_obj.conf.max_outputs; i++) {
- if (res->scanout_bitmask & (1 << i)) {
- virtio_gpu_disable_scanout(g, i);
- }
+ for (i = 0; i < g->parent_obj.conf.max_outputs; i++) {
+ if (g->parent_obj.scanout[i].resource_id == res->resource_id) {
+ virtio_gpu_disable_scanout(g, i);
}
}
@@ -639,10 +631,10 @@ static void virtio_gpu_resource_flush(VirtIOGPU *g,
for (i = 0; i < g->parent_obj.conf.max_outputs; i++) {
QemuRect rect;
- if (!(res->scanout_bitmask & (1 << i))) {
+ scanout = &g->parent_obj.scanout[i];
+ if (scanout->resource_id != res->resource_id) {
continue;
}
- scanout = &g->parent_obj.scanout[i];
qemu_rect_init(&rect, scanout->x, scanout->y,
scanout->width, scanout->height);
@@ -667,16 +659,9 @@ void virtio_gpu_update_scanout(VirtIOGPU *g,
struct virtio_gpu_framebuffer *fb,
struct virtio_gpu_rect *r)
{
- struct virtio_gpu_simple_resource *ores;
struct virtio_gpu_scanout *scanout;
scanout = &g->parent_obj.scanout[scanout_id];
- ores = virtio_gpu_find_resource(g, scanout->resource_id);
- if (ores) {
- ores->scanout_bitmask &= ~(1 << scanout_id);
- }
-
- res->scanout_bitmask |= (1 << scanout_id);
scanout->resource_id = res->resource_id;
scanout->x = r->x;
scanout->y = r->y;
@@ -1707,7 +1692,6 @@ static int virtio_gpu_post_load(void *opaque, int version_id)
if (scanout->cursor.resource_id) {
update_cursor(g, &scanout->cursor);
}
- res->scanout_bitmask |= (1 << i);
}
return 0;
diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
index c2018b4105..071cbbb611 100644
--- a/include/hw/virtio/virtio-gpu.h
+++ b/include/hw/virtio/virtio-gpu.h
@@ -51,7 +51,6 @@ struct virtio_gpu_simple_resource {
uint64_t *addrs;
struct iovec *iov;
unsigned int iov_cnt;
- uint32_t scanout_bitmask;
pixman_image_t *image;
qemu_pixman_shareable share_handle;
uint64_t hostmem;