From e3624e8b1872185ff55a151b299a2cfdc3b42e78 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 14 Sep 2020 15:42:19 +0200 Subject: [PATCH 1/6] meson: fix qxl dependencies Add pixman and spice deps to qxl module. Signed-off-by: Gerd Hoffmann Message-id: 20200914134224.29769-2-kraxel@redhat.com --- hw/display/meson.build | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/display/meson.build b/hw/display/meson.build index 78adaf9db4..2cc73fc2b9 100644 --- a/hw/display/meson.build +++ b/hw/display/meson.build @@ -41,7 +41,8 @@ specific_ss.add(when: 'CONFIG_VGA', if_true: files('vga.c')) if config_all_devices.has_key('CONFIG_QXL') qxl_ss = ss.source_set() - qxl_ss.add(when: 'CONFIG_QXL', if_true: files('qxl.c', 'qxl-logger.c', 'qxl-render.c')) + qxl_ss.add(when: 'CONFIG_QXL', if_true: [files('qxl.c', 'qxl-logger.c', 'qxl-render.c'), + pixman, spice]) hw_display_modules += {'qxl': qxl_ss} endif From 3e292c51ff079258c40dae926f71252423cdcc98 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 14 Sep 2020 15:42:20 +0200 Subject: [PATCH 2/6] meson: fix module config Use all config symbols not only the host ones. Needed to make sure device configs like CONFIG_QXL are used for modules too. Suggested-by: Paolo Bonzini Signed-off-by: Gerd Hoffmann Message-id: 20200914134224.29769-3-kraxel@redhat.com --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 690723b470..bba766b4bc 100644 --- a/meson.build +++ b/meson.build @@ -913,7 +913,7 @@ softmmu_mods = [] foreach d, list : modules foreach m, module_ss : list if enable_modules and targetos != 'windows' - module_ss = module_ss.apply(config_host, strict: false) + module_ss = module_ss.apply(config_all, strict: false) sl = static_library(d + '-' + m, [genh, module_ss.sources()], dependencies: [modulecommon, module_ss.dependencies()], pic: true) if d == 'block' From f84698ee8b4a5d582b7f7080064198d70ba18f35 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 14 Sep 2020 15:42:21 +0200 Subject: [PATCH 3/6] meson: remove duplicate qxl sources We should add sources to the softmmu_ss or module_ss but not both. Signed-off-by: Gerd Hoffmann Message-id: 20200914134224.29769-4-kraxel@redhat.com --- hw/display/meson.build | 2 -- 1 file changed, 2 deletions(-) diff --git a/hw/display/meson.build b/hw/display/meson.build index 2cc73fc2b9..2f07d427dd 100644 --- a/hw/display/meson.build +++ b/hw/display/meson.build @@ -46,8 +46,6 @@ if config_all_devices.has_key('CONFIG_QXL') hw_display_modules += {'qxl': qxl_ss} endif -softmmu_ss.add(when: 'CONFIG_QXL', if_true: files('qxl.c', 'qxl-logger.c', 'qxl-render.c')) - softmmu_ss.add(when: 'CONFIG_DPCD', if_true: files('dpcd.c')) softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx_dp.c')) From 64f7aece8ea0745c0990f7ba20189341e70f123c Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 14 Sep 2020 15:42:22 +0200 Subject: [PATCH 4/6] object_initialize: try module load Needed to allow virtio-gpu-pci initialize the virtio-gpu-device child device. Signed-off-by: Gerd Hoffmann Message-id: 20200914134224.29769-5-kraxel@redhat.com --- qom/object.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/qom/object.c b/qom/object.c index b1822a2ef4..387efb25eb 100644 --- a/qom/object.c +++ b/qom/object.c @@ -518,6 +518,12 @@ void object_initialize(void *data, size_t size, const char *typename) { TypeImpl *type = type_get_by_name(typename); +#ifdef CONFIG_MODULES + if (!type) { + module_load_qom_one(typename); + type = type_get_by_name(typename); + } +#endif if (!type) { error_report("missing object type '%s'", typename); abort(); From 3b593b3fe406c04d34a7e896c364a17b034fcf4f Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 14 Sep 2020 15:42:23 +0200 Subject: [PATCH 5/6] virtio-gpu: make virtio_gpu_ops static Reference it via ops pointer instead, simliar to the vga one. Removes hard symbol reference, needed to build virtio-gpu modular. Signed-off-by: Gerd Hoffmann Message-id: 20200914134224.29769-6-kraxel@redhat.com --- hw/display/virtio-gpu-base.c | 3 ++- hw/display/virtio-vga.c | 16 ++++++++-------- include/hw/virtio/virtio-gpu.h | 3 +-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/hw/display/virtio-gpu-base.c b/hw/display/virtio-gpu-base.c index 7961308606..aeb8723542 100644 --- a/hw/display/virtio-gpu-base.c +++ b/hw/display/virtio-gpu-base.c @@ -112,7 +112,7 @@ virtio_gpu_gl_block(void *opaque, bool block) } } -const GraphicHwOps virtio_gpu_ops = { +static const GraphicHwOps virtio_gpu_ops = { .invalidate = virtio_gpu_invalidate_display, .gfx_update = virtio_gpu_update_display, .text_update = virtio_gpu_text_update, @@ -162,6 +162,7 @@ virtio_gpu_base_device_realize(DeviceState *qdev, g->req_state[0].width = g->conf.xres; g->req_state[0].height = g->conf.yres; + g->hw_ops = &virtio_gpu_ops; for (i = 0; i < g->conf.max_outputs; i++) { g->scanout[i].con = graphic_console_init(DEVICE(g), i, &virtio_gpu_ops, g); diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c index 573e7d5928..f9410a0c2e 100644 --- a/hw/display/virtio-vga.c +++ b/hw/display/virtio-vga.c @@ -13,7 +13,7 @@ static void virtio_vga_base_invalidate_display(void *opaque) VirtIOGPUBase *g = vvga->vgpu; if (g->enable) { - virtio_gpu_ops.invalidate(g); + g->hw_ops->invalidate(g); } else { vvga->vga.hw_ops->invalidate(&vvga->vga); } @@ -25,7 +25,7 @@ static void virtio_vga_base_update_display(void *opaque) VirtIOGPUBase *g = vvga->vgpu; if (g->enable) { - virtio_gpu_ops.gfx_update(g); + g->hw_ops->gfx_update(g); } else { vvga->vga.hw_ops->gfx_update(&vvga->vga); } @@ -37,8 +37,8 @@ static void virtio_vga_base_text_update(void *opaque, console_ch_t *chardata) VirtIOGPUBase *g = vvga->vgpu; if (g->enable) { - if (virtio_gpu_ops.text_update) { - virtio_gpu_ops.text_update(g, chardata); + if (g->hw_ops->text_update) { + g->hw_ops->text_update(g, chardata); } } else { if (vvga->vga.hw_ops->text_update) { @@ -52,8 +52,8 @@ static int virtio_vga_base_ui_info(void *opaque, uint32_t idx, QemuUIInfo *info) VirtIOVGABase *vvga = opaque; VirtIOGPUBase *g = vvga->vgpu; - if (virtio_gpu_ops.ui_info) { - return virtio_gpu_ops.ui_info(g, idx, info); + if (g->hw_ops->ui_info) { + return g->hw_ops->ui_info(g, idx, info); } return -1; } @@ -63,8 +63,8 @@ static void virtio_vga_base_gl_block(void *opaque, bool block) VirtIOVGABase *vvga = opaque; VirtIOGPUBase *g = vvga->vgpu; - if (virtio_gpu_ops.gl_block) { - virtio_gpu_ops.gl_block(g, block); + if (g->hw_ops->gl_block) { + g->hw_ops->gl_block(g, block); } } diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h index f334b78085..6b45b4799a 100644 --- a/include/hw/virtio/virtio-gpu.h +++ b/include/hw/virtio/virtio-gpu.h @@ -106,6 +106,7 @@ struct VirtIOGPUBase { struct virtio_gpu_base_conf conf; struct virtio_gpu_config virtio_config; + const GraphicHwOps *hw_ops; bool use_virgl_renderer; int renderer_blocked; @@ -171,8 +172,6 @@ struct VhostUserGPU { bool backend_blocked; }; -extern const GraphicHwOps virtio_gpu_ops; - #define VIRTIO_GPU_FILL_CMD(out) do { \ size_t s; \ s = iov_to_buf(cmd->elem.out_sg, cmd->elem.out_num, 0, \ From 7b0de5b7969e695d6235525654a8a28a0d82a0e0 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 14 Sep 2020 15:42:24 +0200 Subject: [PATCH 6/6] virtio-gpu: build modular Only build virtio-gpu-device modular (the code which actually depends on the external virglrenderer library). virtio-gpu-pci and virtio-vga are compiled into core qemu still. Signed-off-by: Gerd Hoffmann Message-id: 20200914134224.29769-7-kraxel@redhat.com --- hw/display/meson.build | 22 ++++++---------------- util/module.c | 2 ++ 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/hw/display/meson.build b/hw/display/meson.build index 2f07d427dd..0d5ddecd65 100644 --- a/hw/display/meson.build +++ b/hw/display/meson.build @@ -59,24 +59,14 @@ if config_all_devices.has_key('CONFIG_VIRTIO_GPU') virtio_gpu_ss.add(when: 'CONFIG_VIRTIO_GPU', if_true: [files('virtio-gpu-base.c', 'virtio-gpu.c', 'virtio-gpu-3d.c'), pixman, virgl]) virtio_gpu_ss.add(when: 'CONFIG_VHOST_USER_GPU', if_true: files('vhost-user-gpu.c')) - virtio_gpu_ss.add(when: ['CONFIG_VIRTIO_GPU', 'CONFIG_VIRTIO_PCI'], if_true: files('virtio-gpu-pci.c')) - virtio_gpu_ss.add(when: ['CONFIG_VHOST_USER_GPU', 'CONFIG_VIRTIO_PCI'], if_true: files('vhost-user-gpu-pci.c')) - virtio_gpu_ss.add(when: 'CONFIG_VIRTIO_VGA', if_true: files('virtio-vga.c')) - virtio_gpu_ss.add(when: 'CONFIG_VHOST_USER_VGA', if_true: files('vhost-user-vga.c')) - - # FIXME: this was attempted in the Makefile build system; it was then reverted - # as it would try to load all devices when the module is loaded, even if - # config_devices for this target only has some of them. Since virtio-gpu-pci - # and virtio-vga both instantiate a virtio-gpu-device, fixing it probably does - # not even require a dependency system, just splitting the module in three - # for CONFIG_VIRTIO_GPU/CONFIG_VHOST_USER_GPU, CONFIG_VIRTIO_PCI and - # CONFIG_VIRTIO_VGA/CONFIG_VHOST_USER_VGA. - # Sourcesets are a dime a dozen, so keep it and just disable module builds. - - #hw_display_modules += {'virtio-gpu': virtio_gpu_ss} - softmmu_ss.add_all(virtio_gpu_ss) + hw_display_modules += {'virtio-gpu': virtio_gpu_ss} endif +softmmu_ss.add(when: ['CONFIG_VIRTIO_GPU', 'CONFIG_VIRTIO_PCI'], if_true: files('virtio-gpu-pci.c')) +softmmu_ss.add(when: ['CONFIG_VHOST_USER_GPU', 'CONFIG_VIRTIO_PCI'], if_true: files('vhost-user-gpu-pci.c')) +softmmu_ss.add(when: 'CONFIG_VIRTIO_VGA', if_true: files('virtio-vga.c')) +softmmu_ss.add(when: 'CONFIG_VHOST_USER_VGA', if_true: files('vhost-user-vga.c')) + specific_ss.add(when: [x11, opengl, 'CONFIG_MILKYMIST_TMU2'], if_true: files('milkymist-tmu2.c')) specific_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_lcdc.c')) diff --git a/util/module.c b/util/module.c index 6e63006a8f..34772e7d87 100644 --- a/util/module.c +++ b/util/module.c @@ -265,6 +265,8 @@ static struct { { "usb-redir", "hw-", "usb-redirect" }, { "qxl-vga", "hw-", "display-qxl" }, { "qxl", "hw-", "display-qxl" }, + { "virtio-gpu-device", "hw-", "display-virtio-gpu" }, + { "vhost-user-gpu", "hw-", "display-virtio-gpu" }, { "chardev-braille", "chardev-", "baum" }, };