Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(361)

Side by Side Diff: cc/trees/layer_tree_host_common.cc

Issue 2655233006: cc : Clean up cc clip tree (Closed)
Patch Set: rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_host_common.h ('k') | cc/trees/layer_tree_host_common_perftest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_common.h ('k') | cc/trees/layer_tree_host_common_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698