Changeset View
Changeset View
Standalone View
Standalone View
autotests/client/test_wayland_outputdevice.cpp
Show All 39 Lines | 39 | public: | |||
---|---|---|---|---|---|
40 | explicit TestWaylandOutputDevice(QObject *parent = nullptr); | 40 | explicit TestWaylandOutputDevice(QObject *parent = nullptr); | ||
41 | private Q_SLOTS: | 41 | private Q_SLOTS: | ||
42 | void init(); | 42 | void init(); | ||
43 | void cleanup(); | 43 | void cleanup(); | ||
44 | 44 | | |||
45 | void testRegistry(); | 45 | void testRegistry(); | ||
46 | void testModeChanges(); | 46 | void testModeChanges(); | ||
47 | void testScaleChange(); | 47 | void testScaleChange(); | ||
48 | void testColorCurvesChange(); | ||||
48 | 49 | | |||
49 | void testSubPixel_data(); | 50 | void testSubPixel_data(); | ||
50 | void testSubPixel(); | 51 | void testSubPixel(); | ||
51 | 52 | | |||
52 | void testTransform_data(); | 53 | void testTransform_data(); | ||
53 | void testTransform(); | 54 | void testTransform(); | ||
54 | 55 | | |||
55 | void testEnabled(); | 56 | void testEnabled(); | ||
56 | void testEdid(); | 57 | void testEdid(); | ||
57 | void testId(); | 58 | void testId(); | ||
58 | void testDone(); | 59 | void testDone(); | ||
59 | 60 | | |||
60 | private: | 61 | private: | ||
61 | KWayland::Server::Display *m_display; | 62 | KWayland::Server::Display *m_display; | ||
62 | KWayland::Server::OutputDeviceInterface *m_serverOutputDevice; | 63 | KWayland::Server::OutputDeviceInterface *m_serverOutputDevice; | ||
63 | QByteArray m_edid; | 64 | QByteArray m_edid; | ||
65 | KWayland::Server::OutputDeviceInterface::ColorCurves m_initColorCurves; | ||||
64 | KWayland::Client::ConnectionThread *m_connection; | 66 | KWayland::Client::ConnectionThread *m_connection; | ||
65 | KWayland::Client::EventQueue *m_queue; | 67 | KWayland::Client::EventQueue *m_queue; | ||
66 | QThread *m_thread; | 68 | QThread *m_thread; | ||
67 | 69 | | |||
68 | }; | 70 | }; | ||
69 | 71 | | |||
70 | static const QString s_socketName = QStringLiteral("kwin-test-wayland-output-0"); | 72 | static const QString s_socketName = QStringLiteral("kwin-test-wayland-output-0"); | ||
71 | 73 | | |||
Show All 37 Lines | 85 | { | |||
109 | m2.refreshRate = 90000; | 111 | m2.refreshRate = 90000; | ||
110 | m_serverOutputDevice->addMode(m2); | 112 | m_serverOutputDevice->addMode(m2); | ||
111 | 113 | | |||
112 | m_serverOutputDevice->setCurrentMode(1); | 114 | m_serverOutputDevice->setCurrentMode(1); | ||
113 | 115 | | |||
114 | m_edid = QByteArray::fromBase64("AP///////wAQrBbwTExLQQ4WAQOANCB46h7Frk80sSYOUFSlSwCBgKlA0QBxTwEBAQEBAQEBKDyAoHCwI0AwIDYABkQhAAAaAAAA/wBGNTI1TTI0NUFLTEwKAAAA/ABERUxMIFUyNDEwCiAgAAAA/QA4TB5REQAKICAgICAgAToCAynxUJAFBAMCBxYBHxITFCAVEQYjCQcHZwMMABAAOC2DAQAA4wUDAQI6gBhxOC1AWCxFAAZEIQAAHgEdgBhxHBYgWCwlAAZEIQAAngEdAHJR0B4gbihVAAZEIQAAHowK0Iog4C0QED6WAAZEIQAAGAAAAAAAAAAAAAAAAAAAPg=="); | 116 | m_edid = QByteArray::fromBase64("AP///////wAQrBbwTExLQQ4WAQOANCB46h7Frk80sSYOUFSlSwCBgKlA0QBxTwEBAQEBAQEBKDyAoHCwI0AwIDYABkQhAAAaAAAA/wBGNTI1TTI0NUFLTEwKAAAA/ABERUxMIFUyNDEwCiAgAAAA/QA4TB5REQAKICAgICAgAToCAynxUJAFBAMCBxYBHxITFCAVEQYjCQcHZwMMABAAOC2DAQAA4wUDAQI6gBhxOC1AWCxFAAZEIQAAHgEdgBhxHBYgWCwlAAZEIQAAngEdAHJR0B4gbihVAAZEIQAAHowK0Iog4C0QED6WAAZEIQAAGAAAAAAAAAAAAAAAAAAAPg=="); | ||
115 | m_serverOutputDevice->setEdid(m_edid); | 117 | m_serverOutputDevice->setEdid(m_edid); | ||
116 | 118 | | |||
119 | m_initColorCurves.red.clear(); | ||||
120 | m_initColorCurves.green.clear(); | ||||
121 | m_initColorCurves.blue.clear(); | ||||
122 | // 8 bit color ramps | ||||
123 | for (int i = 0; i < 256; i++) { | ||||
124 | quint16 val = (double)i / 255 * UINT16_MAX; | ||||
125 | m_initColorCurves.red << val ; | ||||
126 | m_initColorCurves.green << val ; | ||||
127 | } | ||||
128 | // 10 bit color ramp | ||||
129 | for (int i = 0; i < 320; i++) { | ||||
130 | m_initColorCurves.blue << (double)i / 319 * UINT16_MAX; | ||||
131 | } | ||||
132 | m_serverOutputDevice->setColorCurves(m_initColorCurves); | ||||
133 | | ||||
117 | m_serverOutputDevice->create(); | 134 | m_serverOutputDevice->create(); | ||
118 | 135 | | |||
119 | // setup connection | 136 | // setup connection | ||
120 | m_connection = new KWayland::Client::ConnectionThread; | 137 | m_connection = new KWayland::Client::ConnectionThread; | ||
121 | QSignalSpy connectedSpy(m_connection, &KWayland::Client::ConnectionThread::connected); | 138 | QSignalSpy connectedSpy(m_connection, &KWayland::Client::ConnectionThread::connected); | ||
122 | m_connection->setSocketName(s_socketName); | 139 | m_connection->setSocketName(s_socketName); | ||
123 | 140 | | |||
124 | m_thread = new QThread(this); | 141 | m_thread = new QThread(this); | ||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Line(s) | 177 | { | |||
177 | QCOMPARE(output.geometry(), QRect()); | 194 | QCOMPARE(output.geometry(), QRect()); | ||
178 | QCOMPARE(output.globalPosition(), QPoint()); | 195 | QCOMPARE(output.globalPosition(), QPoint()); | ||
179 | QCOMPARE(output.manufacturer(), QString()); | 196 | QCOMPARE(output.manufacturer(), QString()); | ||
180 | QCOMPARE(output.model(), QString()); | 197 | QCOMPARE(output.model(), QString()); | ||
181 | QCOMPARE(output.physicalSize(), QSize()); | 198 | QCOMPARE(output.physicalSize(), QSize()); | ||
182 | QCOMPARE(output.pixelSize(), QSize()); | 199 | QCOMPARE(output.pixelSize(), QSize()); | ||
183 | QCOMPARE(output.refreshRate(), 0); | 200 | QCOMPARE(output.refreshRate(), 0); | ||
184 | QCOMPARE(output.scale(), 1); | 201 | QCOMPARE(output.scale(), 1); | ||
202 | QCOMPARE(output.colorCurves().red, QVector<quint16>()); | ||||
203 | QCOMPARE(output.colorCurves().green, QVector<quint16>()); | ||||
204 | QCOMPARE(output.colorCurves().blue, QVector<quint16>()); | ||||
185 | QCOMPARE(output.subPixel(), KWayland::Client::OutputDevice::SubPixel::Unknown); | 205 | QCOMPARE(output.subPixel(), KWayland::Client::OutputDevice::SubPixel::Unknown); | ||
186 | QCOMPARE(output.transform(), KWayland::Client::OutputDevice::Transform::Normal); | 206 | QCOMPARE(output.transform(), KWayland::Client::OutputDevice::Transform::Normal); | ||
187 | QCOMPARE(output.enabled(), OutputDevice::Enablement::Enabled); | 207 | QCOMPARE(output.enabled(), OutputDevice::Enablement::Enabled); | ||
188 | QCOMPARE(output.edid(), QByteArray()); | 208 | QCOMPARE(output.edid(), QByteArray()); | ||
189 | QSignalSpy outputChanged(&output, &KWayland::Client::OutputDevice::done); | 209 | QSignalSpy outputChanged(&output, &KWayland::Client::OutputDevice::done); | ||
190 | QVERIFY(outputChanged.isValid()); | 210 | QVERIFY(outputChanged.isValid()); | ||
191 | 211 | | |||
192 | output.setup(registry.bindOutputDevice(announced.first().first().value<quint32>(), announced.first().last().value<quint32>())); | 212 | output.setup(registry.bindOutputDevice(announced.first().first().value<quint32>(), announced.first().last().value<quint32>())); | ||
193 | wl_display_flush(m_connection->display()); | 213 | wl_display_flush(m_connection->display()); | ||
194 | 214 | | |||
195 | QVERIFY(outputChanged.wait()); | 215 | QVERIFY(outputChanged.wait()); | ||
196 | 216 | | |||
197 | QCOMPARE(output.geometry(), QRect(100, 50, 1024, 768)); | 217 | QCOMPARE(output.geometry(), QRect(100, 50, 1024, 768)); | ||
198 | QCOMPARE(output.globalPosition(), QPoint(100, 50)); | 218 | QCOMPARE(output.globalPosition(), QPoint(100, 50)); | ||
199 | QCOMPARE(output.manufacturer(), QStringLiteral("org.kde.kwin")); | 219 | QCOMPARE(output.manufacturer(), QStringLiteral("org.kde.kwin")); | ||
200 | QCOMPARE(output.model(), QStringLiteral("none")); | 220 | QCOMPARE(output.model(), QStringLiteral("none")); | ||
201 | QCOMPARE(output.physicalSize(), QSize(200, 100)); | 221 | QCOMPARE(output.physicalSize(), QSize(200, 100)); | ||
202 | QCOMPARE(output.pixelSize(), QSize(1024, 768)); | 222 | QCOMPARE(output.pixelSize(), QSize(1024, 768)); | ||
203 | QCOMPARE(output.refreshRate(), 60000); | 223 | QCOMPARE(output.refreshRate(), 60000); | ||
204 | QCOMPARE(output.scale(), 1); | 224 | QCOMPARE(output.scale(), 1); | ||
225 | QCOMPARE(output.colorCurves().red, m_initColorCurves.red); | ||||
226 | QCOMPARE(output.colorCurves().green, m_initColorCurves.green); | ||||
227 | QCOMPARE(output.colorCurves().blue, m_initColorCurves.blue); | ||||
205 | // for xwayland output it's unknown | 228 | // for xwayland output it's unknown | ||
206 | QCOMPARE(output.subPixel(), KWayland::Client::OutputDevice::SubPixel::Unknown); | 229 | QCOMPARE(output.subPixel(), KWayland::Client::OutputDevice::SubPixel::Unknown); | ||
207 | // for xwayland transform is normal | 230 | // for xwayland transform is normal | ||
208 | QCOMPARE(output.transform(), KWayland::Client::OutputDevice::Transform::Normal); | 231 | QCOMPARE(output.transform(), KWayland::Client::OutputDevice::Transform::Normal); | ||
209 | 232 | | |||
210 | QCOMPARE(output.edid(), m_edid); | 233 | QCOMPARE(output.edid(), m_edid); | ||
211 | QCOMPARE(output.enabled(), OutputDevice::Enablement::Enabled); | 234 | QCOMPARE(output.enabled(), OutputDevice::Enablement::Enabled); | ||
212 | QCOMPARE(output.uuid(), QByteArray("1337")); | 235 | QCOMPARE(output.uuid(), QByteArray("1337")); | ||
▲ Show 20 Lines • Show All 126 Lines • ▼ Show 20 Line(s) | 337 | { | |||
339 | 362 | | |||
340 | // change once more | 363 | // change once more | ||
341 | outputChanged.clear(); | 364 | outputChanged.clear(); | ||
342 | m_serverOutputDevice->setScale(4); | 365 | m_serverOutputDevice->setScale(4); | ||
343 | QVERIFY(outputChanged.wait()); | 366 | QVERIFY(outputChanged.wait()); | ||
344 | QCOMPARE(output.scale(), 4); | 367 | QCOMPARE(output.scale(), 4); | ||
345 | } | 368 | } | ||
346 | 369 | | |||
370 | void TestWaylandOutputDevice::testColorCurvesChange() | ||||
371 | { | ||||
372 | KWayland::Client::Registry registry; | ||||
373 | QSignalSpy interfacesAnnouncedSpy(®istry, &KWayland::Client::Registry::interfacesAnnounced); | ||||
374 | QVERIFY(interfacesAnnouncedSpy.isValid()); | ||||
375 | QSignalSpy announced(®istry, &KWayland::Client::Registry::outputDeviceAnnounced); | ||||
376 | registry.setEventQueue(m_queue); | ||||
377 | registry.create(m_connection->display()); | ||||
378 | QVERIFY(registry.isValid()); | ||||
379 | registry.setup(); | ||||
380 | wl_display_flush(m_connection->display()); | ||||
381 | QVERIFY(interfacesAnnouncedSpy.wait()); | ||||
382 | | ||||
383 | KWayland::Client::OutputDevice output; | ||||
384 | QSignalSpy outputChanged(&output, &KWayland::Client::OutputDevice::done); | ||||
385 | QVERIFY(outputChanged.isValid()); | ||||
386 | output.setup(registry.bindOutputDevice(announced.first().first().value<quint32>(), announced.first().last().value<quint32>())); | ||||
387 | wl_display_flush(m_connection->display()); | ||||
388 | QVERIFY(outputChanged.wait()); | ||||
389 | QCOMPARE(output.colorCurves().red, m_initColorCurves.red); | ||||
390 | QCOMPARE(output.colorCurves().green, m_initColorCurves.green); | ||||
391 | QCOMPARE(output.colorCurves().blue, m_initColorCurves.blue); | ||||
392 | | ||||
393 | // change the color curves | ||||
394 | outputChanged.clear(); | ||||
395 | KWayland::Server::OutputDeviceInterface::ColorCurves cc; | ||||
396 | cc.red = QVector<quint16>(256, 0); | ||||
397 | cc.green = QVector<quint16>(256, UINT16_MAX); | ||||
398 | cc.blue = QVector<quint16>(320, 1); | ||||
399 | m_serverOutputDevice->setColorCurves(cc); | ||||
400 | QVERIFY(outputChanged.wait()); | ||||
401 | QCOMPARE(output.colorCurves().red, cc.red); | ||||
402 | QCOMPARE(output.colorCurves().green, cc.green); | ||||
403 | QCOMPARE(output.colorCurves().blue, cc.blue); | ||||
404 | | ||||
405 | // change once more | ||||
406 | outputChanged.clear(); | ||||
407 | cc.red = QVector<quint16>(256, 0); | ||||
408 | cc.green = QVector<quint16>(256, UINT16_MAX); | ||||
409 | cc.blue = QVector<quint16>(320, UINT16_MAX); | ||||
410 | m_serverOutputDevice->setColorCurves(cc); | ||||
411 | QVERIFY(outputChanged.wait()); | ||||
412 | QCOMPARE(output.colorCurves().red, cc.red); | ||||
413 | QCOMPARE(output.colorCurves().green, cc.green); | ||||
414 | QCOMPARE(output.colorCurves().blue, cc.blue); | ||||
415 | } | ||||
416 | | ||||
347 | void TestWaylandOutputDevice::testSubPixel_data() | 417 | void TestWaylandOutputDevice::testSubPixel_data() | ||
348 | { | 418 | { | ||
349 | using namespace KWayland::Client; | 419 | using namespace KWayland::Client; | ||
350 | using namespace KWayland::Server; | 420 | using namespace KWayland::Server; | ||
351 | QTest::addColumn<KWayland::Client::OutputDevice::SubPixel>("expected"); | 421 | QTest::addColumn<KWayland::Client::OutputDevice::SubPixel>("expected"); | ||
352 | QTest::addColumn<KWayland::Server::OutputDeviceInterface::SubPixel>("actual"); | 422 | QTest::addColumn<KWayland::Server::OutputDeviceInterface::SubPixel>("actual"); | ||
353 | 423 | | |||
354 | QTest::newRow("none") << OutputDevice::SubPixel::None << OutputDeviceInterface::SubPixel::None; | 424 | QTest::newRow("none") << OutputDevice::SubPixel::None << OutputDeviceInterface::SubPixel::None; | ||
▲ Show 20 Lines • Show All 219 Lines • Show Last 20 Lines |