summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorachaulk <achaulk@chromium.org>2015-05-14 13:26:35 -0700
committerCommit bot <commit-bot@chromium.org>2015-05-14 20:27:01 +0000
commitd6f9a4e6ed27e57f91bb0ddcf30a2cc96ddb198d (patch)
tree0295f86305ec83408994f10b6b4fe8070e061c80
parentc747af5900eb7adfcae2a4038b0fc52c413a0a1d (diff)
downloadchromium_src-d6f9a4e6ed27e57f91bb0ddcf30a2cc96ddb198d.zip
chromium_src-d6f9a4e6ed27e57f91bb0ddcf30a2cc96ddb198d.tar.gz
chromium_src-d6f9a4e6ed27e57f91bb0ddcf30a2cc96ddb198d.tar.bz2
ozone: Add sync flag for atomic commit and page flip event handling
Committed: https://crrev.com/f7553583492a8ea9a54d75cd6b2d3dd83c94512c Cr-Commit-Position: refs/heads/master@{#326863} Review URL: https://codereview.chromium.org/1099713005 Cr-Commit-Position: refs/heads/master@{#329919}
-rw-r--r--ui/ozone/platform/drm/gpu/drm_device.cc20
-rw-r--r--ui/ozone/platform/drm/gpu/drm_device.h1
-rw-r--r--ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc2
-rw-r--r--ui/ozone/platform/drm/test/mock_drm_device.cc1
-rw-r--r--ui/ozone/platform/drm/test/mock_drm_device.h1
5 files changed, 19 insertions, 6 deletions
diff --git a/ui/ozone/platform/drm/gpu/drm_device.cc b/ui/ozone/platform/drm/gpu/drm_device.cc
index cb5f6c0..6916443 100644
--- a/ui/ozone/platform/drm/gpu/drm_device.cc
+++ b/ui/ozone/platform/drm/gpu/drm_device.cc
@@ -559,20 +559,30 @@ bool DrmDevice::CloseBufferHandle(uint32_t handle) {
bool DrmDevice::CommitProperties(drmModePropertySet* properties,
uint32_t flags,
+ bool is_sync,
const PageFlipCallback& callback) {
#if defined(USE_DRM_ATOMIC)
+ flags |= DRM_MODE_PAGE_FLIP_EVENT;
scoped_ptr<PageFlipPayload> payload(
new PageFlipPayload(base::ThreadTaskRunnerHandle::Get(), callback));
+ uint64_t id = page_flip_manager_->GetNextId();
if (!drmModePropertySetCommit(file_.GetPlatformFile(), flags, payload.get(),
properties)) {
- // If successful the payload will be removed by the event
- ignore_result(payload.release());
+ page_flip_manager_->RegisterCallback(id, callback);
+
+ // If the flip was requested synchronous or if no watcher has been installed
+ // yet, then synchronously handle the page flip events.
+ if (is_sync || !watcher_) {
+ TRACE_EVENT1("drm", "OnDrmEvent", "socket", file_.GetPlatformFile());
+
+ ProcessDrmEvent(
+ file_.GetPlatformFile(),
+ base::Bind(&PageFlipManager::OnPageFlip, page_flip_manager_));
+ }
return true;
}
- return false;
-#else
- return false;
#endif // defined(USE_DRM_ATOMIC)
+ return false;
}
bool DrmDevice::SetCapability(uint64_t capability, uint64_t value) {
diff --git a/ui/ozone/platform/drm/gpu/drm_device.h b/ui/ozone/platform/drm/gpu/drm_device.h
index 0919bc1..2af2d8d 100644
--- a/ui/ozone/platform/drm/gpu/drm_device.h
+++ b/ui/ozone/platform/drm/gpu/drm_device.h
@@ -159,6 +159,7 @@ class OZONE_EXPORT DrmDevice : public base::RefCountedThreadSafe<DrmDevice> {
virtual bool CommitProperties(drmModePropertySet* properties,
uint32_t flags,
+ bool is_sync,
const PageFlipCallback& callback);
// Set the gamma ramp for |crtc_id| to reflect the ramps in |lut|.
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
index 5a7eae3..793db8f 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
@@ -41,7 +41,7 @@ bool HardwareDisplayPlaneManagerAtomic::Commit(
plane_list->plane_list.swap(plane_list->old_plane_list);
plane_list->plane_list.clear();
- if (!drm_->CommitProperties(plane_list->atomic_property_set.get(), 0,
+ if (!drm_->CommitProperties(plane_list->atomic_property_set.get(), 0, is_sync,
base::Bind(&AtomicPageFlipCallback))) {
PLOG(ERROR) << "Failed to commit properties";
return false;
diff --git a/ui/ozone/platform/drm/test/mock_drm_device.cc b/ui/ozone/platform/drm/test/mock_drm_device.cc
index e35ff5a..39d7e39a 100644
--- a/ui/ozone/platform/drm/test/mock_drm_device.cc
+++ b/ui/ozone/platform/drm/test/mock_drm_device.cc
@@ -236,6 +236,7 @@ bool MockDrmDevice::CloseBufferHandle(uint32_t handle) {
bool MockDrmDevice::CommitProperties(drmModePropertySet* properties,
uint32_t flags,
+ bool is_sync,
const PageFlipCallback& callback) {
return false;
}
diff --git a/ui/ozone/platform/drm/test/mock_drm_device.h b/ui/ozone/platform/drm/test/mock_drm_device.h
index ec29cf5..ed50709 100644
--- a/ui/ozone/platform/drm/test/mock_drm_device.h
+++ b/ui/ozone/platform/drm/test/mock_drm_device.h
@@ -108,6 +108,7 @@ class MockDrmDevice : public ui::DrmDevice {
bool CloseBufferHandle(uint32_t handle) override;
bool CommitProperties(drmModePropertySet* properties,
uint32_t flags,
+ bool is_sync,
const PageFlipCallback& callback) override;
bool SetGammaRamp(uint32_t crtc_id,
const std::vector<GammaRampRGBEntry>& lut) override;