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