[Spice-devel] [PATCH v1 0/5] dcc: Create a stream for non-gl/remote clients that want to use dmabuf

Frediano Ziglio freddy77 at gmail.com
Wed Mar 29 16:54:57 UTC 2023


Il giorno lun 27 mar 2023 alle ore 07:53 Kasireddy, Vivek
<vivek.kasireddy at intel.com> ha scritto:
>
> Hi Frediano,
>
> >    I was trying the patch series but the client keeps crashing. I
> > tried different versions of remote-viewer (from Fedora and from
> > Ubuntu) and they both crashed.
> > On host I installed Intel VA drivers , Gstreamer VAAPIs and forced
> > gstreamer:h264 as encoder.
> [Kasireddy, Vivek] I don't think any of these packages are needed if we are testing
> with a software (i.e, CPU-based) encoder/decoder (i.e, using x264enc/x264dec plugins).

They should allow hardware encoding.

> On my Fedora 37, these relevant plugins are provided by:
> # rpm -q --whatprovides /usr/lib64/gstreamer-1.0/libgstx264.so
> gstreamer1-plugins-ugly-1.20.5-1.fc37.x86_64
> # rpm -q --whatprovides /usr/lib64/gstreamer-1.0/libgstlibav.so
> gstreamer1-plugin-libav-1.20.5-1.fc37.x86_64
>
> The former provides x264enc and the latter provides x264dec. You can either choose
> the ones provided by your distro or build Gstreamer with -Dgst-plugins-ugly:x264=enabled
> and -Dlibav=enabled. However, note that one of our eventual goals is to cleanly add a
> new Gstreamer pipeline to Spice to provide users an option for hardware-based
> (i.e, GPU assisted) H.264 encoding/decoding using msdkh264enc/msdkh264dec plugins:
> https://gstreamer.freedesktop.org/documentation/msdk/msdkh264enc.html?gi-language=c
>
> > Anything else you need to do?
> [Kasireddy, Vivek] Sorry, I was not expecting anyone would test the Spice server
> patches and therefore did not provide all the required information to test them.
> Anyway, I suspect the reason for your remote-viewer crash is because there is no
> (primary) surface created. Here is the tentative Qemu patch that does just that:
>

Do you have a branch for Qemu somewhere?

> Author: Vivek Kasireddy <vivek.kasireddy at intel.com>
> Date:   Wed Mar 15 22:18:00 2023 -0700
>
>     spice: Create a primary surface for a streaming non-gl client
>
>     When gl=on option is enabled and a client that cannot accept
>     dmabuf fds is connected, create a primary surface so that
>     the server can start streaming the dmabuf data.
>
>     Signed-off-by: Vivek Kasireddy <vivek.kasireddy at intel.com>
>
> diff --git a/include/ui/spice-display.h b/include/ui/spice-display.h
> index e271e011da..121fb0caf8 100644
> --- a/include/ui/spice-display.h
> +++ b/include/ui/spice-display.h
> @@ -153,6 +153,7 @@ struct SimpleSpiceCursor {
>  };
>
>  extern bool spice_opengl;
> +extern bool streaming_client;
>
>  int qemu_spice_rect_is_empty(const QXLRect* r);
>  void qemu_spice_rect_union(QXLRect *dest, const QXLRect *r);
> diff --git a/ui/spice-core.c b/ui/spice-core.c
> index 6e00211e3a..e5822b41ef 100644
> --- a/ui/spice-core.c
> +++ b/ui/spice-core.c
> @@ -845,9 +845,7 @@ static void qemu_spice_init(void)
>  #ifdef HAVE_SPICE_GL
>      if (qemu_opt_get_bool(opts, "gl", 0)) {
>          if ((port != 0) || (tls_port != 0)) {
> -            error_report("SPICE GL support is local-only for now and "
> -                         "incompatible with -spice port/tls-port");
> -            exit(1);
> +            streaming_client = 1;
>          }
>          if (egl_rendernode_init(qemu_opt_get(opts, "rendernode"),
>                                  DISPLAYGL_MODE_ON) != 0) {
> diff --git a/ui/spice-display.c b/ui/spice-display.c
> index 494168e7fe..fe85604c2e 100644
> --- a/ui/spice-display.c
> +++ b/ui/spice-display.c
> @@ -28,6 +28,7 @@
>  #include "ui/spice-display.h"
>
>  bool spice_opengl;
> +bool streaming_client;
>
>  int qemu_spice_rect_is_empty(const QXLRect* r)
>  {
> @@ -891,6 +892,9 @@ static void spice_gl_switch(DisplayChangeListener *dcl,
>      }
>      ssd->ds = new_surface;
>      if (ssd->ds) {
> +        if (streaming_client) {
> +            qemu_spice_create_host_primary(ssd);
> +        }
>          surface_gl_create_texture(ssd->gls, ssd->ds);
>          fd = egl_get_fd_for_texture(ssd->ds->texture,
>
> I did not yet post this patch to the Qemu mailing list because I still need to implement
> feature negotiation between Qemu and Spice to auto-detect this capability. And,
> in addition to this patch, you also need the patch that adds the "preferred-codec"
> option to Qemu, unless you are hardcoding it in Spice:
> https://lists.nongnu.org/archive/html/qemu-devel/2023-01/msg04999.html
>

Yes, I hardcoded that in SPICE. Note that I posted a comment in that
commit, I think it's valid as it is.
Also I think it should not change the SPICE default.

> Lastly, not sure if it makes a difference, but here are the relevant options I am
> using to launch Qemu:
> -device virtio-gpu-pci,max_outputs=1,blob=true,xres=1920,yres=1080
> -spice port=3001,gl=on,disable-ticketing=on,preferred-codec=gstreamer:h264
> -object memory-backend-memfd,id=mem1,size=4096M
> -machine memory-backend=mem1 -usb -device usb-tablet -serial stdio
>
> Thanks,
> Vivek
>

I will try again.

Thanks,
  Frediano

> >
> > On the logs I find:
> >
> > 2023-03-25T19:31:36.034007Z qemu-system-x86_64: warning: Spice:
> > ../server/dcc-send.cpp:1786:red_marshall_gl_draw_stream: bad return
> > value (0) from VideoEncoder::encode_dmabuf
> > 2023-03-25T19:31:37.064219Z qemu-system-x86_64: warning: spice: no
> > gl-draw-done within one second
> > 2023-03-25T19:31:58.214387Z qemu-system-x86_64: warning: Spice:
> > Connection reset by peer
> > 2023-03-25T19:31:58.214482Z qemu-system-x86_64: warning: Spice:
> > Connection reset by peer
> > 2023-03-25T19:31:58.214580Z qemu-system-x86_64: warning: Spice:
> > Connection reset by peer
> > 2023-03-25T19:31:58.214642Z 2023-03-25T19:31:58.214636Z
> > qemu-system-x86_64:qemu-system-x86_64:  warning: Spice: Connection
> > reset by peer
> > warning: Spice: display:0 (0x55947e76fd10): Connection reset by peer
> > 2023-03-25T19:31:58.214721Z qemu-system-x86_64: warning: Spice:
> > Connection reset by peer
> > 2023-03-25T19:31:58.214841Z qemu-system-x86_64: warning: Spice:
> > Connection reset by peer
> > 2023-03-25T19:31:58.215057Z qemu-system-x86_64: warning: Spice:
> > Connection reset by peer
> >
> > 0 value from encode_dmabuf should mean VIDEO_ENCODER_FRAME_DROP.
> >
> > Regards,
> >    Frediano
> >
> > Il giorno gio 16 mar 2023 alle ore 06:05 Vivek Kasireddy
> > <vivek.kasireddy at intel.com> ha scritto:
> > >
> > > For clients that cannot accept a dmabuf fd directly (such as those
> > > running on a remote system), this patch series provides a way for
> > > the Spice server to stream the gl/dmabuf data/buffer instead. This
> > > is mostly done by enabling the creation of Gst memory using a dmabuf
> > > fd as the source. This ability is useful given that dmabuf is the
> > > standard mechanism for sharing buffers between various drivers and
> > > userspace in many Graphics and Media usecases. Currently, this is
> > > only used/tested with Qemu and remote-viewer using the x264enc/dec
> > > codec to stream the Guest/VM desktop but it can be easily extended
> > > to other plugins and applications.
> > >
> > > Here is roughly how things work:
> > > - The application (e.g, Qemu) chooses its preferred codec (a Gstreamer
> > >   one) and calls gl_scanout (to update the fd) followed by gl_draw.
> > > - In response, the Spice server checks to see if the client is capable
> > >   of accepting a dmabuf fd directly or not. If yes, the fd is forwarded
> > >   directly to the client; otherwise, a new stream is created.
> > > - The Spice server then sends the dmabuf fd to the Gstreamer encoder
> > >   which uses it as an input for creating an encoded buffer which is then
> > >   sent to the client.
> > > - Once the encoding process is done, an async completion cookie is sent
> > >   to the application.
> > >
> > > Here is a link to the previous version that used a drawable to share
> > > the dmabuf fd with the Gstreamer encoder:
> > > https://lists.freedesktop.org/archives/spice-devel/2023-January/052948.html
> > >
> > > Cc: Frediano Ziglio <freddy77 at gmail.com>
> > > Cc: Gerd Hoffmann <kraxel at redhat.com>
> > > Cc: Marc-André Lureau <marcandre.lureau at redhat.com>
> > > Cc: Dongwon Kim <dongwon.kim at intel.com>
> > >
> > > Vivek Kasireddy (5):
> > >   dcc: Check to see if the client supports multiple codecs
> > >   dcc: Create a stream associated with gl_draw for non-gl clients
> > >   dcc-send: Encode and send gl_draw stream data to the remote client
> > >   gstreamer-encoder: Add an encoder function that takes dmabuf fd as
> > >     input
> > >   video-stream: Don't stop a stream if a gl_draw operation is pending
> > >
> > >  meson.build                      |   2 +-
> > >  server/dcc-private.h             |   4 ++
> > >  server/dcc-send.cpp              |  89 ++++++++++++++++++++++-
> > >  server/dcc.cpp                   |  36 +++++++---
> > >  server/display-channel-private.h |   6 ++
> > >  server/gstreamer-encoder.c       | 119 ++++++++++++++++++++++++++++++-
> > >  server/video-encoder.h           |  13 ++++
> > >  server/video-stream.cpp          |  65 ++++++++++++++++-
> > >  server/video-stream.h            |   2 +
> > >  9 files changed, 319 insertions(+), 17 deletions(-)
> > >
> > > --
> > > 2.37.2
> > >


More information about the Spice-devel mailing list