29 using FN_drmGetVersion = drmVersionPtr (*)(int);
30 using FN_drmFreeVersion = void (*)(drmVersionPtr);
31 using FN_drmSetClientCap = int (*)(int, uint64_t, uint64_t);
32 using FN_drmIsMaster = int (*)(int);
33 using FN_drmSetMaster = int (*)(int);
34 using FN_drmDropMaster = int (*)(int);
35 using FN_drmPrimeFDToHandle = int (*)(int, int, uint32_t*);
36 using FN_drmHandleEvent = int (*)(int, drmEventContextPtr);
38 using FN_drmModeGetResources = drmModeResPtr (*)(int);
39 using FN_drmModeFreeResources = void (*)(drmModeResPtr);
40 using FN_drmModeGetConnector = drmModeConnectorPtr (*)(int, uint32_t);
41 using FN_drmModeFreeConnector = void (*)(drmModeConnectorPtr);
42 using FN_drmModeGetEncoder = drmModeEncoderPtr (*)(int, uint32_t);
43 using FN_drmModeFreeEncoder = void (*)(drmModeEncoderPtr);
44 using FN_drmModeGetCrtc = drmModeCrtcPtr (*)(int, uint32_t);
45 using FN_drmModeFreeCrtc = void (*)(drmModeCrtcPtr);
46 using FN_drmModeSetCrtc
47 = int (*)(int, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t*, int,
49 using FN_drmModeGetPlaneResources = drmModePlaneResPtr (*)(int);
50 using FN_drmModeFreePlaneResources = void (*)(drmModePlaneResPtr);
51 using FN_drmModeGetPlane = drmModePlanePtr (*)(int, uint32_t);
52 using FN_drmModeFreePlane = void (*)(drmModePlanePtr);
53 using FN_drmModeObjectGetProperties
54 = drmModeObjectPropertiesPtr (*)(int, uint32_t, uint32_t);
55 using FN_drmModeFreeObjectProperties = void (*)(drmModeObjectPropertiesPtr);
56 using FN_drmModeGetProperty = drmModePropertyPtr (*)(int, uint32_t);
57 using FN_drmModeFreeProperty = void (*)(drmModePropertyPtr);
58 using FN_drmModeGetPropertyBlob = drmModePropertyBlobPtr (*)(int, uint32_t);
59 using FN_drmModeFreePropertyBlob = void (*)(drmModePropertyBlobPtr);
60 using FN_drmModeAddFB2WithModifiers
61 = int (*)(int, uint32_t, uint32_t, uint32_t,
const uint32_t*,
62 const uint32_t*,
const uint32_t*,
const uint64_t*, uint32_t*,
64 using FN_drmModeRmFB = int (*)(int, uint32_t);
65 using FN_drmModePageFlip = int (*)(int, uint32_t, uint32_t, uint32_t,
void*);
66 using FN_drmModeCreateDumbBuffer
67 = int (*)(int, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t*,
68 uint32_t*, uint64_t*);
69 using FN_drmModeMapDumbBuffer = int (*)(int, uint32_t, uint64_t*);
70 using FN_drmModeDestroyDumbBuffer = int (*)(int, uint32_t);
72 = int (*)(int, uint32_t, uint32_t, uint8_t, uint8_t, uint32_t, uint32_t,
77 using FN_drmModeAtomicAlloc = drmModeAtomicReqPtr (*)(void);
78 using FN_drmModeAtomicFree = void (*)(drmModeAtomicReqPtr);
79 using FN_drmModeAtomicAddProperty
80 = int (*)(drmModeAtomicReqPtr, uint32_t, uint32_t, uint64_t);
81 using FN_drmModeAtomicCommit = int (*)(int, drmModeAtomicReqPtr, uint32_t,
void*);
82 using FN_drmModeCreatePropertyBlob
83 = int (*)(int,
const void*, size_t, uint32_t*);
84 using FN_drmModeDestroyPropertyBlob = int (*)(int, uint32_t);
86 FN_drmGetVersion getVersion{};
87 FN_drmFreeVersion freeVersion{};
88 FN_drmSetClientCap setClientCap{};
89 FN_drmIsMaster isMaster{};
90 FN_drmSetMaster setMaster{};
91 FN_drmDropMaster dropMaster{};
92 FN_drmPrimeFDToHandle primeFDToHandle{};
93 FN_drmHandleEvent handleEvent{};
95 FN_drmModeGetResources getResources{};
96 FN_drmModeFreeResources freeResources{};
97 FN_drmModeGetConnector getConnector{};
98 FN_drmModeFreeConnector freeConnector{};
99 FN_drmModeGetEncoder getEncoder{};
100 FN_drmModeFreeEncoder freeEncoder{};
101 FN_drmModeGetCrtc getCrtc{};
102 FN_drmModeFreeCrtc freeCrtc{};
103 FN_drmModeSetCrtc setCrtc{};
104 FN_drmModeGetPlaneResources getPlaneResources{};
105 FN_drmModeFreePlaneResources freePlaneResources{};
106 FN_drmModeGetPlane getPlane{};
107 FN_drmModeFreePlane freePlane{};
108 FN_drmModeObjectGetProperties objectGetProperties{};
109 FN_drmModeFreeObjectProperties freeObjectProperties{};
110 FN_drmModeGetProperty getProperty{};
111 FN_drmModeFreeProperty freeProperty{};
112 FN_drmModeGetPropertyBlob getPropertyBlob{};
113 FN_drmModeFreePropertyBlob freePropertyBlob{};
114 FN_drmModeAddFB2WithModifiers addFB2WithModifiers{};
115 FN_drmModeRmFB rmFB{};
116 FN_drmModePageFlip pageFlip{};
117 FN_drmModeCreateDumbBuffer createDumb{};
118 FN_drmModeMapDumbBuffer mapDumb{};
119 FN_drmModeDestroyDumbBuffer destroyDumb{};
120 FN_drmModeAddFB addFB{};
121 FN_drmModeAtomicAlloc atomicAlloc{};
122 FN_drmModeAtomicFree atomicFree{};
123 FN_drmModeAtomicAddProperty atomicAddProperty{};
124 FN_drmModeAtomicCommit atomicCommit{};
125 FN_drmModeCreatePropertyBlob createPropertyBlob{};
126 FN_drmModeDestroyPropertyBlob destroyPropertyBlob{};
128 bool available()
const noexcept {
return m_lib.has_value(); }
136 m_lib.emplace(std::vector<std::string_view>{
"libdrm.so.2",
"libdrm.so"});
144 auto sym = [&]<
typename T>(T& out,
const char* name) {
145 out = m_lib->symbol<T>(name);
150 sym(getVersion,
"drmGetVersion");
151 sym(freeVersion,
"drmFreeVersion");
152 sym(setClientCap,
"drmSetClientCap");
153 sym(isMaster,
"drmIsMaster");
154 sym(setMaster,
"drmSetMaster");
155 sym(dropMaster,
"drmDropMaster");
156 sym(primeFDToHandle,
"drmPrimeFDToHandle");
157 sym(handleEvent,
"drmHandleEvent");
159 sym(getResources,
"drmModeGetResources");
160 sym(freeResources,
"drmModeFreeResources");
161 sym(getConnector,
"drmModeGetConnector");
162 sym(freeConnector,
"drmModeFreeConnector");
163 sym(getEncoder,
"drmModeGetEncoder");
164 sym(freeEncoder,
"drmModeFreeEncoder");
165 sym(getCrtc,
"drmModeGetCrtc");
166 sym(freeCrtc,
"drmModeFreeCrtc");
167 sym(setCrtc,
"drmModeSetCrtc");
168 sym(getPlaneResources,
"drmModeGetPlaneResources");
169 sym(freePlaneResources,
"drmModeFreePlaneResources");
170 sym(getPlane,
"drmModeGetPlane");
171 sym(freePlane,
"drmModeFreePlane");
172 sym(objectGetProperties,
"drmModeObjectGetProperties");
173 sym(freeObjectProperties,
"drmModeFreeObjectProperties");
174 sym(getProperty,
"drmModeGetProperty");
175 sym(freeProperty,
"drmModeFreeProperty");
176 sym(getPropertyBlob,
"drmModeGetPropertyBlob");
177 sym(freePropertyBlob,
"drmModeFreePropertyBlob");
178 sym(addFB2WithModifiers,
"drmModeAddFB2WithModifiers");
179 sym(rmFB,
"drmModeRmFB");
180 sym(pageFlip,
"drmModePageFlip");
181 sym(createDumb,
"drmModeCreateDumbBuffer");
182 sym(mapDumb,
"drmModeMapDumbBuffer");
183 sym(destroyDumb,
"drmModeDestroyDumbBuffer");
184 sym(addFB,
"drmModeAddFB");
185 sym(atomicAlloc,
"drmModeAtomicAlloc");
186 sym(atomicFree,
"drmModeAtomicFree");
187 sym(atomicAddProperty,
"drmModeAtomicAddProperty");
188 sym(atomicCommit,
"drmModeAtomicCommit");
189 sym(createPropertyBlob,
"drmModeCreatePropertyBlob");
190 sym(destroyPropertyBlob,
"drmModeDestroyPropertyBlob");
198 std::optional<ossia::dylib_loader> m_lib;