summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drm/resourcemanager.cpp31
-rw-r--r--include/resourcemanager.h1
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_;