xref: /qemu/docs/interop/vhost-user-gpu.rst (revision 7754c97179a40c563935b7610aa3146291abefcc)
1bd2e44feSMarc-André Lureau=======================
2bd2e44feSMarc-André LureauVhost-user-gpu Protocol
3bd2e44feSMarc-André Lureau=======================
4bd2e44feSMarc-André Lureau
54e0b15c2SPeter Maydell..
64e0b15c2SPeter Maydell  Licence: This work is licensed under the terms of the GNU GPL,
7bd2e44feSMarc-André Lureau           version 2 or later. See the COPYING file in the top-level
8bd2e44feSMarc-André Lureau           directory.
9bd2e44feSMarc-André Lureau
10bd2e44feSMarc-André Lureau.. contents:: Table of Contents
11bd2e44feSMarc-André Lureau
12bd2e44feSMarc-André LureauIntroduction
13bd2e44feSMarc-André Lureau============
14bd2e44feSMarc-André Lureau
15bd2e44feSMarc-André LureauThe vhost-user-gpu protocol is aiming at sharing the rendering result
16bd59f2a1SPaolo Bonziniof a virtio-gpu, done from a vhost-user back-end process to a vhost-user
17bd59f2a1SPaolo Bonzinifront-end process (such as QEMU). It bears a resemblance to a display
18bd2e44feSMarc-André Lureauserver protocol, if you consider QEMU as the display server and the
19bd59f2a1SPaolo Bonziniback-end as the client, but in a very limited way. Typically, it will
20bd2e44feSMarc-André Lureauwork by setting a scanout/display configuration, before sending flush
21bd2e44feSMarc-André Lureauevents for the display updates. It will also update the cursor shape
22bd2e44feSMarc-André Lureauand position.
23bd2e44feSMarc-André Lureau
24bd2e44feSMarc-André LureauThe protocol is sent over a UNIX domain stream socket, since it uses
25bd2e44feSMarc-André Lureausocket ancillary data to share opened file descriptors (DMABUF fds or
26bd2e44feSMarc-André Lureaushared memory). The socket is usually obtained via
27bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SET_SOCKET``.
28bd2e44feSMarc-André Lureau
29bd59f2a1SPaolo BonziniRequests are sent by the *back-end*, and the optional replies by the
30bd59f2a1SPaolo Bonzini*front-end*.
31bd2e44feSMarc-André Lureau
32bd2e44feSMarc-André LureauWire format
33bd2e44feSMarc-André Lureau===========
34bd2e44feSMarc-André Lureau
35bd2e44feSMarc-André LureauUnless specified differently, numbers are in the machine native byte
36bd2e44feSMarc-André Lureauorder.
37bd2e44feSMarc-André Lureau
38bd2e44feSMarc-André LureauA vhost-user-gpu message (request and reply) consists of 3 header
39bd2e44feSMarc-André Lureaufields and a payload.
40bd2e44feSMarc-André Lureau
41bd2e44feSMarc-André Lureau+---------+-------+------+---------+
42bd2e44feSMarc-André Lureau| request | flags | size | payload |
43bd2e44feSMarc-André Lureau+---------+-------+------+---------+
44bd2e44feSMarc-André Lureau
45bd2e44feSMarc-André LureauHeader
46bd2e44feSMarc-André Lureau------
47bd2e44feSMarc-André Lureau
48bd2e44feSMarc-André Lureau:request: ``u32``, type of the request
49bd2e44feSMarc-André Lureau
50bd2e44feSMarc-André Lureau:flags: ``u32``, 32-bit bit field:
51bd2e44feSMarc-André Lureau
52bd2e44feSMarc-André Lureau - Bit 2 is the reply flag - needs to be set on each reply
53bd2e44feSMarc-André Lureau
54bd2e44feSMarc-André Lureau:size: ``u32``, size of the payload
55bd2e44feSMarc-André Lureau
56bd2e44feSMarc-André LureauPayload types
57bd2e44feSMarc-André Lureau-------------
58bd2e44feSMarc-André Lureau
59bd2e44feSMarc-André LureauDepending on the request type, **payload** can be:
60bd2e44feSMarc-André Lureau
61bd2e44feSMarc-André LureauVhostUserGpuCursorPos
62bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^^^
63bd2e44feSMarc-André Lureau
64bd2e44feSMarc-André Lureau+------------+---+---+
65bd2e44feSMarc-André Lureau| scanout-id | x | y |
66bd2e44feSMarc-André Lureau+------------+---+---+
67bd2e44feSMarc-André Lureau
68bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout where the cursor is located
69bd2e44feSMarc-André Lureau
7076ca4b58Szhaolichang:x/y: ``u32``, the cursor position
71bd2e44feSMarc-André Lureau
72bd2e44feSMarc-André LureauVhostUserGpuCursorUpdate
73bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^^^^^^
74bd2e44feSMarc-André Lureau
75bd2e44feSMarc-André Lureau+-----+-------+-------+--------+
76bd2e44feSMarc-André Lureau| pos | hot_x | hot_y | cursor |
77bd2e44feSMarc-André Lureau+-----+-------+-------+--------+
78bd2e44feSMarc-André Lureau
79bd2e44feSMarc-André Lureau:pos: a ``VhostUserGpuCursorPos``, the cursor location
80bd2e44feSMarc-André Lureau
81bd2e44feSMarc-André Lureau:hot_x/hot_y: ``u32``, the cursor hot location
82bd2e44feSMarc-André Lureau
83bd2e44feSMarc-André Lureau:cursor: ``[u32; 64 * 64]``, 64x64 RGBA cursor data (PIXMAN_a8r8g8b8 format)
84bd2e44feSMarc-André Lureau
85bd2e44feSMarc-André LureauVhostUserGpuScanout
86bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^
87bd2e44feSMarc-André Lureau
88bd2e44feSMarc-André Lureau+------------+---+---+
89bd2e44feSMarc-André Lureau| scanout-id | w | h |
90bd2e44feSMarc-André Lureau+------------+---+---+
91bd2e44feSMarc-André Lureau
92bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout configuration to set
93bd2e44feSMarc-André Lureau
94bd2e44feSMarc-André Lureau:w/h: ``u32``, the scanout width/height size
95bd2e44feSMarc-André Lureau
96bd2e44feSMarc-André LureauVhostUserGpuUpdate
97bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^
98bd2e44feSMarc-André Lureau
99bd2e44feSMarc-André Lureau+------------+---+---+---+---+------+
100bd2e44feSMarc-André Lureau| scanout-id | x | y | w | h | data |
101bd2e44feSMarc-André Lureau+------------+---+---+---+---+------+
102bd2e44feSMarc-André Lureau
103bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout content to update
104bd2e44feSMarc-André Lureau
105bd2e44feSMarc-André Lureau:x/y/w/h: ``u32``, region of the update
106bd2e44feSMarc-André Lureau
107bd2e44feSMarc-André Lureau:data: RGB data (PIXMAN_x8r8g8b8 format)
108bd2e44feSMarc-André Lureau
109bd2e44feSMarc-André LureauVhostUserGpuDMABUFScanout
110bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^^^^^^^
111bd2e44feSMarc-André Lureau
112bd2e44feSMarc-André Lureau+------------+---+---+---+---+-----+-----+--------+-------+--------+
113bd2e44feSMarc-André Lureau| scanout-id | x | y | w | h | fdw | fwh | stride | flags | fourcc |
114bd2e44feSMarc-André Lureau+------------+---+---+---+---+-----+-----+--------+-------+--------+
115bd2e44feSMarc-André Lureau
116bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout configuration to set
117bd2e44feSMarc-André Lureau
118bd2e44feSMarc-André Lureau:x/y: ``u32``, the location of the scanout within the DMABUF
119bd2e44feSMarc-André Lureau
120bd2e44feSMarc-André Lureau:w/h: ``u32``, the scanout width/height size
121bd2e44feSMarc-André Lureau
122bd2e44feSMarc-André Lureau:fdw/fdh/stride/flags: ``u32``, the DMABUF width/height/stride/flags
123bd2e44feSMarc-André Lureau
124bd2e44feSMarc-André Lureau:fourcc: ``i32``, the DMABUF fourcc
125bd2e44feSMarc-André Lureau
126bd2e44feSMarc-André Lureau
12750cbd5b4SErico NunesVhostUserGpuEdidRequest
12850cbd5b4SErico Nunes^^^^^^^^^^^^^^^^^^^^^^^
12950cbd5b4SErico Nunes
13050cbd5b4SErico Nunes+------------+
13150cbd5b4SErico Nunes| scanout-id |
13250cbd5b4SErico Nunes+------------+
13350cbd5b4SErico Nunes
13450cbd5b4SErico Nunes:scanout-id: ``u32``, the scanout to get edid from
13550cbd5b4SErico Nunes
13650cbd5b4SErico Nunes
137*75f217b4SErico NunesVhostUserGpuDMABUFScanout2
138*75f217b4SErico Nunes^^^^^^^^^^^^^^^^^^^^^^^^^^
139*75f217b4SErico Nunes
140*75f217b4SErico Nunes+----------------+----------+
141*75f217b4SErico Nunes| dmabuf_scanout | modifier |
142*75f217b4SErico Nunes+----------------+----------+
143*75f217b4SErico Nunes
144*75f217b4SErico Nunes:dmabuf_scanout: ``VhostUserGpuDMABUFScanout``, filled as described in the
145*75f217b4SErico Nunes                 VhostUserGpuDMABUFScanout structure.
146*75f217b4SErico Nunes
147*75f217b4SErico Nunes:modifier: ``u64``, the DMABUF modifiers
148*75f217b4SErico Nunes
149*75f217b4SErico Nunes
150bd2e44feSMarc-André LureauC structure
151bd2e44feSMarc-André Lureau-----------
152bd2e44feSMarc-André Lureau
153bd2e44feSMarc-André LureauIn QEMU the vhost-user-gpu message is implemented with the following struct:
154bd2e44feSMarc-André Lureau
155bd2e44feSMarc-André Lureau.. code:: c
156bd2e44feSMarc-André Lureau
157bd2e44feSMarc-André Lureau  typedef struct VhostUserGpuMsg {
158bd2e44feSMarc-André Lureau      uint32_t request; /* VhostUserGpuRequest */
159bd2e44feSMarc-André Lureau      uint32_t flags;
160bd2e44feSMarc-André Lureau      uint32_t size; /* the following payload size */
161bd2e44feSMarc-André Lureau      union {
162bd2e44feSMarc-André Lureau          VhostUserGpuCursorPos cursor_pos;
163bd2e44feSMarc-André Lureau          VhostUserGpuCursorUpdate cursor_update;
164bd2e44feSMarc-André Lureau          VhostUserGpuScanout scanout;
165bd2e44feSMarc-André Lureau          VhostUserGpuUpdate update;
166bd2e44feSMarc-André Lureau          VhostUserGpuDMABUFScanout dmabuf_scanout;
16750cbd5b4SErico Nunes          VhostUserGpuEdidRequest edid_req;
16850cbd5b4SErico Nunes          struct virtio_gpu_resp_edid resp_edid;
169bd2e44feSMarc-André Lureau          struct virtio_gpu_resp_display_info display_info;
170bd2e44feSMarc-André Lureau          uint64_t u64;
171bd2e44feSMarc-André Lureau      } payload;
172bd2e44feSMarc-André Lureau  } QEMU_PACKED VhostUserGpuMsg;
173bd2e44feSMarc-André Lureau
174bd2e44feSMarc-André LureauProtocol features
175bd2e44feSMarc-André Lureau-----------------
176bd2e44feSMarc-André Lureau
17750cbd5b4SErico Nunes.. code:: c
178bd2e44feSMarc-André Lureau
17950cbd5b4SErico Nunes  #define VHOST_USER_GPU_PROTOCOL_F_EDID    0
180*75f217b4SErico Nunes  #define VHOST_USER_GPU_PROTOCOL_F_DMABUF2 1
18150cbd5b4SErico Nunes
18250cbd5b4SErico NunesNew messages and communication changes are negotiated thanks to the
183bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_PROTOCOL_FEATURES`` and
184bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SET_PROTOCOL_FEATURES`` requests.
185bd2e44feSMarc-André Lureau
186bd2e44feSMarc-André LureauCommunication
187bd2e44feSMarc-André Lureau=============
188bd2e44feSMarc-André Lureau
189bd2e44feSMarc-André LureauMessage types
190bd2e44feSMarc-André Lureau-------------
191bd2e44feSMarc-André Lureau
192bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_PROTOCOL_FEATURES``
193bd2e44feSMarc-André Lureau  :id: 1
194bd2e44feSMarc-André Lureau  :request payload: N/A
195bd2e44feSMarc-André Lureau  :reply payload: ``u64``
196bd2e44feSMarc-André Lureau
197bd2e44feSMarc-André Lureau  Get the supported protocol features bitmask.
198bd2e44feSMarc-André Lureau
199bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SET_PROTOCOL_FEATURES``
200bd2e44feSMarc-André Lureau  :id: 2
201bd2e44feSMarc-André Lureau  :request payload: ``u64``
202bd2e44feSMarc-André Lureau  :reply payload: N/A
203bd2e44feSMarc-André Lureau
204bd2e44feSMarc-André Lureau  Enable protocol features using a bitmask.
205bd2e44feSMarc-André Lureau
206bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_DISPLAY_INFO``
207bd2e44feSMarc-André Lureau  :id: 3
208bd2e44feSMarc-André Lureau  :request payload: N/A
209bd2e44feSMarc-André Lureau  :reply payload: ``struct virtio_gpu_resp_display_info`` (from virtio specification)
210bd2e44feSMarc-André Lureau
211bd2e44feSMarc-André Lureau  Get the preferred display configuration.
212bd2e44feSMarc-André Lureau
213bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_POS``
214bd2e44feSMarc-André Lureau  :id: 4
215bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuCursorPos``
216bd2e44feSMarc-André Lureau  :reply payload: N/A
217bd2e44feSMarc-André Lureau
218bd2e44feSMarc-André Lureau  Set/show the cursor position.
219bd2e44feSMarc-André Lureau
220bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_POS_HIDE``
221bd2e44feSMarc-André Lureau  :id: 5
222bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuCursorPos``
223bd2e44feSMarc-André Lureau  :reply payload: N/A
224bd2e44feSMarc-André Lureau
225bd2e44feSMarc-André Lureau  Set/hide the cursor.
226bd2e44feSMarc-André Lureau
227bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_UPDATE``
228bd2e44feSMarc-André Lureau  :id: 6
229bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuCursorUpdate``
230bd2e44feSMarc-André Lureau  :reply payload: N/A
231bd2e44feSMarc-André Lureau
232bd2e44feSMarc-André Lureau  Update the cursor shape and location.
233bd2e44feSMarc-André Lureau
234bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SCANOUT``
235bd2e44feSMarc-André Lureau  :id: 7
236bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuScanout``
237bd2e44feSMarc-André Lureau  :reply payload: N/A
238bd2e44feSMarc-André Lureau
239bd2e44feSMarc-André Lureau  Set the scanout resolution. To disable a scanout, the dimensions
240bd2e44feSMarc-André Lureau  width/height are set to 0.
241bd2e44feSMarc-André Lureau
242bd2e44feSMarc-André Lureau``VHOST_USER_GPU_UPDATE``
243bd2e44feSMarc-André Lureau  :id: 8
244bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuUpdate``
245bd2e44feSMarc-André Lureau  :reply payload: N/A
246bd2e44feSMarc-André Lureau
247bd2e44feSMarc-André Lureau  Update the scanout content. The data payload contains the graphical bits.
248bd2e44feSMarc-André Lureau  The display should be flushed and presented.
249bd2e44feSMarc-André Lureau
250bd2e44feSMarc-André Lureau``VHOST_USER_GPU_DMABUF_SCANOUT``
251bd2e44feSMarc-André Lureau  :id: 9
252bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuDMABUFScanout``
253bd2e44feSMarc-André Lureau  :reply payload: N/A
254bd2e44feSMarc-André Lureau
255bd2e44feSMarc-André Lureau  Set the scanout resolution/configuration, and share a DMABUF file
256bd2e44feSMarc-André Lureau  descriptor for the scanout content, which is passed as ancillary
257bd2e44feSMarc-André Lureau  data. To disable a scanout, the dimensions width/height are set
258bd2e44feSMarc-André Lureau  to 0, there is no file descriptor passed.
259bd2e44feSMarc-André Lureau
260bd2e44feSMarc-André Lureau``VHOST_USER_GPU_DMABUF_UPDATE``
261bd2e44feSMarc-André Lureau  :id: 10
262bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuUpdate``
263bd2e44feSMarc-André Lureau  :reply payload: empty payload
264bd2e44feSMarc-André Lureau
265bd2e44feSMarc-André Lureau  The display should be flushed and presented according to updated
266bd2e44feSMarc-André Lureau  region from ``VhostUserGpuUpdate``.
267bd2e44feSMarc-André Lureau
268bd2e44feSMarc-André Lureau  Note: there is no data payload, since the scanout is shared thanks
269bd2e44feSMarc-André Lureau  to DMABUF, that must have been set previously with
270bd2e44feSMarc-André Lureau  ``VHOST_USER_GPU_DMABUF_SCANOUT``.
27150cbd5b4SErico Nunes
27250cbd5b4SErico Nunes``VHOST_USER_GPU_GET_EDID``
27350cbd5b4SErico Nunes  :id: 11
27450cbd5b4SErico Nunes  :request payload: ``struct VhostUserGpuEdidRequest``
27550cbd5b4SErico Nunes  :reply payload: ``struct virtio_gpu_resp_edid`` (from virtio specification)
27650cbd5b4SErico Nunes
27750cbd5b4SErico Nunes  Retrieve the EDID data for a given scanout.
27850cbd5b4SErico Nunes  This message requires the ``VHOST_USER_GPU_PROTOCOL_F_EDID`` protocol
27950cbd5b4SErico Nunes  feature to be supported.
280*75f217b4SErico Nunes
281*75f217b4SErico Nunes``VHOST_USER_GPU_DMABUF_SCANOUT2``
282*75f217b4SErico Nunes  :id: 12
283*75f217b4SErico Nunes  :request payload: ``VhostUserGpuDMABUFScanout2``
284*75f217b4SErico Nunes  :reply payload: N/A
285*75f217b4SErico Nunes
286*75f217b4SErico Nunes  Same as VHOST_USER_GPU_DMABUF_SCANOUT, but also sends the dmabuf modifiers
287*75f217b4SErico Nunes  appended to the message, which were not provided in the other message.
288*75f217b4SErico Nunes  This message requires the ``VHOST_USER_GPU_PROTOCOL_F_DMABUF2`` protocol
289*75f217b4SErico Nunes  feature to be supported.
290