Message ID | 20240504202834.399780-4-dmitry.osipenko@collabora.com |
---|---|
State | New |
Headers | show |
Series | Support blob memory and venus on qemu | expand |
Hi On Sun, May 5, 2024 at 12:29 AM Dmitry Osipenko <dmitry.osipenko@collabora.com> wrote: > > From: Huang Rui <ray.huang@amd.com> > > Patch "virtio-gpu: CONTEXT_INIT feature" has added the context_init > feature flags. Expose this feature and support creating virglrenderer > context with flags using context_id if libvirglrenderer is new enough. > > Originally-by: Antonio Caggiano <antonio.caggiano@collabora.com> > Signed-off-by: Huang Rui <ray.huang@amd.com> > Reviewed-by: Antonio Caggiano <quic_acaggian@quicinc.com> > Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> > --- > hw/display/virtio-gpu-gl.c | 4 ++++ > hw/display/virtio-gpu-virgl.c | 20 ++++++++++++++++++-- > meson.build | 1 + > 3 files changed, 23 insertions(+), 2 deletions(-) > > diff --git a/hw/display/virtio-gpu-gl.c b/hw/display/virtio-gpu-gl.c > index 0c0a8d136954..95806999189e 100644 > --- a/hw/display/virtio-gpu-gl.c > +++ b/hw/display/virtio-gpu-gl.c > @@ -127,6 +127,10 @@ static void virtio_gpu_gl_device_realize(DeviceState *qdev, Error **errp) > VIRTIO_GPU_BASE(g)->virtio_config.num_capsets = > virtio_gpu_virgl_get_num_capsets(g); > > +#ifdef HAVE_VIRGL_CONTEXT_CREATE_WITH_FLAGS > + g->parent_obj.conf.flags |= 1 << VIRTIO_GPU_FLAG_CONTEXT_INIT_ENABLED; > +#endif > + > virtio_gpu_device_realize(qdev, errp); > } > > diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c > index b0500eccf8e0..8306961ad502 100644 > --- a/hw/display/virtio-gpu-virgl.c > +++ b/hw/display/virtio-gpu-virgl.c > @@ -106,8 +106,24 @@ static void virgl_cmd_context_create(VirtIOGPU *g, > trace_virtio_gpu_cmd_ctx_create(cc.hdr.ctx_id, > cc.debug_name); > > - virgl_renderer_context_create(cc.hdr.ctx_id, cc.nlen, > - cc.debug_name); > + if (cc.context_init) { > + if (!virtio_gpu_context_init_enabled(g->parent_obj.conf)) { > + qemu_log_mask(LOG_GUEST_ERROR, "%s: context_init disabled", > + __func__); > + cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC; > + return; > + } > + > +#ifdef HAVE_VIRGL_CONTEXT_CREATE_WITH_FLAGS > + virgl_renderer_context_create_with_flags(cc.hdr.ctx_id, > + cc.context_init, > + cc.nlen, > + cc.debug_name); > + return; > +#endif I am wondering if there should be a: #else g_assert_not_reached(); #endif rather than falling back to a regular context creation. > + } > + > + virgl_renderer_context_create(cc.hdr.ctx_id, cc.nlen, cc.debug_name); > } > > static void virgl_cmd_context_destroy(VirtIOGPU *g, > diff --git a/meson.build b/meson.build > index f4a4d71c1978..513cb2ea6d03 100644 > --- a/meson.build > +++ b/meson.build > @@ -2288,6 +2288,7 @@ config_host_data.set('CONFIG_VNC_JPEG', jpeg.found()) > config_host_data.set('CONFIG_VNC_SASL', sasl.found()) > if virgl.version().version_compare('>=1.0.0') > config_host_data.set('HAVE_VIRGL_D3D_INFO_EXT', 1) > + config_host_data.set('HAVE_VIRGL_CONTEXT_CREATE_WITH_FLAGS', 1) > endif > config_host_data.set('CONFIG_VIRTFS', have_virtfs) > config_host_data.set('CONFIG_VTE', vte.found()) > -- > 2.44.0 > Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
diff --git a/hw/display/virtio-gpu-gl.c b/hw/display/virtio-gpu-gl.c index 0c0a8d136954..95806999189e 100644 --- a/hw/display/virtio-gpu-gl.c +++ b/hw/display/virtio-gpu-gl.c @@ -127,6 +127,10 @@ static void virtio_gpu_gl_device_realize(DeviceState *qdev, Error **errp) VIRTIO_GPU_BASE(g)->virtio_config.num_capsets = virtio_gpu_virgl_get_num_capsets(g); +#ifdef HAVE_VIRGL_CONTEXT_CREATE_WITH_FLAGS + g->parent_obj.conf.flags |= 1 << VIRTIO_GPU_FLAG_CONTEXT_INIT_ENABLED; +#endif + virtio_gpu_device_realize(qdev, errp); } diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c index b0500eccf8e0..8306961ad502 100644 --- a/hw/display/virtio-gpu-virgl.c +++ b/hw/display/virtio-gpu-virgl.c @@ -106,8 +106,24 @@ static void virgl_cmd_context_create(VirtIOGPU *g, trace_virtio_gpu_cmd_ctx_create(cc.hdr.ctx_id, cc.debug_name); - virgl_renderer_context_create(cc.hdr.ctx_id, cc.nlen, - cc.debug_name); + if (cc.context_init) { + if (!virtio_gpu_context_init_enabled(g->parent_obj.conf)) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: context_init disabled", + __func__); + cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC; + return; + } + +#ifdef HAVE_VIRGL_CONTEXT_CREATE_WITH_FLAGS + virgl_renderer_context_create_with_flags(cc.hdr.ctx_id, + cc.context_init, + cc.nlen, + cc.debug_name); + return; +#endif + } + + virgl_renderer_context_create(cc.hdr.ctx_id, cc.nlen, cc.debug_name); } static void virgl_cmd_context_destroy(VirtIOGPU *g, diff --git a/meson.build b/meson.build index f4a4d71c1978..513cb2ea6d03 100644 --- a/meson.build +++ b/meson.build @@ -2288,6 +2288,7 @@ config_host_data.set('CONFIG_VNC_JPEG', jpeg.found()) config_host_data.set('CONFIG_VNC_SASL', sasl.found()) if virgl.version().version_compare('>=1.0.0') config_host_data.set('HAVE_VIRGL_D3D_INFO_EXT', 1) + config_host_data.set('HAVE_VIRGL_CONTEXT_CREATE_WITH_FLAGS', 1) endif config_host_data.set('CONFIG_VIRTFS', have_virtfs) config_host_data.set('CONFIG_VTE', vte.found())