add recheckConnections and use it
This commit is contained in:
parent
23c7925dd3
commit
347a7ef1f2
|
|
@ -367,10 +367,11 @@ namespace Aquamarine {
|
|||
bool initMgpu();
|
||||
bool grabFormats();
|
||||
bool shouldBlit();
|
||||
void scanConnectors(bool allowConnect = true);
|
||||
void scanConnectors();
|
||||
void scanLeases();
|
||||
void restoreAfterVT();
|
||||
void recheckCRTCs();
|
||||
void recheckConnections();
|
||||
void buildGlFormats(const std::vector<SGLFormat>& fmts);
|
||||
|
||||
Hyprutils::Memory::CSharedPointer<CSessionDevice> gpu;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,56 @@
|
|||
diff --git a/include/aquamarine/backend/DRM.hpp b/include/aquamarine/backend/DRM.hpp
|
||||
index 348bbaa..040cad7 100644
|
||||
--- a/include/aquamarine/backend/DRM.hpp
|
||||
+++ b/include/aquamarine/backend/DRM.hpp
|
||||
@@ -367,7 +367,7 @@ namespace Aquamarine {
|
||||
bool initMgpu();
|
||||
bool grabFormats();
|
||||
bool shouldBlit();
|
||||
- void scanConnectors();
|
||||
+ void scanConnectors(bool allowConnect = true);
|
||||
void scanLeases();
|
||||
void restoreAfterVT();
|
||||
void recheckCRTCs();
|
||||
diff --git a/src/backend/drm/DRM.cpp b/src/backend/drm/DRM.cpp
|
||||
index c2c6125..899bbec 100644
|
||||
--- a/src/backend/drm/DRM.cpp
|
||||
+++ b/src/backend/drm/DRM.cpp
|
||||
@@ -658,7 +658,7 @@ bool Aquamarine::CDRMBackend::registerGPU(SP<CSessionDevice> gpu_, SP<CDRMBacken
|
||||
auto E = std::any_cast<CSessionDevice::SChangeEvent>(d);
|
||||
if (E.type == CSessionDevice::AQ_SESSION_EVENT_CHANGE_HOTPLUG) {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Got a hotplug event for {}", gpuName));
|
||||
- scanConnectors();
|
||||
+ scanConnectors(false);
|
||||
recheckCRTCs();
|
||||
} else if (E.type == CSessionDevice::AQ_SESSION_EVENT_CHANGE_LEASE) {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Got a lease event for {}", gpuName));
|
||||
@@ -676,7 +676,7 @@ eBackendType Aquamarine::CDRMBackend::type() {
|
||||
return eBackendType::AQ_BACKEND_DRM;
|
||||
}
|
||||
|
||||
-void Aquamarine::CDRMBackend::scanConnectors() {
|
||||
+void Aquamarine::CDRMBackend::scanConnectors(bool allowConnect) {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Scanning connectors for {}", gpu->path));
|
||||
|
||||
auto resources = drmModeGetResources(gpu->fd);
|
||||
@@ -722,12 +722,14 @@ void Aquamarine::CDRMBackend::scanConnectors() {
|
||||
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} connection state: {}", connectorID, (int)drmConn->connection));
|
||||
|
||||
- if (conn->status == DRM_MODE_CONNECTED && !conn->output) {
|
||||
- backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} connected", conn->szName));
|
||||
- conn->connect(drmConn);
|
||||
- } else if (conn->status != DRM_MODE_CONNECTED && conn->output) {
|
||||
- backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} disconnected", conn->szName));
|
||||
- conn->disconnect();
|
||||
+ if (allowConnect) {
|
||||
+ if (conn->status == DRM_MODE_CONNECTED && !conn->output) {
|
||||
+ backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} connected", conn->szName));
|
||||
+ conn->connect(drmConn);
|
||||
+ } else if (conn->status != DRM_MODE_CONNECTED && conn->output) {
|
||||
+ backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} disconnected", conn->szName));
|
||||
+ conn->disconnect();
|
||||
+ }
|
||||
}
|
||||
|
||||
drmModeFreeConnector(drmConn);
|
||||
|
|
@ -250,6 +250,8 @@ std::vector<SP<CDRMBackend>> Aquamarine::CDRMBackend::attempt(SP<CBackend> backe
|
|||
|
||||
drmBackend->recheckCRTCs();
|
||||
|
||||
drmBackend->recheckConnections();
|
||||
|
||||
if (!newPrimary) {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: gpu {} becomes primary drm", gpu->path));
|
||||
newPrimary = drmBackend;
|
||||
|
|
@ -281,6 +283,7 @@ void Aquamarine::CDRMBackend::restoreAfterVT() {
|
|||
|
||||
scanConnectors();
|
||||
recheckCRTCs();
|
||||
recheckConnections();
|
||||
|
||||
backend->log(AQ_LOG_DEBUG, "drm: Rescanned connectors");
|
||||
|
||||
|
|
@ -658,8 +661,9 @@ bool Aquamarine::CDRMBackend::registerGPU(SP<CSessionDevice> gpu_, SP<CDRMBacken
|
|||
auto E = std::any_cast<CSessionDevice::SChangeEvent>(d);
|
||||
if (E.type == CSessionDevice::AQ_SESSION_EVENT_CHANGE_HOTPLUG) {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Got a hotplug event for {}", gpuName));
|
||||
scanConnectors(false);
|
||||
scanConnectors();
|
||||
recheckCRTCs();
|
||||
recheckConnections();
|
||||
} else if (E.type == CSessionDevice::AQ_SESSION_EVENT_CHANGE_LEASE) {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Got a lease event for {}", gpuName));
|
||||
scanLeases();
|
||||
|
|
@ -676,7 +680,7 @@ eBackendType Aquamarine::CDRMBackend::type() {
|
|||
return eBackendType::AQ_BACKEND_DRM;
|
||||
}
|
||||
|
||||
void Aquamarine::CDRMBackend::scanConnectors(bool allowConnect) {
|
||||
void Aquamarine::CDRMBackend::scanConnectors() {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Scanning connectors for {}", gpu->path));
|
||||
|
||||
auto resources = drmModeGetResources(gpu->fd);
|
||||
|
|
@ -722,22 +726,24 @@ void Aquamarine::CDRMBackend::scanConnectors(bool allowConnect) {
|
|||
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} connection state: {}", connectorID, (int)drmConn->connection));
|
||||
|
||||
if (allowConnect) {
|
||||
if (conn->status == DRM_MODE_CONNECTED && !conn->output) {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} connected", conn->szName));
|
||||
conn->connect(drmConn);
|
||||
} else if (conn->status != DRM_MODE_CONNECTED && conn->output) {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} disconnected", conn->szName));
|
||||
conn->disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
drmModeFreeConnector(drmConn);
|
||||
}
|
||||
|
||||
drmModeFreeResources(resources);
|
||||
}
|
||||
|
||||
void Aquamarine::CDRMBackend::recheckConnections() {
|
||||
for (const auto& conn : connectors) {
|
||||
if (conn->status == DRM_MODE_CONNECTED && !conn->output) {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} connected", conn->szName));
|
||||
conn->connect(drmConn);
|
||||
} else if (conn->status != DRM_MODE_CONNECTED && conn->output) {
|
||||
backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} disconnected", conn->szName));
|
||||
conn->disconnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Aquamarine::CDRMBackend::scanLeases() {
|
||||
auto lessees = drmModeListLessees(gpu->fd);
|
||||
if (!lessees) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue