summaryrefslogtreecommitdiffstats
path: root/ui/ozone
diff options
context:
space:
mode:
authorspang <spang@chromium.org>2015-04-15 08:18:26 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-15 15:19:13 +0000
commitee3db43d851c57a6f93bced7178797c0d73f8c84 (patch)
treeb6073ab738bf8d56e7b2f87418cb14e45033f471 /ui/ozone
parentbbc34a8a27f991478aae35e6d3ece9a4ea9964a6 (diff)
downloadchromium_src-ee3db43d851c57a6f93bced7178797c0d73f8c84.zip
chromium_src-ee3db43d851c57a6f93bced7178797c0d73f8c84.tar.gz
chromium_src-ee3db43d851c57a6f93bced7178797c0d73f8c84.tar.bz2
ozone: drm: Restore cursor in CrtcController::Modeset
This re-sets the cursor after every mode change. It will ensure we restore the cursor after returning from frecon. BUG=471097 TEST=Ctrl-Alt-Forward in developer mode to activate frecon, then Ctrl-Alt-Back to return to chrome. Cursor is shown. Review URL: https://codereview.chromium.org/1085123002 Cr-Commit-Position: refs/heads/master@{#325243}
Diffstat (limited to 'ui/ozone')
-rw-r--r--ui/ozone/platform/drm/gpu/crtc_controller.cc33
-rw-r--r--ui/ozone/platform/drm/gpu/crtc_controller.h3
-rw-r--r--ui/ozone/platform/drm/gpu/hardware_display_controller.cc2
3 files changed, 28 insertions, 10 deletions
diff --git a/ui/ozone/platform/drm/gpu/crtc_controller.cc b/ui/ozone/platform/drm/gpu/crtc_controller.cc
index e76db6d..ce7ab71 100644
--- a/ui/ozone/platform/drm/gpu/crtc_controller.cc
+++ b/ui/ozone/platform/drm/gpu/crtc_controller.cc
@@ -27,7 +27,7 @@ CrtcController::CrtcController(const scoped_refptr<DrmDevice>& drm,
CrtcController::~CrtcController() {
if (!is_disabled_) {
drm_->SetCrtc(saved_crtc_.get(), std::vector<uint32_t>(1, connector_));
- UnsetCursor();
+ SetCursor(nullptr);
}
}
@@ -54,6 +54,9 @@ bool CrtcController::Modeset(const OverlayPlane& plane, drmModeModeInfo mode) {
if (page_flip_pending_)
pending_planes_ = current_planes_;
+ if (!ResetCursor())
+ return false;
+
return true;
}
@@ -118,15 +121,10 @@ void CrtcController::OnPageFlipEvent(unsigned int frame,
}
bool CrtcController::SetCursor(const scoped_refptr<ScanoutBuffer>& buffer) {
- DCHECK(!is_disabled_);
+ DCHECK(!is_disabled_ || !buffer);
cursor_buffer_ = buffer;
- return drm_->SetCursor(crtc_, buffer->GetHandle(), buffer->GetSize());
-}
-bool CrtcController::UnsetCursor() {
- bool state = drm_->SetCursor(crtc_, 0, gfx::Size());
- cursor_buffer_ = NULL;
- return state;
+ return ResetCursor();
}
bool CrtcController::MoveCursor(const gfx::Point& location) {
@@ -142,4 +140,23 @@ void CrtcController::RemoveObserver(PageFlipObserver* observer) {
observers_.RemoveObserver(observer);
}
+bool CrtcController::ResetCursor() {
+ uint32_t handle = 0;
+ gfx::Size size;
+
+ if (cursor_buffer_) {
+ handle = cursor_buffer_->GetHandle();
+ size = cursor_buffer_->GetSize();
+ }
+
+ bool status = drm_->SetCursor(crtc_, handle, size);
+ if (!status) {
+ PLOG(ERROR) << "drmModeSetCursor: device " << drm_->device_path().value()
+ << " crtc " << crtc_ << " handle " << handle << " size "
+ << size.ToString();
+ }
+
+ return status;
+}
+
} // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/crtc_controller.h b/ui/ozone/platform/drm/gpu/crtc_controller.h
index 29135dc..4404bfa 100644
--- a/ui/ozone/platform/drm/gpu/crtc_controller.h
+++ b/ui/ozone/platform/drm/gpu/crtc_controller.h
@@ -68,13 +68,14 @@ class OZONE_EXPORT CrtcController
unsigned int useconds);
bool SetCursor(const scoped_refptr<ScanoutBuffer>& buffer);
- bool UnsetCursor();
bool MoveCursor(const gfx::Point& location);
void AddObserver(PageFlipObserver* observer);
void RemoveObserver(PageFlipObserver* observer);
private:
+ bool ResetCursor();
+
scoped_refptr<DrmDevice> drm_;
HardwareDisplayPlaneManager* overlay_plane_manager_; // Not owned.
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
index 4371963..f9f08ea 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
@@ -136,7 +136,7 @@ bool HardwareDisplayController::SetCursor(
bool HardwareDisplayController::UnsetCursor() {
bool status = true;
for (size_t i = 0; i < crtc_controllers_.size(); ++i)
- status &= crtc_controllers_[i]->UnsetCursor();
+ status &= crtc_controllers_[i]->SetCursor(nullptr);
return status;
}