1#pragma once
2
3/* the rest of this file must match virglrenderer/src/apir-protocol.h */
4
5#include <unistd.h>
6
7#include <cstdint>
8
9#define APIR_PROTOCOL_MAJOR 0
10#define APIR_PROTOCOL_MINOR 1
11
12#define APIR_HANDSHAKE_MAGIC 0xab1e
13
14enum ApirCommandType {
15 APIR_COMMAND_TYPE_HANDSHAKE = 0,
16 APIR_COMMAND_TYPE_LOADLIBRARY = 1,
17 APIR_COMMAND_TYPE_FORWARD = 2,
18
19 APIR_COMMAND_TYPE_LENGTH = 3,
20};
21
22typedef uint64_t ApirCommandFlags;
23
24enum ApirLoadLibraryReturnCode {
25 APIR_LOAD_LIBRARY_SUCCESS = 0,
26 APIR_LOAD_LIBRARY_HYPERCALL_INITIALIZATION_ERROR = 1,
27 APIR_LOAD_LIBRARY_ALREADY_LOADED = 2,
28 APIR_LOAD_LIBRARY_ENV_VAR_MISSING = 3,
29 APIR_LOAD_LIBRARY_CANNOT_OPEN = 4,
30 APIR_LOAD_LIBRARY_SYMBOL_MISSING = 5,
31 APIR_LOAD_LIBRARY_INIT_BASE_INDEX = 6, // anything above this is a APIR backend library initialization return code
32};
33
34enum ApirForwardReturnCode {
35 APIR_FORWARD_SUCCESS = 0,
36 APIR_FORWARD_NO_DISPATCH_FCT = 1,
37 APIR_FORWARD_TIMEOUT = 2,
38
39 APIR_FORWARD_BASE_INDEX = 3, // anything above this is a APIR backend library forward return code
40} ;
41
42__attribute__((unused)) static inline const char * apir_command_name(ApirCommandType type) {
43 switch (type) {
44 case APIR_COMMAND_TYPE_HANDSHAKE:
45 return "HandShake";
46 case APIR_COMMAND_TYPE_LOADLIBRARY:
47 return "LoadLibrary";
48 case APIR_COMMAND_TYPE_FORWARD:
49 return "Forward";
50 default:
51 return "unknown";
52 }
53}
54
55__attribute__((unused)) static const char * apir_load_library_error(ApirLoadLibraryReturnCode code) {
56#define APIR_LOAD_LIBRARY_ERROR(code_name) \
57 do { \
58 if (code == code_name) \
59 return #code_name; \
60 } while (0)
61
62 APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_SUCCESS);
63 APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_HYPERCALL_INITIALIZATION_ERROR);
64 APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_ALREADY_LOADED);
65 APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_ENV_VAR_MISSING);
66 APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_CANNOT_OPEN);
67 APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_SYMBOL_MISSING);
68 APIR_LOAD_LIBRARY_ERROR(APIR_LOAD_LIBRARY_INIT_BASE_INDEX);
69
70 return "Unknown APIR_COMMAND_TYPE_LoadLibrary error";
71
72#undef APIR_LOAD_LIBRARY_ERROR
73}
74
75__attribute__((unused)) static const char * apir_forward_error(ApirForwardReturnCode code) {
76#define APIR_FORWARD_ERROR(code_name) \
77 do { \
78 if (code == code_name) \
79 return #code_name; \
80 } while (0)
81
82 APIR_FORWARD_ERROR(APIR_FORWARD_SUCCESS);
83 APIR_FORWARD_ERROR(APIR_FORWARD_NO_DISPATCH_FCT);
84 APIR_FORWARD_ERROR(APIR_FORWARD_TIMEOUT);
85 APIR_FORWARD_ERROR(APIR_FORWARD_BASE_INDEX);
86
87 return "Unknown APIR_COMMAND_TYPE_FORWARD error";
88
89#undef APIR_FORWARD_ERROR
90}