xref: /qemu/docs/interop/vhost-user-gpu.rst (revision bd59f2a1823a458ac27c09e1f27f30098745381e)
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
16*bd59f2a1SPaolo Bonziniof a virtio-gpu, done from a vhost-user back-end process to a vhost-user
17*bd59f2a1SPaolo 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
19*bd59f2a1SPaolo 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
29*bd59f2a1SPaolo BonziniRequests are sent by the *back-end*, and the optional replies by the
30*bd59f2a1SPaolo 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
127bd2e44feSMarc-André LureauC structure
128bd2e44feSMarc-André Lureau-----------
129bd2e44feSMarc-André Lureau
130bd2e44feSMarc-André LureauIn QEMU the vhost-user-gpu message is implemented with the following struct:
131bd2e44feSMarc-André Lureau
132bd2e44feSMarc-André Lureau.. code:: c
133bd2e44feSMarc-André Lureau
134bd2e44feSMarc-André Lureau  typedef struct VhostUserGpuMsg {
135bd2e44feSMarc-André Lureau      uint32_t request; /* VhostUserGpuRequest */
136bd2e44feSMarc-André Lureau      uint32_t flags;
137bd2e44feSMarc-André Lureau      uint32_t size; /* the following payload size */
138bd2e44feSMarc-André Lureau      union {
139bd2e44feSMarc-André Lureau          VhostUserGpuCursorPos cursor_pos;
140bd2e44feSMarc-André Lureau          VhostUserGpuCursorUpdate cursor_update;
141bd2e44feSMarc-André Lureau          VhostUserGpuScanout scanout;
142bd2e44feSMarc-André Lureau          VhostUserGpuUpdate update;
143bd2e44feSMarc-André Lureau          VhostUserGpuDMABUFScanout dmabuf_scanout;
144bd2e44feSMarc-André Lureau          struct virtio_gpu_resp_display_info display_info;
145bd2e44feSMarc-André Lureau          uint64_t u64;
146bd2e44feSMarc-André Lureau      } payload;
147bd2e44feSMarc-André Lureau  } QEMU_PACKED VhostUserGpuMsg;
148bd2e44feSMarc-André Lureau
149bd2e44feSMarc-André LureauProtocol features
150bd2e44feSMarc-André Lureau-----------------
151bd2e44feSMarc-André Lureau
152bd2e44feSMarc-André LureauNone yet.
153bd2e44feSMarc-André Lureau
154bd2e44feSMarc-André LureauAs the protocol may need to evolve, new messages and communication
155bd2e44feSMarc-André Lureauchanges are negotiated thanks to preliminary
156bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_PROTOCOL_FEATURES`` and
157bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SET_PROTOCOL_FEATURES`` requests.
158bd2e44feSMarc-André Lureau
159bd2e44feSMarc-André LureauCommunication
160bd2e44feSMarc-André Lureau=============
161bd2e44feSMarc-André Lureau
162bd2e44feSMarc-André LureauMessage types
163bd2e44feSMarc-André Lureau-------------
164bd2e44feSMarc-André Lureau
165bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_PROTOCOL_FEATURES``
166bd2e44feSMarc-André Lureau  :id: 1
167bd2e44feSMarc-André Lureau  :request payload: N/A
168bd2e44feSMarc-André Lureau  :reply payload: ``u64``
169bd2e44feSMarc-André Lureau
170bd2e44feSMarc-André Lureau  Get the supported protocol features bitmask.
171bd2e44feSMarc-André Lureau
172bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SET_PROTOCOL_FEATURES``
173bd2e44feSMarc-André Lureau  :id: 2
174bd2e44feSMarc-André Lureau  :request payload: ``u64``
175bd2e44feSMarc-André Lureau  :reply payload: N/A
176bd2e44feSMarc-André Lureau
177bd2e44feSMarc-André Lureau  Enable protocol features using a bitmask.
178bd2e44feSMarc-André Lureau
179bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_DISPLAY_INFO``
180bd2e44feSMarc-André Lureau  :id: 3
181bd2e44feSMarc-André Lureau  :request payload: N/A
182bd2e44feSMarc-André Lureau  :reply payload: ``struct virtio_gpu_resp_display_info`` (from virtio specification)
183bd2e44feSMarc-André Lureau
184bd2e44feSMarc-André Lureau  Get the preferred display configuration.
185bd2e44feSMarc-André Lureau
186bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_POS``
187bd2e44feSMarc-André Lureau  :id: 4
188bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuCursorPos``
189bd2e44feSMarc-André Lureau  :reply payload: N/A
190bd2e44feSMarc-André Lureau
191bd2e44feSMarc-André Lureau  Set/show the cursor position.
192bd2e44feSMarc-André Lureau
193bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_POS_HIDE``
194bd2e44feSMarc-André Lureau  :id: 5
195bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuCursorPos``
196bd2e44feSMarc-André Lureau  :reply payload: N/A
197bd2e44feSMarc-André Lureau
198bd2e44feSMarc-André Lureau  Set/hide the cursor.
199bd2e44feSMarc-André Lureau
200bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_UPDATE``
201bd2e44feSMarc-André Lureau  :id: 6
202bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuCursorUpdate``
203bd2e44feSMarc-André Lureau  :reply payload: N/A
204bd2e44feSMarc-André Lureau
205bd2e44feSMarc-André Lureau  Update the cursor shape and location.
206bd2e44feSMarc-André Lureau
207bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SCANOUT``
208bd2e44feSMarc-André Lureau  :id: 7
209bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuScanout``
210bd2e44feSMarc-André Lureau  :reply payload: N/A
211bd2e44feSMarc-André Lureau
212bd2e44feSMarc-André Lureau  Set the scanout resolution. To disable a scanout, the dimensions
213bd2e44feSMarc-André Lureau  width/height are set to 0.
214bd2e44feSMarc-André Lureau
215bd2e44feSMarc-André Lureau``VHOST_USER_GPU_UPDATE``
216bd2e44feSMarc-André Lureau  :id: 8
217bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuUpdate``
218bd2e44feSMarc-André Lureau  :reply payload: N/A
219bd2e44feSMarc-André Lureau
220bd2e44feSMarc-André Lureau  Update the scanout content. The data payload contains the graphical bits.
221bd2e44feSMarc-André Lureau  The display should be flushed and presented.
222bd2e44feSMarc-André Lureau
223bd2e44feSMarc-André Lureau``VHOST_USER_GPU_DMABUF_SCANOUT``
224bd2e44feSMarc-André Lureau  :id: 9
225bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuDMABUFScanout``
226bd2e44feSMarc-André Lureau  :reply payload: N/A
227bd2e44feSMarc-André Lureau
228bd2e44feSMarc-André Lureau  Set the scanout resolution/configuration, and share a DMABUF file
229bd2e44feSMarc-André Lureau  descriptor for the scanout content, which is passed as ancillary
230bd2e44feSMarc-André Lureau  data. To disable a scanout, the dimensions width/height are set
231bd2e44feSMarc-André Lureau  to 0, there is no file descriptor passed.
232bd2e44feSMarc-André Lureau
233bd2e44feSMarc-André Lureau``VHOST_USER_GPU_DMABUF_UPDATE``
234bd2e44feSMarc-André Lureau  :id: 10
235bd2e44feSMarc-André Lureau  :request payload: ``VhostUserGpuUpdate``
236bd2e44feSMarc-André Lureau  :reply payload: empty payload
237bd2e44feSMarc-André Lureau
238bd2e44feSMarc-André Lureau  The display should be flushed and presented according to updated
239bd2e44feSMarc-André Lureau  region from ``VhostUserGpuUpdate``.
240bd2e44feSMarc-André Lureau
241bd2e44feSMarc-André Lureau  Note: there is no data payload, since the scanout is shared thanks
242bd2e44feSMarc-André Lureau  to DMABUF, that must have been set previously with
243bd2e44feSMarc-André Lureau  ``VHOST_USER_GPU_DMABUF_SCANOUT``.
244