| 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..05aeb2d2a7e8c7cbdb7e28be0cbd50d7ddb59777 100644
|
| --- a/ui/ozone/platform/drm/host/drm_display_host_manager.cc
|
| +++ b/ui/ozone/platform/drm/host/drm_display_host_manager.cc
|
| @@ -31,6 +31,7 @@ typedef base::Callback<void(const base::FilePath&, scoped_ptr<DrmDeviceHandle>)>
|
| OnOpenDeviceReplyCallback;
|
|
|
| const char kDefaultGraphicsCardPattern[] = "/dev/dri/card%d";
|
| +const char kVGEMCardPattern[] = "/sys/bus/platform/devices/vgem/drm/card%d";
|
|
|
| const char* kDisplayActionString[] = {
|
| "ADD",
|
| @@ -40,10 +41,11 @@ const char* kDisplayActionString[] = {
|
|
|
| void OpenDeviceOnWorkerThread(
|
| const base::FilePath& path,
|
| + bool is_vgem,
|
| const scoped_refptr<base::TaskRunner>& reply_runner,
|
| const OnOpenDeviceReplyCallback& callback) {
|
| 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 +114,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;
|
| }
|
| @@ -249,7 +251,20 @@ void DrmDisplayHostManager::OnDeviceEvent(const DeviceEvent& event) {
|
| if (event.device_type() != DeviceEvent::DISPLAY)
|
| return;
|
|
|
| - event_queue_.push(DisplayEvent(event.action_type(), event.path()));
|
| + bool is_vgem = false;
|
| + for (int i = 0; i < 16; i++) {
|
| + struct stat vgem_stat;
|
| + std::string vgem_path = base::StringPrintf(kVGEMCardPattern, i);
|
| + if (stat(vgem_path.c_str(), &vgem_stat) == -1)
|
| + continue;
|
| +
|
| + std::string card_path = base::StringPrintf(kDefaultGraphicsCardPattern, i);
|
| + if (card_path == event.path().value())
|
| + is_vgem = true;
|
| + break;
|
| + }
|
| +
|
| + event_queue_.push(DisplayEvent(event.action_type(), event.path(), is_vgem));
|
| ProcessEvent();
|
| }
|
|
|
| @@ -264,7 +279,7 @@ void DrmDisplayHostManager::ProcessEvent() {
|
| if (drm_devices_.find(event.path) == drm_devices_.end()) {
|
| task_pending_ = base::WorkerPool::PostTask(
|
| FROM_HERE,
|
| - base::Bind(&OpenDeviceOnWorkerThread, event.path,
|
| + base::Bind(&OpenDeviceOnWorkerThread, event.path, event.is_vgem,
|
| base::ThreadTaskRunnerHandle::Get(),
|
| base::Bind(&DrmDisplayHostManager::OnAddGraphicsDevice,
|
| weak_ptr_factory_.GetWeakPtr())),
|
| @@ -305,7 +320,7 @@ void DrmDisplayHostManager::OnAddGraphicsDevice(
|
| base::ScopedFD file = handle->Duplicate();
|
| drm_devices_.add(path, handle.Pass());
|
| proxy_->Send(new OzoneGpuMsg_AddGraphicsDevice(
|
| - path, base::FileDescriptor(file.Pass())));
|
| + path, base::FileDescriptor(file.Pass()), handle->IsVgem()));
|
| NotifyDisplayDelegate();
|
| }
|
|
|
| @@ -335,12 +350,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()));
|
| }
|
| }
|
|
|
|
|