| 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;
|
| }
|
|
|
|
|