diff --git a/autotests/drm/drmTest.cpp b/autotests/drm/drmTest.cpp index d469743408..09ed44a277 100644 --- a/autotests/drm/drmTest.cpp +++ b/autotests/drm/drmTest.cpp @@ -7,6 +7,7 @@ SPDX-License-Identifier: GPL-2.0-or-later */ +#include #include #include @@ -70,6 +71,7 @@ private Q_SLOTS: void testConnectorLifetime(); void testModeset_data(); void testModeset(); + void testVrrChange(); }; static void verifyCleanup(MockGpu *mockGpu) @@ -394,5 +396,32 @@ void DrmTest::testModeset() verifyCleanup(mockGpu.get()); } +void DrmTest::testVrrChange() +{ + const auto mockGpu = findPrimaryDevice(5); + mockGpu->deviceCaps[MOCKDRM_DEVICE_CAP_ATOMIC] = 1; + + const auto conn = std::make_shared(mockGpu.get()); + conn->setVrrCapable(false); + mockGpu->connectors.push_back(conn); + + const auto session = Session::create(Session::Type::Noop); + const auto backend = std::make_unique(session.get()); + const auto renderBackend = backend->createQPainterBackend(); + auto gpu = std::make_unique(backend.get(), mockGpu->fd, DrmDevice::open(mockGpu->devNode)); + + QVERIFY(gpu->updateOutputs()); + const auto output = gpu->drmOutputs().front(); + QVERIFY(!(output->capabilities() & Output::Capability::Vrr)); + + QSignalSpy capsChanged(output, &Output::capabilitiesChanged); + + conn->setVrrCapable(true); + QVERIFY(gpu->updateOutputs()); + QCOMPARE(gpu->drmOutputs().front(), output); + QCOMPARE(capsChanged.count(), 1); + QVERIFY(output->capabilities() & Output::Capability::Vrr); +} + QTEST_GUILESS_MAIN(DrmTest) #include "drmTest.moc" diff --git a/autotests/drm/mock_drm.cpp b/autotests/drm/mock_drm.cpp index eb41eec57c..3edeed1234 100644 --- a/autotests/drm/mock_drm.cpp +++ b/autotests/drm/mock_drm.cpp @@ -212,6 +212,14 @@ void MockConnector::addMode(uint32_t width, uint32_t height, float refreshRate, free(modeInfo); } +void MockConnector::setVrrCapable(bool cap) +{ + auto &prop = *std::ranges::find_if(props, [](const auto &prop) { + return prop.name == "vrr_capable"; + }); + prop.value = cap ? 1 : 0; +} + // MockCrtc::MockCrtc(MockGpu *gpu, const std::shared_ptr &legacyPlane, int pipeIndex, int gamma_size) diff --git a/autotests/drm/mock_drm.h b/autotests/drm/mock_drm.h index 4ae7db0614..f795977fdc 100644 --- a/autotests/drm/mock_drm.h +++ b/autotests/drm/mock_drm.h @@ -71,6 +71,7 @@ public: ~MockConnector() = default; void addMode(uint32_t width, uint32_t height, float refreshRate, bool preferred = false); + void setVrrCapable(bool cap); drmModeConnection connection; uint32_t type;