From ecdf3a38af524dd54b97ee2c73e725452a2a7e42 Mon Sep 17 00:00:00 2001 From: Ikalco <73481042+ikalco@users.noreply.github.com> Date: Sat, 8 Feb 2025 17:43:54 -0600 Subject: [PATCH] prioritize gpus with the most internal panels --- src/backend/drm/DRM.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/backend/drm/DRM.cpp b/src/backend/drm/DRM.cpp index b7b123b..508de51 100644 --- a/src/backend/drm/DRM.cpp +++ b/src/backend/drm/DRM.cpp @@ -68,6 +68,28 @@ static udev_enumerate* enumDRMCards(udev* udev) { return enumerate; } +static int gpuNumBuiltinPanels(const SP gpu) { + auto resources = drmModeGetResources(gpu->fd); + if (!resources) + return 0; + + int num = 0; + for (int i = 0; i < resources->count_connectors; ++i) { + auto drmConn = drmModeGetConnector(gpu->fd, resources->connectors[i]); + if (!drmConn) + continue; + + if (drmConn->connector_type == DRM_MODE_CONNECTOR_LVDS || drmConn->connector_type == DRM_MODE_CONNECTOR_eDP || drmConn->connector_type == DRM_MODE_CONNECTOR_DSI) + num++; + + drmModeFreeConnector(drmConn); + } + + drmModeFreeResources(resources); + + return num; +} + static std::vector> scanGPUs(SP backend) { auto enumerate = enumDRMCards(backend->session->udevHandle); @@ -85,6 +107,9 @@ static std::vector> scanGPUs(SP backend) { udev_list_entry* entry = nullptr; std::deque> devices; + int maxBuiltinPanels = 0; + SP maxBuiltinPanelsGPU; + udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(enumerate)) { auto path = udev_list_entry_get_name(entry); auto device = udev_device_new_from_syspath(backend->session->udevHandle, path); @@ -131,6 +156,13 @@ static std::vector> scanGPUs(SP backend) { devices.push_front(sessionDevice); else devices.push_back(sessionDevice); + + int numBuiltinPanels = gpuNumBuiltinPanels(sessionDevice); + backend->log(AQ_LOG_TRACE, std::format("drm: Device {} has {} builtin {}", sessionDevice->path, numBuiltinPanels, numBuiltinPanels == 1 ? "panel" : "panels")); + if (numBuiltinPanels > maxBuiltinPanels) { + maxBuiltinPanelsGPU = sessionDevice; + maxBuiltinPanels = numBuiltinPanels; + } } udev_enumerate_unref(enumerate); @@ -174,6 +206,10 @@ static std::vector> scanGPUs(SP backend) { backend->log(AQ_LOG_ERROR, std::format("drm: Explicit device {} not found", d)); } } else { + if (maxBuiltinPanelsGPU && devices.front() != maxBuiltinPanelsGPU) { + std::erase(devices, maxBuiltinPanelsGPU); + devices.push_front(maxBuiltinPanelsGPU); + } for (auto const& d : devices) { vecDevices.push_back(d); }