| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/ozone/platform/drm/gpu/drm_device.h" | 5 #include "ui/ozone/platform/drm/gpu/drm_device.h" |
| 6 | 6 |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <sys/mman.h> | 8 #include <sys/mman.h> |
| 9 #include <unistd.h> | 9 #include <unistd.h> |
| 10 #include <xf86drm.h> | 10 #include <xf86drm.h> |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 : device_path_(device_path), | 283 : device_path_(device_path), |
| 284 file_(file.Pass()), | 284 file_(file.Pass()), |
| 285 page_flip_manager_(new PageFlipManager()) { | 285 page_flip_manager_(new PageFlipManager()) { |
| 286 } | 286 } |
| 287 | 287 |
| 288 DrmDevice::~DrmDevice() { | 288 DrmDevice::~DrmDevice() { |
| 289 if (watcher_) | 289 if (watcher_) |
| 290 watcher_->Shutdown(); | 290 watcher_->Shutdown(); |
| 291 } | 291 } |
| 292 | 292 |
| 293 bool DrmDevice::Initialize() { | 293 bool DrmDevice::Initialize(bool use_atomic) { |
| 294 // Ignore devices that cannot perform modesetting. | 294 // Ignore devices that cannot perform modesetting. |
| 295 if (!CanQueryForResources(file_.GetPlatformFile())) { | 295 if (!CanQueryForResources(file_.GetPlatformFile())) { |
| 296 VLOG(2) << "Cannot query for resources for '" << device_path_.value() | 296 VLOG(2) << "Cannot query for resources for '" << device_path_.value() |
| 297 << "'"; | 297 << "'"; |
| 298 return false; | 298 return false; |
| 299 } | 299 } |
| 300 | 300 |
| 301 #if defined(USE_DRM_ATOMIC) | 301 #if defined(USE_DRM_ATOMIC) |
| 302 plane_manager_.reset(new HardwareDisplayPlaneManagerAtomic()); | 302 // Use atomic only if the build, kernel & flags all allow it. |
| 303 #else | 303 if (use_atomic && SetCapability(DRM_CLIENT_CAP_ATOMIC, 1)) |
| 304 plane_manager_.reset(new HardwareDisplayPlaneManagerLegacy()); | 304 plane_manager_.reset(new HardwareDisplayPlaneManagerAtomic()); |
| 305 #endif // defined(USE_DRM_ATOMIC) | 305 #endif // defined(USE_DRM_ATOMIC) |
| 306 |
| 307 if (!plane_manager_) |
| 308 plane_manager_.reset(new HardwareDisplayPlaneManagerLegacy()); |
| 306 if (!plane_manager_->Initialize(this)) { | 309 if (!plane_manager_->Initialize(this)) { |
| 307 LOG(ERROR) << "Failed to initialize the plane manager for " | 310 LOG(ERROR) << "Failed to initialize the plane manager for " |
| 308 << device_path_.value(); | 311 << device_path_.value(); |
| 309 plane_manager_.reset(); | 312 plane_manager_.reset(); |
| 310 return false; | 313 return false; |
| 311 } | 314 } |
| 312 | 315 |
| 313 return true; | 316 return true; |
| 314 } | 317 } |
| 315 | 318 |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 return !drmIoctl(file_.GetPlatformFile(), DRM_IOCTL_GEM_CLOSE, | 559 return !drmIoctl(file_.GetPlatformFile(), DRM_IOCTL_GEM_CLOSE, |
| 557 &close_request); | 560 &close_request); |
| 558 } | 561 } |
| 559 | 562 |
| 560 bool DrmDevice::CommitProperties(drmModePropertySet* properties, | 563 bool DrmDevice::CommitProperties(drmModePropertySet* properties, |
| 561 uint32_t flags, | 564 uint32_t flags, |
| 562 bool is_sync, | 565 bool is_sync, |
| 563 const PageFlipCallback& callback) { | 566 const PageFlipCallback& callback) { |
| 564 #if defined(USE_DRM_ATOMIC) | 567 #if defined(USE_DRM_ATOMIC) |
| 565 flags |= DRM_MODE_PAGE_FLIP_EVENT; | 568 flags |= DRM_MODE_PAGE_FLIP_EVENT; |
| 566 scoped_ptr<PageFlipPayload> payload( | |
| 567 new PageFlipPayload(base::ThreadTaskRunnerHandle::Get(), callback)); | |
| 568 uint64_t id = page_flip_manager_->GetNextId(); | 569 uint64_t id = page_flip_manager_->GetNextId(); |
| 569 if (!drmModePropertySetCommit(file_.GetPlatformFile(), flags, payload.get(), | 570 if (!drmModePropertySetCommit(file_.GetPlatformFile(), flags, |
| 570 properties)) { | 571 reinterpret_cast<void*>(id), properties)) { |
| 571 page_flip_manager_->RegisterCallback(id, callback); | 572 page_flip_manager_->RegisterCallback(id, callback); |
| 572 | 573 |
| 573 // If the flip was requested synchronous or if no watcher has been installed | 574 // If the flip was requested synchronous or if no watcher has been installed |
| 574 // yet, then synchronously handle the page flip events. | 575 // yet, then synchronously handle the page flip events. |
| 575 if (is_sync || !watcher_) { | 576 if (is_sync || !watcher_) { |
| 576 TRACE_EVENT1("drm", "OnDrmEvent", "socket", file_.GetPlatformFile()); | 577 TRACE_EVENT1("drm", "OnDrmEvent", "socket", file_.GetPlatformFile()); |
| 577 | 578 |
| 578 ProcessDrmEvent( | 579 ProcessDrmEvent( |
| 579 file_.GetPlatformFile(), | 580 file_.GetPlatformFile(), |
| 580 base::Bind(&PageFlipManager::OnPageFlip, page_flip_manager_)); | 581 base::Bind(&PageFlipManager::OnPageFlip, page_flip_manager_)); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 b.push_back(lut[i].b); | 623 b.push_back(lut[i].b); |
| 623 } | 624 } |
| 624 | 625 |
| 625 DCHECK(file_.IsValid()); | 626 DCHECK(file_.IsValid()); |
| 626 TRACE_EVENT0("drm", "DrmDevice::SetGamma"); | 627 TRACE_EVENT0("drm", "DrmDevice::SetGamma"); |
| 627 return (drmModeCrtcSetGamma(file_.GetPlatformFile(), crtc_id, r.size(), &r[0], | 628 return (drmModeCrtcSetGamma(file_.GetPlatformFile(), crtc_id, r.size(), &r[0], |
| 628 &g[0], &b[0]) == 0); | 629 &g[0], &b[0]) == 0); |
| 629 } | 630 } |
| 630 | 631 |
| 631 } // namespace ui | 632 } // namespace ui |
| OLD | NEW |