xref: /qemu/docs/interop/vhost-user-gpu.rst (revision 76ca4b58c295e154dfe9c2405141e81ce928c19c)
1bd2e44feSMarc-André Lureau=======================
2bd2e44feSMarc-André LureauVhost-user-gpu Protocol
3bd2e44feSMarc-André Lureau=======================
4bd2e44feSMarc-André Lureau
5bd2e44feSMarc-André Lureau:Licence: This work is licensed under the terms of the GNU GPL,
6bd2e44feSMarc-André Lureau          version 2 or later. See the COPYING file in the top-level
7bd2e44feSMarc-André Lureau          directory.
8bd2e44feSMarc-André Lureau
9bd2e44feSMarc-André Lureau.. contents:: Table of Contents
10bd2e44feSMarc-André Lureau
11bd2e44feSMarc-André LureauIntroduction
12bd2e44feSMarc-André Lureau============
13bd2e44feSMarc-André Lureau
14bd2e44feSMarc-André LureauThe vhost-user-gpu protocol is aiming at sharing the rendering result
15bd2e44feSMarc-André Lureauof a virtio-gpu, done from a vhost-user slave process to a vhost-user
16bd2e44feSMarc-André Lureaumaster process (such as QEMU). It bears a resemblance to a display
17bd2e44feSMarc-André Lureauserver protocol, if you consider QEMU as the display server and the
18bd2e44feSMarc-André Lureauslave as the client, but in a very limited way. Typically, it will
19bd2e44feSMarc-André Lureauwork by setting a scanout/display configuration, before sending flush
20bd2e44feSMarc-André Lureauevents for the display updates. It will also update the cursor shape
21bd2e44feSMarc-André Lureauand position.
22bd2e44feSMarc-André Lureau
23bd2e44feSMarc-André LureauThe protocol is sent over a UNIX domain stream socket, since it uses
24bd2e44feSMarc-André Lureausocket ancillary data to share opened file descriptors (DMABUF fds or
25bd2e44feSMarc-André Lureaushared memory). The socket is usually obtained via
26bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SET_SOCKET``.
27bd2e44feSMarc-André Lureau
28bd2e44feSMarc-André LureauRequests are sent by the *slave*, and the optional replies by the
29bd2e44feSMarc-André Lureau*master*.
30bd2e44feSMarc-André Lureau
31bd2e44feSMarc-André LureauWire format
32bd2e44feSMarc-André Lureau===========
33bd2e44feSMarc-André Lureau
34bd2e44feSMarc-André LureauUnless specified differently, numbers are in the machine native byte
35bd2e44feSMarc-André Lureauorder.
36bd2e44feSMarc-André Lureau
37bd2e44feSMarc-André LureauA vhost-user-gpu message (request and reply) consists of 3 header
38bd2e44feSMarc-André Lureaufields and a payload.
39bd2e44feSMarc-André Lureau
40bd2e44feSMarc-André Lureau+---------+-------+------+---------+
41bd2e44feSMarc-André Lureau| request | flags | size | payload |
42bd2e44feSMarc-André Lureau+---------+-------+------+---------+
43bd2e44feSMarc-André Lureau
44bd2e44feSMarc-André LureauHeader
45bd2e44feSMarc-André Lureau------
46bd2e44feSMarc-André Lureau
47bd2e44feSMarc-André Lureau:request: ``u32``, type of the request
48bd2e44feSMarc-André Lureau
49bd2e44feSMarc-André Lureau:flags: ``u32``, 32-bit bit field:
50bd2e44feSMarc-André Lureau
51bd2e44feSMarc-André Lureau - Bit 2 is the reply flag - needs to be set on each reply
52bd2e44feSMarc-André Lureau
53bd2e44feSMarc-André Lureau:size: ``u32``, size of the payload
54bd2e44feSMarc-André Lureau
55bd2e44feSMarc-André LureauPayload types
56bd2e44feSMarc-André Lureau-------------
57bd2e44feSMarc-André Lureau
58bd2e44feSMarc-André LureauDepending on the request type, **payload** can be:
59bd2e44feSMarc-André Lureau
60bd2e44feSMarc-André LureauVhostUserGpuCursorPos
61bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^^^
62bd2e44feSMarc-André Lureau
63bd2e44feSMarc-André Lureau+------------+---+---+
64bd2e44feSMarc-André Lureau| scanout-id | x | y |
65bd2e44feSMarc-André Lureau+------------+---+---+
66bd2e44feSMarc-André Lureau
67bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout where the cursor is located
68bd2e44feSMarc-André Lureau
69*76ca4b58Szhaolichang:x/y: ``u32``, the cursor position
70bd2e44feSMarc-André Lureau
71bd2e44feSMarc-André LureauVhostUserGpuCursorUpdate
72bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^^^^^^
73bd2e44feSMarc-André Lureau
74bd2e44feSMarc-André Lureau+-----+-------+-------+--------+
75bd2e44feSMarc-André Lureau| pos | hot_x | hot_y | cursor |
76bd2e44feSMarc-André Lureau+-----+-------+-------+--------+
77bd2e44feSMarc-André Lureau
78bd2e44feSMarc-André Lureau:pos: a ``VhostUserGpuCursorPos``, the cursor location
79bd2e44feSMarc-André Lureau
80bd2e44feSMarc-André Lureau:hot_x/hot_y: ``u32``, the cursor hot location
81bd2e44feSMarc-André Lureau
82bd2e44feSMarc-André Lureau:cursor: ``[u32; 64 * 64]``, 64x64 RGBA cursor data (PIXMAN_a8r8g8b8 format)
83bd2e44feSMarc-André Lureau
84bd2e44feSMarc-André LureauVhostUserGpuScanout
85bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^
86bd2e44feSMarc-André Lureau
87bd2e44feSMarc-André Lureau+------------+---+---+
88bd2e44feSMarc-André Lureau| scanout-id | w | h |
89bd2e44feSMarc-André Lureau+------------+---+---+
90bd2e44feSMarc-André Lureau
91bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout configuration to set
92bd2e44feSMarc-André Lureau
93bd2e44feSMarc-André Lureau:w/h: ``u32``, the scanout width/height size
94bd2e44feSMarc-André Lureau
95bd2e44feSMarc-André LureauVhostUserGpuUpdate
96bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^
97bd2e44feSMarc-André Lureau
98bd2e44feSMarc-André Lureau+------------+---+---+---+---+------+
99bd2e44feSMarc-André Lureau| scanout-id | x | y | w | h | data |
100bd2e44feSMarc-André Lureau+------------+---+---+---+---+------+
101bd2e44feSMarc-André Lureau
102bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout content to update
103bd2e44feSMarc-André Lureau
104bd2e44feSMarc-André Lureau:x/y/w/h: ``u32``, region of the update
105bd2e44feSMarc-André Lureau
106bd2e44feSMarc-André Lureau:data: RGB data (PIXMAN_x8r8g8b8 format)
107bd2e44feSMarc-André Lureau
108bd2e44feSMarc-André LureauVhostUserGpuDMABUFScanout
109bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^^^^^^^
110bd2e44feSMarc-André Lureau
111bd2e44feSMarc-André Lureau+------------+---+---+---+---+-----+-----+--------+-------+--------+
112bd2e44feSMarc-André Lureau| scanout-id | x | y | w | h | fdw | fwh | stride | flags | fourcc |
113bd2e44feSMarc-André Lureau+------------+---+---+---+---+-----+-----+--------+-------+--------+
114bd2e44feSMarc-André Lureau
115bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout configuration to set
116bd2e44feSMarc-André Lureau
117bd2e44feSMarc-André Lureau:x/y: ``u32``, the location of the scanout within the DMABUF
118bd2e44feSMarc-André Lureau
119bd2e44feSMarc-André Lureau:w/h: ``u32``, the scanout width/height size
120bd2e44feSMarc-André Lureau
121bd2e44feSMarc-André Lureau:fdw/fdh/stride/flags: ``u32``, the DMABUF width/height/stride/flags
122bd2e44feSMarc-André Lureau
123bd2e44feSMarc-André Lureau:fourcc: ``i32``, the DMABUF fourcc
124bd2e44feSMarc-André Lureau
125bd2e44feSMarc-André Lureau
126bd2e44feSMarc-André LureauC structure
127bd2e44feSMarc-André Lureau-----------
128bd2e44feSMarc-André Lureau
129bd2e44feSMarc-André LureauIn QEMU the vhost-user-gpu message is implemented with the following struct:
130bd2e44feSMarc-André Lureau
131bd2e44feSMarc-André Lureau.. code:: c
132bd2e44feSMarc-André Lureau
133bd2e44feSMarc-André Lureau  typedef struct VhostUserGpuMsg {
134bd2e44feSMarc-André Lureau      uint32_t request; /* VhostUserGpuRequest */
135bd2e44feSMarc-André Lureau      uint32_t flags;
136bd2e44feSMarc-André Lureau      uint32_t size; /* the following payload size */
137bd2e44feSMarc-André Lureau      union {
138bd2e44feSMarc-André Lureau          VhostUserGpuCursorPos cursor_pos;
139bd2e44feSMarc-André Lureau          VhostUserGpuCursorUpdate cursor_update;
140bd2e44feSMarc-André Lureau          VhostUserGpuScanout scanout;
141bd2e44feSMarc-André Lureau          VhostUserGpuUpdate update;
142bd2e44feSMarc-André Lureau          VhostUserGpuDMABUFScanout dmabuf_scanout;
143bd2e44feSMarc-André Lureau          struct virtio_gpu_resp_display_info display_info;
144bd2e44feSMarc-André Lureau          uint64_t u64;
145bd2e44feSMarc-André Lureau      } payload;
146bd2e44feSMarc-André Lureau  } QEMU_PACKED VhostUserGpuMsg;
147bd2e44feSMarc-André Lureau
148bd2e44feSMarc-André LureauProtocol features
149bd2e44feSMarc-André Lureau-----------------
150bd2e44feSMarc-André Lureau
151bd2e44feSMarc-André LureauNone yet.
152bd2e44feSMarc-André Lureau
153bd2e44feSMarc-André LureauAs the protocol may need to evolve, new messages and communication
154bd2e44feSMarc-André Lureauchanges are negotiated thanks to preliminary
155bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_PROTOCOL_FEATURES`` and
156bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SET_PROTOCOL_FEATURES`` requests.
157bd2e44feSMarc-André Lureau
158bd2e44feSMarc-André LureauCommunication
159bd2e44feSMarc-André Lureau=============
160bd2e44feSMarc-André Lureau
161bd2e44feSMarc-André LureauMessage types
162bd2e44feSMarc-André Lureau-------------
163bd2e44feSMarc-André Lureau
164bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_PROTOCOL_FEATURES``
165bd2e44feSMarc-André Lureau  :id: 1
166bd2e44feSMarc-André Lureau  :request payload: N/A
167bd2e44feSMarc-André Lureau  :reply payload: ``u64``
168bd2e44feSMarc-André Lureau
169bd2e44feSMarc-André Lureau  Get the supported protocol features bitmask.
170bd2e44feSMarc-André Lureau
171bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SET_PROTOCOL_FEATURES``
172bd2e44feSMarc-André Lureau  :id: 2
173bd2e44feSMarc-André Lureau  :request payload: ``u64``
174bd2e44feSMarc-André Lureau  :reply payload: N/A
175bd2e44feSMarc-André Lureau
176bd2e44feSMarc-André Lureau  Enable protocol features using a bitmask.
177bd2e44feSMarc-André Lureau
178bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_DISPLAY_INFO``
179bd2e44feSMarc-André Lureau  :id: 3
180bd2e44feSMarc-André Lureau  :request payload: N/A
181bd2e44feSMarc-André Lureau  :reply payload: ``struct virtio_gpu_resp_display_info`` (from virtio specification)
182bd2e44feSMarc-André Lureau
183bd2e44feSMarc-André Lureau  Get the preferred display configuration.
184bd2e44feSMarc-André Lureau
185bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_POS``
186bd2e44feSMarc-André Lureau  :id: 4
187bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuCursorPos``
188bd2e44feSMarc-André Lureau  :reply payload: N/A
189bd2e44feSMarc-André Lureau
190bd2e44feSMarc-André Lureau  Set/show the cursor position.
191bd2e44feSMarc-André Lureau
192bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_POS_HIDE``
193bd2e44feSMarc-André Lureau  :id: 5
194bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuCursorPos``
195bd2e44feSMarc-André Lureau  :reply payload: N/A
196bd2e44feSMarc-André Lureau
197bd2e44feSMarc-André Lureau  Set/hide the cursor.
198bd2e44feSMarc-André Lureau
199bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_UPDATE``
200bd2e44feSMarc-André Lureau  :id: 6
201bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuCursorUpdate``
202bd2e44feSMarc-André Lureau  :reply payload: N/A
203bd2e44feSMarc-André Lureau
204bd2e44feSMarc-André Lureau  Update the cursor shape and location.
205bd2e44feSMarc-André Lureau
206bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SCANOUT``
207bd2e44feSMarc-André Lureau  :id: 7
208bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuScanout``
209bd2e44feSMarc-André Lureau  :reply payload: N/A
210bd2e44feSMarc-André Lureau
211bd2e44feSMarc-André Lureau  Set the scanout resolution. To disable a scanout, the dimensions
212bd2e44feSMarc-André Lureau  width/height are set to 0.
213bd2e44feSMarc-André Lureau
214bd2e44feSMarc-André Lureau``VHOST_USER_GPU_UPDATE``
215bd2e44feSMarc-André Lureau  :id: 8
216bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuUpdate``
217bd2e44feSMarc-André Lureau  :reply payload: N/A
218bd2e44feSMarc-André Lureau
219bd2e44feSMarc-André Lureau  Update the scanout content. The data payload contains the graphical bits.
220bd2e44feSMarc-André Lureau  The display should be flushed and presented.
221bd2e44feSMarc-André Lureau
222bd2e44feSMarc-André Lureau``VHOST_USER_GPU_DMABUF_SCANOUT``
223bd2e44feSMarc-André Lureau  :id: 9
224bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuDMABUFScanout``
225bd2e44feSMarc-André Lureau  :reply payload: N/A
226bd2e44feSMarc-André Lureau
227bd2e44feSMarc-André Lureau  Set the scanout resolution/configuration, and share a DMABUF file
228bd2e44feSMarc-André Lureau  descriptor for the scanout content, which is passed as ancillary
229bd2e44feSMarc-André Lureau  data. To disable a scanout, the dimensions width/height are set
230bd2e44feSMarc-André Lureau  to 0, there is no file descriptor passed.
231bd2e44feSMarc-André Lureau
232bd2e44feSMarc-André Lureau``VHOST_USER_GPU_DMABUF_UPDATE``
233bd2e44feSMarc-André Lureau  :id: 10
234bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuUpdate``
235bd2e44feSMarc-André Lureau  :reply payload: empty payload
236bd2e44feSMarc-André Lureau
237bd2e44feSMarc-André Lureau  The display should be flushed and presented according to updated
238bd2e44feSMarc-André Lureau  region from ``VhostUserGpuUpdate``.
239bd2e44feSMarc-André Lureau
240bd2e44feSMarc-André Lureau  Note: there is no data payload, since the scanout is shared thanks
241bd2e44feSMarc-André Lureau  to DMABUF, that must have been set previously with
242bd2e44feSMarc-André Lureau  ``VHOST_USER_GPU_DMABUF_SCANOUT``.
243