You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
virglrenderer/server/render_protocol.h

220 lines
6.0 KiB

/*
* Copyright 2021 Google LLC
* SPDX-License-Identifier: MIT
*/
#ifndef RENDER_PROTOCOL_H
#define RENDER_PROTOCOL_H
#include <stdint.h>
#include "virgl_resource.h"
#include "virglrenderer.h"
#include "virglrenderer_hw.h"
/* this covers the command line options and the socket type */
#define RENDER_SERVER_VERSION 0
/* The protocol itself is internal to virglrenderer. There is no backward
* compatibility to be kept.
*/
/* client ops, which are handled by the server process */
enum render_client_op {
RENDER_CLIENT_OP_NOP = 0,
RENDER_CLIENT_OP_INIT,
RENDER_CLIENT_OP_RESET,
RENDER_CLIENT_OP_CREATE_CONTEXT,
RENDER_CLIENT_OP_DESTROY_CONTEXT,
RENDER_CLIENT_OP_COUNT,
};
/* context ops, which are handled by workers (subprocesses or threads) created
* by the server process
*/
enum render_context_op {
RENDER_CONTEXT_OP_NOP = 0,
RENDER_CONTEXT_OP_INIT,
RENDER_CONTEXT_OP_ATTACH_RESOURCE,
RENDER_CONTEXT_OP_DETACH_RESOURCE,
RENDER_CONTEXT_OP_GET_BLOB,
RENDER_CONTEXT_OP_SUBMIT_CMD,
RENDER_CONTEXT_OP_SUBMIT_FENCE,
RENDER_CONTEXT_OP_COUNT,
};
struct render_client_op_header {
enum render_client_op op;
};
struct render_client_op_nop_request {
struct render_client_op_header header;
};
/* Initialize virglrenderer.
*
* This roughly corresponds to virgl_renderer_init.
*/
struct render_client_op_init_request {
struct render_client_op_header header;
uint32_t flags; /* VIRGL_RENDERER_USE_* and others */
};
/* Remove all contexts.
*
* This roughly corresponds to virgl_renderer_reset.
*/
struct render_client_op_reset_request {
struct render_client_op_header header;
};
/* Create a context, which will be serviced by a worker.
*
* See also the comment before main() for the process model.
*
* This roughly corresponds to virgl_renderer_context_create_with_flags.
*/
struct render_client_op_create_context_request {
struct render_client_op_header header;
uint32_t ctx_id;
char ctx_name[32];
};
struct render_client_op_create_context_reply {
bool ok;
/* followed by 1 socket fd if ok */
};
/* Destroy a context, including the worker.
*
* This roughly corresponds to virgl_renderer_context_destroy.
*/
struct render_client_op_destroy_context_request {
struct render_client_op_header header;
uint32_t ctx_id;
};
union render_client_op_request {
struct render_client_op_header header;
struct render_client_op_nop_request nop;
struct render_client_op_init_request init;
struct render_client_op_reset_request reset;
struct render_client_op_create_context_request create_context;
struct render_client_op_destroy_context_request destroy_context;
};
struct render_context_op_header {
enum render_context_op op;
};
struct render_context_op_nop_request {
struct render_context_op_header header;
};
/* Initialize the context.
*
* The shmem is required and currently holds an array of atomic_uint. Each
* atomic_uint represents the current sequence number of a ring (as defined by
* the virtio-gpu spec).
*
* The eventfd is optional. When given, it will be written to when there are
* changes to any of the sequence numbers.
*
* This roughly corresponds to virgl_renderer_context_create_with_flags.
*/
struct render_context_op_init_request {
struct render_context_op_header header;
uint32_t flags; /* VIRGL_RENDERER_CONTEXT_FLAG_*/
size_t shmem_size;
/* followed by 1 shmem fd and optionally 1 eventfd */
};
/* Attach a resource to the context.
*
* This roughly corresponds to virgl_renderer_ctx_attach_resource.
*/
struct render_context_op_attach_resource_request {
struct render_context_op_header header;
uint32_t res_id;
enum virgl_resource_fd_type fd_type;
uint64_t size;
/* followed by 1 fd */
};
/* Detach a resource from the context.
*
* This roughly corresponds to virgl_renderer_ctx_detach_resource.
*/
struct render_context_op_detach_resource_request {
struct render_context_op_header header;
uint32_t res_id;
};
/* Export a blob from the context.
*
* This roughly corresponds to virgl_renderer_resource_create_blob.
*/
struct render_context_op_get_blob_request {
struct render_context_op_header header;
uint32_t res_id;
uint64_t blob_id;
uint64_t blob_size;
uint32_t blob_flags; /* VIRGL_RENDERER_BLOB_FLAG_* */
};
struct render_context_op_get_blob_reply {
enum virgl_resource_fd_type fd_type;
uint32_t map_info; /* VIRGL_RENDERER_MAP_* */
/* followed by 1 fd if not VIRGL_RESOURCE_FD_INVALID */
};
/* Submit a small command stream to the context.
*
* The size limit depends on the socket type. Currently, SOCK_SEQPACKET is
* used and the size limit is best treated as one page.
*
* This roughly corresponds to virgl_renderer_submit_cmd.
*/
struct render_context_op_submit_cmd_request {
struct render_context_op_header header;
size_t size;
char cmd[256];
/* if size > sizeof(cmd), followed by (size - sizeof(cmd)) bytes in another
* message; size still must be small
*/
};
struct render_context_op_submit_cmd_reply {
bool ok;
};
/* Submit a fence to the context.
*
* This submits a fence to the specified ring. When the fence signals, the
* current sequence number of the ring in the shmem is updated.
*
* This roughly corresponds to virgl_renderer_context_create_fence.
*/
struct render_context_op_submit_fence_request {
struct render_context_op_header header;
uint32_t flags; /* VIRGL_RENDERER_FENCE_FLAG_* */
/* TODO fix virgl_renderer_context_create_fence to use ring_index */
uint32_t ring_index;
uint32_t seqno;
};
union render_context_op_request {
struct render_context_op_header header;
struct render_context_op_nop_request nop;
struct render_context_op_init_request init;
struct render_context_op_attach_resource_request attach_resource;
struct render_context_op_detach_resource_request detach_resource;
struct render_context_op_get_blob_request get_blob;
struct render_context_op_submit_cmd_request submit_cmd;
struct render_context_op_submit_fence_request submit_fence;
};
#endif /* RENDER_PROTOCOL_H */