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_common.h" | 5 #include "cc/trees/layer_tree_host_common.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 float device_scale_factor, | 73 float device_scale_factor, |
74 float page_scale_factor, | 74 float page_scale_factor, |
75 const LayerImpl* page_scale_layer, | 75 const LayerImpl* page_scale_layer, |
76 const LayerImpl* inner_viewport_scroll_layer, | 76 const LayerImpl* inner_viewport_scroll_layer, |
77 const LayerImpl* outer_viewport_scroll_layer, | 77 const LayerImpl* outer_viewport_scroll_layer, |
78 const gfx::Vector2dF& elastic_overscroll, | 78 const gfx::Vector2dF& elastic_overscroll, |
79 const LayerImpl* elastic_overscroll_application_layer, | 79 const LayerImpl* elastic_overscroll_application_layer, |
80 int max_texture_size, | 80 int max_texture_size, |
81 bool can_render_to_separate_surface, | 81 bool can_render_to_separate_surface, |
82 bool can_adjust_raster_scales, | 82 bool can_adjust_raster_scales, |
83 bool verify_clip_tree_calculations, | 83 bool use_layer_lists, |
84 bool verify_visible_rect_calculations, | |
85 LayerImplList* render_surface_layer_list, | 84 LayerImplList* render_surface_layer_list, |
86 PropertyTrees* property_trees) | 85 PropertyTrees* property_trees) |
87 : root_layer(root_layer), | 86 : root_layer(root_layer), |
88 device_viewport_size(device_viewport_size), | 87 device_viewport_size(device_viewport_size), |
89 device_transform(device_transform), | 88 device_transform(device_transform), |
90 device_scale_factor(device_scale_factor), | 89 device_scale_factor(device_scale_factor), |
91 page_scale_factor(page_scale_factor), | 90 page_scale_factor(page_scale_factor), |
92 page_scale_layer(page_scale_layer), | 91 page_scale_layer(page_scale_layer), |
93 inner_viewport_scroll_layer(inner_viewport_scroll_layer), | 92 inner_viewport_scroll_layer(inner_viewport_scroll_layer), |
94 outer_viewport_scroll_layer(outer_viewport_scroll_layer), | 93 outer_viewport_scroll_layer(outer_viewport_scroll_layer), |
95 elastic_overscroll(elastic_overscroll), | 94 elastic_overscroll(elastic_overscroll), |
96 elastic_overscroll_application_layer( | 95 elastic_overscroll_application_layer( |
97 elastic_overscroll_application_layer), | 96 elastic_overscroll_application_layer), |
98 max_texture_size(max_texture_size), | 97 max_texture_size(max_texture_size), |
99 can_render_to_separate_surface(can_render_to_separate_surface), | 98 can_render_to_separate_surface(can_render_to_separate_surface), |
100 can_adjust_raster_scales(can_adjust_raster_scales), | 99 can_adjust_raster_scales(can_adjust_raster_scales), |
101 verify_clip_tree_calculations(verify_clip_tree_calculations), | 100 use_layer_lists(use_layer_lists), |
102 verify_visible_rect_calculations(verify_visible_rect_calculations), | |
103 render_surface_layer_list(render_surface_layer_list), | 101 render_surface_layer_list(render_surface_layer_list), |
104 property_trees(property_trees) {} | 102 property_trees(property_trees) {} |
105 | 103 |
106 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting:: | 104 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting:: |
107 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer, | 105 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer, |
108 const gfx::Size& device_viewport_size, | 106 const gfx::Size& device_viewport_size, |
109 const gfx::Transform& device_transform, | 107 const gfx::Transform& device_transform, |
110 float device_scale_factor, | 108 float device_scale_factor, |
111 LayerImplList* render_surface_layer_list) | 109 LayerImplList* render_surface_layer_list) |
112 : CalcDrawPropsImplInputs(root_layer, | 110 : CalcDrawPropsImplInputs(root_layer, |
113 device_viewport_size, | 111 device_viewport_size, |
114 device_transform, | 112 device_transform, |
115 device_scale_factor, | 113 device_scale_factor, |
116 1.f, | 114 1.f, |
117 NULL, | 115 NULL, |
118 NULL, | 116 NULL, |
119 NULL, | 117 NULL, |
120 gfx::Vector2dF(), | 118 gfx::Vector2dF(), |
121 NULL, | 119 NULL, |
122 std::numeric_limits<int>::max() / 2, | 120 std::numeric_limits<int>::max() / 2, |
123 true, | 121 true, |
124 false, | 122 false, |
125 true, | 123 false, |
126 true, | |
127 render_surface_layer_list, | 124 render_surface_layer_list, |
128 GetPropertyTrees(root_layer)) { | 125 GetPropertyTrees(root_layer)) { |
129 DCHECK(root_layer); | 126 DCHECK(root_layer); |
130 DCHECK(render_surface_layer_list); | 127 DCHECK(render_surface_layer_list); |
131 } | 128 } |
132 | 129 |
133 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting:: | 130 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting:: |
134 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer, | 131 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer, |
135 const gfx::Size& device_viewport_size, | 132 const gfx::Size& device_viewport_size, |
136 const gfx::Transform& device_transform, | 133 const gfx::Transform& device_transform, |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 | 276 |
280 enum PropertyTreeOption { | 277 enum PropertyTreeOption { |
281 BUILD_PROPERTY_TREES_IF_NEEDED, | 278 BUILD_PROPERTY_TREES_IF_NEEDED, |
282 DONT_BUILD_PROPERTY_TREES | 279 DONT_BUILD_PROPERTY_TREES |
283 }; | 280 }; |
284 | 281 |
285 static void ComputeInitialRenderSurfaceLayerList( | 282 static void ComputeInitialRenderSurfaceLayerList( |
286 LayerTreeImpl* layer_tree_impl, | 283 LayerTreeImpl* layer_tree_impl, |
287 PropertyTrees* property_trees, | 284 PropertyTrees* property_trees, |
288 LayerImplList* render_surface_layer_list, | 285 LayerImplList* render_surface_layer_list, |
289 bool can_render_to_separate_surface) { | 286 bool can_render_to_separate_surface, |
| 287 bool use_layer_lists) { |
290 // Add all non-skipped surfaces to the initial render surface layer list. Add | 288 // Add all non-skipped surfaces to the initial render surface layer list. Add |
291 // all non-skipped layers to the layer list of their target surface, and | 289 // all non-skipped layers to the layer list of their target surface, and |
292 // add their content rect to their target surface's accumulated content rect. | 290 // add their content rect to their target surface's accumulated content rect. |
293 for (LayerImpl* layer : *layer_tree_impl) { | 291 for (LayerImpl* layer : *layer_tree_impl) { |
294 RenderSurfaceImpl* render_surface = layer->GetRenderSurface(); | 292 RenderSurfaceImpl* render_surface = layer->GetRenderSurface(); |
295 if (render_surface) { | 293 if (render_surface) { |
296 render_surface->ClearLayerLists(); | 294 render_surface->ClearLayerLists(); |
297 ClearMaskLayersAreDrawnRenderSurfaceLayerListMembers(render_surface); | 295 ClearMaskLayersAreDrawnRenderSurfaceLayerListMembers(render_surface); |
298 } | 296 } |
299 layer->set_is_drawn_render_surface_layer_list_member(false); | 297 layer->set_is_drawn_render_surface_layer_list_member(false); |
(...skipping 19 matching lines...) Expand all Loading... |
319 render_surface->set_contributes_to_drawn_surface(false); | 317 render_surface->set_contributes_to_drawn_surface(false); |
320 } else { | 318 } else { |
321 render_surface->render_target()->layer_list().push_back(layer); | 319 render_surface->render_target()->layer_list().push_back(layer); |
322 bool contributes_to_drawn_surface = | 320 bool contributes_to_drawn_surface = |
323 property_trees->effect_tree.ContributesToDrawnSurface( | 321 property_trees->effect_tree.ContributesToDrawnSurface( |
324 layer->effect_tree_index()); | 322 layer->effect_tree_index()); |
325 render_surface->set_contributes_to_drawn_surface( | 323 render_surface->set_contributes_to_drawn_surface( |
326 contributes_to_drawn_surface); | 324 contributes_to_drawn_surface); |
327 } | 325 } |
328 | 326 |
329 draw_property_utils::ComputeSurfaceDrawProperties(property_trees, | 327 draw_property_utils::ComputeSurfaceDrawProperties( |
330 render_surface); | 328 property_trees, render_surface, use_layer_lists); |
331 | 329 |
332 // Ignore occlusion from outside the surface when surface contents need to | 330 // Ignore occlusion from outside the surface when surface contents need to |
333 // be fully drawn. Layers with copy-request need to be complete. We could | 331 // be fully drawn. Layers with copy-request need to be complete. We could |
334 // be smarter about layers with filters that move pixels and exclude | 332 // be smarter about layers with filters that move pixels and exclude |
335 // regions where both layers and the filters are occluded, but this seems | 333 // regions where both layers and the filters are occluded, but this seems |
336 // like overkill. | 334 // like overkill. |
337 // TODO(senorblanco): make this smarter for the SkImageFilter case (check | 335 // TODO(senorblanco): make this smarter for the SkImageFilter case (check |
338 // for pixel-moving filters) | 336 // for pixel-moving filters) |
339 const FilterOperations& filters = render_surface->Filters(); | 337 const FilterOperations& filters = render_surface->Filters(); |
340 bool is_occlusion_immune = render_surface->HasCopyRequest() || | 338 bool is_occlusion_immune = render_surface->HasCopyRequest() || |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 SetMaskLayersAreDrawnRenderSurfaceLayerListMembers(surface, property_trees); | 428 SetMaskLayersAreDrawnRenderSurfaceLayerListMembers(surface, property_trees); |
431 final_surface_list->push_back(layer); | 429 final_surface_list->push_back(layer); |
432 } | 430 } |
433 } | 431 } |
434 | 432 |
435 static void CalculateRenderSurfaceLayerList( | 433 static void CalculateRenderSurfaceLayerList( |
436 LayerTreeImpl* layer_tree_impl, | 434 LayerTreeImpl* layer_tree_impl, |
437 PropertyTrees* property_trees, | 435 PropertyTrees* property_trees, |
438 LayerImplList* render_surface_layer_list, | 436 LayerImplList* render_surface_layer_list, |
439 const bool can_render_to_separate_surface, | 437 const bool can_render_to_separate_surface, |
| 438 const bool use_layer_lists, |
440 const int max_texture_size) { | 439 const int max_texture_size) { |
441 // This calculates top level Render Surface Layer List, and Layer List for all | 440 // This calculates top level Render Surface Layer List, and Layer List for all |
442 // Render Surfaces. | 441 // Render Surfaces. |
443 // |render_surface_layer_list| is the top level RenderSurfaceLayerList. | 442 // |render_surface_layer_list| is the top level RenderSurfaceLayerList. |
444 | 443 |
445 LayerImplList initial_render_surface_list; | 444 LayerImplList initial_render_surface_list; |
446 | 445 |
447 // First compute an RSLL that might include surfaces that later turn out to | 446 // First compute an RSLL that might include surfaces that later turn out to |
448 // have an empty content rect. After surface content rects are computed, | 447 // have an empty content rect. After surface content rects are computed, |
449 // produce a final RSLL that omits empty surfaces. | 448 // produce a final RSLL that omits empty surfaces. |
450 ComputeInitialRenderSurfaceLayerList(layer_tree_impl, property_trees, | 449 ComputeInitialRenderSurfaceLayerList( |
451 &initial_render_surface_list, | 450 layer_tree_impl, property_trees, &initial_render_surface_list, |
452 can_render_to_separate_surface); | 451 can_render_to_separate_surface, use_layer_lists); |
453 ComputeSurfaceContentRects(layer_tree_impl, property_trees, | 452 ComputeSurfaceContentRects(layer_tree_impl, property_trees, |
454 &initial_render_surface_list, max_texture_size); | 453 &initial_render_surface_list, max_texture_size); |
455 ComputeListOfNonEmptySurfaces(layer_tree_impl, property_trees, | 454 ComputeListOfNonEmptySurfaces(layer_tree_impl, property_trees, |
456 &initial_render_surface_list, | 455 &initial_render_surface_list, |
457 render_surface_layer_list); | 456 render_surface_layer_list); |
458 } | 457 } |
459 | 458 |
460 void CalculateDrawPropertiesInternal( | 459 void CalculateDrawPropertiesInternal( |
461 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs, | 460 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs, |
462 PropertyTreeOption property_tree_option) { | 461 PropertyTreeOption property_tree_option) { |
463 inputs->render_surface_layer_list->clear(); | 462 inputs->render_surface_layer_list->clear(); |
464 | 463 |
465 const bool should_measure_property_tree_performance = | 464 const bool should_measure_property_tree_performance = |
466 property_tree_option == BUILD_PROPERTY_TREES_IF_NEEDED; | 465 property_tree_option == BUILD_PROPERTY_TREES_IF_NEEDED; |
467 | 466 |
468 LayerImplList visible_layer_list; | 467 LayerImplList visible_layer_list; |
469 switch (property_tree_option) { | 468 switch (property_tree_option) { |
470 case BUILD_PROPERTY_TREES_IF_NEEDED: { | 469 case BUILD_PROPERTY_TREES_IF_NEEDED: { |
471 // The translation from layer to property trees is an intermediate | 470 // The translation from layer to property trees is an intermediate |
472 // state. We will eventually get these data passed directly to the | 471 // state. We will eventually get these data passed directly to the |
473 // compositor. | 472 // compositor. |
474 if (should_measure_property_tree_performance) { | 473 if (should_measure_property_tree_performance) { |
475 TRACE_EVENT_BEGIN0( | 474 TRACE_EVENT_BEGIN0( |
476 TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 475 TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), |
477 "LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees"); | 476 "LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees"); |
478 } | 477 } |
479 | 478 |
480 draw_property_utils::BuildPropertyTreesAndComputeVisibleRects( | 479 PropertyTreeBuilder::BuildPropertyTrees( |
481 inputs->root_layer, inputs->page_scale_layer, | 480 inputs->root_layer, inputs->page_scale_layer, |
482 inputs->inner_viewport_scroll_layer, | 481 inputs->inner_viewport_scroll_layer, |
483 inputs->outer_viewport_scroll_layer, | 482 inputs->outer_viewport_scroll_layer, |
484 inputs->elastic_overscroll_application_layer, | 483 inputs->elastic_overscroll_application_layer, |
485 inputs->elastic_overscroll, inputs->page_scale_factor, | 484 inputs->elastic_overscroll, inputs->page_scale_factor, |
486 inputs->device_scale_factor, gfx::Rect(inputs->device_viewport_size), | 485 inputs->device_scale_factor, gfx::Rect(inputs->device_viewport_size), |
487 inputs->device_transform, inputs->can_render_to_separate_surface, | 486 inputs->device_transform, inputs->property_trees); |
488 inputs->property_trees, &visible_layer_list); | 487 draw_property_utils::UpdatePropertyTreesAndRenderSurfaces( |
| 488 inputs->root_layer, inputs->property_trees, |
| 489 inputs->can_render_to_separate_surface); |
489 | 490 |
490 // Property trees are normally constructed on the main thread and | 491 // Property trees are normally constructed on the main thread and |
491 // passed to compositor thread. Source to parent updates on them are not | 492 // passed to compositor thread. Source to parent updates on them are not |
492 // allowed in the compositor thread. Some tests build them on the | 493 // allowed in the compositor thread. Some tests build them on the |
493 // compositor thread, so we need to explicitly disallow source to parent | 494 // compositor thread, so we need to explicitly disallow source to parent |
494 // updates when they are built on compositor thread. | 495 // updates when they are built on compositor thread. |
495 inputs->property_trees->transform_tree | 496 inputs->property_trees->transform_tree |
496 .set_source_to_parent_updates_allowed(false); | 497 .set_source_to_parent_updates_allowed(false); |
497 if (should_measure_property_tree_performance) { | 498 if (should_measure_property_tree_performance) { |
498 TRACE_EVENT_END0( | 499 TRACE_EVENT_END0( |
(...skipping 23 matching lines...) Expand all Loading... |
522 PropertyTrees* property_trees = inputs->property_trees; | 523 PropertyTrees* property_trees = inputs->property_trees; |
523 property_trees->clip_tree.SetViewportClip( | 524 property_trees->clip_tree.SetViewportClip( |
524 gfx::RectF(gfx::SizeF(inputs->device_viewport_size))); | 525 gfx::RectF(gfx::SizeF(inputs->device_viewport_size))); |
525 float page_scale_factor_for_root = | 526 float page_scale_factor_for_root = |
526 inputs->page_scale_layer == inputs->root_layer | 527 inputs->page_scale_layer == inputs->root_layer |
527 ? inputs->page_scale_factor | 528 ? inputs->page_scale_factor |
528 : 1.f; | 529 : 1.f; |
529 property_trees->transform_tree.SetRootTransformsAndScales( | 530 property_trees->transform_tree.SetRootTransformsAndScales( |
530 inputs->device_scale_factor, page_scale_factor_for_root, | 531 inputs->device_scale_factor, page_scale_factor_for_root, |
531 inputs->device_transform, inputs->root_layer->position()); | 532 inputs->device_transform, inputs->root_layer->position()); |
532 draw_property_utils::ComputeVisibleRects( | 533 draw_property_utils::UpdatePropertyTreesAndRenderSurfaces( |
533 inputs->root_layer, inputs->property_trees, | 534 inputs->root_layer, inputs->property_trees, |
534 inputs->can_render_to_separate_surface, &visible_layer_list); | 535 inputs->can_render_to_separate_surface); |
535 break; | 536 break; |
536 } | 537 } |
537 } | 538 } |
538 | 539 |
539 if (should_measure_property_tree_performance) { | 540 if (should_measure_property_tree_performance) { |
540 TRACE_EVENT_BEGIN0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 541 TRACE_EVENT_BEGIN0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), |
541 "LayerTreeHostCommon::CalculateDrawProperties"); | 542 "LayerTreeHostCommon::CalculateDrawProperties"); |
542 } | 543 } |
543 | 544 |
| 545 draw_property_utils::FindLayersThatNeedUpdates( |
| 546 inputs->root_layer->layer_tree_impl(), inputs->property_trees, |
| 547 &visible_layer_list); |
544 DCHECK(inputs->can_render_to_separate_surface == | 548 DCHECK(inputs->can_render_to_separate_surface == |
545 inputs->property_trees->non_root_surfaces_enabled); | 549 inputs->property_trees->non_root_surfaces_enabled); |
546 for (LayerImpl* layer : visible_layer_list) { | 550 draw_property_utils::ComputeDrawPropertiesOfVisibleLayers( |
547 draw_property_utils::ComputeLayerDrawProperties(layer, | 551 &visible_layer_list, inputs->property_trees); |
548 inputs->property_trees); | |
549 } | |
550 | 552 |
551 CalculateRenderSurfaceLayerList( | 553 CalculateRenderSurfaceLayerList( |
552 inputs->root_layer->layer_tree_impl(), inputs->property_trees, | 554 inputs->root_layer->layer_tree_impl(), inputs->property_trees, |
553 inputs->render_surface_layer_list, inputs->can_render_to_separate_surface, | 555 inputs->render_surface_layer_list, inputs->can_render_to_separate_surface, |
554 inputs->max_texture_size); | 556 inputs->use_layer_lists, inputs->max_texture_size); |
555 | |
556 if (inputs->verify_clip_tree_calculations) | |
557 draw_property_utils::VerifyClipTreeCalculations(visible_layer_list, | |
558 inputs->property_trees); | |
559 if (inputs->verify_visible_rect_calculations) | |
560 draw_property_utils::VerifyVisibleRectsCalculations(visible_layer_list, | |
561 inputs->property_trees); | |
562 | 557 |
563 if (should_measure_property_tree_performance) { | 558 if (should_measure_property_tree_performance) { |
564 TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 559 TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), |
565 "LayerTreeHostCommon::CalculateDrawProperties"); | 560 "LayerTreeHostCommon::CalculateDrawProperties"); |
566 } | 561 } |
567 | 562 |
568 // A root layer render_surface should always exist after | 563 // A root layer render_surface should always exist after |
569 // CalculateDrawProperties. | 564 // CalculateDrawProperties. |
570 DCHECK(inputs->root_layer->GetRenderSurface()); | 565 DCHECK(inputs->root_layer->GetRenderSurface()); |
571 } | 566 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 | 644 |
650 PropertyTrees* GetPropertyTrees(Layer* layer) { | 645 PropertyTrees* GetPropertyTrees(Layer* layer) { |
651 return layer->layer_tree_host()->property_trees(); | 646 return layer->layer_tree_host()->property_trees(); |
652 } | 647 } |
653 | 648 |
654 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { | 649 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { |
655 return layer->layer_tree_impl()->property_trees(); | 650 return layer->layer_tree_impl()->property_trees(); |
656 } | 651 } |
657 | 652 |
658 } // namespace cc | 653 } // namespace cc |
OLD | NEW |