40QEglFSKmsScreen::QEglFSKmsScreen(QEglFSKmsDevice *device,
const QKmsOutput &output,
bool headless)
41 : QEglFSScreen(
static_cast<QEglFSIntegration *>(QGuiApplicationPrivate::platformIntegration())->display())
44 , m_cursorOutOfRange(
false)
45 , m_powerState(PowerStateOn)
46 , m_interruptHandler(
new QEglFSKmsInterruptHandler(
this))
47 , m_headless(headless)
51 if (m_output.edid_blob) {
52 QByteArray edid(
reinterpret_cast<
const char *>(m_output.edid_blob->data), m_output.edid_blob->length);
53 if (m_edid.parse(edid))
54 qCDebug(qLcEglfsKmsDebug,
"EDID data for output \"%s\": identifier '%s', manufacturer '%s', model '%s', serial '%s', physical size: %.2fx%.2f",
55 name().toLatin1().constData(),
56 m_edid.identifier.toLatin1().constData(),
57 m_edid.manufacturer.toLatin1().constData(),
58 m_edid.model.toLatin1().constData(),
59 m_edid.serialNumber.toLatin1().constData(),
60 m_edid.physicalSize.width(), m_edid.physicalSize.height());
62 qCDebug(qLcEglfsKmsDebug) <<
"Failed to parse EDID data for output" << name();
64 qCDebug(qLcEglfsKmsDebug) <<
"No EDID data for output" << name();
68 QMutexLocker lock(&s_screensMutex);
69 s_screens.insert(
this);
91QRect QEglFSKmsScreen::rawGeometry()
const
94 return QRect(QPoint(0, 0), m_device->screenConfig()->headlessSize());
96 return QRect(m_pos.x(), m_pos.y(),
97 m_output.size.width(),
98 m_output.size.height());
129QSizeF QEglFSKmsScreen::physicalSize()
const
131 if (!m_output.physical_size.isEmpty()) {
132 return m_output.physical_size;
134 const QSize s = geometry().size();
135 return QSizeF(0.254 * s.width(), 0.254 * s.height());
207QList<QPlatformScreen::Mode> QEglFSKmsScreen::modes()
const
209 QList<QPlatformScreen::Mode> list;
210 list.reserve(m_output.modes.size());
212 for (
const drmModeModeInfo &info : std::as_const(m_output.modes))
213 list.append({QSize(info.hdisplay, info.vdisplay),
214 qreal(info.vrefresh > 0 ? info.vrefresh : 60)});