Skip to content

Commit

Permalink
drm: prioritize gpus with the most internal panels (#144)
Browse files Browse the repository at this point in the history
  • Loading branch information
ikalco authored Feb 9, 2025
1 parent 427077c commit a3dda0d
Showing 1 changed file with 36 additions and 0 deletions.
36 changes: 36 additions & 0 deletions src/backend/drm/DRM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,28 @@ static udev_enumerate* enumDRMCards(udev* udev) {
return enumerate;
}

static int gpuNumBuiltinPanels(const SP<CSessionDevice> 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<SP<CSessionDevice>> scanGPUs(SP<CBackend> backend) {
auto enumerate = enumDRMCards(backend->session->udevHandle);

Expand All @@ -85,6 +107,9 @@ static std::vector<SP<CSessionDevice>> scanGPUs(SP<CBackend> backend) {
udev_list_entry* entry = nullptr;
std::deque<SP<CSessionDevice>> devices;

int maxBuiltinPanels = 0;
SP<CSessionDevice> 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);
Expand Down Expand Up @@ -131,6 +156,13 @@ static std::vector<SP<CSessionDevice>> scanGPUs(SP<CBackend> 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);
Expand Down Expand Up @@ -174,6 +206,10 @@ static std::vector<SP<CSessionDevice>> scanGPUs(SP<CBackend> 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);
}
Expand Down

0 comments on commit a3dda0d

Please sign in to comment.