xref: /aosp_15_r20/external/virglrenderer/server/render_protocol.h (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker  * Copyright 2021 Google LLC
3*bbecb9d1SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*bbecb9d1SAndroid Build Coastguard Worker  */
5*bbecb9d1SAndroid Build Coastguard Worker 
6*bbecb9d1SAndroid Build Coastguard Worker #ifndef RENDER_PROTOCOL_H
7*bbecb9d1SAndroid Build Coastguard Worker #define RENDER_PROTOCOL_H
8*bbecb9d1SAndroid Build Coastguard Worker 
9*bbecb9d1SAndroid Build Coastguard Worker #include <stdint.h>
10*bbecb9d1SAndroid Build Coastguard Worker 
11*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_resource.h"
12*bbecb9d1SAndroid Build Coastguard Worker #include "virglrenderer.h"
13*bbecb9d1SAndroid Build Coastguard Worker #include "virglrenderer_hw.h"
14*bbecb9d1SAndroid Build Coastguard Worker 
15*bbecb9d1SAndroid Build Coastguard Worker /* this covers the command line options and the socket type */
16*bbecb9d1SAndroid Build Coastguard Worker #define RENDER_SERVER_VERSION 0
17*bbecb9d1SAndroid Build Coastguard Worker 
18*bbecb9d1SAndroid Build Coastguard Worker /* The protocol itself is internal to virglrenderer.  There is no backward
19*bbecb9d1SAndroid Build Coastguard Worker  * compatibility to be kept.
20*bbecb9d1SAndroid Build Coastguard Worker  */
21*bbecb9d1SAndroid Build Coastguard Worker 
22*bbecb9d1SAndroid Build Coastguard Worker /* client ops, which are handled by the server process */
23*bbecb9d1SAndroid Build Coastguard Worker enum render_client_op {
24*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CLIENT_OP_NOP = 0,
25*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CLIENT_OP_INIT,
26*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CLIENT_OP_RESET,
27*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CLIENT_OP_CREATE_CONTEXT,
28*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CLIENT_OP_DESTROY_CONTEXT,
29*bbecb9d1SAndroid Build Coastguard Worker 
30*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CLIENT_OP_COUNT,
31*bbecb9d1SAndroid Build Coastguard Worker };
32*bbecb9d1SAndroid Build Coastguard Worker 
33*bbecb9d1SAndroid Build Coastguard Worker /* context ops, which are handled by workers (subprocesses or threads) created
34*bbecb9d1SAndroid Build Coastguard Worker  * by the server process
35*bbecb9d1SAndroid Build Coastguard Worker  */
36*bbecb9d1SAndroid Build Coastguard Worker enum render_context_op {
37*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CONTEXT_OP_NOP = 0,
38*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CONTEXT_OP_INIT,
39*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CONTEXT_OP_CREATE_RESOURCE,
40*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CONTEXT_OP_IMPORT_RESOURCE,
41*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CONTEXT_OP_DESTROY_RESOURCE,
42*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CONTEXT_OP_SUBMIT_CMD,
43*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CONTEXT_OP_SUBMIT_FENCE,
44*bbecb9d1SAndroid Build Coastguard Worker 
45*bbecb9d1SAndroid Build Coastguard Worker    RENDER_CONTEXT_OP_COUNT,
46*bbecb9d1SAndroid Build Coastguard Worker };
47*bbecb9d1SAndroid Build Coastguard Worker 
48*bbecb9d1SAndroid Build Coastguard Worker struct render_client_op_header {
49*bbecb9d1SAndroid Build Coastguard Worker    enum render_client_op op;
50*bbecb9d1SAndroid Build Coastguard Worker };
51*bbecb9d1SAndroid Build Coastguard Worker 
52*bbecb9d1SAndroid Build Coastguard Worker struct render_client_op_nop_request {
53*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_header header;
54*bbecb9d1SAndroid Build Coastguard Worker };
55*bbecb9d1SAndroid Build Coastguard Worker 
56*bbecb9d1SAndroid Build Coastguard Worker /* Initialize virglrenderer.
57*bbecb9d1SAndroid Build Coastguard Worker  *
58*bbecb9d1SAndroid Build Coastguard Worker  * This roughly corresponds to virgl_renderer_init.
59*bbecb9d1SAndroid Build Coastguard Worker  */
60*bbecb9d1SAndroid Build Coastguard Worker struct render_client_op_init_request {
61*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_header header;
62*bbecb9d1SAndroid Build Coastguard Worker    uint32_t flags; /* VIRGL_RENDERER_USE_* and others */
63*bbecb9d1SAndroid Build Coastguard Worker };
64*bbecb9d1SAndroid Build Coastguard Worker 
65*bbecb9d1SAndroid Build Coastguard Worker /* Remove all contexts.
66*bbecb9d1SAndroid Build Coastguard Worker  *
67*bbecb9d1SAndroid Build Coastguard Worker  * This roughly corresponds to virgl_renderer_reset.
68*bbecb9d1SAndroid Build Coastguard Worker  */
69*bbecb9d1SAndroid Build Coastguard Worker struct render_client_op_reset_request {
70*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_header header;
71*bbecb9d1SAndroid Build Coastguard Worker };
72*bbecb9d1SAndroid Build Coastguard Worker 
73*bbecb9d1SAndroid Build Coastguard Worker /* Create a context, which will be serviced by a worker.
74*bbecb9d1SAndroid Build Coastguard Worker  *
75*bbecb9d1SAndroid Build Coastguard Worker  * See also the comment before main() for the process model.
76*bbecb9d1SAndroid Build Coastguard Worker  *
77*bbecb9d1SAndroid Build Coastguard Worker  * This roughly corresponds to virgl_renderer_context_create_with_flags.
78*bbecb9d1SAndroid Build Coastguard Worker  */
79*bbecb9d1SAndroid Build Coastguard Worker struct render_client_op_create_context_request {
80*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_header header;
81*bbecb9d1SAndroid Build Coastguard Worker    uint32_t ctx_id;
82*bbecb9d1SAndroid Build Coastguard Worker    char ctx_name[32];
83*bbecb9d1SAndroid Build Coastguard Worker };
84*bbecb9d1SAndroid Build Coastguard Worker 
85*bbecb9d1SAndroid Build Coastguard Worker struct render_client_op_create_context_reply {
86*bbecb9d1SAndroid Build Coastguard Worker    bool ok;
87*bbecb9d1SAndroid Build Coastguard Worker    /* followed by 1 socket fd if ok */
88*bbecb9d1SAndroid Build Coastguard Worker };
89*bbecb9d1SAndroid Build Coastguard Worker 
90*bbecb9d1SAndroid Build Coastguard Worker /* Destroy a context, including the worker.
91*bbecb9d1SAndroid Build Coastguard Worker  *
92*bbecb9d1SAndroid Build Coastguard Worker  * This roughly corresponds to virgl_renderer_context_destroy.
93*bbecb9d1SAndroid Build Coastguard Worker  */
94*bbecb9d1SAndroid Build Coastguard Worker struct render_client_op_destroy_context_request {
95*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_header header;
96*bbecb9d1SAndroid Build Coastguard Worker    uint32_t ctx_id;
97*bbecb9d1SAndroid Build Coastguard Worker };
98*bbecb9d1SAndroid Build Coastguard Worker 
99*bbecb9d1SAndroid Build Coastguard Worker union render_client_op_request {
100*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_header header;
101*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_nop_request nop;
102*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_init_request init;
103*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_reset_request reset;
104*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_create_context_request create_context;
105*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_destroy_context_request destroy_context;
106*bbecb9d1SAndroid Build Coastguard Worker };
107*bbecb9d1SAndroid Build Coastguard Worker 
108*bbecb9d1SAndroid Build Coastguard Worker struct render_context_op_header {
109*bbecb9d1SAndroid Build Coastguard Worker    enum render_context_op op;
110*bbecb9d1SAndroid Build Coastguard Worker };
111*bbecb9d1SAndroid Build Coastguard Worker 
112*bbecb9d1SAndroid Build Coastguard Worker struct render_context_op_nop_request {
113*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_header header;
114*bbecb9d1SAndroid Build Coastguard Worker };
115*bbecb9d1SAndroid Build Coastguard Worker 
116*bbecb9d1SAndroid Build Coastguard Worker /* Initialize the context.
117*bbecb9d1SAndroid Build Coastguard Worker  *
118*bbecb9d1SAndroid Build Coastguard Worker  * The shmem is required and currently holds an array of atomic_uint.  Each
119*bbecb9d1SAndroid Build Coastguard Worker  * atomic_uint represents the current sequence number of a ring (as defined by
120*bbecb9d1SAndroid Build Coastguard Worker  * the virtio-gpu spec).
121*bbecb9d1SAndroid Build Coastguard Worker  *
122*bbecb9d1SAndroid Build Coastguard Worker  * The eventfd is optional.  When given, it will be written to when there are
123*bbecb9d1SAndroid Build Coastguard Worker  * changes to any of the sequence numbers.
124*bbecb9d1SAndroid Build Coastguard Worker  *
125*bbecb9d1SAndroid Build Coastguard Worker  * This roughly corresponds to virgl_renderer_context_create_with_flags.
126*bbecb9d1SAndroid Build Coastguard Worker  */
127*bbecb9d1SAndroid Build Coastguard Worker struct render_context_op_init_request {
128*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_header header;
129*bbecb9d1SAndroid Build Coastguard Worker    uint32_t flags; /* VIRGL_RENDERER_CONTEXT_FLAG_*/
130*bbecb9d1SAndroid Build Coastguard Worker    size_t shmem_size;
131*bbecb9d1SAndroid Build Coastguard Worker    /* followed by 1 shmem fd and optionally 1 eventfd */
132*bbecb9d1SAndroid Build Coastguard Worker };
133*bbecb9d1SAndroid Build Coastguard Worker 
134*bbecb9d1SAndroid Build Coastguard Worker /* Export a blob resource from the context
135*bbecb9d1SAndroid Build Coastguard Worker  *
136*bbecb9d1SAndroid Build Coastguard Worker  * This roughly corresponds to:
137*bbecb9d1SAndroid Build Coastguard Worker  * - virgl_renderer_resource_create_blob
138*bbecb9d1SAndroid Build Coastguard Worker  * - virgl_renderer_resource_get_map_info
139*bbecb9d1SAndroid Build Coastguard Worker  * - virgl_renderer_resource_export_blob
140*bbecb9d1SAndroid Build Coastguard Worker  * - virgl_renderer_ctx_attach_resource
141*bbecb9d1SAndroid Build Coastguard Worker  */
142*bbecb9d1SAndroid Build Coastguard Worker struct render_context_op_create_resource_request {
143*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_header header;
144*bbecb9d1SAndroid Build Coastguard Worker    uint32_t res_id;
145*bbecb9d1SAndroid Build Coastguard Worker    uint64_t blob_id;
146*bbecb9d1SAndroid Build Coastguard Worker    uint64_t blob_size;
147*bbecb9d1SAndroid Build Coastguard Worker    uint32_t blob_flags; /* VIRGL_RENDERER_BLOB_FLAG_* */
148*bbecb9d1SAndroid Build Coastguard Worker };
149*bbecb9d1SAndroid Build Coastguard Worker 
150*bbecb9d1SAndroid Build Coastguard Worker struct render_context_op_create_resource_reply {
151*bbecb9d1SAndroid Build Coastguard Worker    enum virgl_resource_fd_type fd_type;
152*bbecb9d1SAndroid Build Coastguard Worker    uint32_t map_info; /* VIRGL_RENDERER_MAP_* */
153*bbecb9d1SAndroid Build Coastguard Worker    /* followed by 1 fd if not VIRGL_RESOURCE_FD_INVALID */
154*bbecb9d1SAndroid Build Coastguard Worker };
155*bbecb9d1SAndroid Build Coastguard Worker 
156*bbecb9d1SAndroid Build Coastguard Worker /* Import a blob resource to the context
157*bbecb9d1SAndroid Build Coastguard Worker  *
158*bbecb9d1SAndroid Build Coastguard Worker  * This roughly corresponds to:
159*bbecb9d1SAndroid Build Coastguard Worker  * - virgl_renderer_resource_import_blob
160*bbecb9d1SAndroid Build Coastguard Worker  * - virgl_renderer_ctx_attach_resource
161*bbecb9d1SAndroid Build Coastguard Worker  */
162*bbecb9d1SAndroid Build Coastguard Worker struct render_context_op_import_resource_request {
163*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_header header;
164*bbecb9d1SAndroid Build Coastguard Worker    uint32_t res_id;
165*bbecb9d1SAndroid Build Coastguard Worker    enum virgl_resource_fd_type fd_type;
166*bbecb9d1SAndroid Build Coastguard Worker    uint64_t size;
167*bbecb9d1SAndroid Build Coastguard Worker    /* followed by 1 fd */
168*bbecb9d1SAndroid Build Coastguard Worker };
169*bbecb9d1SAndroid Build Coastguard Worker 
170*bbecb9d1SAndroid Build Coastguard Worker /* Free a blob resource from the context
171*bbecb9d1SAndroid Build Coastguard Worker  *
172*bbecb9d1SAndroid Build Coastguard Worker  * This roughly corresponds to:
173*bbecb9d1SAndroid Build Coastguard Worker  * - virgl_renderer_resource_unref
174*bbecb9d1SAndroid Build Coastguard Worker  */
175*bbecb9d1SAndroid Build Coastguard Worker struct render_context_op_destroy_resource_request {
176*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_header header;
177*bbecb9d1SAndroid Build Coastguard Worker    uint32_t res_id;
178*bbecb9d1SAndroid Build Coastguard Worker };
179*bbecb9d1SAndroid Build Coastguard Worker 
180*bbecb9d1SAndroid Build Coastguard Worker /* Submit a small command stream to the context.
181*bbecb9d1SAndroid Build Coastguard Worker  *
182*bbecb9d1SAndroid Build Coastguard Worker  * The size limit depends on the socket type.  Currently, SOCK_SEQPACKET is
183*bbecb9d1SAndroid Build Coastguard Worker  * used and the size limit is best treated as one page.
184*bbecb9d1SAndroid Build Coastguard Worker  *
185*bbecb9d1SAndroid Build Coastguard Worker  * This roughly corresponds to virgl_renderer_submit_cmd.
186*bbecb9d1SAndroid Build Coastguard Worker  */
187*bbecb9d1SAndroid Build Coastguard Worker struct render_context_op_submit_cmd_request {
188*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_header header;
189*bbecb9d1SAndroid Build Coastguard Worker    size_t size;
190*bbecb9d1SAndroid Build Coastguard Worker    char cmd[256];
191*bbecb9d1SAndroid Build Coastguard Worker    /* if size > sizeof(cmd), followed by (size - sizeof(cmd)) bytes in another
192*bbecb9d1SAndroid Build Coastguard Worker     * message; size still must be small
193*bbecb9d1SAndroid Build Coastguard Worker     */
194*bbecb9d1SAndroid Build Coastguard Worker };
195*bbecb9d1SAndroid Build Coastguard Worker 
196*bbecb9d1SAndroid Build Coastguard Worker struct render_context_op_submit_cmd_reply {
197*bbecb9d1SAndroid Build Coastguard Worker    bool ok;
198*bbecb9d1SAndroid Build Coastguard Worker };
199*bbecb9d1SAndroid Build Coastguard Worker 
200*bbecb9d1SAndroid Build Coastguard Worker /* Submit a fence to the context.
201*bbecb9d1SAndroid Build Coastguard Worker  *
202*bbecb9d1SAndroid Build Coastguard Worker  * This submits a fence to the specified ring.  When the fence signals, the
203*bbecb9d1SAndroid Build Coastguard Worker  * current sequence number of the ring in the shmem is updated.
204*bbecb9d1SAndroid Build Coastguard Worker  *
205*bbecb9d1SAndroid Build Coastguard Worker  * This roughly corresponds to virgl_renderer_context_create_fence.
206*bbecb9d1SAndroid Build Coastguard Worker  */
207*bbecb9d1SAndroid Build Coastguard Worker struct render_context_op_submit_fence_request {
208*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_header header;
209*bbecb9d1SAndroid Build Coastguard Worker    uint32_t flags; /* VIRGL_RENDERER_FENCE_FLAG_* */
210*bbecb9d1SAndroid Build Coastguard Worker    /* TODO fix virgl_renderer_context_create_fence to use ring_index */
211*bbecb9d1SAndroid Build Coastguard Worker    uint32_t ring_index;
212*bbecb9d1SAndroid Build Coastguard Worker    uint32_t seqno;
213*bbecb9d1SAndroid Build Coastguard Worker };
214*bbecb9d1SAndroid Build Coastguard Worker 
215*bbecb9d1SAndroid Build Coastguard Worker union render_context_op_request {
216*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_header header;
217*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_nop_request nop;
218*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_init_request init;
219*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_create_resource_request create_resource;
220*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_import_resource_request import_resource;
221*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_destroy_resource_request destroy_resource;
222*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_submit_cmd_request submit_cmd;
223*bbecb9d1SAndroid Build Coastguard Worker    struct render_context_op_submit_fence_request submit_fence;
224*bbecb9d1SAndroid Build Coastguard Worker };
225*bbecb9d1SAndroid Build Coastguard Worker 
226*bbecb9d1SAndroid Build Coastguard Worker #endif /* RENDER_PROTOCOL_H */
227