| 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(
|
|
|