Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(217)

Unified Diff: ui/ozone/platform/dri/screen_manager.cc

Issue 469343003: [Ozone-GBM] Pumb DriWindowDelegate throughout the platform (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/ozone/platform/dri/screen_manager.cc
diff --git a/ui/ozone/platform/dri/screen_manager.cc b/ui/ozone/platform/dri/screen_manager.cc
index 87364dc51712bed1e475c7c3d4ffa90ac8efb88f..0a8af0fc662a8efa3388aa14ea1941228f2cf838 100644
--- a/ui/ozone/platform/dri/screen_manager.cc
+++ b/ui/ozone/platform/dri/screen_manager.cc
@@ -24,24 +24,21 @@ gfx::Size GetModeSize(const drmModeModeInfo& mode) {
} // namespace
-ScreenManager::ScreenManager(
- DriWrapper* dri, ScanoutBufferGenerator* buffer_generator)
- : dri_(dri), buffer_generator_(buffer_generator), last_added_widget_(0) {
+ScreenManager::ScreenManager(DriWrapper* dri,
+ ScanoutBufferGenerator* buffer_generator)
+ : dri_(dri), buffer_generator_(buffer_generator) {
}
ScreenManager::~ScreenManager() {
- STLDeleteContainerPairSecondPointers(
- controllers_.begin(), controllers_.end());
}
void ScreenManager::RemoveDisplayController(uint32_t crtc) {
- HardwareDisplayControllerMap::iterator it = FindDisplayController(crtc);
+ HardwareDisplayControllers::iterator it = FindDisplayController(crtc);
if (it != controllers_.end()) {
- it->second->RemoveCrtc(crtc);
- if (!it->second->HasCrtcs()) {
- delete it->second;
+ bool is_mirrored = (*it)->IsMirrored();
+ (*it)->RemoveCrtc(crtc);
+ if (!is_mirrored)
controllers_.erase(it);
- }
}
}
@@ -49,36 +46,40 @@ bool ScreenManager::ConfigureDisplayController(uint32_t crtc,
uint32_t connector,
const gfx::Point& origin,
const drmModeModeInfo& mode) {
- HardwareDisplayControllerMap::iterator it =
- FindDisplayController(crtc);
+ gfx::Rect modeset_bounds(origin, GetModeSize(mode));
+ HardwareDisplayControllers::iterator it = FindDisplayController(crtc);
HardwareDisplayController* controller = NULL;
if (it != controllers_.end()) {
- // If nothing changed just enable the controller.
- if (SameMode(mode, it->second->get_mode()) &&
- origin == it->second->origin())
- return it->second->Enable();
+ controller = *it;
+ // If nothing changed just enable the controller. Note, we perform an exact
+ // comparison on the mode since the refresh rate may have changed.
+ if (SameMode(mode, controller->get_mode()) &&
+ origin == controller->origin() && !controller->IsDisabled())
+ return controller->Enable();
// Either the mode or the location of the display changed, so exit mirror
// mode and configure the display independently. If the caller still wants
// mirror mode, subsequent calls configuring the other controllers will
// restore mirror mode.
- it->second->RemoveMirroredCrtcs();
- HardwareDisplayControllerMap::iterator mirror =
- FindDisplayControllerByOrigin(origin);
- // Handle mirror mode.
- if (mirror != controllers_.end() && it != mirror) {
- DCHECK(SameMode(mode, mirror->second->get_mode()));
- return HandleMirrorMode(it, mirror, crtc, connector);
+ if (controller->IsMirrored()) {
+ controller =
+ new HardwareDisplayController(dri_, controller->RemoveCrtc(crtc));
+ controllers_.push_back(controller);
+ it = --controllers_.end();
}
- controller = it->second;
+ HardwareDisplayControllers::iterator mirror =
+ FindActiveDisplayControllerByLocation(modeset_bounds);
+ // Handle mirror mode.
+ if (mirror != controllers_.end() && it != mirror)
+ return HandleMirrorMode(it, mirror, crtc, connector);
} else {
- HardwareDisplayControllerMap::iterator mirror =
- FindDisplayControllerByOrigin(origin);
+ HardwareDisplayControllers::iterator mirror =
+ FindActiveDisplayControllerByLocation(modeset_bounds);
if (mirror != controllers_.end()) {
- mirror->second->AddCrtc(scoped_ptr<CrtcState>(
- new CrtcState(dri_, crtc, connector)));
- return mirror->second->Enable();
+ (*mirror)->AddCrtc(
+ scoped_ptr<CrtcState>(new CrtcState(dri_, crtc, connector)));
+ return (*mirror)->Enable();
}
}
@@ -86,40 +87,30 @@ bool ScreenManager::ConfigureDisplayController(uint32_t crtc,
controller = new HardwareDisplayController(
dri_,
scoped_ptr<CrtcState>(new CrtcState(dri_, crtc, connector)));
- controllers_.insert(std::make_pair(++last_added_widget_, controller));
+ controllers_.push_back(controller);
}
return ModesetDisplayController(controller, origin, mode);
}
bool ScreenManager::DisableDisplayController(uint32_t crtc) {
- HardwareDisplayControllerMap::iterator it = FindDisplayController(crtc);
+ HardwareDisplayControllers::iterator it = FindDisplayController(crtc);
if (it != controllers_.end()) {
- it->second->Disable();
+ if ((*it)->IsMirrored()) {
+ HardwareDisplayController* controller =
+ new HardwareDisplayController(dri_, (*it)->RemoveCrtc(crtc));
+ controllers_.push_back(controller);
+ }
+
+ (*it)->Disable();
return true;
}
- LOG(ERROR) << "Failed to find display controller"
- << " crtc=" << crtc;
+ LOG(ERROR) << "Failed to find display controller crtc=" << crtc;
return false;
}
base::WeakPtr<HardwareDisplayController> ScreenManager::GetDisplayController(
- gfx::AcceleratedWidget widget) {
- // TODO(dnicoara): Remove hack once TestScreen uses a simple Ozone display
- // configuration reader and ScreenManager is called from there to create the
- // one display needed by the content_shell target.
- if (controllers_.empty() && last_added_widget_ == 0)
- ForceInitializationOfPrimaryDisplay();
-
- HardwareDisplayControllerMap::iterator it = controllers_.find(widget);
- if (it != controllers_.end())
- return it->second->AsWeakPtr();
-
- return base::WeakPtr<HardwareDisplayController>();
-}
-
-base::WeakPtr<HardwareDisplayController> ScreenManager::GetDisplayController(
const gfx::Rect& bounds) {
// TODO(dnicoara): Remove hack once TestScreen uses a simple Ozone display
// configuration reader and ScreenManager is called from there to create the
@@ -127,48 +118,36 @@ base::WeakPtr<HardwareDisplayController> ScreenManager::GetDisplayController(
if (controllers_.empty())
ForceInitializationOfPrimaryDisplay();
- HardwareDisplayControllerMap::iterator it =
+ HardwareDisplayControllers::iterator it =
FindActiveDisplayControllerByLocation(bounds);
if (it != controllers_.end())
- return it->second->AsWeakPtr();
+ return (*it)->AsWeakPtr();
return base::WeakPtr<HardwareDisplayController>();
}
-ScreenManager::HardwareDisplayControllerMap::iterator
+ScreenManager::HardwareDisplayControllers::iterator
ScreenManager::FindDisplayController(uint32_t crtc) {
- for (HardwareDisplayControllerMap::iterator it = controllers_.begin();
- it != controllers_.end();
- ++it) {
- if (it->second->HasCrtc(crtc))
- return it;
- }
-
- return controllers_.end();
-}
-
-ScreenManager::HardwareDisplayControllerMap::iterator
-ScreenManager::FindDisplayControllerByOrigin(const gfx::Point& origin) {
- for (HardwareDisplayControllerMap::iterator it = controllers_.begin();
+ for (HardwareDisplayControllers::iterator it = controllers_.begin();
it != controllers_.end();
++it) {
- if (it->second->origin() == origin)
+ if ((*it)->HasCrtc(crtc))
return it;
}
return controllers_.end();
}
-ScreenManager::HardwareDisplayControllerMap::iterator
+ScreenManager::HardwareDisplayControllers::iterator
ScreenManager::FindActiveDisplayControllerByLocation(const gfx::Rect& bounds) {
- for (HardwareDisplayControllerMap::iterator it = controllers_.begin();
+ for (HardwareDisplayControllers::iterator it = controllers_.begin();
it != controllers_.end();
++it) {
- gfx::Rect controller_bounds(it->second->origin(),
- GetModeSize(it->second->get_mode()));
+ gfx::Rect controller_bounds((*it)->origin(),
+ GetModeSize((*it)->get_mode()));
// We don't perform a strict check since content_shell will have windows
// smaller than the display size.
- if (controller_bounds.Contains(bounds))
+ if (controller_bounds.Contains(bounds) && !(*it)->IsDisabled())
return it;
}
@@ -176,6 +155,7 @@ ScreenManager::FindActiveDisplayControllerByLocation(const gfx::Rect& bounds) {
}
void ScreenManager::ForceInitializationOfPrimaryDisplay() {
+ LOG(WARNING) << "Forcing initialization of primary display.";
ScopedVector<HardwareDisplayControllerInfo> displays =
GetAvailableDisplayControllerInfos(dri_->get_fd());
@@ -217,13 +197,12 @@ bool ScreenManager::ModesetDisplayController(
}
bool ScreenManager::HandleMirrorMode(
- HardwareDisplayControllerMap::iterator original,
- HardwareDisplayControllerMap::iterator mirror,
+ HardwareDisplayControllers::iterator original,
+ HardwareDisplayControllers::iterator mirror,
uint32_t crtc,
uint32_t connector) {
- mirror->second->AddCrtc(original->second->RemoveCrtc(crtc));
- if (mirror->second->Enable()) {
- delete original->second;
+ (*mirror)->AddCrtc((*original)->RemoveCrtc(crtc));
+ if ((*mirror)->Enable()) {
controllers_.erase(original);
return true;
}
@@ -233,8 +212,8 @@ bool ScreenManager::HandleMirrorMode(
// When things go wrong revert back to the previous configuration since
// it is expected that the configuration would not have changed if
// things fail.
- original->second->AddCrtc(mirror->second->RemoveCrtc(crtc));
- original->second->Enable();
+ (*original)->AddCrtc((*mirror)->RemoveCrtc(crtc));
+ (*original)->Enable();
return false;
}

Powered by Google App Engine
This is Rietveld 408576698