[Spice-devel] [PATCH spice-protocol] Add unix GL scanout messages

Frediano Ziglio fziglio at redhat.com
Mon Dec 21 08:41:49 PST 2015


> 
> Add 2 new messages to the display channel to stream pre-rendered GL
> images of the display. This is only possible when the client supports
> SPICE_DISPLAY_CAP_GL_SCANOUT capability.
> 
> The first message, SPICE_MSG_DISPLAY_GL_SCANOUT_UNIX, sends a gl image
> file handle via socket ancillary data, and can be imported in a GL
> context with the help of eglCreateImageKHR() (as with the 2d canvas, the
> SPICE_MSG_DISPLAY_MONITORS_CONFIG will give the monitors
> coordinates (x/y/w/h) within the image). There can be only one scanount
> per display channel.
> 
> A SPICE_MSG_DISPLAY_GL_DRAW message is sent with the coordinate of the
> region within the scanount to (re)draw on the client display. For each
> draw, once the client is done with the rendering, it must acknowldge it
> by sending a SPICE_MSGC_DISPLAY_GL_DRAW_DONE message, in order to
> release the context (it is expected to improve this in the future with a
> cross-process GL fence).
> 
> The relation with the existing display channel messages is that all
> other messages are unchanged: the last drawing command received must be
> displayed. However the scanout display is all or nothing. Consequently,
> if a 2d canvas draw is received, the display must be switched to the
> drawn canvas. In other words, if the last message received is a GL draw
> the display should switch to the GL display, if it's a 2d draw message
> the display should be switched to the client 2d canvas.
> 
> (there will probably be a stipped-down "gl-only" channel in the future,
> or support for other streaming methods, but this protocol change should
> be enough for basic virgl or other gpu-accelerated support)
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
> ---
> v2->v3:
>  - change flags8 for flags32 (Frediano Ziglio)
> 
> spice.proto      | 25 ++++++++++++++++++++++++-
>  spice/enums.h    |  9 +++++++++
>  spice/protocol.h |  1 +
>  3 files changed, 34 insertions(+), 1 deletion(-)
> 
> diff --git a/spice.proto b/spice.proto
> index 3bca900..172d6e3 100644
> --- a/spice.proto
> +++ b/spice.proto
> @@ -678,6 +678,10 @@ struct Head {
>      uint32 flags;
>  };
>  
> +flags32 gl_scanout_flags {
> +    Y0TOP
> +};
> +
>  channel DisplayChannel : BaseChannel {
>   server:
>      message {
> @@ -915,7 +919,23 @@ channel DisplayChannel : BaseChannel {
>          uint32 timeout_ms;
>      } stream_activate_report;
>  
> - client:
> +    message {
> +        unix_fd fd;
> +        uint32 width;
> +        uint32 height;
> +        uint32 stride;
> +        uint32 format; /* drm fourcc */
> +        gl_scanout_flags flags;
> +    } gl_scanout_unix;
> +

I think names like drm_dma_buf_fd and drm_fourcc_format are much clearer
(other fields are fine).

I would like to see something like

   message {
       /* dma buffer exported by the Linux DRM layer */
       unix_fd drm_dma_buf_fd;
       uint32 width;
       uint32 height;
       uint32 stride;
       /* specifies the format of drm_dma_buf_fd defined in drm_fourcc.h */
       uint32 drm_fourcc_format;
       gl_scanout_flags flags;
   } gl_scanout_unix;

> +    message {
> +        uint32 x;
> +        uint32 y;
> +        uint32 w;
> +        uint32 h;
> +    } gl_draw;
> +

Why not "Rect box;" ?

> +client:
>      message {
>  	uint8 pixmap_cache_id;
>  	int64 pixmap_cache_size; //in pixels
> @@ -937,6 +957,9 @@ channel DisplayChannel : BaseChannel {
>      message {
>          image_compression image_compression;
>      } preferred_compression;
> +
> +    message {
> +    } gl_draw_done;
>  };
>  
>  flags16 keyboard_modifier_flags {
> diff --git a/spice/enums.h b/spice/enums.h
> index 16885ac..613db52 100644
> --- a/spice/enums.h
> +++ b/spice/enums.h
> @@ -303,6 +303,12 @@ typedef enum SpiceResourceType {
>      SPICE_RESOURCE_TYPE_ENUM_END
>  } SpiceResourceType;
>  
> +typedef enum SpiceGlScanoutFlags {
> +    SPICE_GL_SCANOUT_FLAGS_Y0TOP = (1 << 0),
> +
> +    SPICE_GL_SCANOUT_FLAGS_MASK = 0x1
> +} SpiceGlScanoutFlags;
> +
>  typedef enum SpiceKeyboardModifierFlags {
>      SPICE_KEYBOARD_MODIFIER_FLAGS_SCROLL_LOCK = (1 << 0),
>      SPICE_KEYBOARD_MODIFIER_FLAGS_NUM_LOCK = (1 << 1),
> @@ -503,6 +509,8 @@ enum {
>      SPICE_MSG_DISPLAY_MONITORS_CONFIG,
>      SPICE_MSG_DISPLAY_DRAW_COMPOSITE,
>      SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT,
> +    SPICE_MSG_DISPLAY_GL_SCANOUT_UNIX,

Sometimes I think SPICE_MSG_DISPLAY_GL_SCANOUT_LINUX would be
better in this case. dma_buf is really specific.
But I can live with _UNIX too.

> +    SPICE_MSG_DISPLAY_GL_DRAW,
>  
>      SPICE_MSG_END_DISPLAY
>  };
> @@ -511,6 +519,7 @@ enum {
>      SPICE_MSGC_DISPLAY_INIT = 101,
>      SPICE_MSGC_DISPLAY_STREAM_REPORT,
>      SPICE_MSGC_DISPLAY_PREFERRED_COMPRESSION,
> +    SPICE_MSGC_DISPLAY_GL_DRAW_DONE,
>  
>      SPICE_MSGC_END_DISPLAY
>  };
> diff --git a/spice/protocol.h b/spice/protocol.h
> index 0c265ee..3e6c624 100644
> --- a/spice/protocol.h
> +++ b/spice/protocol.h
> @@ -136,6 +136,7 @@ enum {
>      SPICE_DISPLAY_CAP_STREAM_REPORT,
>      SPICE_DISPLAY_CAP_LZ4_COMPRESSION,
>      SPICE_DISPLAY_CAP_PREF_COMPRESSION,
> +    SPICE_DISPLAY_CAP_GL_SCANOUT,
>  };
>  
>  enum {
> --
> 2.5.0

Frediano


More information about the Spice-devel mailing list