Chromium Code Reviews| 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( |