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