summaryrefslogtreecommitdiff
path: root/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm')
-rw-r--r--chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm554
1 files changed, 287 insertions, 267 deletions
diff --git a/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm b/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
index e4610b0da4e..c959d1f81f2 100644
--- a/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
+++ b/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
@@ -288,29 +288,29 @@ void CARendererLayerTree::CommitScheduledCALayers(
bool CARendererLayerTree::RootLayer::WantsFullcreenLowPowerBackdrop() const {
bool found_video_layer = false;
- for (auto& clip_layer : clip_and_sorting_layers) {
- for (auto& transform_layer : clip_layer.transform_layers) {
- for (auto& content_layer : transform_layer.content_layers) {
+ for (auto& clip_layer : clip_and_sorting_layers_) {
+ for (auto& transform_layer : clip_layer.transform_layers_) {
+ for (auto& content_layer : transform_layer.content_layers_) {
// Detached mode requires that no layers be on top of the video layer.
if (found_video_layer)
return false;
// See if this is the video layer.
- if (content_layer.type == CALayerType::kVideo) {
+ if (content_layer.type_ == CALayerType::kVideo) {
found_video_layer = true;
- if (!transform_layer.transform.IsPositiveScaleOrTranslation())
+ if (!transform_layer.transform_.IsPositiveScaleOrTranslation())
return false;
- if (content_layer.opacity != 1)
+ if (content_layer.opacity_ != 1)
return false;
continue;
}
// If we haven't found the video layer yet, make sure everything is
// solid black or transparent
- if (content_layer.io_surface)
+ if (content_layer.io_surface_)
return false;
- if (content_layer.background_color != SK_ColorBLACK &&
- content_layer.background_color != SK_ColorTRANSPARENT) {
+ if (content_layer.background_color_ != SK_ColorBLACK &&
+ content_layer.background_color_ != SK_ColorTRANSPARENT) {
return false;
}
}
@@ -320,12 +320,12 @@ bool CARendererLayerTree::RootLayer::WantsFullcreenLowPowerBackdrop() const {
}
void CARendererLayerTree::RootLayer::DowngradeAVLayersToCALayers() {
- for (auto& clip_layer : clip_and_sorting_layers) {
- for (auto& transform_layer : clip_layer.transform_layers) {
- for (auto& content_layer : transform_layer.content_layers) {
- if (content_layer.type == CALayerType::kVideo &&
- content_layer.video_type_can_downgrade) {
- content_layer.type = CALayerType::kDefault;
+ for (auto& clip_layer : clip_and_sorting_layers_) {
+ for (auto& transform_layer : clip_layer.transform_layers_) {
+ for (auto& content_layer : transform_layer.content_layers_) {
+ if (content_layer.type_ == CALayerType::kVideo &&
+ content_layer.video_type_can_downgrade_) {
+ content_layer.type_ = CALayerType::kDefault;
}
}
}
@@ -337,29 +337,29 @@ id CARendererLayerTree::ContentsForSolidColorForTesting(SkColor color) {
}
IOSurfaceRef CARendererLayerTree::GetContentIOSurface() const {
- size_t clip_count = root_layer_.clip_and_sorting_layers.size();
+ size_t clip_count = root_layer_.clip_and_sorting_layers_.size();
if (clip_count != 1) {
DLOG(ERROR) << "Can only return contents IOSurface when there is 1 "
<< "ClipAndSortingLayer, there are " << clip_count << ".";
return nullptr;
}
const ClipAndSortingLayer& clip_and_sorting =
- root_layer_.clip_and_sorting_layers[0];
- size_t transform_count = clip_and_sorting.transform_layers.size();
+ root_layer_.clip_and_sorting_layers_[0];
+ size_t transform_count = clip_and_sorting.transform_layers_.size();
if (transform_count != 1) {
DLOG(ERROR) << "Can only return contents IOSurface when there is 1 "
<< "TransformLayer, there are " << transform_count << ".";
return nullptr;
}
- const TransformLayer& transform = clip_and_sorting.transform_layers[0];
- size_t content_count = transform.content_layers.size();
+ const TransformLayer& transform = clip_and_sorting.transform_layers_[0];
+ size_t content_count = transform.content_layers_.size();
if (content_count != 1) {
DLOG(ERROR) << "Can only return contents IOSurface when there is 1 "
<< "ContentLayer, there are " << transform_count << ".";
return nullptr;
}
- const ContentLayer& content = transform.content_layers[0];
- return content.io_surface.get();
+ const ContentLayer& content = transform.content_layers_[0];
+ return content.io_surface_.get();
}
CARendererLayerTree::RootLayer::RootLayer() {}
@@ -367,7 +367,7 @@ CARendererLayerTree::RootLayer::RootLayer() {}
// Note that for all destructors, the the CALayer will have been reset to nil if
// another layer has taken it.
CARendererLayerTree::RootLayer::~RootLayer() {
- [ca_layer removeFromSuperlayer];
+ [ca_layer_ removeFromSuperlayer];
}
CARendererLayerTree::ClipAndSortingLayer::ClipAndSortingLayer(
@@ -376,48 +376,48 @@ CARendererLayerTree::ClipAndSortingLayer::ClipAndSortingLayer(
gfx::RRectF rounded_corner_bounds_arg,
unsigned sorting_context_id,
bool is_singleton_sorting_context)
- : is_clipped(is_clipped),
- clip_rect(clip_rect),
- rounded_corner_bounds(rounded_corner_bounds_arg),
- sorting_context_id(sorting_context_id),
- is_singleton_sorting_context(is_singleton_sorting_context) {}
+ : is_clipped_(is_clipped),
+ clip_rect_(clip_rect),
+ rounded_corner_bounds_(rounded_corner_bounds_arg),
+ sorting_context_id_(sorting_context_id),
+ is_singleton_sorting_context_(is_singleton_sorting_context) {}
CARendererLayerTree::ClipAndSortingLayer::ClipAndSortingLayer(
ClipAndSortingLayer&& layer)
- : transform_layers(std::move(layer.transform_layers)),
- is_clipped(layer.is_clipped),
- clip_rect(layer.clip_rect),
- rounded_corner_bounds(layer.rounded_corner_bounds),
- sorting_context_id(layer.sorting_context_id),
- is_singleton_sorting_context(layer.is_singleton_sorting_context),
- clipping_ca_layer(layer.clipping_ca_layer),
- rounded_corner_ca_layer(layer.rounded_corner_ca_layer) {
+ : transform_layers_(std::move(layer.transform_layers_)),
+ is_clipped_(layer.is_clipped_),
+ clip_rect_(layer.clip_rect_),
+ rounded_corner_bounds_(layer.rounded_corner_bounds_),
+ sorting_context_id_(layer.sorting_context_id_),
+ is_singleton_sorting_context_(layer.is_singleton_sorting_context_),
+ clipping_ca_layer_(layer.clipping_ca_layer_),
+ rounded_corner_ca_layer_(layer.rounded_corner_ca_layer_) {
// Ensure that the ca_layer be reset, so that when the destructor is called,
// the layer hierarchy is unaffected.
// TODO(ccameron): Add a move constructor for scoped_nsobject to do this
// automatically.
- layer.clipping_ca_layer.reset();
- layer.rounded_corner_ca_layer.reset();
+ layer.clipping_ca_layer_.reset();
+ layer.rounded_corner_ca_layer_.reset();
}
CARendererLayerTree::ClipAndSortingLayer::~ClipAndSortingLayer() {
- [clipping_ca_layer removeFromSuperlayer];
- [rounded_corner_ca_layer removeFromSuperlayer];
+ [clipping_ca_layer_ removeFromSuperlayer];
+ [rounded_corner_ca_layer_ removeFromSuperlayer];
}
CARendererLayerTree::TransformLayer::TransformLayer(
const gfx::Transform& transform)
- : transform(transform) {}
+ : transform_(transform) {}
CARendererLayerTree::TransformLayer::TransformLayer(TransformLayer&& layer)
- : transform(layer.transform),
- content_layers(std::move(layer.content_layers)),
- ca_layer(layer.ca_layer) {
- layer.ca_layer.reset();
+ : transform_(layer.transform_),
+ content_layers_(std::move(layer.content_layers_)),
+ ca_layer_(layer.ca_layer_) {
+ layer.ca_layer_.reset();
}
CARendererLayerTree::TransformLayer::~TransformLayer() {
- [ca_layer removeFromSuperlayer];
+ [ca_layer_ removeFromSuperlayer];
}
CARendererLayerTree::ContentLayer::ContentLayer(
@@ -425,36 +425,38 @@ CARendererLayerTree::ContentLayer::ContentLayer(
base::ScopedCFTypeRef<IOSurfaceRef> io_surface,
base::ScopedCFTypeRef<CVPixelBufferRef> cv_pixel_buffer,
const gfx::RectF& contents_rect,
- const gfx::Rect& rect_in,
+ const gfx::Rect& rect,
unsigned background_color,
const gfx::ColorSpace& io_surface_color_space,
unsigned edge_aa_mask,
float opacity,
- unsigned filter)
- : io_surface(io_surface),
- cv_pixel_buffer(cv_pixel_buffer),
- contents_rect(contents_rect),
- rect(rect_in),
- background_color(background_color),
- io_surface_color_space(io_surface_color_space),
- ca_edge_aa_mask(0),
- opacity(opacity),
- ca_filter(filter == GL_LINEAR ? kCAFilterLinear : kCAFilterNearest) {
+ unsigned filter,
+ gfx::ProtectedVideoType protected_video_type)
+ : io_surface_(io_surface),
+ cv_pixel_buffer_(cv_pixel_buffer),
+ contents_rect_(contents_rect),
+ rect_(rect),
+ background_color_(background_color),
+ io_surface_color_space_(io_surface_color_space),
+ ca_edge_aa_mask_(0),
+ opacity_(opacity),
+ ca_filter_(filter == GL_LINEAR ? kCAFilterLinear : kCAFilterNearest),
+ protected_video_type_(protected_video_type) {
DCHECK(filter == GL_LINEAR || filter == GL_NEAREST);
- // On Mac OS Sierra, solid color layers are not color color corrected to the
- // output monitor color space, but IOSurface-backed layers are color
- // corrected. Note that this is only the case when the CALayers are shared
- // across processes. To make colors consistent across both solid color and
- // IOSurface-backed layers, use a cache of solid-color IOSurfaces as
- // contents. Black and transparent layers must use real colors to be eligible
- // for low power detachment in fullscreen.
+ // On Mac OS Sierra, solid color layers are not color converted to the output
+ // monitor color space, but IOSurface-backed layers are color converted. Note
+ // that this is only the case when the CALayers are shared across processes.
+ // To make colors consistent across both solid color and IOSurface-backed
+ // layers, use a cache of solid-color IOSurfaces as contents. Black and
+ // transparent layers must use real colors to be eligible for low power
+ // detachment in fullscreen.
// https://crbug.com/633805
if (!io_surface && !tree->allow_solid_color_layers_ &&
- background_color != SK_ColorBLACK &&
- background_color != SK_ColorTRANSPARENT) {
- solid_color_contents = SolidColorContents::Get(background_color);
- ContentLayer::contents_rect = gfx::RectF(0, 0, 1, 1);
+ background_color_ != SK_ColorBLACK &&
+ background_color_ != SK_ColorTRANSPARENT) {
+ solid_color_contents_ = SolidColorContents::Get(background_color);
+ contents_rect_ = gfx::RectF(0, 0, 1, 1);
}
// Because the root layer has setGeometryFlipped:YES, there is some ambiguity
@@ -466,45 +468,54 @@ CARendererLayerTree::ContentLayer::ContentLayer(
// top edge on-screen.
// https://crbug.com/567946
if (edge_aa_mask & GL_CA_LAYER_EDGE_LEFT_CHROMIUM)
- ca_edge_aa_mask |= kCALayerLeftEdge;
+ ca_edge_aa_mask_ |= kCALayerLeftEdge;
if (edge_aa_mask & GL_CA_LAYER_EDGE_RIGHT_CHROMIUM)
- ca_edge_aa_mask |= kCALayerRightEdge;
- if (io_surface || solid_color_contents) {
+ ca_edge_aa_mask_ |= kCALayerRightEdge;
+ if (io_surface || solid_color_contents_) {
if (edge_aa_mask & GL_CA_LAYER_EDGE_TOP_CHROMIUM)
- ca_edge_aa_mask |= kCALayerBottomEdge;
+ ca_edge_aa_mask_ |= kCALayerBottomEdge;
if (edge_aa_mask & GL_CA_LAYER_EDGE_BOTTOM_CHROMIUM)
- ca_edge_aa_mask |= kCALayerTopEdge;
+ ca_edge_aa_mask_ |= kCALayerTopEdge;
} else {
if (edge_aa_mask & GL_CA_LAYER_EDGE_TOP_CHROMIUM)
- ca_edge_aa_mask |= kCALayerTopEdge;
+ ca_edge_aa_mask_ |= kCALayerTopEdge;
if (edge_aa_mask & GL_CA_LAYER_EDGE_BOTTOM_CHROMIUM)
- ca_edge_aa_mask |= kCALayerBottomEdge;
+ ca_edge_aa_mask_ |= kCALayerBottomEdge;
}
// Determine which type of CALayer subclass we should use.
if (metal::ShouldUseHDRCopier(io_surface, io_surface_color_space)) {
- type = CALayerType::kHDRCopier;
+ type_ = CALayerType::kHDRCopier;
} else if (io_surface) {
- // Only allow 4:2:0 frames which fill the layer's contents to be
- // promoted to AV layers.
- if (tree->allow_av_sample_buffer_display_layer_ &&
- contents_rect == gfx::RectF(0, 0, 1, 1)) {
- switch (IOSurfaceGetPixelFormat(io_surface)) {
- case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
- type = CALayerType::kVideo;
- video_type_can_downgrade = !io_surface_color_space.IsHDR();
- break;
- case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange:
- type = CALayerType::kVideo;
- video_type_can_downgrade = false;
- break;
- default:
- break;
+ // Only allow 4:2:0 frames which fill the layer's contents or protected
+ // video to be promoted to AV layers.
+ if (tree->allow_av_sample_buffer_display_layer_) {
+ if (contents_rect == gfx::RectF(0, 0, 1, 1)) {
+ switch (IOSurfaceGetPixelFormat(io_surface)) {
+ case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
+ type_ = CALayerType::kVideo;
+ video_type_can_downgrade_ = !io_surface_color_space.IsHDR();
+ break;
+ case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange:
+ type_ = CALayerType::kVideo;
+ video_type_can_downgrade_ = false;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (protected_video_type_ ==
+ gfx::ProtectedVideoType::kHardwareProtected) {
+ if (@available(macOS 10.15, *)) {
+ type_ = CALayerType::kVideo;
+ video_type_can_downgrade_ = false;
+ }
}
}
}
- if (type == CALayerType::kVideo) {
+ if (type_ == CALayerType::kVideo) {
// If the layer's aspect ratio could be made to match the video's aspect
// ratio by expanding either dimension by a fractional pixel, do so. The
// mismatch probably resulted from rounding the dimensions to integers.
@@ -516,43 +527,45 @@ CARendererLayerTree::ContentLayer::ContentLayer(
: gfx::RectF(IOSurfaceGetWidth(io_surface),
IOSurfaceGetHeight(io_surface)));
const CGFloat av_ratio = av_rect.width() / av_rect.height();
- const CGFloat layer_ratio = rect.width() / rect.height();
+ const CGFloat layer_ratio = rect_.width() / rect_.height();
const CGFloat ratio_error = av_ratio / layer_ratio;
if (ratio_error > 1) {
- const float width_correction = rect.width() * ratio_error - rect.width();
+ const float width_correction =
+ rect_.width() * ratio_error - rect_.width();
if (width_correction < 1)
- rect.Inset(-width_correction / 2, 0);
+ rect_.Inset(-width_correction / 2, 0);
} else if (ratio_error < 1) {
const float height_correction =
- rect.height() / ratio_error - rect.height();
+ rect_.height() / ratio_error - rect_.height();
if (height_correction < 1)
- rect.Inset(0, -height_correction / 2);
+ rect_.Inset(0, -height_correction / 2);
}
}
}
CARendererLayerTree::ContentLayer::ContentLayer(ContentLayer&& layer)
- : io_surface(layer.io_surface),
- cv_pixel_buffer(layer.cv_pixel_buffer),
- solid_color_contents(layer.solid_color_contents),
- contents_rect(layer.contents_rect),
- rect(layer.rect),
- background_color(layer.background_color),
- io_surface_color_space(layer.io_surface_color_space),
- ca_edge_aa_mask(layer.ca_edge_aa_mask),
- opacity(layer.opacity),
- ca_filter(layer.ca_filter),
- type(layer.type),
- video_type_can_downgrade(layer.video_type_can_downgrade),
- ca_layer(std::move(layer.ca_layer)),
- av_layer(std::move(layer.av_layer)) {
- DCHECK(!layer.ca_layer);
- DCHECK(!layer.av_layer);
+ : io_surface_(layer.io_surface_),
+ cv_pixel_buffer_(layer.cv_pixel_buffer_),
+ solid_color_contents_(layer.solid_color_contents_),
+ contents_rect_(layer.contents_rect_),
+ rect_(layer.rect_),
+ background_color_(layer.background_color_),
+ io_surface_color_space_(layer.io_surface_color_space_),
+ ca_edge_aa_mask_(layer.ca_edge_aa_mask_),
+ opacity_(layer.opacity_),
+ ca_filter_(layer.ca_filter_),
+ type_(layer.type_),
+ video_type_can_downgrade_(layer.video_type_can_downgrade_),
+ protected_video_type_(layer.protected_video_type_),
+ ca_layer_(std::move(layer.ca_layer_)),
+ av_layer_(std::move(layer.av_layer_)) {
+ DCHECK(!layer.ca_layer_);
+ DCHECK(!layer.av_layer_);
}
CARendererLayerTree::ContentLayer::~ContentLayer() {
- [ca_layer removeFromSuperlayer];
+ [ca_layer_ removeFromSuperlayer];
}
bool CARendererLayerTree::RootLayer::AddContentLayer(
@@ -567,33 +580,34 @@ bool CARendererLayerTree::RootLayer::AddContentLayer(
bool is_singleton_sorting_context =
!params.sorting_context_id && !params.transform.IsFlat();
- if (!clip_and_sorting_layers.empty()) {
- ClipAndSortingLayer& current_layer = clip_and_sorting_layers.back();
+ if (!clip_and_sorting_layers_.empty()) {
+ ClipAndSortingLayer& current_layer = clip_and_sorting_layers_.back();
// It is in error to change the clipping settings within a non-zero sorting
// context. The result will be incorrect layering and intersection.
if (params.sorting_context_id &&
- current_layer.sorting_context_id == params.sorting_context_id &&
- (current_layer.is_clipped != params.is_clipped ||
- current_layer.clip_rect != params.clip_rect ||
- current_layer.rounded_corner_bounds != params.rounded_corner_bounds)) {
+ current_layer.sorting_context_id_ == params.sorting_context_id &&
+ (current_layer.is_clipped_ != params.is_clipped ||
+ current_layer.clip_rect_ != params.clip_rect ||
+ current_layer.rounded_corner_bounds_ !=
+ params.rounded_corner_bounds)) {
DLOG(ERROR) << "CALayer changed clip inside non-zero sorting context.";
return false;
}
if (!is_singleton_sorting_context &&
- !current_layer.is_singleton_sorting_context &&
- current_layer.is_clipped == params.is_clipped &&
- current_layer.clip_rect == params.clip_rect &&
- current_layer.rounded_corner_bounds == params.rounded_corner_bounds &&
- current_layer.sorting_context_id == params.sorting_context_id) {
+ !current_layer.is_singleton_sorting_context_ &&
+ current_layer.is_clipped_ == params.is_clipped &&
+ current_layer.clip_rect_ == params.clip_rect &&
+ current_layer.rounded_corner_bounds_ == params.rounded_corner_bounds &&
+ current_layer.sorting_context_id_ == params.sorting_context_id) {
needs_new_clip_and_sorting_layer = false;
}
}
if (needs_new_clip_and_sorting_layer) {
- clip_and_sorting_layers.push_back(ClipAndSortingLayer(
+ clip_and_sorting_layers_.push_back(ClipAndSortingLayer(
params.is_clipped, params.clip_rect, params.rounded_corner_bounds,
params.sorting_context_id, is_singleton_sorting_context));
}
- clip_and_sorting_layers.back().AddContentLayer(tree, params);
+ clip_and_sorting_layers_.back().AddContentLayer(tree, params);
return true;
}
@@ -601,14 +615,14 @@ void CARendererLayerTree::ClipAndSortingLayer::AddContentLayer(
CARendererLayerTree* tree,
const CARendererLayerParams& params) {
bool needs_new_transform_layer = true;
- if (!transform_layers.empty()) {
- const TransformLayer& current_layer = transform_layers.back();
- if (current_layer.transform == params.transform)
+ if (!transform_layers_.empty()) {
+ const TransformLayer& current_layer = transform_layers_.back();
+ if (current_layer.transform_ == params.transform)
needs_new_transform_layer = false;
}
if (needs_new_transform_layer)
- transform_layers.push_back(TransformLayer(params.transform));
- transform_layers.back().AddContentLayer(tree, params);
+ transform_layers_.push_back(TransformLayer(params.transform));
+ transform_layers_.back().AddContentLayer(tree, params);
}
void CARendererLayerTree::TransformLayer::AddContentLayer(
@@ -632,10 +646,10 @@ void CARendererLayerTree::TransformLayer::AddContentLayer(
// cv_pixel_buffer = io_surface_image->cv_pixel_buffer();
io_surface_color_space = params.image->color_space();
}
- content_layers.push_back(
- ContentLayer(tree, io_surface, cv_pixel_buffer, params.contents_rect,
- params.rect, params.background_color, io_surface_color_space,
- params.edge_aa_mask, params.opacity, params.filter));
+ content_layers_.push_back(ContentLayer(
+ tree, io_surface, cv_pixel_buffer, params.contents_rect, params.rect,
+ params.background_color, io_surface_color_space, params.edge_aa_mask,
+ params.opacity, params.filter, params.protected_video_type));
}
void CARendererLayerTree::RootLayer::CommitToCA(CALayer* superlayer,
@@ -643,16 +657,16 @@ void CARendererLayerTree::RootLayer::CommitToCA(CALayer* superlayer,
const gfx::Size& pixel_size,
float scale_factor) {
if (old_layer) {
- DCHECK(old_layer->ca_layer);
- std::swap(ca_layer, old_layer->ca_layer);
+ DCHECK(old_layer->ca_layer_);
+ std::swap(ca_layer_, old_layer->ca_layer_);
} else {
- ca_layer.reset([[CALayer alloc] init]);
- [ca_layer setAnchorPoint:CGPointZero];
+ ca_layer_.reset([[CALayer alloc] init]);
+ [ca_layer_ setAnchorPoint:CGPointZero];
[superlayer setSublayers:nil];
- [superlayer addSublayer:ca_layer];
+ [superlayer addSublayer:ca_layer_];
[superlayer setBorderWidth:0];
}
- if ([ca_layer superlayer] != superlayer) {
+ if ([ca_layer_ superlayer] != superlayer) {
DLOG(ERROR) << "CARendererLayerTree root layer not attached to tree.";
}
@@ -661,15 +675,15 @@ void CARendererLayerTree::RootLayer::CommitToCA(CALayer* superlayer,
// solid black background.
const gfx::RectF bg_rect(
ScaleSize(gfx::SizeF(pixel_size), 1 / scale_factor));
- if (gfx::RectF([ca_layer frame]) != bg_rect)
- [ca_layer setFrame:bg_rect.ToCGRect()];
- if (![ca_layer backgroundColor])
- [ca_layer setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];
+ if (gfx::RectF([ca_layer_ frame]) != bg_rect)
+ [ca_layer_ setFrame:bg_rect.ToCGRect()];
+ if (![ca_layer_ backgroundColor])
+ [ca_layer_ setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];
} else {
- if (gfx::RectF([ca_layer frame]) != gfx::RectF())
- [ca_layer setFrame:CGRectZero];
- if ([ca_layer backgroundColor])
- [ca_layer setBackgroundColor:nil];
+ if (gfx::RectF([ca_layer_ frame]) != gfx::RectF())
+ [ca_layer_ setFrame:CGRectZero];
+ if ([ca_layer_ backgroundColor])
+ [ca_layer_ setBackgroundColor:nil];
// We know that we are not in fullscreen low power mode, so there is no
// power savings (and a slight power cost) to using
// AVSampleBufferDisplayLayer.
@@ -682,13 +696,13 @@ void CARendererLayerTree::RootLayer::CommitToCA(CALayer* superlayer,
DowngradeAVLayersToCALayers();
}
- for (size_t i = 0; i < clip_and_sorting_layers.size(); ++i) {
+ for (size_t i = 0; i < clip_and_sorting_layers_.size(); ++i) {
ClipAndSortingLayer* old_clip_and_sorting_layer = nullptr;
- if (old_layer && i < old_layer->clip_and_sorting_layers.size()) {
- old_clip_and_sorting_layer = &old_layer->clip_and_sorting_layers[i];
+ if (old_layer && i < old_layer->clip_and_sorting_layers_.size()) {
+ old_clip_and_sorting_layer = &old_layer->clip_and_sorting_layers_[i];
}
- clip_and_sorting_layers[i].CommitToCA(
- ca_layer.get(), old_clip_and_sorting_layer, scale_factor);
+ clip_and_sorting_layers_[i].CommitToCA(
+ ca_layer_.get(), old_clip_and_sorting_layer, scale_factor);
}
}
@@ -699,83 +713,83 @@ void CARendererLayerTree::ClipAndSortingLayer::CommitToCA(
bool update_is_clipped = true;
bool update_clip_rect = true;
if (old_layer) {
- DCHECK(old_layer->clipping_ca_layer);
- DCHECK(old_layer->rounded_corner_ca_layer);
- std::swap(clipping_ca_layer, old_layer->clipping_ca_layer);
- std::swap(rounded_corner_ca_layer, old_layer->rounded_corner_ca_layer);
- update_is_clipped = old_layer->is_clipped != is_clipped;
- update_clip_rect = update_is_clipped || old_layer->clip_rect != clip_rect;
+ DCHECK(old_layer->clipping_ca_layer_);
+ DCHECK(old_layer->rounded_corner_ca_layer_);
+ std::swap(clipping_ca_layer_, old_layer->clipping_ca_layer_);
+ std::swap(rounded_corner_ca_layer_, old_layer->rounded_corner_ca_layer_);
+ update_is_clipped = old_layer->is_clipped_ != is_clipped_;
+ update_clip_rect = update_is_clipped || old_layer->clip_rect_ != clip_rect_;
} else {
- clipping_ca_layer.reset([[CALayer alloc] init]);
- [clipping_ca_layer setAnchorPoint:CGPointZero];
- [superlayer addSublayer:clipping_ca_layer];
- rounded_corner_ca_layer.reset([[CALayer alloc] init]);
- [rounded_corner_ca_layer setAnchorPoint:CGPointZero];
- [clipping_ca_layer addSublayer:rounded_corner_ca_layer];
+ clipping_ca_layer_.reset([[CALayer alloc] init]);
+ [clipping_ca_layer_ setAnchorPoint:CGPointZero];
+ [superlayer addSublayer:clipping_ca_layer_];
+ rounded_corner_ca_layer_.reset([[CALayer alloc] init]);
+ [rounded_corner_ca_layer_ setAnchorPoint:CGPointZero];
+ [clipping_ca_layer_ addSublayer:rounded_corner_ca_layer_];
}
- if (!rounded_corner_bounds.IsEmpty()) {
+ if (!rounded_corner_bounds_.IsEmpty()) {
if (!old_layer ||
- old_layer->rounded_corner_bounds != rounded_corner_bounds) {
+ old_layer->rounded_corner_bounds_ != rounded_corner_bounds_) {
gfx::RectF dip_rounded_corner_bounds =
- gfx::RectF(rounded_corner_bounds.rect());
+ gfx::RectF(rounded_corner_bounds_.rect());
dip_rounded_corner_bounds.Scale(1 / scale_factor);
- [rounded_corner_ca_layer setMasksToBounds:true];
+ [rounded_corner_ca_layer_ setMasksToBounds:true];
- [rounded_corner_ca_layer
+ [rounded_corner_ca_layer_
setPosition:CGPointMake(dip_rounded_corner_bounds.x(),
dip_rounded_corner_bounds.y())];
- [rounded_corner_ca_layer
+ [rounded_corner_ca_layer_
setBounds:CGRectMake(0, 0, dip_rounded_corner_bounds.width(),
dip_rounded_corner_bounds.height())];
- [rounded_corner_ca_layer
+ [rounded_corner_ca_layer_
setSublayerTransform:CATransform3DMakeTranslation(
-dip_rounded_corner_bounds.x(),
-dip_rounded_corner_bounds.y(), 0)];
- [rounded_corner_ca_layer
- setCornerRadius:rounded_corner_bounds.GetSimpleRadius() /
+ [rounded_corner_ca_layer_
+ setCornerRadius:rounded_corner_bounds_.GetSimpleRadius() /
scale_factor];
}
} else {
- [rounded_corner_ca_layer setMasksToBounds:false];
- [rounded_corner_ca_layer setPosition:CGPointZero];
- [rounded_corner_ca_layer setBounds:CGRectZero];
- [rounded_corner_ca_layer setSublayerTransform:CATransform3DIdentity];
- [rounded_corner_ca_layer setCornerRadius:0];
+ [rounded_corner_ca_layer_ setMasksToBounds:false];
+ [rounded_corner_ca_layer_ setPosition:CGPointZero];
+ [rounded_corner_ca_layer_ setBounds:CGRectZero];
+ [rounded_corner_ca_layer_ setSublayerTransform:CATransform3DIdentity];
+ [rounded_corner_ca_layer_ setCornerRadius:0];
}
- if ([clipping_ca_layer superlayer] != superlayer) {
+ if ([clipping_ca_layer_ superlayer] != superlayer) {
DLOG(ERROR) << "CARendererLayerTree root layer not attached to tree.";
}
if (update_is_clipped)
- [clipping_ca_layer setMasksToBounds:is_clipped];
+ [clipping_ca_layer_ setMasksToBounds:is_clipped_];
if (update_clip_rect) {
- if (is_clipped) {
- gfx::RectF dip_clip_rect = gfx::RectF(clip_rect);
+ if (is_clipped_) {
+ gfx::RectF dip_clip_rect = gfx::RectF(clip_rect_);
dip_clip_rect.Scale(1 / scale_factor);
- [clipping_ca_layer
+ [clipping_ca_layer_
setPosition:CGPointMake(dip_clip_rect.x(), dip_clip_rect.y())];
- [clipping_ca_layer setBounds:CGRectMake(0, 0, dip_clip_rect.width(),
- dip_clip_rect.height())];
- [clipping_ca_layer
+ [clipping_ca_layer_ setBounds:CGRectMake(0, 0, dip_clip_rect.width(),
+ dip_clip_rect.height())];
+ [clipping_ca_layer_
setSublayerTransform:CATransform3DMakeTranslation(
-dip_clip_rect.x(), -dip_clip_rect.y(), 0)];
} else {
- [clipping_ca_layer setPosition:CGPointZero];
- [clipping_ca_layer setBounds:CGRectZero];
- [clipping_ca_layer setSublayerTransform:CATransform3DIdentity];
+ [clipping_ca_layer_ setPosition:CGPointZero];
+ [clipping_ca_layer_ setBounds:CGRectZero];
+ [clipping_ca_layer_ setSublayerTransform:CATransform3DIdentity];
}
}
- for (size_t i = 0; i < transform_layers.size(); ++i) {
+ for (size_t i = 0; i < transform_layers_.size(); ++i) {
TransformLayer* old_transform_layer = nullptr;
- if (old_layer && i < old_layer->transform_layers.size())
- old_transform_layer = &old_layer->transform_layers[i];
- transform_layers[i].CommitToCA(rounded_corner_ca_layer, old_transform_layer,
- scale_factor);
+ if (old_layer && i < old_layer->transform_layers_.size())
+ old_transform_layer = &old_layer->transform_layers_[i];
+ transform_layers_[i].CommitToCA(rounded_corner_ca_layer_,
+ old_transform_layer, scale_factor);
}
}
@@ -784,33 +798,33 @@ void CARendererLayerTree::TransformLayer::CommitToCA(CALayer* superlayer,
float scale_factor) {
bool update_transform = true;
if (old_layer) {
- DCHECK(old_layer->ca_layer);
- std::swap(ca_layer, old_layer->ca_layer);
- update_transform = old_layer->transform != transform;
+ DCHECK(old_layer->ca_layer_);
+ std::swap(ca_layer_, old_layer->ca_layer_);
+ update_transform = old_layer->transform_ != transform_;
} else {
- ca_layer.reset([[CATransformLayer alloc] init]);
- [superlayer addSublayer:ca_layer];
+ ca_layer_.reset([[CATransformLayer alloc] init]);
+ [superlayer addSublayer:ca_layer_];
}
- DCHECK_EQ([ca_layer superlayer], superlayer);
+ DCHECK_EQ([ca_layer_ superlayer], superlayer);
if (update_transform) {
gfx::Transform pre_scale;
gfx::Transform post_scale;
pre_scale.Scale(1 / scale_factor, 1 / scale_factor);
post_scale.Scale(scale_factor, scale_factor);
- gfx::Transform conjugated_transform = pre_scale * transform * post_scale;
+ gfx::Transform conjugated_transform = pre_scale * transform_ * post_scale;
CATransform3D ca_transform;
conjugated_transform.matrix().asColMajord(&ca_transform.m11);
- [ca_layer setTransform:ca_transform];
+ [ca_layer_ setTransform:ca_transform];
}
- for (size_t i = 0; i < content_layers.size(); ++i) {
+ for (size_t i = 0; i < content_layers_.size(); ++i) {
ContentLayer* old_content_layer = nullptr;
- if (old_layer && i < old_layer->content_layers.size())
- old_content_layer = &old_layer->content_layers[i];
- content_layers[i].CommitToCA(ca_layer.get(), old_content_layer,
- scale_factor);
+ if (old_layer && i < old_layer->content_layers_.size())
+ old_content_layer = &old_layer->content_layers_[i];
+ content_layers_[i].CommitToCA(ca_layer_.get(), old_content_layer,
+ scale_factor);
}
}
@@ -824,64 +838,70 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer,
bool update_ca_edge_aa_mask = true;
bool update_opacity = true;
bool update_ca_filter = true;
- if (old_layer && old_layer->type == type) {
- DCHECK(old_layer->ca_layer);
- std::swap(ca_layer, old_layer->ca_layer);
- std::swap(av_layer, old_layer->av_layer);
- update_contents = old_layer->io_surface != io_surface ||
- old_layer->cv_pixel_buffer != cv_pixel_buffer ||
- old_layer->solid_color_contents != solid_color_contents;
- update_contents_rect = old_layer->contents_rect != contents_rect;
- update_rect = old_layer->rect != rect;
- update_background_color = old_layer->background_color != background_color;
- update_ca_edge_aa_mask = old_layer->ca_edge_aa_mask != ca_edge_aa_mask;
- update_opacity = old_layer->opacity != opacity;
- update_ca_filter = old_layer->ca_filter != ca_filter;
+ if (old_layer && old_layer->type_ == type_) {
+ DCHECK(old_layer->ca_layer_);
+ std::swap(ca_layer_, old_layer->ca_layer_);
+ std::swap(av_layer_, old_layer->av_layer_);
+ update_contents = old_layer->io_surface_ != io_surface_ ||
+ old_layer->cv_pixel_buffer_ != cv_pixel_buffer_ ||
+ old_layer->solid_color_contents_ != solid_color_contents_;
+ update_contents_rect = old_layer->contents_rect_ != contents_rect_;
+ update_rect = old_layer->rect_ != rect_;
+ update_background_color = old_layer->background_color_ != background_color_;
+ update_ca_edge_aa_mask = old_layer->ca_edge_aa_mask_ != ca_edge_aa_mask_;
+ update_opacity = old_layer->opacity_ != opacity_;
+ update_ca_filter = old_layer->ca_filter_ != ca_filter_;
} else {
- switch (type) {
+ switch (type_) {
case CALayerType::kHDRCopier:
- ca_layer.reset(metal::CreateHDRCopierLayer());
+ ca_layer_.reset(metal::CreateHDRCopierLayer());
break;
case CALayerType::kVideo:
- av_layer.reset([[AVSampleBufferDisplayLayer alloc] init]);
- ca_layer.reset([av_layer retain]);
- [av_layer setVideoGravity:AVLayerVideoGravityResize];
+ av_layer_.reset([[AVSampleBufferDisplayLayer alloc] init]);
+ ca_layer_.reset([av_layer_ retain]);
+ [av_layer_ setVideoGravity:AVLayerVideoGravityResize];
+ if (protected_video_type_ ==
+ gfx::ProtectedVideoType::kHardwareProtected) {
+ if (@available(macOS 10.15, *)) {
+ [av_layer_ setPreventsCapture:true];
+ }
+ }
break;
case CALayerType::kDefault:
- ca_layer.reset([[CALayer alloc] init]);
+ ca_layer_.reset([[CALayer alloc] init]);
}
- [ca_layer setAnchorPoint:CGPointZero];
- if (old_layer && old_layer->ca_layer)
- [superlayer replaceSublayer:old_layer->ca_layer with:ca_layer];
+ [ca_layer_ setAnchorPoint:CGPointZero];
+ if (old_layer && old_layer->ca_layer_)
+ [superlayer replaceSublayer:old_layer->ca_layer_ with:ca_layer_];
else
- [superlayer addSublayer:ca_layer];
+ [superlayer addSublayer:ca_layer_];
}
- DCHECK_EQ([ca_layer superlayer], superlayer);
+ DCHECK_EQ([ca_layer_ superlayer], superlayer);
bool update_anything = update_contents || update_contents_rect ||
update_rect || update_background_color ||
update_ca_edge_aa_mask || update_opacity ||
update_ca_filter;
- switch (type) {
+ switch (type_) {
case CALayerType::kHDRCopier:
if (update_contents) {
- metal::UpdateHDRCopierLayer(ca_layer.get(), io_surface.get(),
- io_surface_color_space);
+ metal::UpdateHDRCopierLayer(ca_layer_.get(), io_surface_.get(),
+ io_surface_color_space_);
}
break;
case CALayerType::kVideo:
if (update_contents) {
bool result = false;
- if (cv_pixel_buffer) {
+ if (cv_pixel_buffer_) {
result = AVSampleBufferDisplayLayerEnqueueCVPixelBuffer(
- av_layer, cv_pixel_buffer);
+ av_layer_, cv_pixel_buffer_);
if (!result) {
LOG(ERROR)
<< "AVSampleBufferDisplayLayerEnqueueCVPixelBuffer failed";
}
} else {
result = AVSampleBufferDisplayLayerEnqueueIOSurface(
- av_layer, io_surface, io_surface_color_space);
+ av_layer_, io_surface_, io_surface_color_space_);
if (!result) {
LOG(ERROR) << "AVSampleBufferDisplayLayerEnqueueIOSurface failed";
}
@@ -894,47 +914,47 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer,
break;
case CALayerType::kDefault:
if (update_contents) {
- if (io_surface) {
- [ca_layer setContents:static_cast<id>(io_surface.get())];
- } else if (solid_color_contents) {
- [ca_layer setContents:solid_color_contents->GetContents()];
+ if (io_surface_) {
+ [ca_layer_ setContents:static_cast<id>(io_surface_.get())];
+ } else if (solid_color_contents_) {
+ [ca_layer_ setContents:solid_color_contents_->GetContents()];
} else {
- [ca_layer setContents:nil];
+ [ca_layer_ setContents:nil];
}
- if ([ca_layer respondsToSelector:(@selector(setContentsScale:))])
- [ca_layer setContentsScale:scale_factor];
+ if ([ca_layer_ respondsToSelector:(@selector(setContentsScale:))])
+ [ca_layer_ setContentsScale:scale_factor];
}
break;
}
if (update_contents_rect) {
- if (type != CALayerType::kVideo)
- [ca_layer setContentsRect:contents_rect.ToCGRect()];
+ if (type_ != CALayerType::kVideo)
+ [ca_layer_ setContentsRect:contents_rect_.ToCGRect()];
}
if (update_rect) {
- gfx::RectF dip_rect = gfx::RectF(rect);
+ gfx::RectF dip_rect = gfx::RectF(rect_);
dip_rect.Scale(1 / scale_factor);
- [ca_layer setPosition:CGPointMake(dip_rect.x(), dip_rect.y())];
- [ca_layer setBounds:CGRectMake(0, 0, dip_rect.width(), dip_rect.height())];
+ [ca_layer_ setPosition:CGPointMake(dip_rect.x(), dip_rect.y())];
+ [ca_layer_ setBounds:CGRectMake(0, 0, dip_rect.width(), dip_rect.height())];
}
if (update_background_color) {
CGFloat rgba_color_components[4] = {
- SkColorGetR(background_color) / 255.,
- SkColorGetG(background_color) / 255.,
- SkColorGetB(background_color) / 255.,
- SkColorGetA(background_color) / 255.,
+ SkColorGetR(background_color_) / 255.,
+ SkColorGetG(background_color_) / 255.,
+ SkColorGetB(background_color_) / 255.,
+ SkColorGetA(background_color_) / 255.,
};
base::ScopedCFTypeRef<CGColorRef> srgb_background_color(CGColorCreate(
CGColorSpaceCreateWithName(kCGColorSpaceSRGB), rgba_color_components));
- [ca_layer setBackgroundColor:srgb_background_color];
+ [ca_layer_ setBackgroundColor:srgb_background_color];
}
if (update_ca_edge_aa_mask)
- [ca_layer setEdgeAntialiasingMask:ca_edge_aa_mask];
+ [ca_layer_ setEdgeAntialiasingMask:ca_edge_aa_mask_];
if (update_opacity)
- [ca_layer setOpacity:opacity];
+ [ca_layer_ setOpacity:opacity_];
if (update_ca_filter) {
- [ca_layer setMagnificationFilter:ca_filter];
- [ca_layer setMinificationFilter:ca_filter];
+ [ca_layer_ setMagnificationFilter:ca_filter_];
+ [ca_layer_ setMinificationFilter:ca_filter_];
}
static bool show_borders = base::CommandLine::ForCurrentProcess()->HasSwitch(
@@ -942,24 +962,24 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer,
if (show_borders) {
base::ScopedCFTypeRef<CGColorRef> color;
float alpha = update_anything ? 1.f : 0.2f;
- if (type == CALayerType::kHDRCopier) {
+ if (type_ == CALayerType::kHDRCopier) {
// Blue represents an HDR layer.
color.reset(CGColorCreateGenericRGB(0, 0, 1, alpha));
- } else if (type == CALayerType::kVideo) {
+ } else if (type_ == CALayerType::kVideo) {
// Yellow represents an AV layer.
color.reset(CGColorCreateGenericRGB(1, 1, 0, alpha));
- } else if (io_surface) {
+ } else if (io_surface_) {
// Magenta represents a CALayer.
color.reset(CGColorCreateGenericRGB(1, 0, 1, alpha));
- } else if (solid_color_contents) {
+ } else if (solid_color_contents_) {
// Cyan represents a solid color.
color.reset(CGColorCreateGenericRGB(0, 1, 1, alpha));
} else {
// Grey represents a CALayer that has not changed.
color.reset(CGColorCreateGenericRGB(0.5, 0.5, 0.5, 1));
}
- [ca_layer setBorderWidth:1];
- [ca_layer setBorderColor:color];
+ [ca_layer_ setBorderWidth:1];
+ [ca_layer_ setBorderColor:color];
}
}