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

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

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 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
« no previous file with comments | « ui/ozone/platform/dri/screen_manager.h ('k') | ui/ozone/platform/dri/screen_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
deleted file mode 100644
index 10f38c3051b73d4710c853bf0bbf410d70e00f7f..0000000000000000000000000000000000000000
--- a/ui/ozone/platform/dri/screen_manager.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/ozone/platform/dri/screen_manager.h"
-
-#include <xf86drmMode.h>
-
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/ozone/platform/dri/crtc_controller.h"
-#include "ui/ozone/platform/dri/dri_util.h"
-#include "ui/ozone/platform/dri/dri_wrapper.h"
-#include "ui/ozone/platform/dri/hardware_display_controller.h"
-#include "ui/ozone/platform/dri/scanout_buffer.h"
-
-namespace ui {
-
-ScreenManager::ScreenManager(DriWrapper* dri,
- ScanoutBufferGenerator* buffer_generator)
- : dri_(dri), buffer_generator_(buffer_generator) {
-}
-
-ScreenManager::~ScreenManager() {
-}
-
-void ScreenManager::AddDisplayController(DriWrapper* dri,
- uint32_t crtc,
- uint32_t connector) {
- HardwareDisplayControllers::iterator it = FindDisplayController(crtc);
- // TODO(dnicoara): Turn this into a DCHECK when async display configuration is
- // properly supported. (When there can't be a race between forcing initial
- // display configuration in ScreenManager and NativeDisplayDelegate creating
- // the display controllers.)
- if (it != controllers_.end()) {
- LOG(WARNING) << "Display controller (crtc=" << crtc << ") already present.";
- return;
- }
-
- controllers_.push_back(new HardwareDisplayController(
- scoped_ptr<CrtcController>(new CrtcController(dri, crtc, connector))));
-}
-
-void ScreenManager::RemoveDisplayController(uint32_t crtc) {
- HardwareDisplayControllers::iterator it = FindDisplayController(crtc);
- if (it != controllers_.end()) {
- bool is_mirrored = (*it)->IsMirrored();
- (*it)->RemoveCrtc(crtc);
- if (!is_mirrored)
- controllers_.erase(it);
- }
-}
-
-bool ScreenManager::ConfigureDisplayController(uint32_t crtc,
- uint32_t connector,
- const gfx::Point& origin,
- const drmModeModeInfo& mode) {
- gfx::Rect modeset_bounds(
- origin.x(), origin.y(), mode.hdisplay, mode.vdisplay);
- HardwareDisplayControllers::iterator it = FindDisplayController(crtc);
- DCHECK(controllers_.end() != it) << "Display controller (crtc=" << crtc
- << ") doesn't exist.";
-
- HardwareDisplayController* controller = *it;
- 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.
- if (controller->IsMirrored()) {
- controller = new HardwareDisplayController(controller->RemoveCrtc(crtc));
- controllers_.push_back(controller);
- it = controllers_.end() - 1;
- }
-
- HardwareDisplayControllers::iterator mirror =
- FindActiveDisplayControllerByLocation(modeset_bounds);
- // Handle mirror mode.
- if (mirror != controllers_.end() && it != mirror)
- return HandleMirrorMode(it, mirror, crtc, connector);
-
- return ModesetDisplayController(controller, origin, mode);
-}
-
-bool ScreenManager::DisableDisplayController(uint32_t crtc) {
- HardwareDisplayControllers::iterator it = FindDisplayController(crtc);
- if (it != controllers_.end()) {
- if ((*it)->IsMirrored()) {
- HardwareDisplayController* controller =
- new HardwareDisplayController((*it)->RemoveCrtc(crtc));
- controllers_.push_back(controller);
- }
-
- (*it)->Disable();
- return true;
- }
-
- LOG(ERROR) << "Failed to find display controller crtc=" << crtc;
- return false;
-}
-
-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
- // one display needed by the content_shell target.
- if (controllers_.empty())
- ForceInitializationOfPrimaryDisplay();
-
- HardwareDisplayControllers::iterator it =
- FindActiveDisplayControllerByLocation(bounds);
- if (it != controllers_.end())
- return (*it)->AsWeakPtr();
-
- return base::WeakPtr<HardwareDisplayController>();
-}
-
-ScreenManager::HardwareDisplayControllers::iterator
-ScreenManager::FindDisplayController(uint32_t crtc) {
- for (HardwareDisplayControllers::iterator it = controllers_.begin();
- it != controllers_.end();
- ++it) {
- if ((*it)->HasCrtc(crtc))
- return it;
- }
-
- return controllers_.end();
-}
-
-ScreenManager::HardwareDisplayControllers::iterator
-ScreenManager::FindActiveDisplayControllerByLocation(const gfx::Rect& bounds) {
- for (HardwareDisplayControllers::iterator it = controllers_.begin();
- it != controllers_.end();
- ++it) {
- gfx::Rect controller_bounds((*it)->origin(), (*it)->GetModeSize());
- // We don't perform a strict check since content_shell will have windows
- // smaller than the display size.
- if (controller_bounds.Contains(bounds) && !(*it)->IsDisabled())
- return it;
- }
-
- return controllers_.end();
-}
-
-void ScreenManager::ForceInitializationOfPrimaryDisplay() {
- LOG(WARNING) << "Forcing initialization of primary display.";
- ScopedVector<HardwareDisplayControllerInfo> displays =
- GetAvailableDisplayControllerInfos(dri_->get_fd());
-
- DCHECK_NE(0u, displays.size());
-
- ScopedDrmPropertyPtr dpms(
- dri_->GetProperty(displays[0]->connector(), "DPMS"));
- if (dpms)
- dri_->SetProperty(displays[0]->connector()->connector_id,
- dpms->prop_id,
- DRM_MODE_DPMS_ON);
-
- AddDisplayController(dri_,
- displays[0]->crtc()->crtc_id,
- displays[0]->connector()->connector_id);
- ConfigureDisplayController(displays[0]->crtc()->crtc_id,
- displays[0]->connector()->connector_id,
- gfx::Point(),
- displays[0]->connector()->modes[0]);
-}
-
-bool ScreenManager::ModesetDisplayController(
- HardwareDisplayController* controller,
- const gfx::Point& origin,
- const drmModeModeInfo& mode) {
- controller->set_origin(origin);
- // Create a surface suitable for the current controller.
- scoped_refptr<ScanoutBuffer> buffer =
- buffer_generator_->Create(gfx::Size(mode.hdisplay, mode.vdisplay));
-
- if (!buffer.get()) {
- LOG(ERROR) << "Failed to create scanout buffer";
- return false;
- }
-
- if (!controller->Modeset(OverlayPlane(buffer), mode)) {
- LOG(ERROR) << "Failed to modeset controller";
- return false;
- }
-
- return true;
-}
-
-bool ScreenManager::HandleMirrorMode(
- HardwareDisplayControllers::iterator original,
- HardwareDisplayControllers::iterator mirror,
- uint32_t crtc,
- uint32_t connector) {
- (*mirror)->AddCrtc((*original)->RemoveCrtc(crtc));
- if ((*mirror)->Enable()) {
- controllers_.erase(original);
- return true;
- }
-
- LOG(ERROR) << "Failed to switch to mirror mode";
-
- // 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)->AddCrtc((*mirror)->RemoveCrtc(crtc));
- (*original)->Enable();
- return false;
-}
-
-} // namespace ui
« no previous file with comments | « ui/ozone/platform/dri/screen_manager.h ('k') | ui/ozone/platform/dri/screen_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698