Index: ui/ozone/platform/drm/host/drm_display_host_manager.cc |
diff --git a/ui/ozone/platform/drm/host/drm_display_host_manager.cc b/ui/ozone/platform/drm/host/drm_display_host_manager.cc |
index bef88fbb0f1467ba1664cd8d976fa052d7113bf2..badff449d9da22f3eb09b4db871bf3df32eca595 100644 |
--- a/ui/ozone/platform/drm/host/drm_display_host_manager.cc |
+++ b/ui/ozone/platform/drm/host/drm_display_host_manager.cc |
@@ -5,11 +5,10 @@ |
#include "ui/ozone/platform/drm/host/drm_display_host_manager.h" |
#include <fcntl.h> |
-#include <stdio.h> |
#include <xf86drm.h> |
-#include "base/logging.h" |
-#include "base/strings/stringprintf.h" |
+#include "base/files/file_enumerator.h" |
+#include "base/posix/eintr_wrapper.h" |
#include "base/thread_task_runner_handle.h" |
#include "base/threading/thread_restrictions.h" |
#include "base/threading/worker_pool.h" |
@@ -32,6 +31,8 @@ typedef base::Callback<void(const base::FilePath&, scoped_ptr<DrmDeviceHandle>)> |
OnOpenDeviceReplyCallback; |
const char kDefaultGraphicsCardPattern[] = "/dev/dri/card%d"; |
+const char kVgemDevDriCardPath[] = "/dev/dri/"; |
+const char kVgemSysCardPath[] = "/sys/bus/platform/devices/vgem/drm/"; |
const char* kDisplayActionString[] = { |
"ADD", |
@@ -76,6 +77,22 @@ base::FilePath GetPrimaryDisplayCardPath() { |
return base::FilePath(); |
} |
+base::FilePath GetVgemCardPath() { |
+ base::FileEnumerator file_iter(base::FilePath(kVgemSysCardPath), false, |
+ base::FileEnumerator::DIRECTORIES, |
+ FILE_PATH_LITERAL("card*")); |
+ |
+ while (!file_iter.Next().empty()) { |
+ // Inspect the card%d directories in the directory and extract the filename. |
+ std::string vgem_card_path = |
+ kVgemDevDriCardPath + file_iter.GetInfo().GetName().BaseName().value(); |
+ DVLOG(1) << "VGEM card path is " << vgem_card_path; |
+ return base::FilePath(vgem_card_path); |
+ } |
+ DVLOG(1) << "Don't support VGEM"; |
+ return base::FilePath(); |
+} |
+ |
class FindDrmDisplayHostById { |
public: |
explicit FindDrmDisplayHostById(int64_t display_id) |
@@ -111,6 +128,16 @@ DrmDisplayHostManager::DrmDisplayHostManager(DrmGpuPlatformSupportHost* proxy, |
return; |
} |
drm_devices_.insert(primary_graphics_card_path_); |
+ |
+ vgem_card_path_ = GetVgemCardPath(); |
+ if (!vgem_card_path_.empty()) { |
+ int fd = HANDLE_EINTR( |
+ open(vgem_card_path_.value().c_str(), O_RDWR | O_CLOEXEC)); |
+ if (fd < 0) { |
+ PLOG(ERROR) << "Failed to open vgem: " << vgem_card_path_.value(); |
+ } |
+ vgem_card_device_file_.reset(fd); |
+ } |
} |
device_manager_->AddObserver(this); |
@@ -187,6 +214,8 @@ void DrmDisplayHostManager::ProcessEvent() { |
<< " for " << event.path.value(); |
switch (event.action_type) { |
case DeviceEvent::ADD: |
+ if (event.path == vgem_card_path_) |
+ continue; |
if (drm_devices_.find(event.path) == drm_devices_.end()) { |
task_pending_ = base::WorkerPool::PostTask( |
FROM_HERE, |
@@ -206,6 +235,7 @@ void DrmDisplayHostManager::ProcessEvent() { |
case DeviceEvent::REMOVE: |
DCHECK(event.path != primary_graphics_card_path_) |
<< "Removing primary graphics card"; |
+ DCHECK(event.path != vgem_card_path_) << "Removing VGEM device"; |
auto it = drm_devices_.find(event.path); |
if (it != drm_devices_.end()) { |
task_pending_ = base::ThreadTaskRunnerHandle::Get()->PostTask( |