summaryrefslogtreecommitdiffstats
path: root/chromium/cc/trees/layer_tree_host.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/cc/trees/layer_tree_host.cc')
-rw-r--r--chromium/cc/trees/layer_tree_host.cc205
1 files changed, 85 insertions, 120 deletions
diff --git a/chromium/cc/trees/layer_tree_host.cc b/chromium/cc/trees/layer_tree_host.cc
index 1fab49e82ec..09cd244629c 100644
--- a/chromium/cc/trees/layer_tree_host.cc
+++ b/chromium/cc/trees/layer_tree_host.cc
@@ -48,12 +48,13 @@
#include "cc/trees/draw_property_utils.h"
#include "cc/trees/effect_node.h"
#include "cc/trees/layer_tree_host_client.h"
-#include "cc/trees/layer_tree_host_common.h"
#include "cc/trees/layer_tree_host_impl.h"
+#include "cc/trees/layer_tree_impl.h"
#include "cc/trees/mutator_host.h"
#include "cc/trees/property_tree_builder.h"
#include "cc/trees/proxy_main.h"
#include "cc/trees/render_frame_metadata_observer.h"
+#include "cc/trees/scroll_and_scale_set.h"
#include "cc/trees/scroll_node.h"
#include "cc/trees/single_thread_proxy.h"
#include "cc/trees/swap_promise_manager.h"
@@ -126,6 +127,7 @@ LayerTreeHost::LayerTreeHost(InitParams params, CompositorMode mode)
compositor_mode_(mode),
ui_resource_manager_(std::make_unique<UIResourceManager>()),
client_(params.client),
+ scheduling_client_(params.scheduling_client),
rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()),
settings_(*params.settings),
debug_state_(settings_.initial_debug_state),
@@ -199,9 +201,6 @@ LayerTreeHost::~LayerTreeHost() {
// Clear any references into the LayerTreeHost.
mutator_host_->SetMutatorHostClient(nullptr);
- // We must clear any pointers into the layer tree prior to destroying it.
- RegisterViewportLayers(ViewportLayers());
-
if (root_layer_) {
root_layer_->SetLayerTreeHost(nullptr);
@@ -289,8 +288,12 @@ const LayerTreeDebugState& LayerTreeHost::GetDebugState() const {
return debug_state_;
}
-void LayerTreeHost::RequestMainFrameUpdate() {
+void LayerTreeHost::RequestMainFrameUpdate(bool report_cc_metrics) {
client_->UpdateLayerTreeHost();
+ if (report_cc_metrics)
+ begin_main_frame_metrics_ = client_->GetBeginMainFrameMetrics();
+ else
+ begin_main_frame_metrics_.reset();
}
// This function commits the LayerTreeHost to an impl tree. When modifying
@@ -368,6 +371,7 @@ void LayerTreeHost::FinishCommitOnImplThread(
TRACE_EVENT0("cc", "LayerTreeHost::AnimationHost::PushProperties");
DCHECK(host_impl->mutator_host());
mutator_host_->PushPropertiesTo(host_impl->mutator_host());
+ MoveChangeTrackingToLayers(sync_tree);
// Updating elements affects whether animations are in effect based on their
// properties so run after pushing updated animation properties.
@@ -402,6 +406,27 @@ void LayerTreeHost::FinishCommitOnImplThread(
}
}
+void LayerTreeHost::MoveChangeTrackingToLayers(LayerTreeImpl* tree_impl) {
+ // This is only true for single-thread compositing (i.e. not via Blink).
+ bool property_trees_changed_on_active_tree =
+ tree_impl->IsActiveTree() && tree_impl->property_trees()->changed;
+
+ if (property_trees_changed_on_active_tree) {
+ // Property trees may store damage status. We preserve the sync tree damage
+ // status by pushing the damage status from sync tree property trees to main
+ // thread property trees or by moving it onto the layers.
+ if (root_layer_) {
+ if (property_trees_.sequence_number ==
+ tree_impl->property_trees()->sequence_number)
+ tree_impl->property_trees()->PushChangeTrackingTo(&property_trees_);
+ else
+ tree_impl->MoveChangeTrackingToLayers();
+ }
+ } else {
+ tree_impl->MoveChangeTrackingToLayers();
+ }
+}
+
void LayerTreeHost::ImageDecodesFinished(
const std::vector<std::pair<int, bool>>& results) {
// Issue stored callbacks and remove them from the pending list.
@@ -442,8 +467,8 @@ void LayerTreeHost::WillCommit() {
// PushPropertiesTo() propagates layer debug info to the impl side --
// otherwise this won't happen for the layers that remain unchanged since
// tracing started.
- LayerTreeHostCommon::CallFunctionForEveryLayer(
- this, [](Layer* layer) { layer->SetNeedsPushProperties(); });
+ for (auto* layer : *this)
+ layer->SetNeedsPushProperties();
}
for (Layer* layer : LayersThatShouldPushProperties())
@@ -454,8 +479,7 @@ void LayerTreeHost::WillCommit() {
void LayerTreeHost::UpdateDeferMainFrameUpdateInternal() {
proxy_->SetDeferMainFrameUpdate(
defer_main_frame_update_count_ > 0 ||
- (settings_.enable_surface_synchronization &&
- !local_surface_id_allocation_from_parent_.IsValid()));
+ !local_surface_id_allocation_from_parent_.IsValid());
}
bool LayerTreeHost::IsUsingLayerLists() const {
@@ -526,13 +550,13 @@ LayerTreeHost::CreateLayerTreeHostImpl(
std::unique_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create(
settings_, client, task_runner_provider_.get(),
rendering_stats_instrumentation_.get(), task_graph_runner_,
- std::move(mutator_host_impl), id_, std::move(image_worker_task_runner_));
+ std::move(mutator_host_impl), id_, std::move(image_worker_task_runner_),
+ scheduling_client_);
if (ukm_recorder_factory_) {
host_impl->InitializeUkm(ukm_recorder_factory_->CreateRecorder());
ukm_recorder_factory_.reset();
}
- host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_);
host_impl->SetContentHasSlowPaths(content_has_slow_paths_);
host_impl->SetContentHasNonAAPaint(content_has_non_aa_paint_);
task_graph_runner_ = nullptr;
@@ -653,16 +677,6 @@ void LayerTreeHost::SetDebugState(
SetNeedsCommit();
}
-void LayerTreeHost::SetHasGpuRasterizationTrigger(bool has_trigger) {
- if (has_trigger == has_gpu_rasterization_trigger_)
- return;
-
- has_gpu_rasterization_trigger_ = has_trigger;
- TRACE_EVENT_INSTANT1("cc", "LayerTreeHost::SetHasGpuRasterizationTrigger",
- TRACE_EVENT_SCOPE_THREAD, "has_trigger",
- has_gpu_rasterization_trigger_);
-}
-
void LayerTreeHost::ApplyPageScaleDeltaFromImplSide(
float page_scale_delta) {
DCHECK(CommitRequested());
@@ -687,7 +701,7 @@ void LayerTreeHost::LayoutAndUpdateLayers() {
DCHECK(IsSingleThreaded());
// This function is only valid when not using the scheduler.
DCHECK(!settings_.single_thread_proxy_scheduler);
- RequestMainFrameUpdate();
+ RequestMainFrameUpdate(false);
UpdateLayers();
}
@@ -702,6 +716,7 @@ void LayerTreeHost::Composite(base::TimeTicks frame_begin_time, bool raster) {
bool LayerTreeHost::UpdateLayers() {
if (!root_layer()) {
property_trees_.clear();
+ viewport_property_ids_ = ViewportPropertyIds();
return false;
}
@@ -713,8 +728,11 @@ bool LayerTreeHost::UpdateLayers() {
client_->DidUpdateLayers();
micro_benchmark_controller_.DidUpdateLayers();
+ base::TimeDelta elapsed_delta = timer.Elapsed();
+ if (begin_main_frame_metrics_)
+ begin_main_frame_metrics_->update_layers = elapsed_delta;
if (const char* client_name = GetClientNameForMetrics()) {
- auto elapsed = timer.Elapsed().InMicroseconds();
+ auto elapsed = elapsed_delta.InMicroseconds();
std::string histogram_name =
base::StringPrintf("Compositing.%s.LayersUpdateTime", client_name);
@@ -761,8 +779,6 @@ void LayerTreeHost::RecordGpuRasterizationHistogram(
UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationEnabled",
gpu_rasterization_enabled);
if (gpu_rasterization_enabled) {
- UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationTriggered",
- has_gpu_rasterization_trigger_);
UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationSuitableContent",
!content_has_slow_paths_);
UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationSlowPathsWithNonAAPaint",
@@ -801,13 +817,7 @@ bool LayerTreeHost::DoUpdateLayers() {
// need to be built here.
if (!IsUsingLayerLists()) {
TRACE_EVENT0("cc", "LayerTreeHost::UpdateLayers::BuildPropertyTrees");
- Layer* page_scale_layer = viewport_layers_.page_scale.get();
- gfx::Transform identity_transform;
- PropertyTreeBuilder::BuildPropertyTrees(
- root_layer_.get(), page_scale_layer, inner_viewport_scroll_layer(),
- outer_viewport_scroll_layer(), overscroll_elasticity_element_id(),
- elastic_overscroll_, page_scale_factor_, device_scale_factor_,
- device_viewport_rect_, identity_transform, &property_trees_);
+ PropertyTreeBuilder::BuildPropertyTrees(this);
TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
"LayerTreeHost::UpdateLayers_BuiltPropertyTrees",
TRACE_EVENT_SCOPE_THREAD, "property_trees",
@@ -848,11 +858,10 @@ bool LayerTreeHost::DoUpdateLayers() {
CHECK(property_trees_.effect_tree.Node(root_layer_->effect_tree_index()));
#endif
- draw_property_utils::UpdatePropertyTrees(this, &property_trees_);
+ draw_property_utils::UpdatePropertyTrees(this);
LayerList update_layer_list;
- draw_property_utils::FindLayersThatNeedUpdates(this, &property_trees_,
- &update_layer_list);
+ draw_property_utils::FindLayersThatNeedUpdates(this, &update_layer_list);
bool painted_content_has_slow_paths = false;
bool painted_content_has_non_aa_paint = false;
@@ -898,10 +907,13 @@ void LayerTreeHost::ApplyViewportChanges(const ScrollAndScaleSet& info) {
// Preemptively apply the scroll offset and scale delta here before sending
// it to the client. If the client comes back and sets it to the same
// value, then the layer can early out without needing a full commit.
- if (viewport_layers_.inner_viewport_scroll) {
- viewport_layers_.inner_viewport_scroll->SetScrollOffsetFromImplSide(
- viewport_layers_.inner_viewport_scroll->CurrentScrollOffset() +
- inner_viewport_scroll_delta);
+ if (auto* inner_scroll = property_trees()->scroll_tree.Node(
+ viewport_property_ids_.inner_scroll)) {
+ if (auto* inner_scroll_layer = LayerByElementId(inner_scroll->element_id)) {
+ inner_scroll_layer->SetScrollOffsetFromImplSide(
+ inner_scroll_layer->CurrentScrollOffset() +
+ inner_viewport_scroll_delta);
+ }
}
ApplyPageScaleDeltaFromImplSide(info.page_scale_delta);
@@ -1100,36 +1112,26 @@ void LayerTreeHost::SetNonBlinkManagedRootLayer(
force_use_property_tree_builder_ = true;
}
-void LayerTreeHost::RegisterViewportLayers(const ViewportLayers& layers) {
- DCHECK(!layers.inner_viewport_scroll ||
- layers.inner_viewport_scroll != layers.outer_viewport_scroll);
- // The page scale layer only affects the innter viewport scroll layer. The
- // page scale layer should be sandwiched between the inner viewport scroll and
- // inner viewport container layers:
- // inner viewport container
- // overscroll elasticity (optional)
- // page scale
- // inner viewport scroll
- DCHECK(IsUsingLayerLists() || !layers.page_scale ||
- layers.inner_viewport_scroll->parent() == layers.page_scale);
- DCHECK(IsUsingLayerLists() || !layers.page_scale ||
- layers.page_scale->parent()->element_id() ==
- layers.overscroll_elasticity_element_id ||
- layers.page_scale->parent() == layers.inner_viewport_container);
- viewport_layers_.overscroll_elasticity_element_id =
- layers.overscroll_elasticity_element_id;
- viewport_layers_.page_scale = layers.page_scale;
- viewport_layers_.inner_viewport_container = layers.inner_viewport_container;
- viewport_layers_.outer_viewport_container = layers.outer_viewport_container;
- viewport_layers_.inner_viewport_scroll = layers.inner_viewport_scroll;
- viewport_layers_.outer_viewport_scroll = layers.outer_viewport_scroll;
-}
-
void LayerTreeHost::RegisterViewportPropertyIds(
const ViewportPropertyIds& ids) {
- DCHECK(!viewport_layers_.inner_viewport_scroll);
DCHECK(IsUsingLayerLists());
viewport_property_ids_ = ids;
+ // Outer viewport properties exist only if inner viewport property exists.
+ DCHECK(ids.inner_scroll != ScrollTree::kInvalidNodeId ||
+ (ids.outer_scroll == ScrollTree::kInvalidNodeId &&
+ ids.outer_clip == ClipTree::kInvalidNodeId));
+}
+
+Layer* LayerTreeHost::InnerViewportScrollLayerForTesting() const {
+ auto* scroll_node =
+ property_trees()->scroll_tree.Node(viewport_property_ids_.inner_scroll);
+ return scroll_node ? LayerByElementId(scroll_node->element_id) : nullptr;
+}
+
+Layer* LayerTreeHost::OuterViewportScrollLayerForTesting() const {
+ auto* scroll_node =
+ property_trees()->scroll_tree.Node(viewport_property_ids_.outer_scroll);
+ return scroll_node ? LayerByElementId(scroll_node->element_id) : nullptr;
}
void LayerTreeHost::RegisterSelection(const LayerSelection& selection) {
@@ -1172,8 +1174,8 @@ void LayerTreeHost::SetEventListenerProperties(
old_properties == EventListenerProperties::kBlockingAndPassive;
if (old_property_is_blocking != new_property_is_blocking) {
- LayerTreeHostCommon::CallFunctionForEveryLayer(
- this, [](Layer* layer) { layer->SetNeedsPushProperties(); });
+ for (auto* layer : *this)
+ layer->SetNeedsPushProperties();
}
}
@@ -1321,8 +1323,8 @@ void LayerTreeHost::SetRasterColorSpace(
return;
raster_color_space_id_ = gfx::ColorSpace::GetNextId();
raster_color_space_ = raster_color_space;
- LayerTreeHostCommon::CallFunctionForEveryLayer(
- this, [](Layer* layer) { layer->SetNeedsDisplay(); });
+ for (auto* layer : *this)
+ layer->SetNeedsDisplay();
}
void LayerTreeHost::SetExternalPageScaleFactor(
@@ -1396,11 +1398,8 @@ void LayerTreeHost::SetLocalSurfaceIdAllocationFromParent(
}
void LayerTreeHost::RequestNewLocalSurfaceId() {
- // If surface synchronization is enabled, then we can still request a new
- // viz::LocalSurfaceId but that request will be deferred until we have a valid
- // viz::LocalSurfaceId from the parent.
- DCHECK(settings_.enable_surface_synchronization ||
- local_surface_id_allocation_from_parent_.IsValid());
+ // We can still request a new viz::LocalSurfaceId but that request will be
+ // deferred until we have a valid viz::LocalSurfaceId from the parent.
if (new_local_surface_id_request_)
return;
new_local_surface_id_request_ = true;
@@ -1554,32 +1553,7 @@ void LayerTreeHost::PushLayerTreePropertiesTo(LayerTreeImpl* tree_impl) {
EventListenerClass::kTouchEndOrCancel,
event_listener_properties(EventListenerClass::kTouchEndOrCancel));
- if (viewport_layers_.inner_viewport_scroll) {
- LayerTreeImpl::ViewportLayerIds ids;
- if (viewport_layers_.overscroll_elasticity_element_id) {
- ids.overscroll_elasticity_element_id =
- viewport_layers_.overscroll_elasticity_element_id;
- }
- if (viewport_layers_.page_scale) {
- ids.page_scale = viewport_layers_.page_scale->id();
- }
- if (viewport_layers_.inner_viewport_container) {
- ids.inner_viewport_container =
- viewport_layers_.inner_viewport_container->id();
- }
- if (viewport_layers_.outer_viewport_container) {
- ids.outer_viewport_container =
- viewport_layers_.outer_viewport_container->id();
- }
- ids.inner_viewport_scroll = viewport_layers_.inner_viewport_scroll->id();
- if (viewport_layers_.outer_viewport_scroll)
- ids.outer_viewport_scroll = viewport_layers_.outer_viewport_scroll->id();
- tree_impl->SetViewportLayersFromIds(ids);
- } else {
- tree_impl->ClearViewportLayers();
- }
-
- tree_impl->set_viewport_property_ids(viewport_property_ids_);
+ tree_impl->SetViewportPropertyIds(viewport_property_ids_);
tree_impl->RegisterSelection(selection_);
@@ -1641,7 +1615,6 @@ void LayerTreeHost::PushSurfaceRangesTo(LayerTreeImpl* tree_impl) {
void LayerTreeHost::PushLayerTreeHostPropertiesTo(
LayerTreeHostImpl* host_impl) {
- host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_);
host_impl->SetContentHasSlowPaths(content_has_slow_paths_);
host_impl->SetContentHasNonAAPaint(content_has_non_aa_paint_);
host_impl->set_external_pinch_gesture_active(
@@ -1684,21 +1657,13 @@ void LayerTreeHost::UpdateActiveElements() {
mutator_host_->UpdateRegisteredElementIds(ElementListType::ACTIVE);
}
-static void SetElementIdForTesting(Layer* layer) {
- layer->SetElementId(LayerIdToElementIdForTesting(layer->id()));
-}
-
void LayerTreeHost::SetElementIdsForTesting() {
- LayerTreeHostCommon::CallFunctionForEveryLayer(this, SetElementIdForTesting);
+ for (auto* layer : *this)
+ layer->SetElementId(LayerIdToElementIdForTesting(layer->id()));
}
void LayerTreeHost::BuildPropertyTreesForTesting() {
- gfx::Transform identity_transform;
- PropertyTreeBuilder::BuildPropertyTrees(
- root_layer(), page_scale_layer(), inner_viewport_scroll_layer(),
- outer_viewport_scroll_layer(), overscroll_elasticity_element_id(),
- elastic_overscroll(), page_scale_factor(), device_scale_factor(),
- device_viewport_rect(), identity_transform, property_trees());
+ PropertyTreeBuilder::BuildPropertyTrees(this);
}
bool LayerTreeHost::IsElementInPropertyTrees(ElementId element_id,
@@ -1846,20 +1811,20 @@ void LayerTreeHost::QueueImageDecode(const PaintImage& image,
SetNeedsCommit();
}
-LayerListIterator<Layer> LayerTreeHost::begin() const {
- return LayerListIterator<Layer>(root_layer_.get());
+LayerListIterator LayerTreeHost::begin() const {
+ return LayerListIterator(root_layer_.get());
}
-LayerListIterator<Layer> LayerTreeHost::end() const {
- return LayerListIterator<Layer>(nullptr);
+LayerListIterator LayerTreeHost::end() const {
+ return LayerListIterator(nullptr);
}
-LayerListReverseIterator<Layer> LayerTreeHost::rbegin() {
- return LayerListReverseIterator<Layer>(root_layer_.get());
+LayerListReverseIterator LayerTreeHost::rbegin() {
+ return LayerListReverseIterator(root_layer_.get());
}
-LayerListReverseIterator<Layer> LayerTreeHost::rend() {
- return LayerListReverseIterator<Layer>(nullptr);
+LayerListReverseIterator LayerTreeHost::rend() {
+ return LayerListReverseIterator(nullptr);
}
void LayerTreeHost::SetPropertyTreesForTesting(