@@ -22,6 +22,7 @@
#include "hw/virtio/virtio-gpu-bswap.h"
#include "hw/virtio/virtio-gpu-pixman.h"
#include "hw/qdev-properties.h"
+#include "monitor/monitor.h"
#include <virglrenderer.h>
@@ -143,6 +144,17 @@ static void virtio_gpu_gl_device_realize(DeviceState *qdev, Error **errp)
return;
}
+#if VIRGL_RENDERER_CALLBACKS_VERSION >= 3
+ if (g->parent_obj.conf.serverfd) {
+ g->parent_obj.conf.serverfd_parsed =
+ monitor_fd_param(monitor_cur(), g->parent_obj.conf.serverfd, errp);
+ if (g->parent_obj.conf.serverfd_parsed < 0) {
+ error_prepend(errp, "unable to parse serverfd: ");
+ return;
+ }
+ }
+#endif
+
g->parent_obj.conf.flags |= (1 << VIRTIO_GPU_FLAG_VIRGL_ENABLED);
g->capset_ids = virtio_gpu_virgl_get_capsets(g);
VIRTIO_GPU_BASE(g)->virtio_config.num_capsets = g->capset_ids->len;
@@ -159,6 +171,9 @@ static const Property virtio_gpu_gl_properties[] = {
VIRTIO_GPU_FLAG_STATS_ENABLED, false),
DEFINE_PROP_BIT("venus", VirtIOGPU, parent_obj.conf.flags,
VIRTIO_GPU_FLAG_VENUS_ENABLED, false),
+#if VIRGL_RENDERER_CALLBACKS_VERSION >= 3
+ DEFINE_PROP_STRING("serverfd", VirtIOGPU, parent_obj.conf.serverfd),
+#endif
};
static void virtio_gpu_gl_device_unrealize(DeviceState *qdev)
@@ -1030,6 +1030,19 @@ static int virgl_make_context_current(void *opaque, int scanout_idx,
qctx);
}
+#if VIRGL_RENDERER_CALLBACKS_VERSION >= 3
+static int virgl_get_server_fd(void *opaque, uint32_t version)
+{
+ VirtIOGPU *g = opaque;
+
+ if (g->parent_obj.conf.serverfd) {
+ return g->parent_obj.conf.serverfd_parsed;
+ }
+
+ return -1;
+}
+#endif
+
static struct virgl_renderer_callbacks virtio_gpu_3d_cbs = {
.version = 1,
.write_fence = virgl_write_fence,
@@ -1097,6 +1110,10 @@ int virtio_gpu_virgl_init(VirtIOGPU *g)
uint32_t flags = 0;
VirtIOGPUGL *gl = VIRTIO_GPU_GL(g);
+#if VIRGL_RENDERER_CALLBACKS_VERSION >= 3
+ virtio_gpu_3d_cbs.version = 3;
+ virtio_gpu_3d_cbs.get_server_fd = virgl_get_server_fd;
+#endif
#if VIRGL_RENDERER_CALLBACKS_VERSION >= 4
if (qemu_egl_display) {
virtio_gpu_3d_cbs.version = 4;
@@ -128,6 +128,8 @@ struct virtio_gpu_base_conf {
uint32_t xres;
uint32_t yres;
uint64_t hostmem;
+ char *serverfd;
+ int serverfd_parsed;
};
struct virtio_gpu_ctrl_command {
This property passes socket of a externally started virgl_render_server to virglrenderer, so that it won't try to spawn new process and get killed by seccomp, allowing virtio-gpu-gl venus and sandbox to enable at the same time. Signed-off-by: Jiang XueQian <jiangxueqian@gmail.com> --- hw/display/virtio-gpu-gl.c | 15 +++++++++++++++ hw/display/virtio-gpu-virgl.c | 17 +++++++++++++++++ include/hw/virtio/virtio-gpu.h | 2 ++ 3 files changed, 34 insertions(+)