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 93d43e2467de430ae2cec6ce1655f6eb33dd403d..e04f33bc2fd3eb0db944d8cd340a7da50038592a 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,7 @@ typedef base::Callback<void(const base::FilePath&, scoped_ptr<DrmDeviceHandle>)> |
| OnOpenDeviceReplyCallback; |
| const char kDefaultGraphicsCardPattern[] = "/dev/dri/card%d"; |
| +const char kVgemSysCardPath[] = "/sys/bus/platform/devices/vgem/drm/"; |
| const char* kDisplayActionString[] = { |
| "ADD", |
| @@ -38,12 +40,45 @@ const char* kDisplayActionString[] = { |
| "CHANGE", |
| }; |
| +// VGEM fd is a /dev/dri device but we cannot know in advance which one, for |
| +// that we inspect the /sys/.../vgem/.../cardX, if we find one such card, then |
| +// VGEM is present in the system and we can reuse the index. |
| +std::string GetVgemCardPath() { |
| + static std::string vgem_card_path; |
| + static base::ThreadChecker checker; |
| + DCHECK(checker.CalledOnValidThread()); |
| + if (!vgem_card_path.empty()) |
|
reveman
2015/05/12 13:47:01
Is this VgemCardPath really supposed to be a singl
dshwang
2015/05/12 14:11:42
I believe it's singleton. +zachr
However, this co
|
| + return vgem_card_path; |
| + |
| + 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 index. |
| + std::string name(file_iter.GetInfo().GetName().BaseName().MaybeAsASCII()); |
| + base::TrimString(name, "card", &name); |
| + errno = 0; |
| + const int device_index = strtol(name.c_str(), nullptr, 10); |
| + DLOG_IF(ERROR, errno != 0) << "Error extracting integer from " << name; |
| + if (errno != 0) |
| + return std::string(); |
| + |
| + vgem_card_path = |
| + base::StringPrintf(kDefaultGraphicsCardPattern, device_index); |
| + DVLOG(1) << "VGEM card path is " << vgem_card_path; |
| + break; |
| + } |
| + return vgem_card_path; |
| +} |
| + |
| void OpenDeviceOnWorkerThread( |
| const base::FilePath& path, |
| const scoped_refptr<base::TaskRunner>& reply_runner, |
| const OnOpenDeviceReplyCallback& callback) { |
| + bool is_vgem = path.MaybeAsASCII() == GetVgemCardPath(); |
| scoped_ptr<DrmDeviceHandle> handle(new DrmDeviceHandle()); |
| - handle->Initialize(path); |
| + handle->Initialize(path, is_vgem); |
| reply_runner->PostTask( |
| FROM_HERE, base::Bind(callback, path, base::Passed(handle.Pass()))); |
| } |
| @@ -112,7 +147,7 @@ DrmDisplayHostManager::DrmDisplayHostManager(DrmGpuPlatformSupportHost* proxy, |
| // graphics state. |
| base::ThreadRestrictions::ScopedAllowIO allow_io; |
| scoped_ptr<DrmDeviceHandle> handle(new DrmDeviceHandle()); |
| - if (!handle->Initialize(primary_graphics_card_path_)) { |
| + if (!handle->Initialize(primary_graphics_card_path_, false)) { |
| LOG(FATAL) << "Failed to open primary graphics card"; |
| return; |
| } |
| @@ -303,9 +338,10 @@ void DrmDisplayHostManager::OnAddGraphicsDevice( |
| scoped_ptr<DrmDeviceHandle> handle) { |
| if (handle->IsValid()) { |
| base::ScopedFD file = handle->Duplicate(); |
| + bool is_vgem = handle->IsVgem(); |
| drm_devices_.add(path, handle.Pass()); |
| proxy_->Send(new OzoneGpuMsg_AddGraphicsDevice( |
| - path, base::FileDescriptor(file.Pass()))); |
| + path, base::FileDescriptor(file.Pass()), is_vgem)); |
| NotifyDisplayDelegate(); |
| } |
| @@ -335,12 +371,14 @@ void DrmDisplayHostManager::OnChannelEstablished( |
| // Send the primary device first since this is used to initialize graphics |
| // state. |
| proxy_->Send(new OzoneGpuMsg_AddGraphicsDevice( |
| - it->first, base::FileDescriptor(it->second->Duplicate()))); |
| + it->first, base::FileDescriptor(it->second->Duplicate()), |
| + it->second->IsVgem())); |
| for (auto pair : drm_devices_) { |
| if (pair.second->IsValid() && pair.first != primary_graphics_card_path_) { |
| proxy_->Send(new OzoneGpuMsg_AddGraphicsDevice( |
| - pair.first, base::FileDescriptor(pair.second->Duplicate()))); |
| + pair.first, base::FileDescriptor(pair.second->Duplicate()), |
| + it->second->IsVgem())); |
| } |
| } |