Skip to content

Commit

Permalink
recheck crtcs before connecting on udev event
Browse files Browse the repository at this point in the history
  • Loading branch information
ikalco committed Aug 26, 2024
1 parent 3989aa9 commit 969cb5a
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 9 deletions.
2 changes: 1 addition & 1 deletion include/aquamarine/backend/DRM.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
56 changes: 56 additions & 0 deletions patch.txt
Original file line number Diff line number Diff line change
@@ -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);
18 changes: 10 additions & 8 deletions src/backend/drm/DRM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 969cb5a

Please sign in to comment.