Added a special callback function called virtio_get_drm_fd to create a render node based on the path specified by the user via QEMU command line. This function is called during the virglrenderer callback sequence where we specify the get_drm_fd function pointer to call back our new function, allowing us to pass the fd of our created render node.
Based-on: [email protected] Signed-off-by: Luqmaan Irshad <[email protected]> --- hw/display/virtio-gpu-gl.c | 4 ++++ hw/display/virtio-gpu-virgl.c | 17 ++++++++++++++++- include/hw/virtio/virtio-gpu.h | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/hw/display/virtio-gpu-gl.c b/hw/display/virtio-gpu-gl.c index b640900fc6..c0587929e4 100644 --- a/hw/display/virtio-gpu-gl.c +++ b/hw/display/virtio-gpu-gl.c @@ -161,6 +161,10 @@ static const Property virtio_gpu_gl_properties[] = { VIRTIO_GPU_FLAG_VENUS_ENABLED, false), DEFINE_PROP_BIT("drm_native_context", VirtIOGPU, parent_obj.conf.flags, VIRTIO_GPU_FLAG_DRM_ENABLED, false), +#if VIRGL_RENDERER_CALLBACKS_VERSION >= 2s + DEFINE_PROP_STRING("drm_render_node", VirtIOGPU, + parent_obj.drm_render_node), +#endif }; static void virtio_gpu_gl_device_unrealize(DeviceState *qdev) diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c index 6ad3b46066..c271194260 100644 --- a/hw/display/virtio-gpu-virgl.c +++ b/hw/display/virtio-gpu-virgl.c @@ -1016,6 +1016,15 @@ void virtio_gpu_virgl_process_cmd(VirtIOGPU *g, } } +#if VIRGL_RENDERER_CALLBACKS_VERSION >= 2 +static int virtio_get_drm_fd(void *opaque) +{ + VirtIOGPU *g = opaque; + int fd = open(g->parent_obj.drm_render_node, O_RDWR); + return fd; +} +#endif + static void virgl_write_fence(void *opaque, uint32_t fence) { VirtIOGPU *g = opaque; @@ -1300,7 +1309,13 @@ int virtio_gpu_virgl_init(VirtIOGPU *g) } if (virtio_gpu_drm_enabled(g->parent_obj.conf)) { flags |= VIRGL_RENDERER_DRM; - +#if VIRGL_RENDERER_CALLBACKS_VERSION >= 2 + if (g->parent_obj.drm_render_node) { + if (virtio_gpu_3d_cbs.version < 2) + virtio_gpu_3d_cbs.version = 2; + virtio_gpu_3d_cbs.get_drm_fd = virtio_get_drm_fd; + } +#endif if (!(flags & VIRGL_RENDERER_ASYNC_FENCE_CB)) { /* * Virglrenderer skips enabling DRM context support without diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h index a4963508a4..aba8343848 100644 --- a/include/hw/virtio/virtio-gpu.h +++ b/include/hw/virtio/virtio-gpu.h @@ -152,6 +152,7 @@ struct VirtIOGPUBase { struct virtio_gpu_base_conf conf; struct virtio_gpu_config virtio_config; const GraphicHwOps *hw_ops; + char *drm_render_node; int renderer_blocked; int enable; -- 2.43.0
