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

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

Issue 1588093004: Compute if a layer is drawn without LayerTree hierarchy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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
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 1452 matching lines...) Expand 10 before | Expand all | Expand 10 after
1463 data_from_ancestor.in_subtree_of_page_scale_layer; 1463 data_from_ancestor.in_subtree_of_page_scale_layer;
1464 data_for_children.subtree_can_use_lcd_text = 1464 data_for_children.subtree_can_use_lcd_text =
1465 data_from_ancestor.subtree_can_use_lcd_text; 1465 data_from_ancestor.subtree_can_use_lcd_text;
1466 1466
1467 // Layers that are marked as hidden will hide themselves and their subtree. 1467 // Layers that are marked as hidden will hide themselves and their subtree.
1468 // Exception: Layers with copy requests, whether hidden or not, must be drawn 1468 // Exception: Layers with copy requests, whether hidden or not, must be drawn
1469 // anyway. In this case, we will inform their subtree they are visible to get 1469 // anyway. In this case, we will inform their subtree they are visible to get
1470 // the right results. 1470 // the right results.
1471 const bool layer_is_visible = 1471 const bool layer_is_visible =
1472 data_from_ancestor.subtree_is_visible_from_ancestor && 1472 data_from_ancestor.subtree_is_visible_from_ancestor &&
1473 !layer->hide_layer_and_subtree(); 1473 layer->opacity() != 0;
1474 const bool layer_is_drawn = layer_is_visible || layer->HasCopyRequest(); 1474 const bool layer_is_drawn = layer_is_visible || layer->HasCopyRequest();
1475 1475
1476 // The root layer cannot skip CalcDrawProperties. 1476 // The root layer cannot skip CalcDrawProperties.
1477 if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_drawn)) { 1477 if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_drawn)) {
1478 return; 1478 return;
1479 } 1479 }
1480 1480
1481 // We need to circumvent the normal recursive flow of information for clip 1481 // We need to circumvent the normal recursive flow of information for clip
1482 // children (they don't inherit their direct ancestor's clip information). 1482 // children (they don't inherit their direct ancestor's clip information).
1483 // This is unfortunate, and would be unnecessary if we were to formally 1483 // This is unfortunate, and would be unnecessary if we were to formally
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after
2275 inputs->can_use_lcd_text); 2275 inputs->can_use_lcd_text);
2276 } 2276 }
2277 } 2277 }
2278 2278
2279 enum PropertyTreeOption { 2279 enum PropertyTreeOption {
2280 BUILD_PROPERTY_TREES_IF_NEEDED, 2280 BUILD_PROPERTY_TREES_IF_NEEDED,
2281 DONT_BUILD_PROPERTY_TREES 2281 DONT_BUILD_PROPERTY_TREES
2282 }; 2282 };
2283 2283
2284 void CalculateRenderTargetInternal(LayerImpl* layer, 2284 void CalculateRenderTargetInternal(LayerImpl* layer,
2285 PropertyTrees* property_trees,
2285 bool subtree_visible_from_ancestor, 2286 bool subtree_visible_from_ancestor,
2286 bool can_render_to_separate_surface) { 2287 bool can_render_to_separate_surface,
2287 const bool layer_is_visible = 2288 bool use_property_trees) {
2288 subtree_visible_from_ancestor && !layer->hide_layer_and_subtree(); 2289 bool layer_is_drawn;
2289 const bool layer_is_drawn = layer_is_visible || layer->HasCopyRequest(); 2290 if (use_property_trees) {
2291 DCHECK_GE(layer->effect_tree_index(), 0);
2292 layer_is_drawn =
2293 property_trees->effect_tree.Node(layer->effect_tree_index())
2294 ->data.is_drawn;
2295 } else {
2296 layer_is_drawn = (subtree_visible_from_ancestor && layer->opacity() != 0) ||
2297 layer->HasCopyRequest();
2298 }
2290 2299
2291 // The root layer cannot be skipped. 2300 // The root layer cannot be skipped.
2292 if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_drawn)) { 2301 if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_drawn)) {
2293 layer->draw_properties().render_target = nullptr; 2302 layer->draw_properties().render_target = nullptr;
2294 return; 2303 return;
2295 } 2304 }
2296 2305
2297 bool render_to_separate_surface = 2306 bool render_to_separate_surface =
2298 IsRootLayer(layer) || 2307 IsRootLayer(layer) ||
2299 (can_render_to_separate_surface && layer->render_surface()); 2308 (can_render_to_separate_surface && layer->render_surface());
(...skipping 12 matching lines...) Expand all
2312 layer; 2321 layer;
2313 2322
2314 } else { 2323 } else {
2315 DCHECK(layer->parent()); 2324 DCHECK(layer->parent());
2316 layer->draw_properties().render_target = layer->parent()->render_target(); 2325 layer->draw_properties().render_target = layer->parent()->render_target();
2317 } 2326 }
2318 2327
2319 for (size_t i = 0; i < layer->children().size(); ++i) { 2328 for (size_t i = 0; i < layer->children().size(); ++i) {
2320 CalculateRenderTargetInternal( 2329 CalculateRenderTargetInternal(
2321 LayerTreeHostCommon::get_layer_as_raw_ptr(layer->children(), i), 2330 LayerTreeHostCommon::get_layer_as_raw_ptr(layer->children(), i),
2322 layer_is_drawn, can_render_to_separate_surface); 2331 property_trees, layer_is_drawn, can_render_to_separate_surface,
2332 use_property_trees);
2323 } 2333 }
2324 } 2334 }
2325 2335
2326 void CalculateRenderSurfaceLayerListInternal( 2336 void CalculateRenderSurfaceLayerListInternal(
2327 LayerImpl* layer, 2337 LayerImpl* layer,
2328 PropertyTrees* property_trees, 2338 PropertyTrees* property_trees,
2329 LayerImplList* render_surface_layer_list, 2339 LayerImplList* render_surface_layer_list,
2330 LayerImplList* descendants, 2340 LayerImplList* descendants,
2331 RenderSurfaceImpl* nearest_occlusion_immune_ancestor, 2341 RenderSurfaceImpl* nearest_occlusion_immune_ancestor,
2332 bool subtree_visible_from_ancestor, 2342 bool subtree_visible_from_ancestor,
(...skipping 10 matching lines...) Expand all
2343 // |render_surface_layer_list| is the top level RenderSurfaceLayerList. 2353 // |render_surface_layer_list| is the top level RenderSurfaceLayerList.
2344 2354
2345 // |descendants| is used to determine what's in current layer's render 2355 // |descendants| is used to determine what's in current layer's render
2346 // surface's layer list. 2356 // surface's layer list.
2347 2357
2348 // |subtree_visible_from_ancestor| is set during recursion to affect current 2358 // |subtree_visible_from_ancestor| is set during recursion to affect current
2349 // layer's subtree. 2359 // layer's subtree.
2350 2360
2351 // |can_render_to_separate_surface| and |current_render_surface_layer_list_id| 2361 // |can_render_to_separate_surface| and |current_render_surface_layer_list_id|
2352 // are settings that should stay the same during recursion. 2362 // are settings that should stay the same during recursion.
2353 2363 bool layer_is_drawn;
weiliangc 2016/01/19 21:03:08 Initialize this please.
jaydasika 2016/01/19 22:10:36 Done.
2354 // Layers that are marked as hidden will hide themselves and their subtree. 2364 if (use_property_trees) {
2355 // Exception: Layers with copy requests, whether hidden or not, must be drawn 2365 DCHECK_GE(layer->effect_tree_index(), 0);
2356 // anyway. In this case, we will inform their subtree they are visible to get 2366 layer_is_drawn =
2357 // the right results. 2367 property_trees->effect_tree.Node(layer->effect_tree_index())
2358 const bool layer_is_visible = 2368 ->data.is_drawn;
2359 subtree_visible_from_ancestor && !layer->hide_layer_and_subtree(); 2369 } else {
2360 const bool layer_is_drawn = layer_is_visible || layer->HasCopyRequest(); 2370 layer_is_drawn = (subtree_visible_from_ancestor && layer->opacity() != 0) ||
2371 layer->HasCopyRequest();
2372 }
2361 2373
2362 // The root layer cannot be skipped. 2374 // The root layer cannot be skipped.
2363 if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_drawn)) { 2375 if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_drawn)) {
2364 if (layer->render_surface()) 2376 if (layer->render_surface())
2365 layer->ClearRenderSurfaceLayerList(); 2377 layer->ClearRenderSurfaceLayerList();
2366 layer->draw_properties().render_target = nullptr; 2378 layer->draw_properties().render_target = nullptr;
2367 return; 2379 return;
2368 } 2380 }
2369 2381
2370 bool render_to_separate_surface = 2382 bool render_to_separate_surface =
2371 IsRootLayer(layer) || 2383 IsRootLayer(layer) ||
2372 (can_render_to_separate_surface && layer->render_surface()); 2384 (can_render_to_separate_surface && layer->render_surface());
2373 2385
2374 if (render_to_separate_surface) { 2386 if (render_to_separate_surface) {
2375 DCHECK(layer->render_surface()); 2387 DCHECK(layer->render_surface());
2376 2388
2389 bool contributes_to_drawn_surface;
weiliangc 2016/01/19 21:03:08 No need to compute here. Just compute at the locat
jaydasika 2016/01/19 22:10:36 Done.
2377 if (use_property_trees) { 2390 if (use_property_trees) {
2378 RenderSurfaceDrawProperties draw_properties; 2391 RenderSurfaceDrawProperties draw_properties;
2379 ComputeSurfaceDrawPropertiesUsingPropertyTrees( 2392 ComputeSurfaceDrawPropertiesUsingPropertyTrees(
2380 layer->render_surface(), property_trees, &draw_properties); 2393 layer->render_surface(), property_trees, &draw_properties);
2381 // TODO(ajuma): Once property tree verification is removed, make the above 2394 // TODO(ajuma): Once property tree verification is removed, make the above
2382 // call directly set the surface's properties, so that the copying below 2395 // call directly set the surface's properties, so that the copying below
2383 // is no longer needed. 2396 // is no longer needed.
2384 layer->render_surface()->SetIsClipped(draw_properties.is_clipped); 2397 layer->render_surface()->SetIsClipped(draw_properties.is_clipped);
2385 layer->render_surface()->SetDrawOpacity(draw_properties.draw_opacity); 2398 layer->render_surface()->SetDrawOpacity(draw_properties.draw_opacity);
2386 layer->render_surface()->SetDrawTransform(draw_properties.draw_transform); 2399 layer->render_surface()->SetDrawTransform(draw_properties.draw_transform);
2387 layer->render_surface()->SetScreenSpaceTransform( 2400 layer->render_surface()->SetScreenSpaceTransform(
2388 draw_properties.screen_space_transform); 2401 draw_properties.screen_space_transform);
2389 layer->render_surface()->SetReplicaDrawTransform( 2402 layer->render_surface()->SetReplicaDrawTransform(
2390 draw_properties.replica_draw_transform); 2403 draw_properties.replica_draw_transform);
2391 layer->render_surface()->SetReplicaScreenSpaceTransform( 2404 layer->render_surface()->SetReplicaScreenSpaceTransform(
2392 draw_properties.replica_screen_space_transform); 2405 draw_properties.replica_screen_space_transform);
2393 layer->render_surface()->SetClipRect(draw_properties.clip_rect); 2406 layer->render_surface()->SetClipRect(draw_properties.clip_rect);
2407 contributes_to_drawn_surface =
2408 property_trees->effect_tree.ContributesToDrawnSurface(
2409 layer->effect_tree_index());
2410 } else {
2411 contributes_to_drawn_surface =
2412 subtree_visible_from_ancestor && layer->opacity() != 0.f;
2394 } 2413 }
2395 2414
2396 if (!layer->double_sided() && 2415 if (!layer->double_sided() &&
2397 IsSurfaceBackFaceVisible(layer, 2416 IsSurfaceBackFaceVisible(layer,
2398 layer->render_surface()->draw_transform())) { 2417 layer->render_surface()->draw_transform())) {
2399 layer->ClearRenderSurfaceLayerList(); 2418 layer->ClearRenderSurfaceLayerList();
2400 layer->draw_properties().render_target = nullptr; 2419 layer->draw_properties().render_target = nullptr;
2401 return; 2420 return;
2402 } 2421 }
2403 2422
2404 if (IsRootLayer(layer)) { 2423 if (IsRootLayer(layer)) {
2405 // The root surface does not contribute to any other surface, it has no 2424 // The root surface does not contribute to any other surface, it has no
2406 // target. 2425 // target.
2407 layer->render_surface()->set_contributes_to_drawn_surface(false); 2426 layer->render_surface()->set_contributes_to_drawn_surface(false);
2408 } else { 2427 } else {
2409 // Even if the |layer_is_drawn|, it only contributes to a drawn surface 2428 // Even if the |layer_is_drawn|, it only contributes to a drawn surface
2410 // when the |layer_is_visible|. 2429 // when the |layer_is_visible|.
2411 layer->render_surface()->set_contributes_to_drawn_surface( 2430 layer->render_surface()->set_contributes_to_drawn_surface(
2412 layer_is_visible); 2431 contributes_to_drawn_surface);
2413 } 2432 }
2414 2433
2415 // Ignore occlusion from outside the surface when surface contents need to 2434 // Ignore occlusion from outside the surface when surface contents need to
2416 // be fully drawn. Layers with copy-request need to be complete. 2435 // be fully drawn. Layers with copy-request need to be complete.
2417 // We could be smarter about layers with replica and exclude regions 2436 // We could be smarter about layers with replica and exclude regions
2418 // where both layer and the replica are occluded, but this seems like an 2437 // where both layer and the replica are occluded, but this seems like an
2419 // overkill. The same is true for layers with filters that move pixels. 2438 // overkill. The same is true for layers with filters that move pixels.
2420 // TODO(senorblanco): make this smarter for the SkImageFilter case (check 2439 // TODO(senorblanco): make this smarter for the SkImageFilter case (check
2421 // for pixel-moving filters) 2440 // for pixel-moving filters)
2422 if (layer->HasCopyRequest() || layer->has_replica() || 2441 if (layer->HasCopyRequest() || layer->has_replica() ||
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
2567 2586
2568 if (layer->HasContributingDelegatedRenderPasses()) { 2587 if (layer->HasContributingDelegatedRenderPasses()) {
2569 layer->render_target() 2588 layer->render_target()
2570 ->render_surface() 2589 ->render_surface()
2571 ->AddContributingDelegatedRenderPassLayer(layer); 2590 ->AddContributingDelegatedRenderPassLayer(layer);
2572 } 2591 }
2573 } 2592 }
2574 2593
2575 void CalculateRenderTarget( 2594 void CalculateRenderTarget(
2576 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs) { 2595 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs) {
2577 CalculateRenderTargetInternal(inputs->root_layer, true, 2596 CalculateRenderTargetInternal(
2578 inputs->can_render_to_separate_surface); 2597 inputs->root_layer, inputs->property_trees, true,
2598 inputs->can_render_to_separate_surface,
2599 inputs->verify_property_trees || inputs->use_property_trees);
2579 } 2600 }
2580 2601
2581 void CalculateRenderSurfaceLayerList( 2602 void CalculateRenderSurfaceLayerList(
2582 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs) { 2603 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs) {
2583 const bool subtree_visible_from_ancestor = true; 2604 const bool subtree_visible_from_ancestor = true;
2584 DCHECK_EQ( 2605 DCHECK_EQ(
2585 inputs->current_render_surface_layer_list_id, 2606 inputs->current_render_surface_layer_list_id,
2586 inputs->root_layer->layer_tree_impl()->current_render_surface_list_id()); 2607 inputs->root_layer->layer_tree_impl()->current_render_surface_list_id());
2587 CalculateRenderSurfaceLayerListInternal( 2608 CalculateRenderSurfaceLayerListInternal(
2588 inputs->root_layer, inputs->property_trees, 2609 inputs->root_layer, inputs->property_trees,
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
2782 2803
2783 PropertyTrees* GetPropertyTrees(Layer* layer) { 2804 PropertyTrees* GetPropertyTrees(Layer* layer) {
2784 return layer->layer_tree_host()->property_trees(); 2805 return layer->layer_tree_host()->property_trees();
2785 } 2806 }
2786 2807
2787 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { 2808 PropertyTrees* GetPropertyTrees(LayerImpl* layer) {
2788 return layer->layer_tree_impl()->property_trees(); 2809 return layer->layer_tree_impl()->property_trees();
2789 } 2810 }
2790 2811
2791 } // namespace cc 2812 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698