Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 36 #include "cc/debug/rendering_stats_instrumentation.h" | 36 #include "cc/debug/rendering_stats_instrumentation.h" |
| 37 #include "cc/input/layer_selection_bound.h" | 37 #include "cc/input/layer_selection_bound.h" |
| 38 #include "cc/input/page_scale_animation.h" | 38 #include "cc/input/page_scale_animation.h" |
| 39 #include "cc/layers/heads_up_display_layer.h" | 39 #include "cc/layers/heads_up_display_layer.h" |
| 40 #include "cc/layers/heads_up_display_layer_impl.h" | 40 #include "cc/layers/heads_up_display_layer_impl.h" |
| 41 #include "cc/layers/layer.h" | 41 #include "cc/layers/layer.h" |
| 42 #include "cc/layers/layer_iterator.h" | 42 #include "cc/layers/layer_iterator.h" |
| 43 #include "cc/layers/painted_scrollbar_layer.h" | 43 #include "cc/layers/painted_scrollbar_layer.h" |
| 44 #include "cc/resources/ui_resource_manager.h" | 44 #include "cc/resources/ui_resource_manager.h" |
| 45 #include "cc/trees/draw_property_utils.h" | 45 #include "cc/trees/draw_property_utils.h" |
| 46 #include "cc/trees/effect_node.h" | |
| 46 #include "cc/trees/layer_tree_host_client.h" | 47 #include "cc/trees/layer_tree_host_client.h" |
| 47 #include "cc/trees/layer_tree_host_common.h" | 48 #include "cc/trees/layer_tree_host_common.h" |
| 48 #include "cc/trees/layer_tree_host_impl.h" | 49 #include "cc/trees/layer_tree_host_impl.h" |
| 49 #include "cc/trees/layer_tree_impl.h" | 50 #include "cc/trees/layer_tree_impl.h" |
| 50 #include "cc/trees/mutator_host.h" | 51 #include "cc/trees/mutator_host.h" |
| 51 #include "cc/trees/property_tree_builder.h" | 52 #include "cc/trees/property_tree_builder.h" |
| 52 #include "cc/trees/proxy_main.h" | 53 #include "cc/trees/proxy_main.h" |
| 53 #include "cc/trees/single_thread_proxy.h" | 54 #include "cc/trees/single_thread_proxy.h" |
| 54 #include "cc/trees/swap_promise_manager.h" | 55 #include "cc/trees/swap_promise_manager.h" |
| 56 #include "cc/trees/transform_node.h" | |
| 55 #include "cc/trees/tree_synchronizer.h" | 57 #include "cc/trees/tree_synchronizer.h" |
| 56 #include "ui/gfx/geometry/size_conversions.h" | 58 #include "ui/gfx/geometry/size_conversions.h" |
| 57 #include "ui/gfx/geometry/vector2d_conversions.h" | 59 #include "ui/gfx/geometry/vector2d_conversions.h" |
| 58 | 60 |
| 59 namespace { | 61 namespace { |
| 60 static base::StaticAtomicSequenceNumber s_layer_tree_host_sequence_number; | 62 static base::StaticAtomicSequenceNumber s_layer_tree_host_sequence_number; |
| 61 } | 63 } |
| 62 | 64 |
| 63 namespace cc { | 65 namespace cc { |
| 64 | 66 |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 void LayerTreeHost::FinishCommitOnImplThread( | 268 void LayerTreeHost::FinishCommitOnImplThread( |
| 267 LayerTreeHostImpl* host_impl) { | 269 LayerTreeHostImpl* host_impl) { |
| 268 DCHECK(task_runner_provider_->IsImplThread()); | 270 DCHECK(task_runner_provider_->IsImplThread()); |
| 269 | 271 |
| 270 bool is_new_trace; | 272 bool is_new_trace; |
| 271 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); | 273 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); |
| 272 if (is_new_trace && | 274 if (is_new_trace && |
| 273 frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() && | 275 frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() && |
| 274 root_layer()) { | 276 root_layer()) { |
| 275 LayerTreeHostCommon::CallFunctionForEveryLayer( | 277 LayerTreeHostCommon::CallFunctionForEveryLayer( |
| 276 this, [](Layer* layer) { layer->DidBeginTracing(); }); | 278 this, [](Layer* layer) { layer->SetNeedsPushProperties(); }); |
|
danakj
2017/02/24 00:52:38
Can you transplant the comment about why we're doi
| |
| 277 } | 279 } |
| 278 | 280 |
| 279 LayerTreeImpl* sync_tree = host_impl->sync_tree(); | 281 LayerTreeImpl* sync_tree = host_impl->sync_tree(); |
| 280 | 282 |
| 281 if (next_commit_forces_redraw_) { | 283 if (next_commit_forces_redraw_) { |
| 282 sync_tree->ForceRedrawNextActivation(); | 284 sync_tree->ForceRedrawNextActivation(); |
| 283 next_commit_forces_redraw_ = false; | 285 next_commit_forces_redraw_ = false; |
| 284 } | 286 } |
| 285 if (next_commit_forces_recalculate_raster_scales_) { | 287 if (next_commit_forces_recalculate_raster_scales_) { |
| 286 sync_tree->ForceRecalculateRasterScales(); | 288 sync_tree->ForceRecalculateRasterScales(); |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 630 | 632 |
| 631 if (hud_layer_) { | 633 if (hud_layer_) { |
| 632 hud_layer_->PrepareForCalculateDrawProperties(device_viewport_size_, | 634 hud_layer_->PrepareForCalculateDrawProperties(device_viewport_size_, |
| 633 device_scale_factor_); | 635 device_scale_factor_); |
| 634 } | 636 } |
| 635 | 637 |
| 636 gfx::Transform identity_transform; | 638 gfx::Transform identity_transform; |
| 637 LayerList update_layer_list; | 639 LayerList update_layer_list; |
| 638 | 640 |
| 639 { | 641 { |
| 642 base::AutoReset<bool> update_property_trees(&in_update_property_trees_, | |
| 643 true); | |
| 640 TRACE_EVENT0("cc", | 644 TRACE_EVENT0("cc", |
| 641 "LayerTreeHostInProcess::UpdateLayers::BuildPropertyTrees"); | 645 "LayerTreeHostInProcess::UpdateLayers::BuildPropertyTrees"); |
| 642 TRACE_EVENT0( | 646 TRACE_EVENT0( |
| 643 TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 647 TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), |
| 644 "LayerTreeHostInProcessCommon::ComputeVisibleRectsWithPropertyTrees"); | 648 "LayerTreeHostInProcessCommon::ComputeVisibleRectsWithPropertyTrees"); |
| 645 PropertyTreeBuilder::PreCalculateMetaInformation(root_layer); | 649 PropertyTreeBuilder::PreCalculateMetaInformation(root_layer); |
| 646 bool can_render_to_separate_surface = true; | 650 bool can_render_to_separate_surface = true; |
| 647 PropertyTrees* property_trees = &property_trees_; | 651 PropertyTrees* property_trees = &property_trees_; |
| 648 if (!settings_.use_layer_lists) { | 652 if (!settings_.use_layer_lists) { |
| 649 // If use_layer_lists is set, then the property trees should have been | 653 // If use_layer_lists is set, then the property trees should have been |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 667 can_render_to_separate_surface); | 671 can_render_to_separate_surface); |
| 668 draw_property_utils::FindLayersThatNeedUpdates(this, property_trees, | 672 draw_property_utils::FindLayersThatNeedUpdates(this, property_trees, |
| 669 &update_layer_list); | 673 &update_layer_list); |
| 670 } | 674 } |
| 671 | 675 |
| 672 for (const auto& layer : update_layer_list) | 676 for (const auto& layer : update_layer_list) |
| 673 layer->SavePaintProperties(); | 677 layer->SavePaintProperties(); |
| 674 | 678 |
| 675 bool content_is_suitable_for_gpu = true; | 679 bool content_is_suitable_for_gpu = true; |
| 676 bool did_paint_content = | 680 bool did_paint_content = |
| 677 UpdateLayers(update_layer_list, &content_is_suitable_for_gpu); | 681 PaintContent(update_layer_list, &content_is_suitable_for_gpu); |
| 678 | 682 |
| 679 if (content_is_suitable_for_gpu) { | 683 if (content_is_suitable_for_gpu) { |
| 680 ++num_consecutive_frames_suitable_for_gpu_; | 684 ++num_consecutive_frames_suitable_for_gpu_; |
| 681 if (num_consecutive_frames_suitable_for_gpu_ >= | 685 if (num_consecutive_frames_suitable_for_gpu_ >= |
| 682 kNumFramesToConsiderBeforeGpuRasterization) { | 686 kNumFramesToConsiderBeforeGpuRasterization) { |
| 683 content_is_suitable_for_gpu_rasterization_ = true; | 687 content_is_suitable_for_gpu_rasterization_ = true; |
| 684 } | 688 } |
| 685 } else { | 689 } else { |
| 686 num_consecutive_frames_suitable_for_gpu_ = 0; | 690 num_consecutive_frames_suitable_for_gpu_ = 0; |
| 687 content_is_suitable_for_gpu_rasterization_ = false; | 691 content_is_suitable_for_gpu_rasterization_ = false; |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 984 | 988 |
| 985 Layer* LayerTreeHost::LayerById(int id) const { | 989 Layer* LayerTreeHost::LayerById(int id) const { |
| 986 auto iter = layer_id_map_.find(id); | 990 auto iter = layer_id_map_.find(id); |
| 987 return iter != layer_id_map_.end() ? iter->second : nullptr; | 991 return iter != layer_id_map_.end() ? iter->second : nullptr; |
| 988 } | 992 } |
| 989 | 993 |
| 990 size_t LayerTreeHost::NumLayers() const { | 994 size_t LayerTreeHost::NumLayers() const { |
| 991 return layer_id_map_.size(); | 995 return layer_id_map_.size(); |
| 992 } | 996 } |
| 993 | 997 |
| 994 bool LayerTreeHost::UpdateLayers(const LayerList& update_layer_list, | 998 bool LayerTreeHost::PaintContent(const LayerList& update_layer_list, |
| 995 bool* content_is_suitable_for_gpu) { | 999 bool* content_is_suitable_for_gpu) { |
| 996 base::AutoReset<bool> painting(&in_paint_layer_contents_, true); | 1000 base::AutoReset<bool> painting(&in_paint_layer_contents_, true); |
| 997 bool did_paint_content = false; | 1001 bool did_paint_content = false; |
| 998 for (const auto& layer : update_layer_list) { | 1002 for (const auto& layer : update_layer_list) { |
| 999 did_paint_content |= layer->Update(); | 1003 did_paint_content |= layer->Update(); |
| 1000 *content_is_suitable_for_gpu &= layer->IsSuitableForGpuRasterization(); | 1004 *content_is_suitable_for_gpu &= layer->IsSuitableForGpuRasterization(); |
| 1001 } | 1005 } |
| 1002 return did_paint_content; | 1006 return did_paint_content; |
| 1003 } | 1007 } |
| 1004 | 1008 |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1203 Layer* layer = LayerByElementId(element_id); | 1207 Layer* layer = LayerByElementId(element_id); |
| 1204 DCHECK(layer); | 1208 DCHECK(layer); |
| 1205 layer->OnFilterAnimated(filters); | 1209 layer->OnFilterAnimated(filters); |
| 1206 } | 1210 } |
| 1207 | 1211 |
| 1208 void LayerTreeHost::SetElementOpacityMutated(ElementId element_id, | 1212 void LayerTreeHost::SetElementOpacityMutated(ElementId element_id, |
| 1209 ElementListType list_type, | 1213 ElementListType list_type, |
| 1210 float opacity) { | 1214 float opacity) { |
| 1211 Layer* layer = LayerByElementId(element_id); | 1215 Layer* layer = LayerByElementId(element_id); |
| 1212 DCHECK(layer); | 1216 DCHECK(layer); |
| 1217 DCHECK_GE(opacity, 0.f); | |
| 1218 DCHECK_LE(opacity, 1.f); | |
| 1213 layer->OnOpacityAnimated(opacity); | 1219 layer->OnOpacityAnimated(opacity); |
| 1220 | |
| 1221 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, | |
| 1222 layer->id())) { | |
| 1223 DCHECK_EQ(layer->effect_tree_index(), | |
| 1224 property_trees_.layer_id_to_effect_node_index[layer->id()]); | |
| 1225 EffectNode* node = | |
| 1226 property_trees_.effect_tree.Node(layer->effect_tree_index()); | |
| 1227 if (node->opacity == opacity) | |
| 1228 return; | |
| 1229 | |
| 1230 node->opacity = opacity; | |
| 1231 property_trees_.effect_tree.set_needs_update(true); | |
| 1232 } | |
| 1233 | |
| 1234 SetNeedsUpdateLayers(); | |
| 1214 } | 1235 } |
| 1215 | 1236 |
| 1216 void LayerTreeHost::SetElementTransformMutated( | 1237 void LayerTreeHost::SetElementTransformMutated( |
| 1217 ElementId element_id, | 1238 ElementId element_id, |
| 1218 ElementListType list_type, | 1239 ElementListType list_type, |
| 1219 const gfx::Transform& transform) { | 1240 const gfx::Transform& transform) { |
| 1220 Layer* layer = LayerByElementId(element_id); | 1241 Layer* layer = LayerByElementId(element_id); |
| 1221 DCHECK(layer); | 1242 DCHECK(layer); |
| 1222 layer->OnTransformAnimated(transform); | 1243 layer->OnTransformAnimated(transform); |
| 1244 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | |
|
danakj
2017/02/24 00:52:38
nit: maybe im being pedantic but can you make the
| |
| 1245 layer->id())) { | |
| 1246 DCHECK_EQ(layer->transform_tree_index(), | |
| 1247 property_trees_.layer_id_to_transform_node_index[layer->id()]); | |
| 1248 TransformNode* node = | |
| 1249 property_trees_.transform_tree.Node(layer->transform_tree_index()); | |
| 1250 if (node->local == transform) | |
| 1251 return; | |
| 1252 | |
| 1253 node->local = transform; | |
| 1254 node->needs_local_transform_update = true; | |
| 1255 node->has_potential_animation = true; | |
| 1256 property_trees_.transform_tree.set_needs_update(true); | |
| 1257 } | |
| 1258 SetNeedsUpdateLayers(); | |
| 1223 } | 1259 } |
| 1224 | 1260 |
| 1225 void LayerTreeHost::SetElementScrollOffsetMutated( | 1261 void LayerTreeHost::SetElementScrollOffsetMutated( |
| 1226 ElementId element_id, | 1262 ElementId element_id, |
| 1227 ElementListType list_type, | 1263 ElementListType list_type, |
| 1228 const gfx::ScrollOffset& scroll_offset) { | 1264 const gfx::ScrollOffset& scroll_offset) { |
| 1229 Layer* layer = LayerByElementId(element_id); | 1265 Layer* layer = LayerByElementId(element_id); |
| 1230 DCHECK(layer); | 1266 DCHECK(layer); |
| 1231 layer->OnScrollOffsetAnimated(scroll_offset); | 1267 layer->OnScrollOffsetAnimated(scroll_offset); |
| 1232 } | 1268 } |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 1263 LayerListReverseIterator<Layer> LayerTreeHost::rend() { | 1299 LayerListReverseIterator<Layer> LayerTreeHost::rend() { |
| 1264 return LayerListReverseIterator<Layer>(nullptr); | 1300 return LayerListReverseIterator<Layer>(nullptr); |
| 1265 } | 1301 } |
| 1266 | 1302 |
| 1267 void LayerTreeHost::SetNeedsDisplayOnAllLayers() { | 1303 void LayerTreeHost::SetNeedsDisplayOnAllLayers() { |
| 1268 for (auto* layer : *this) | 1304 for (auto* layer : *this) |
| 1269 layer->SetNeedsDisplay(); | 1305 layer->SetNeedsDisplay(); |
| 1270 } | 1306 } |
| 1271 | 1307 |
| 1272 } // namespace cc | 1308 } // namespace cc |
| OLD | NEW |