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 1452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |