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 d22752717435b5d761cab96499d904cfab44477c..473970a4f9c6585c579a4928d8bcf69dc6e37576 100644 |
--- a/ui/ozone/platform/drm/host/drm_display_host_manager.cc |
+++ b/ui/ozone/platform/drm/host/drm_display_host_manager.cc |
@@ -8,6 +8,7 @@ |
#include <stdio.h> |
#include <xf86drm.h> |
+#include "base/files/file_enumerator.h" |
#include "base/logging.h" |
#include "base/strings/stringprintf.h" |
#include "base/thread_task_runner_handle.h" |
@@ -31,6 +32,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/"; |
vignatti (out of this project)
2015/05/26 18:28:34
note that this only works on CrOS. In other Linux
|
const char* kDisplayActionString[] = { |
"ADD", |
@@ -75,6 +78,23 @@ base::FilePath GetPrimaryDisplayCardPath() { |
return base::FilePath(); |
} |
+base::FilePath GetVgemCardPath() { |
+ base::FileEnumerator file_iter( |
+ base::FilePath::FromUTF8Unsafe(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().MaybeAsASCII(); |
+ 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 FindDisplaySnapshotById { |
public: |
FindDisplaySnapshotById(int64_t display_id) : display_id_(display_id) {} |
@@ -109,6 +129,11 @@ DrmDisplayHostManager::DrmDisplayHostManager(DrmGpuPlatformSupportHost* proxy, |
return; |
} |
drm_devices_.insert(primary_graphics_card_path_); |
+ |
+ vgem_card_path_ = GetVgemCardPath(); |
+ vgem_card_device_file_ = base::File( |
+ vgem_card_path_, |
+ base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE); |
} |
device_manager_->AddObserver(this); |
@@ -229,6 +254,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, |
@@ -248,6 +275,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( |