diff options
-rw-r--r-- | drm/resourcemanager.cpp | 31 | ||||
-rw-r--r-- | include/resourcemanager.h | 1 |
2 files changed, 30 insertions, 2 deletions
diff --git a/drm/resourcemanager.cpp b/drm/resourcemanager.cpp index da1a2db..382a85a 100644 --- a/drm/resourcemanager.cpp +++ b/drm/resourcemanager.cpp @@ -20,6 +20,7 @@ #include <cutils/properties.h> #include <log/log.h> +#include <sys/stat.h> #include <sstream> #include <string> @@ -32,7 +33,7 @@ int ResourceManager::Init() { char path_pattern[PROPERTY_VALUE_MAX]; // Could be a valid path or it can have at the end of it the wildcard % // which means that it will try open all devices until an error is met. - int path_len = property_get("hwc.drm.device", path_pattern, "/dev/dri/card0"); + int path_len = property_get("hwc.drm.device", path_pattern, "/dev/dri/card%"); int ret = 0; if (path_pattern[path_len - 1] != '%') { ret = AddDrmDevice(std::string(path_pattern)); @@ -41,7 +42,13 @@ int ResourceManager::Init() { for (int idx = 0; !ret; ++idx) { std::ostringstream path; path << path_pattern << idx; - ret = AddDrmDevice(path.str()); + + struct stat buf; + if (stat(path.str().c_str(), &buf)) { + break; + } else if (IsKMSDev(path.str().c_str())) { + ret = AddDrmDevice(path.str()); + } } } @@ -94,6 +101,26 @@ DrmConnector *ResourceManager::AvailableWritebackConnector(int display) { return writeback_conn; } +bool ResourceManager::IsKMSDev(const char *path) { + int fd = open(path, O_RDWR | O_CLOEXEC); + if (fd < 0) + return false; + + auto res = drmModeGetResources(fd); + if (!res) { + close(fd); + return false; + } + + bool is_kms = res->count_crtcs > 0 && res->count_connectors > 0 && + res->count_encoders > 0; + + drmModeFreeResources(res); + close(fd); + + return is_kms; +} + DrmDevice *ResourceManager::GetDrmDevice(int display) { for (auto &drm : drms_) { if (drm->HandlesDisplay(display)) diff --git a/include/resourcemanager.h b/include/resourcemanager.h index 7a86828..9fefb46 100644 --- a/include/resourcemanager.h +++ b/include/resourcemanager.h @@ -46,6 +46,7 @@ class ResourceManager { private: int AddDrmDevice(std::string path); + static bool IsKMSDev(const char *path); int num_displays_; std::vector<std::unique_ptr<DrmDevice>> drms_; |