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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 const gfx::Size& device_viewport_size, | 71 const gfx::Size& device_viewport_size, |
72 const gfx::Transform& device_transform, | 72 const gfx::Transform& device_transform, |
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, | |
82 bool can_adjust_raster_scales, | 81 bool can_adjust_raster_scales, |
83 bool verify_clip_tree_calculations, | 82 bool verify_clip_tree_calculations, |
84 bool verify_visible_rect_calculations, | 83 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), | |
100 can_adjust_raster_scales(can_adjust_raster_scales), | 98 can_adjust_raster_scales(can_adjust_raster_scales), |
101 verify_clip_tree_calculations(verify_clip_tree_calculations), | 99 verify_clip_tree_calculations(verify_clip_tree_calculations), |
102 verify_visible_rect_calculations(verify_visible_rect_calculations), | 100 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, | |
124 false, | 121 false, |
125 true, | 122 true, |
126 true, | 123 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:: |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 } | 275 } |
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) { | |
290 // Add all non-skipped surfaces to the initial render surface layer list. Add | 286 // 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 | 287 // 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. | 288 // add their content rect to their target surface's accumulated content rect. |
293 for (LayerImpl* layer : *layer_tree_impl) { | 289 for (LayerImpl* layer : *layer_tree_impl) { |
294 if (layer->render_surface()) { | 290 if (layer->render_surface()) { |
295 layer->ClearRenderSurfaceLayerList(); | 291 layer->ClearRenderSurfaceLayerList(); |
296 ClearMaskLayersAreDrawnRenderSurfaceLayerListMembers( | 292 ClearMaskLayersAreDrawnRenderSurfaceLayerListMembers( |
297 layer->render_surface()); | 293 layer->render_surface()); |
298 } | 294 } |
299 layer->set_is_drawn_render_surface_layer_list_member(false); | 295 layer->set_is_drawn_render_surface_layer_list_member(false); |
300 | 296 |
301 bool is_root = layer_tree_impl->IsRootLayer(layer); | 297 bool is_root = layer_tree_impl->IsRootLayer(layer); |
302 bool skip_layer = !is_root && draw_property_utils::LayerShouldBeSkipped( | 298 bool skip_layer = !is_root && draw_property_utils::LayerShouldBeSkipped( |
303 layer, property_trees->transform_tree, | 299 layer, property_trees->transform_tree, |
304 property_trees->effect_tree); | 300 property_trees->effect_tree); |
305 if (skip_layer) | 301 if (skip_layer) |
306 continue; | 302 continue; |
307 | 303 |
308 bool render_to_separate_surface = | 304 bool render_to_separate_surface = is_root || layer->render_surface(); |
309 is_root || (can_render_to_separate_surface && layer->render_surface()); | |
310 | |
311 if (render_to_separate_surface) { | 305 if (render_to_separate_surface) { |
312 DCHECK(layer->render_surface()); | 306 DCHECK(layer->render_surface()); |
313 DCHECK(layer->render_target() == layer->render_surface()); | 307 DCHECK(layer->render_target() == layer->render_surface()); |
314 RenderSurfaceImpl* surface = layer->render_surface(); | 308 RenderSurfaceImpl* surface = layer->render_surface(); |
315 surface->ClearAccumulatedContentRect(); | 309 surface->ClearAccumulatedContentRect(); |
316 render_surface_layer_list->push_back(layer); | 310 render_surface_layer_list->push_back(layer); |
317 if (is_root) { | 311 if (is_root) { |
318 // The root surface does not contribute to any other surface, it has no | 312 // The root surface does not contribute to any other surface, it has no |
319 // target. | 313 // target. |
320 layer->render_surface()->set_contributes_to_drawn_surface(false); | 314 layer->render_surface()->set_contributes_to_drawn_surface(false); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 } | 421 } |
428 SetMaskLayersAreDrawnRenderSurfaceLayerListMembers(surface, property_trees); | 422 SetMaskLayersAreDrawnRenderSurfaceLayerListMembers(surface, property_trees); |
429 final_surface_list->push_back(layer); | 423 final_surface_list->push_back(layer); |
430 } | 424 } |
431 } | 425 } |
432 | 426 |
433 static void CalculateRenderSurfaceLayerList( | 427 static void CalculateRenderSurfaceLayerList( |
434 LayerTreeImpl* layer_tree_impl, | 428 LayerTreeImpl* layer_tree_impl, |
435 PropertyTrees* property_trees, | 429 PropertyTrees* property_trees, |
436 LayerImplList* render_surface_layer_list, | 430 LayerImplList* render_surface_layer_list, |
437 const bool can_render_to_separate_surface, | |
438 const int max_texture_size) { | 431 const int max_texture_size) { |
439 // This calculates top level Render Surface Layer List, and Layer List for all | 432 // This calculates top level Render Surface Layer List, and Layer List for all |
440 // Render Surfaces. | 433 // Render Surfaces. |
441 // |render_surface_layer_list| is the top level RenderSurfaceLayerList. | 434 // |render_surface_layer_list| is the top level RenderSurfaceLayerList. |
442 | 435 |
443 LayerImplList initial_render_surface_list; | 436 LayerImplList initial_render_surface_list; |
444 | 437 |
445 // First compute an RSLL that might include surfaces that later turn out to | 438 // First compute an RSLL that might include surfaces that later turn out to |
446 // have an empty content rect. After surface content rects are computed, | 439 // have an empty content rect. After surface content rects are computed, |
447 // produce a final RSLL that omits empty surfaces. | 440 // produce a final RSLL that omits empty surfaces. |
448 ComputeInitialRenderSurfaceLayerList(layer_tree_impl, property_trees, | 441 ComputeInitialRenderSurfaceLayerList(layer_tree_impl, property_trees, |
449 &initial_render_surface_list, | 442 &initial_render_surface_list); |
450 can_render_to_separate_surface); | |
451 ComputeSurfaceContentRects(layer_tree_impl, property_trees, | 443 ComputeSurfaceContentRects(layer_tree_impl, property_trees, |
452 &initial_render_surface_list, max_texture_size); | 444 &initial_render_surface_list, max_texture_size); |
453 ComputeListOfNonEmptySurfaces(layer_tree_impl, property_trees, | 445 ComputeListOfNonEmptySurfaces(layer_tree_impl, property_trees, |
454 &initial_render_surface_list, | 446 &initial_render_surface_list, |
455 render_surface_layer_list); | 447 render_surface_layer_list); |
456 } | 448 } |
457 | 449 |
458 void CalculateDrawPropertiesInternal( | 450 void CalculateDrawPropertiesInternal( |
459 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs, | 451 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs, |
460 PropertyTreeOption property_tree_option) { | 452 PropertyTreeOption property_tree_option) { |
(...skipping 14 matching lines...) Expand all Loading... |
475 "LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees"); | 467 "LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees"); |
476 } | 468 } |
477 | 469 |
478 draw_property_utils::BuildPropertyTreesAndComputeVisibleRects( | 470 draw_property_utils::BuildPropertyTreesAndComputeVisibleRects( |
479 inputs->root_layer, inputs->page_scale_layer, | 471 inputs->root_layer, inputs->page_scale_layer, |
480 inputs->inner_viewport_scroll_layer, | 472 inputs->inner_viewport_scroll_layer, |
481 inputs->outer_viewport_scroll_layer, | 473 inputs->outer_viewport_scroll_layer, |
482 inputs->elastic_overscroll_application_layer, | 474 inputs->elastic_overscroll_application_layer, |
483 inputs->elastic_overscroll, inputs->page_scale_factor, | 475 inputs->elastic_overscroll, inputs->page_scale_factor, |
484 inputs->device_scale_factor, gfx::Rect(inputs->device_viewport_size), | 476 inputs->device_scale_factor, gfx::Rect(inputs->device_viewport_size), |
485 inputs->device_transform, inputs->can_render_to_separate_surface, | 477 inputs->device_transform, inputs->property_trees, |
486 inputs->property_trees, &visible_layer_list); | 478 &visible_layer_list); |
487 | 479 |
488 // Property trees are normally constructed on the main thread and | 480 // Property trees are normally constructed on the main thread and |
489 // passed to compositor thread. Source to parent updates on them are not | 481 // passed to compositor thread. Source to parent updates on them are not |
490 // allowed in the compositor thread. Some tests build them on the | 482 // allowed in the compositor thread. Some tests build them on the |
491 // compositor thread, so we need to explicitly disallow source to parent | 483 // compositor thread, so we need to explicitly disallow source to parent |
492 // updates when they are built on compositor thread. | 484 // updates when they are built on compositor thread. |
493 inputs->property_trees->transform_tree | 485 inputs->property_trees->transform_tree |
494 .set_source_to_parent_updates_allowed(false); | 486 .set_source_to_parent_updates_allowed(false); |
495 if (should_measure_property_tree_performance) { | 487 if (should_measure_property_tree_performance) { |
496 TRACE_EVENT_END0( | 488 TRACE_EVENT_END0( |
(...skipping 24 matching lines...) Expand all Loading... |
521 property_trees->clip_tree.SetViewportClip( | 513 property_trees->clip_tree.SetViewportClip( |
522 gfx::RectF(gfx::SizeF(inputs->device_viewport_size))); | 514 gfx::RectF(gfx::SizeF(inputs->device_viewport_size))); |
523 float page_scale_factor_for_root = | 515 float page_scale_factor_for_root = |
524 inputs->page_scale_layer == inputs->root_layer | 516 inputs->page_scale_layer == inputs->root_layer |
525 ? inputs->page_scale_factor | 517 ? inputs->page_scale_factor |
526 : 1.f; | 518 : 1.f; |
527 property_trees->transform_tree.SetRootTransformsAndScales( | 519 property_trees->transform_tree.SetRootTransformsAndScales( |
528 inputs->device_scale_factor, page_scale_factor_for_root, | 520 inputs->device_scale_factor, page_scale_factor_for_root, |
529 inputs->device_transform, inputs->root_layer->position()); | 521 inputs->device_transform, inputs->root_layer->position()); |
530 draw_property_utils::ComputeVisibleRects( | 522 draw_property_utils::ComputeVisibleRects( |
531 inputs->root_layer, inputs->property_trees, | 523 inputs->root_layer, inputs->property_trees, &visible_layer_list); |
532 inputs->can_render_to_separate_surface, &visible_layer_list); | |
533 break; | 524 break; |
534 } | 525 } |
535 } | 526 } |
536 | 527 |
537 if (should_measure_property_tree_performance) { | 528 if (should_measure_property_tree_performance) { |
538 TRACE_EVENT_BEGIN0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 529 TRACE_EVENT_BEGIN0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), |
539 "LayerTreeHostCommon::CalculateDrawProperties"); | 530 "LayerTreeHostCommon::CalculateDrawProperties"); |
540 } | 531 } |
541 | 532 |
542 DCHECK(inputs->can_render_to_separate_surface == | |
543 inputs->property_trees->non_root_surfaces_enabled); | |
544 for (LayerImpl* layer : visible_layer_list) { | 533 for (LayerImpl* layer : visible_layer_list) { |
545 draw_property_utils::ComputeLayerDrawProperties(layer, | 534 draw_property_utils::ComputeLayerDrawProperties(layer, |
546 inputs->property_trees); | 535 inputs->property_trees); |
547 } | 536 } |
548 | 537 |
549 CalculateRenderSurfaceLayerList( | 538 CalculateRenderSurfaceLayerList( |
550 inputs->root_layer->layer_tree_impl(), inputs->property_trees, | 539 inputs->root_layer->layer_tree_impl(), inputs->property_trees, |
551 inputs->render_surface_layer_list, inputs->can_render_to_separate_surface, | 540 inputs->render_surface_layer_list, inputs->max_texture_size); |
552 inputs->max_texture_size); | |
553 | 541 |
554 if (inputs->verify_clip_tree_calculations) | 542 if (inputs->verify_clip_tree_calculations) |
555 draw_property_utils::VerifyClipTreeCalculations(visible_layer_list, | 543 draw_property_utils::VerifyClipTreeCalculations(visible_layer_list, |
556 inputs->property_trees); | 544 inputs->property_trees); |
557 if (inputs->verify_visible_rect_calculations) | 545 if (inputs->verify_visible_rect_calculations) |
558 draw_property_utils::VerifyVisibleRectsCalculations(visible_layer_list, | 546 draw_property_utils::VerifyVisibleRectsCalculations(visible_layer_list, |
559 inputs->property_trees); | 547 inputs->property_trees); |
560 | 548 |
561 if (should_measure_property_tree_performance) { | 549 if (should_measure_property_tree_performance) { |
562 TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 550 TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), |
563 "LayerTreeHostCommon::CalculateDrawProperties"); | 551 "LayerTreeHostCommon::CalculateDrawProperties"); |
564 } | 552 } |
565 | 553 |
566 // A root layer render_surface should always exist after | 554 // A root layer render_surface should always exist after |
567 // CalculateDrawProperties. | 555 // CalculateDrawProperties. |
568 DCHECK(inputs->root_layer->render_surface()); | 556 DCHECK(inputs->root_layer->render_surface()); |
569 } | 557 } |
570 | 558 |
571 void LayerTreeHostCommon::CalculateDrawPropertiesForTesting( | 559 void LayerTreeHostCommon::CalculateDrawPropertiesForTesting( |
572 CalcDrawPropsMainInputsForTesting* inputs) { | 560 CalcDrawPropsMainInputsForTesting* inputs) { |
573 LayerList update_layer_list; | 561 LayerList update_layer_list; |
574 bool can_render_to_separate_surface = true; | |
575 PropertyTrees* property_trees = | 562 PropertyTrees* property_trees = |
576 inputs->root_layer->layer_tree_host()->property_trees(); | 563 inputs->root_layer->layer_tree_host()->property_trees(); |
577 Layer* overscroll_elasticity_layer = nullptr; | 564 Layer* overscroll_elasticity_layer = nullptr; |
578 gfx::Vector2dF elastic_overscroll; | 565 gfx::Vector2dF elastic_overscroll; |
579 PropertyTreeBuilder::BuildPropertyTrees( | 566 PropertyTreeBuilder::BuildPropertyTrees( |
580 inputs->root_layer, inputs->page_scale_layer, | 567 inputs->root_layer, inputs->page_scale_layer, |
581 inputs->inner_viewport_scroll_layer, inputs->outer_viewport_scroll_layer, | 568 inputs->inner_viewport_scroll_layer, inputs->outer_viewport_scroll_layer, |
582 overscroll_elasticity_layer, elastic_overscroll, | 569 overscroll_elasticity_layer, elastic_overscroll, |
583 inputs->page_scale_factor, inputs->device_scale_factor, | 570 inputs->page_scale_factor, inputs->device_scale_factor, |
584 gfx::Rect(inputs->device_viewport_size), inputs->device_transform, | 571 gfx::Rect(inputs->device_viewport_size), inputs->device_transform, |
585 property_trees); | 572 property_trees); |
586 draw_property_utils::UpdatePropertyTrees(property_trees, | 573 draw_property_utils::UpdatePropertyTrees(property_trees); |
587 can_render_to_separate_surface); | |
588 draw_property_utils::FindLayersThatNeedUpdates( | 574 draw_property_utils::FindLayersThatNeedUpdates( |
589 inputs->root_layer->layer_tree_host(), property_trees, | 575 inputs->root_layer->layer_tree_host(), property_trees, |
590 &update_layer_list); | 576 &update_layer_list); |
591 } | 577 } |
592 | 578 |
593 void LayerTreeHostCommon::CalculateDrawProperties( | 579 void LayerTreeHostCommon::CalculateDrawProperties( |
594 CalcDrawPropsImplInputs* inputs) { | 580 CalcDrawPropsImplInputs* inputs) { |
595 CalculateDrawPropertiesInternal(inputs, DONT_BUILD_PROPERTY_TREES); | 581 CalculateDrawPropertiesInternal(inputs, DONT_BUILD_PROPERTY_TREES); |
596 | 582 |
597 if (CdpPerfTracingEnabled()) { | 583 if (CdpPerfTracingEnabled()) { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 | 634 |
649 PropertyTrees* GetPropertyTrees(Layer* layer) { | 635 PropertyTrees* GetPropertyTrees(Layer* layer) { |
650 return layer->layer_tree_host()->property_trees(); | 636 return layer->layer_tree_host()->property_trees(); |
651 } | 637 } |
652 | 638 |
653 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { | 639 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { |
654 return layer->layer_tree_impl()->property_trees(); | 640 return layer->layer_tree_impl()->property_trees(); |
655 } | 641 } |
656 | 642 |
657 } // namespace cc | 643 } // namespace cc |
OLD | NEW |