Loading...
Searching...
No Matches
DrmFunctions.hpp
Go to the documentation of this file.
1#pragma once
2
17#include <ossia/detail/dylib_loader.hpp>
18
19#include <xf86drm.h>
20#include <xf86drmMode.h>
21
22#include <optional>
23
24namespace score::gfx::drm
25{
26
28{
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);
37
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,
48 drmModeModeInfoPtr);
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*,
63 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);
71 using FN_drmModeAddFB
72 = int (*)(int, uint32_t, uint32_t, uint8_t, uint8_t, uint32_t, uint32_t,
73 uint32_t*);
74
75 // Atomic modesetting: the only way to change several objects in one
76 // tear-free commit, and the only way to drive a writeback connector.
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);
85
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{};
94
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{};
127
128 bool available() const noexcept { return m_lib.has_value(); }
129
130 bool load() noexcept
131 {
132 if(m_lib)
133 return true;
134 try
135 {
136 m_lib.emplace(std::vector<std::string_view>{"libdrm.so.2", "libdrm.so"});
137 }
138 catch(...)
139 {
140 return false;
141 }
142
143 bool ok = true;
144 auto sym = [&]<typename T>(T& out, const char* name) {
145 out = m_lib->symbol<T>(name);
146 if(!out)
147 ok = false;
148 };
149
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");
158
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");
191
192 if(!ok)
193 m_lib.reset();
194 return ok;
195 }
196
197private:
198 std::optional<ossia::dylib_loader> m_lib;
199};
200
201} // namespace score::gfx::drm
Definition DrmFunctions.hpp:28