22static FileDescriptor findRenderDevice()
24 const int deviceCount = drmGetDevices2(0,
nullptr, 0);
25 if (deviceCount <= 0) {
26 return FileDescriptor{};
29 QList<drmDevice *> devices(deviceCount);
30 if (drmGetDevices2(0, devices.data(), devices.size()) < 0) {
31 return FileDescriptor{};
33 auto deviceCleanup = qScopeGuard([&devices]() {
34 drmFreeDevices(devices.data(), devices.size());
37 for (drmDevice *device : std::as_const(devices)) {
40 int nodeType = DRM_NODE_RENDER;
41 if (device->bustype == DRM_BUS_PLATFORM) {
42 if (strcmp(device->businfo.platform->fullname,
"vgem") == 0) {
43 nodeType = DRM_NODE_PRIMARY;
47 if (device->available_nodes & (1 << nodeType)) {
48 FileDescriptor fd{open(device->nodes[nodeType], O_RDWR | O_CLOEXEC)};
55 return FileDescriptor{};
61 m_drmFileDescriptor = findRenderDevice();
62 if (m_drmFileDescriptor.
isValid()) {
63 m_gbmDevice = gbm_create_device(m_drmFileDescriptor.
get());
70 gbm_device_destroy(m_gbmDevice);
81 QList<CompositingType> compositingTypes;
86 return compositingTypes;
96 return std::make_unique<VirtualQPainterBackend>(
this);
101 return std::make_unique<VirtualEglBackend>(
this);
109VirtualOutput *VirtualBackend::createOutput(
const OutputInfo &info)
112 output->
init(info.geometry.topLeft(), info.geometry.size() * info.scale, info.scale);
113 m_outputs.append(output);
128 const QList<VirtualOutput *> removed = m_outputs;
130 for (
const auto &info : infos) {
136 m_outputs.removeOne(output);
146 m_display = std::move(display);
151 return m_display.get();
156#include "moc_virtual_backend.cpp"
void outputAdded(Output *output)
void outputRemoved(Output *output)
std::unique_ptr< QPainterBackend > createQPainterBackend() override
Output * addOutput(const OutputInfo &info)
QList< CompositingType > supportedCompositors() const override
bool initialize() override
VirtualBackend(QObject *parent=nullptr)
EglDisplay * sceneEglDisplayObject() const override
gbm_device * gbmDevice() const
std::unique_ptr< OpenGLBackend > createOpenGLBackend() override
void setEglDisplay(std::unique_ptr< EglDisplay > &&display)
void setVirtualOutputs(const QList< OutputInfo > &infos)
Outputs outputs() const override
~VirtualBackend() override
void updateEnabled(bool enabled)
void init(const QPoint &logicalPosition, const QSize &pixelSize, qreal scale)