| 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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 648 | 643 |
| 649 PropertyTrees* GetPropertyTrees(Layer* layer) { | 644 PropertyTrees* GetPropertyTrees(Layer* layer) { |
| 650 return layer->layer_tree_host()->property_trees(); | 645 return layer->layer_tree_host()->property_trees(); |
| 651 } | 646 } |
| 652 | 647 |
| 653 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { | 648 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { |
| 654 return layer->layer_tree_impl()->property_trees(); | 649 return layer->layer_tree_impl()->property_trees(); |
| 655 } | 650 } |
| 656 | 651 |
| 657 } // namespace cc | 652 } // namespace cc |
| OLD | NEW |