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

Unified Diff: ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc

Issue 1285183008: Ozone integration. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: add missing license header Created 5 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/drm/gpu/hardware_display_plane_manager_legacy.cc
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
new file mode 100644
index 0000000000000000000000000000000000000000..dff9e57ab2db56189536844eb3a4883808ca5de4
--- /dev/null
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
@@ -0,0 +1,108 @@
+// 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/drm/gpu/hardware_display_plane_manager_legacy.h"
+
+#include "base/bind.h"
+#include "ui/ozone/platform/drm/gpu/crtc_controller.h"
+#include "ui/ozone/platform/drm/gpu/drm_device.h"
+#include "ui/ozone/platform/drm/gpu/scanout_buffer.h"
+
+namespace ui {
+
+HardwareDisplayPlaneManagerLegacy::HardwareDisplayPlaneManagerLegacy() {
+}
+
+HardwareDisplayPlaneManagerLegacy::~HardwareDisplayPlaneManagerLegacy() {
+}
+
+bool HardwareDisplayPlaneManagerLegacy::Commit(
+ HardwareDisplayPlaneList* plane_list,
+ bool is_sync,
+ bool test_only) {
+ if (test_only) {
+ for (HardwareDisplayPlane* plane : plane_list->plane_list) {
+ plane->set_in_use(false);
+ }
+ plane_list->plane_list.clear();
+ plane_list->legacy_page_flips.clear();
+ return true;
+ }
+ if (plane_list->plane_list.empty()) // No assigned planes, nothing to do.
+ return true;
+ bool ret = true;
+ // The order of operations here (set new planes, pageflip, clear old planes)
+ // is designed to minimze the chance of a significant artifact occurring.
+ // The planes must be updated first because the main plane no longer contains
+ // their content. The old planes are removed last because the previous primary
+ // plane used them as overlays and thus didn't contain their content, so we
+ // must first flip to the new primary plane, which does. The error here will
+ // be the delta of (new contents, old contents), but it should be barely
+ // noticeable.
+ for (const auto& flip : plane_list->legacy_page_flips) {
+ // Permission Denied is a legitimate error
+ for (const auto& plane : flip.planes) {
+ if (!drm_->PageFlipOverlay(flip.crtc_id, plane.framebuffer, plane.bounds,
+ plane.src_rect, plane.plane)) {
+ PLOG(ERROR) << "Cannot display plane on overlay: crtc=" << flip.crtc
+ << " plane=" << plane.plane;
+ ret = false;
+ flip.crtc->PageFlipFailed();
+ break;
+ }
+ }
+ if (!drm_->PageFlip(flip.crtc_id, flip.framebuffer, is_sync,
+ base::Bind(&CrtcController::OnPageFlipEvent,
+ flip.crtc->AsWeakPtr()))) {
+ if (errno != EACCES) {
+ PLOG(ERROR) << "Cannot page flip: crtc=" << flip.crtc_id
+ << " framebuffer=" << flip.framebuffer
+ << " is_sync=" << is_sync;
+ ret = false;
+ }
+ flip.crtc->PageFlipFailed();
+ }
+ }
+ // For each element in |old_plane_list|, if it hasn't been reclaimed (by
+ // this or any other HDPL), clear the overlay contents.
+ for (HardwareDisplayPlane* plane : plane_list->old_plane_list) {
+ if (!plane->in_use() && !plane->is_dummy()) {
+ // This plane is being released, so we need to zero it.
+ if (!drm_->PageFlipOverlay(plane->owning_crtc(), 0, gfx::Rect(),
+ gfx::Rect(), plane->plane_id())) {
+ PLOG(ERROR) << "Cannot free overlay: crtc=" << plane->owning_crtc()
+ << " plane=" << plane->plane_id();
+ ret = false;
+ break;
+ }
+ }
+ }
+ plane_list->plane_list.swap(plane_list->old_plane_list);
+ plane_list->plane_list.clear();
+ plane_list->legacy_page_flips.clear();
+ return ret;
+}
+
+bool HardwareDisplayPlaneManagerLegacy::SetPlaneData(
+ HardwareDisplayPlaneList* plane_list,
+ HardwareDisplayPlane* hw_plane,
+ const OverlayPlane& overlay,
+ uint32_t crtc_id,
+ const gfx::Rect& src_rect,
+ CrtcController* crtc) {
+ if (hw_plane->is_dummy() || plane_list->legacy_page_flips.empty() ||
+ plane_list->legacy_page_flips.back().crtc_id != crtc_id) {
+ plane_list->legacy_page_flips.push_back(
+ HardwareDisplayPlaneList::PageFlipInfo(
+ crtc_id, overlay.buffer->GetFramebufferId(), crtc));
+ } else {
+ plane_list->legacy_page_flips.back().planes.push_back(
+ HardwareDisplayPlaneList::PageFlipInfo::Plane(
+ hw_plane->plane_id(), overlay.buffer->GetFramebufferId(),
+ overlay.display_bounds, src_rect));
+ }
+ return true;
+}
+
+} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698