backends/drm: restrict common mode generation to drivers that support scaling

Also set the scaling mode property to "full aspect", which should reduce
the number of cases where the feature can cause issues
This commit is contained in:
Xaver Hugl 2023-03-25 17:51:52 +01:00
parent cf1d66ef59
commit 67dc0c5c48
5 changed files with 27 additions and 2 deletions

View file

@ -266,6 +266,15 @@ void DrmTest::testModeGeneration()
conn->addMode(nativeMode.width(), nativeMode.height(), 60);
QVERIFY(gpu->updateOutputs());
QCOMPARE(gpu->drmOutputs().size(), 1);
// no mode generation without the scaling property
QCOMPARE(gpu->drmOutputs().front()->modes().size(), 1);
mockGpu->connectors.removeAll(conn);
QVERIFY(gpu->updateOutputs());
conn->props.emplace_back(conn.get(), QStringLiteral("scaling mode"), 0, 0, QVector<QByteArray>{"None", "Full", "Center", "Full aspect"});
mockGpu->connectors.push_back(conn);
QVERIFY(gpu->updateOutputs());
DrmOutput *const output = gpu->drmOutputs().front();
QCOMPARE(output->modes().size(), expectedModes.size());

View file

@ -105,7 +105,8 @@ DrmConnector::DrmConnector(DrmGpu *gpu, uint32_t connectorId)
PropertyDefinition(QByteArrayLiteral("content type"), Requirement::Optional,
{QByteArrayLiteral("No Data"), QByteArrayLiteral("Graphics"), QByteArrayLiteral("Photo"), QByteArrayLiteral("Cinema"), QByteArrayLiteral("Game")}),
PropertyDefinition(QByteArrayLiteral("panel orientation"), Requirement::Optional, {QByteArrayLiteral("Normal"), QByteArrayLiteral("Upside Down"), QByteArrayLiteral("Left Side Up"), QByteArrayLiteral("Right Side Up")}),
PropertyDefinition(QByteArrayLiteral("HDR_OUTPUT_METADATA"), Requirement::Optional)},
PropertyDefinition(QByteArrayLiteral("HDR_OUTPUT_METADATA"), Requirement::Optional),
PropertyDefinition(QByteArrayLiteral("scaling mode"), Requirement::Optional, {QByteArrayLiteral("None"), QByteArrayLiteral("Full"), QByteArrayLiteral("Center"), QByteArrayLiteral("Full aspect")})},
DRM_MODE_OBJECT_CONNECTOR)
, m_pipeline(std::make_unique<DrmPipeline>(this))
, m_conn(drmModeGetConnector(gpu->fd(), connectorId))
@ -282,7 +283,9 @@ bool DrmConnector::updateProperties()
}
m_modes.clear();
m_modes.append(m_driverModes);
m_modes.append(generateCommonModes());
if (auto scaling = getProp(PropertyIndex::ScalingMode); scaling && scaling->hasEnum(ScalingMode::Full_Aspect)) {
m_modes.append(generateCommonModes());
}
if (m_pipeline->mode()) {
if (const auto mode = findMode(*m_pipeline->mode()->nativeMode())) {
m_pipeline->setMode(mode);

View file

@ -67,6 +67,7 @@ public:
ContentType = 12,
PanelOrientation = 13,
HdrMetadata = 14,
ScalingMode = 15,
Count
};
@ -92,6 +93,12 @@ public:
LeftUp = 2,
RightUp = 3
};
enum class ScalingMode : uint32_t {
None = 0,
Full = 1,
Center = 2,
Full_Aspect = 3
};
bool init() override;
bool updateProperties() override;

View file

@ -264,6 +264,9 @@ void DrmPipeline::prepareAtomicModeset(DrmAtomicCommit *commit)
if (const auto hdr = m_connector->getProp(DrmConnector::PropertyIndex::HdrMetadata)) {
commit->addProperty(hdr, 0);
}
if (const auto scaling = m_connector->getProp(DrmConnector::PropertyIndex::ScalingMode); scaling && scaling->hasEnum(DrmConnector::ScalingMode::Full_Aspect)) {
commit->addEnum(scaling, DrmConnector::ScalingMode::Full_Aspect);
}
commit->addProperty(m_pending.crtc->getProp(DrmCrtc::PropertyIndex::Active), 1);
commit->addBlob(m_pending.crtc->getProp(DrmCrtc::PropertyIndex::ModeId), m_pending.mode->blob());

View file

@ -112,6 +112,9 @@ DrmPipeline::Error DrmPipeline::applyPendingChangesLegacy()
m_connector->getProp(DrmConnector::PropertyIndex::Underscan_vborder)->setPropertyLegacy(m_pending.overscan);
m_connector->getProp(DrmConnector::PropertyIndex::Underscan_hborder)->setPropertyLegacy(hborder);
}
if (const auto scaling = m_connector->getProp(DrmConnector::PropertyIndex::ScalingMode); scaling && scaling->hasEnum(DrmConnector::ScalingMode::Full_Aspect)) {
scaling->setEnumLegacy(DrmConnector::ScalingMode::Full_Aspect);
}
if (m_pending.crtc != m_current.crtc || m_pending.mode != m_current.mode) {
Error err = legacyModeset();
if (err != Error::None) {