kwin/udev.h
Martin Gräßlin 56ce6689fd [platforms/virtual] Use rendernode or vgem device if available for egl
Summary:
The egl implementation for the virtual platform tries to use a render
node if available. If there is no render node it looks for a virtual
(kernel driver vgem) device, which unfortunately does not create a
render node in mainline kernel (there are patches in ChromiumOS).

For this the Udev wrapper is extended to search for renderNode devices
and for virtual dri devices.

If either render node or vgem dri device is found, it is tried to be
opened (without logind escalation) and on success a gbm device is
created on it. If any step of this fails the so far default behavior
of default device is tried for creating the EGLDisplay.

All of this is compile optional, so that the virtual platform does not
hard depend on udev and/or gbm.

Test Plan:
Auto tests which need OpenGL executed and verified that they
use the render node or vgem device.

Reviewers: #kwin, #plasma_on_wayland

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D2216
2016-07-21 09:13:57 +02:00

102 lines
2.4 KiB
C++

/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2014 Martin Gräßlin <mgraesslin@kde.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#ifndef KWIN_UDEV_H
#define KWIN_UDEV_H
#include <memory>
#include <kwin_export.h>
struct udev;
struct udev_device;
struct udev_monitor;
namespace KWin
{
class Udev;
class KWIN_EXPORT UdevDevice
{
public:
UdevDevice(udev_device *device);
~UdevDevice();
udev_device *getParentWithSubsystemDevType(const char *subsystem, const char *devtype = nullptr) const;
const char *devNode();
int sysNum() const;
const char *property(const char *key);
bool hasProperty(const char *key, const char *value);
operator udev_device*() const {
return m_device;
}
operator udev_device*() {
return m_device;
}
typedef std::unique_ptr<UdevDevice> Ptr;
private:
udev_device *m_device;
};
class KWIN_EXPORT UdevMonitor
{
public:
explicit UdevMonitor(Udev *udev);
~UdevMonitor();
int fd() const;
bool isValid() const {
return m_monitor != nullptr;
}
void filterSubsystemDevType(const char *subSystem, const char *devType = nullptr);
void enable();
UdevDevice::Ptr getDevice();
private:
Udev *m_udev;
udev_monitor *m_monitor;
};
class KWIN_EXPORT Udev
{
public:
Udev();
~Udev();
bool isValid() const {
return m_udev != nullptr;
}
UdevDevice::Ptr primaryGpu();
UdevDevice::Ptr virtualGpu();
UdevDevice::Ptr renderNode();
UdevDevice::Ptr deviceFromSyspath(const char *syspath);
UdevMonitor *monitor();
operator udev*() const {
return m_udev;
}
operator udev*() {
return m_udev;
}
private:
struct udev *m_udev;
};
}
#endif