blob: fb4e271dc45d9ca2609dc831388fd91b679127fb [file] [log] [blame]
// 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_coordinator.h"
#import <AVFoundation/AVFoundation.h>
#include "base/mac/mac_util.h"
#include "base/trace_event/trace_event.h"
#include "ui/accelerated_widget_mac/availability_macros.h"
#include "ui/base/cocoa/animation_utils.h"
namespace ui {
CALayerTreeCoordinator::CALayerTreeCoordinator(
bool allow_remote_layers,
bool allow_av_sample_buffer_display_layer)
: allow_remote_layers_(allow_remote_layers),
allow_av_sample_buffer_display_layer_(
allow_av_sample_buffer_display_layer) {
if (allow_remote_layers_) {
root_ca_layer_.reset([[CALayer alloc] init]);
[root_ca_layer_ setGeometryFlipped:YES];
[root_ca_layer_ setOpaque:YES];
}
}
CALayerTreeCoordinator::~CALayerTreeCoordinator() {}
void CALayerTreeCoordinator::Resize(const gfx::Size& pixel_size,
float scale_factor) {
pixel_size_ = pixel_size;
scale_factor_ = scale_factor;
}
CARendererLayerTree* CALayerTreeCoordinator::GetPendingCARendererLayerTree() {
if (!pending_ca_renderer_layer_tree_)
pending_ca_renderer_layer_tree_.reset(new CARendererLayerTree(
allow_av_sample_buffer_display_layer_, false));
return pending_ca_renderer_layer_tree_.get();
}
void CALayerTreeCoordinator::CommitPendingTreesToCA(
const gfx::Rect& pixel_damage_rect) {
// Update the CALayer hierarchy.
ScopedCAActionDisabler disabler;
if (pending_ca_renderer_layer_tree_) {
pending_ca_renderer_layer_tree_->CommitScheduledCALayers(
root_ca_layer_.get(), std::move(current_ca_renderer_layer_tree_),
pixel_size_, scale_factor_);
current_ca_renderer_layer_tree_.swap(pending_ca_renderer_layer_tree_);
} else {
TRACE_EVENT0("gpu", "Blank frame: No overlays or CALayers");
DLOG(WARNING) << "Blank frame: No overlays or CALayers";
[root_ca_layer_ setSublayers:nil];
current_ca_renderer_layer_tree_.reset();
}
// Reset all state for the next frame.
pending_ca_renderer_layer_tree_.reset();
}
CALayer* CALayerTreeCoordinator::GetCALayerForDisplay() const {
DCHECK(allow_remote_layers_);
return root_ca_layer_.get();
}
IOSurfaceRef CALayerTreeCoordinator::GetIOSurfaceForDisplay() {
DCHECK(!allow_remote_layers_);
if (!current_ca_renderer_layer_tree_)
return nullptr;
return current_ca_renderer_layer_tree_->GetContentIOSurface();
}
} // namespace ui