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

Unified Diff: ui/accelerated_widget_mac/ca_layer_tree_host.mm

Issue 1917723002: Move logic from ImageTransportSurfaceOverlayMac into ui/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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/accelerated_widget_mac/ca_layer_tree_host.mm
diff --git a/ui/accelerated_widget_mac/ca_layer_tree_host.mm b/ui/accelerated_widget_mac/ca_layer_tree_host.mm
new file mode 100644
index 0000000000000000000000000000000000000000..bd390fde84ea3fe6278d6d1036b03e601feb5fb8
--- /dev/null
+++ b/ui/accelerated_widget_mac/ca_layer_tree_host.mm
@@ -0,0 +1,88 @@
+// Copyright 2016 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/accelerated_widget_mac/ca_layer_tree_host.h"
+
+#include "base/trace_event/trace_event.h"
+#include "ui/base/cocoa/animation_utils.h"
+
+namespace ui {
+
+CALayerTreeHost::CALayerTreeHost(bool allow_remote_layers)
+ : allow_remote_layers_(allow_remote_layers) {
+ if (allow_remote_layers_) {
+ root_ca_layer_.reset([[CALayer alloc] init]);
+ [root_ca_layer_ setGeometryFlipped:YES];
+ [root_ca_layer_ setOpaque:YES];
+ }
+}
+
+CALayerTreeHost::~CALayerTreeHost() {}
+
+void CALayerTreeHost::Resize(const gfx::Size& pixel_size, float scale_factor) {
+ pixel_size_ = pixel_size;
+ scale_factor_ = scale_factor;
+}
+
+bool CALayerTreeHost::SetPendingBackbuffer(
+ base::ScopedCFTypeRef<IOSurfaceRef> backbuffer) {
+ if (pending_ca_layer_tree_) {
+ DLOG(ERROR) << "Either CALayer overlays or a backbuffer should be "
+ "specified, but not both.";
+ return false;
+ }
+ if (pending_partial_damage_tree_) {
+ DLOG(ERROR) << "Only one backbuffer per swap is allowed.";
+ return false;
+ }
+ pending_partial_damage_tree_.reset(new CALayerPartialDamageTree(
+ allow_remote_layers_, backbuffer, gfx::Rect(pixel_size_)));
+
+ return true;
+}
+
+CALayerTree* CALayerTreeHost::GetPendingCALayerTree() {
+ if (pending_partial_damage_tree_) {
+ DLOG(ERROR) << "Either CALayer overlays or a backbuffer should be "
+ "specified, but not both.";
+ }
+ if (!pending_ca_layer_tree_)
+ pending_ca_layer_tree_.reset(new CALayerTree);
+ return pending_ca_layer_tree_.get();
+}
+
+void CALayerTreeHost::CommitPendingTreesToCA(
+ const gfx::Rect& pixel_damage_rect) {
+ // Update the CALayer hierarchy.
+ ScopedCAActionDisabler disabler;
+ if (pending_ca_layer_tree_) {
+ pending_ca_layer_tree_->CommitScheduledCALayers(
+ root_ca_layer_.get(), std::move(current_ca_layer_tree_), scale_factor_);
+ current_ca_layer_tree_.swap(pending_ca_layer_tree_);
+ current_partial_damage_tree_.reset();
+ } else if (pending_partial_damage_tree_) {
+ pending_partial_damage_tree_->CommitCALayers(
+ root_ca_layer_.get(), std::move(current_partial_damage_tree_),
+ scale_factor_, pixel_damage_rect);
+ current_partial_damage_tree_.swap(pending_partial_damage_tree_);
+ current_ca_layer_tree_.reset();
+ } else {
+ TRACE_EVENT0("gpu", "Blank frame: No overlays or CALayers");
+ [root_ca_layer_ setSublayers:nil];
+ current_partial_damage_tree_.reset();
+ current_ca_layer_tree_.reset();
+ }
+
+ // Reset all state for the next frame.
+ pending_ca_layer_tree_.reset();
+ pending_partial_damage_tree_.reset();
+}
+
+IOSurfaceRef CALayerTreeHost::GetFrontbufferIOSurface() {
+ if (!current_partial_damage_tree_)
+ return nullptr;
+ return current_partial_damage_tree_->RootLayerIOSurface();
+}
+
+} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698