/// \internal /// <summary> /// Queries the specified GPU for connected displays and, optionally, /// returns the list of displays. /// </summary> /// <returns><c>true</c>, if at least one display is connected, <c>false</c> otherwise.</returns> /// <param name="fd">The fd for the GPU to query, obtained through open("/dev/dri/card0").</param> /// <param name="displays"> /// If not null, this will contain a list <see cref="LinuxDisplay"/> instances, /// one for each connected display. /// </param> internal static bool QueryDisplays(int fd, List <LinuxDisplay> displays) { unsafe { bool has_displays = false; if (displays != null) { displays.Clear(); } ModeRes *resources = (ModeRes *)Drm.ModeGetResources(fd); if (resources == null) { Debug.Print("[KMS] Drm.ModeGetResources failed."); return(false); } Debug.Print("[KMS] DRM found {0} connectors", resources->count_connectors); // Search for a valid connector ModeConnector *connector = null; for (int i = 0; i < resources->count_connectors; i++) { connector = (ModeConnector *)Drm.ModeGetConnector(fd, *(resources->connectors + i)); if (connector != null) { bool success = false; LinuxDisplay display = null; try { if (connector->connection == ModeConnection.Connected && connector->count_modes > 0) { success = QueryDisplay(fd, connector, out display); has_displays |= success; } } catch (Exception e) { Debug.Print("[KMS] Failed to add display. Error: {0}", e); } if (success && displays != null) { displays.Add(display); } else { Drm.ModeFreeConnector((IntPtr)connector); connector = null; } } } return(has_displays); } }