123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- =======================
- Vhost-user-gpu Protocol
- =======================
- :Licence: This work is licensed under the terms of the GNU GPL,
- version 2 or later. See the COPYING file in the top-level
- directory.
- .. contents:: Table of Contents
- Introduction
- ============
- The vhost-user-gpu protocol is aiming at sharing the rendering result
- of a virtio-gpu, done from a vhost-user slave process to a vhost-user
- master process (such as QEMU). It bears a resemblance to a display
- server protocol, if you consider QEMU as the display server and the
- slave as the client, but in a very limited way. Typically, it will
- work by setting a scanout/display configuration, before sending flush
- events for the display updates. It will also update the cursor shape
- and position.
- The protocol is sent over a UNIX domain stream socket, since it uses
- socket ancillary data to share opened file descriptors (DMABUF fds or
- shared memory). The socket is usually obtained via
- ``VHOST_USER_GPU_SET_SOCKET``.
- Requests are sent by the *slave*, and the optional replies by the
- *master*.
- Wire format
- ===========
- Unless specified differently, numbers are in the machine native byte
- order.
- A vhost-user-gpu message (request and reply) consists of 3 header
- fields and a payload.
- +---------+-------+------+---------+
- | request | flags | size | payload |
- +---------+-------+------+---------+
- Header
- ------
- :request: ``u32``, type of the request
- :flags: ``u32``, 32-bit bit field:
- - Bit 2 is the reply flag - needs to be set on each reply
- :size: ``u32``, size of the payload
- Payload types
- -------------
- Depending on the request type, **payload** can be:
- VhostUserGpuCursorPos
- ^^^^^^^^^^^^^^^^^^^^^
- +------------+---+---+
- | scanout-id | x | y |
- +------------+---+---+
- :scanout-id: ``u32``, the scanout where the cursor is located
- :x/y: ``u32``, the cursor postion
- VhostUserGpuCursorUpdate
- ^^^^^^^^^^^^^^^^^^^^^^^^
- +-----+-------+-------+--------+
- | pos | hot_x | hot_y | cursor |
- +-----+-------+-------+--------+
- :pos: a ``VhostUserGpuCursorPos``, the cursor location
- :hot_x/hot_y: ``u32``, the cursor hot location
- :cursor: ``[u32; 64 * 64]``, 64x64 RGBA cursor data (PIXMAN_a8r8g8b8 format)
- VhostUserGpuScanout
- ^^^^^^^^^^^^^^^^^^^
- +------------+---+---+
- | scanout-id | w | h |
- +------------+---+---+
- :scanout-id: ``u32``, the scanout configuration to set
- :w/h: ``u32``, the scanout width/height size
- VhostUserGpuUpdate
- ^^^^^^^^^^^^^^^^^^
- +------------+---+---+---+---+------+
- | scanout-id | x | y | w | h | data |
- +------------+---+---+---+---+------+
- :scanout-id: ``u32``, the scanout content to update
- :x/y/w/h: ``u32``, region of the update
- :data: RGB data (PIXMAN_x8r8g8b8 format)
- VhostUserGpuDMABUFScanout
- ^^^^^^^^^^^^^^^^^^^^^^^^^
- +------------+---+---+---+---+-----+-----+--------+-------+--------+
- | scanout-id | x | y | w | h | fdw | fwh | stride | flags | fourcc |
- +------------+---+---+---+---+-----+-----+--------+-------+--------+
- :scanout-id: ``u32``, the scanout configuration to set
- :x/y: ``u32``, the location of the scanout within the DMABUF
- :w/h: ``u32``, the scanout width/height size
- :fdw/fdh/stride/flags: ``u32``, the DMABUF width/height/stride/flags
- :fourcc: ``i32``, the DMABUF fourcc
- C structure
- -----------
- In QEMU the vhost-user-gpu message is implemented with the following struct:
- .. code:: c
- typedef struct VhostUserGpuMsg {
- uint32_t request; /* VhostUserGpuRequest */
- uint32_t flags;
- uint32_t size; /* the following payload size */
- union {
- VhostUserGpuCursorPos cursor_pos;
- VhostUserGpuCursorUpdate cursor_update;
- VhostUserGpuScanout scanout;
- VhostUserGpuUpdate update;
- VhostUserGpuDMABUFScanout dmabuf_scanout;
- struct virtio_gpu_resp_display_info display_info;
- uint64_t u64;
- } payload;
- } QEMU_PACKED VhostUserGpuMsg;
- Protocol features
- -----------------
- None yet.
- As the protocol may need to evolve, new messages and communication
- changes are negotiated thanks to preliminary
- ``VHOST_USER_GPU_GET_PROTOCOL_FEATURES`` and
- ``VHOST_USER_GPU_SET_PROTOCOL_FEATURES`` requests.
- Communication
- =============
- Message types
- -------------
- ``VHOST_USER_GPU_GET_PROTOCOL_FEATURES``
- :id: 1
- :request payload: N/A
- :reply payload: ``u64``
- Get the supported protocol features bitmask.
- ``VHOST_USER_GPU_SET_PROTOCOL_FEATURES``
- :id: 2
- :request payload: ``u64``
- :reply payload: N/A
- Enable protocol features using a bitmask.
- ``VHOST_USER_GPU_GET_DISPLAY_INFO``
- :id: 3
- :request payload: N/A
- :reply payload: ``struct virtio_gpu_resp_display_info`` (from virtio specification)
- Get the preferred display configuration.
- ``VHOST_USER_GPU_CURSOR_POS``
- :id: 4
- :request payload: ``VhostUserGpuCursorPos``
- :reply payload: N/A
- Set/show the cursor position.
- ``VHOST_USER_GPU_CURSOR_POS_HIDE``
- :id: 5
- :request payload: ``VhostUserGpuCursorPos``
- :reply payload: N/A
- Set/hide the cursor.
- ``VHOST_USER_GPU_CURSOR_UPDATE``
- :id: 6
- :request payload: ``VhostUserGpuCursorUpdate``
- :reply payload: N/A
- Update the cursor shape and location.
- ``VHOST_USER_GPU_SCANOUT``
- :id: 7
- :request payload: ``VhostUserGpuScanout``
- :reply payload: N/A
- Set the scanout resolution. To disable a scanout, the dimensions
- width/height are set to 0.
- ``VHOST_USER_GPU_UPDATE``
- :id: 8
- :request payload: ``VhostUserGpuUpdate``
- :reply payload: N/A
- Update the scanout content. The data payload contains the graphical bits.
- The display should be flushed and presented.
- ``VHOST_USER_GPU_DMABUF_SCANOUT``
- :id: 9
- :request payload: ``VhostUserGpuDMABUFScanout``
- :reply payload: N/A
- Set the scanout resolution/configuration, and share a DMABUF file
- descriptor for the scanout content, which is passed as ancillary
- data. To disable a scanout, the dimensions width/height are set
- to 0, there is no file descriptor passed.
- ``VHOST_USER_GPU_DMABUF_UPDATE``
- :id: 10
- :request payload: ``VhostUserGpuUpdate``
- :reply payload: empty payload
- The display should be flushed and presented according to updated
- region from ``VhostUserGpuUpdate``.
- Note: there is no data payload, since the scanout is shared thanks
- to DMABUF, that must have been set previously with
- ``VHOST_USER_GPU_DMABUF_SCANOUT``.
|