| 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 <algorithm> | 7 #include <algorithm> | 
| 8 | 8 | 
| 9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" | 
| 10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" | 
| (...skipping 2467 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2478       const float tolerance = | 2478       const float tolerance = | 
| 2479           col == 3 && row < 3 ? translation_tolerance : component_tolerance; | 2479           col == 3 && row < 3 ? translation_tolerance : component_tolerance; | 
| 2480       if (delta > tolerance) | 2480       if (delta > tolerance) | 
| 2481         return false; | 2481         return false; | 
| 2482     } | 2482     } | 
| 2483   } | 2483   } | 
| 2484 | 2484 | 
| 2485   return true; | 2485   return true; | 
| 2486 } | 2486 } | 
| 2487 | 2487 | 
| 2488 void LayerTreeHostCommon::CalculateDrawProperties( | 2488 void VerifyPropertyTreeValues( | 
| 2489     CalcDrawPropsMainInputs* inputs) { | 2489     LayerTreeHostCommon::CalcDrawPropsMainInputs* inputs) { | 
| 2490   UpdateRenderSurfaces(inputs->root_layer, | 2490   LayerIterator<Layer> it, end; | 
| 2491                        inputs->can_render_to_separate_surface, gfx::Transform(), | 2491   for (it = LayerIterator<Layer>::Begin(inputs->render_surface_layer_list), | 
| 2492                        false); | 2492       end = LayerIterator<Layer>::End(inputs->render_surface_layer_list); | 
| 2493   LayerList dummy_layer_list; | 2493        it != end; ++it) { | 
| 2494   SubtreeGlobals<Layer> globals; | 2494     Layer* current_layer = *it; | 
| 2495   DataForRecursion<Layer> data_for_recursion; | 2495     if (!it.represents_itself() || !current_layer->DrawsContent()) | 
|  | 2496       continue; | 
|  | 2497 | 
|  | 2498     const bool visible_rects_match = | 
|  | 2499         ApproximatelyEqual(current_layer->visible_content_rect(), | 
|  | 2500                            current_layer->visible_rect_from_property_trees()); | 
|  | 2501     CHECK(visible_rects_match) | 
|  | 2502         << "expected: " << current_layer->visible_content_rect().ToString() | 
|  | 2503         << " actual: " | 
|  | 2504         << current_layer->visible_rect_from_property_trees().ToString(); | 
|  | 2505 | 
|  | 2506     const bool draw_transforms_match = ApproximatelyEqual( | 
|  | 2507         current_layer->draw_transform(), | 
|  | 2508         DrawTransformFromPropertyTrees(current_layer, | 
|  | 2509                                        inputs->property_trees->transform_tree)); | 
|  | 2510     CHECK(draw_transforms_match) | 
|  | 2511         << "expected: " << current_layer->draw_transform().ToString() | 
|  | 2512         << " actual: " | 
|  | 2513         << DrawTransformFromPropertyTrees( | 
|  | 2514                current_layer, inputs->property_trees->transform_tree) | 
|  | 2515                .ToString(); | 
|  | 2516 | 
|  | 2517     const bool draw_opacities_match = | 
|  | 2518         current_layer->draw_opacity() == | 
|  | 2519         DrawOpacityFromPropertyTrees(current_layer, | 
|  | 2520                                      inputs->property_trees->opacity_tree); | 
|  | 2521     CHECK(draw_opacities_match) | 
|  | 2522         << "expected: " << current_layer->draw_opacity() << " actual: " | 
|  | 2523         << DrawOpacityFromPropertyTrees(current_layer, | 
|  | 2524                                         inputs->property_trees->opacity_tree); | 
|  | 2525   } | 
|  | 2526 } | 
|  | 2527 | 
|  | 2528 void VerifyPropertyTreeValues( | 
|  | 2529     LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs) { | 
|  | 2530   // TODO(enne): need to synchronize compositor thread changes | 
|  | 2531   // for animation and scrolling to the property trees before these | 
|  | 2532   // can be correct. | 
|  | 2533 } | 
|  | 2534 | 
|  | 2535 enum PropertyTreeOption { | 
|  | 2536   BUILD_PROPERTY_TREES_IF_NEEDED, | 
|  | 2537   DONT_BUILD_PROPERTY_TREES | 
|  | 2538 }; | 
|  | 2539 | 
|  | 2540 template <typename LayerType, typename RenderSurfaceLayerListType> | 
|  | 2541 void CalculateDrawPropertiesAndVerify(LayerTreeHostCommon::CalcDrawPropsInputs< | 
|  | 2542                                           LayerType, | 
|  | 2543                                           RenderSurfaceLayerListType>* inputs, | 
|  | 2544                                       PropertyTreeOption property_tree_option) { | 
|  | 2545   typename LayerType::LayerListType dummy_layer_list; | 
|  | 2546   SubtreeGlobals<LayerType> globals; | 
|  | 2547   DataForRecursion<LayerType> data_for_recursion; | 
|  | 2548 | 
| 2496   ProcessCalcDrawPropsInputs(*inputs, &globals, &data_for_recursion); | 2549   ProcessCalcDrawPropsInputs(*inputs, &globals, &data_for_recursion); | 
| 2497 |  | 
| 2498   PreCalculateMetaInformationRecursiveData recursive_data; | 2550   PreCalculateMetaInformationRecursiveData recursive_data; | 
| 2499   PreCalculateMetaInformation(inputs->root_layer, &recursive_data); | 2551   PreCalculateMetaInformation(inputs->root_layer, &recursive_data); | 
| 2500 | 2552 | 
| 2501   if (!inputs->verify_property_trees) { | 2553   if (!inputs->verify_property_trees) { | 
| 2502     std::vector<AccumulatedSurfaceState<Layer>> accumulated_surface_state; | 2554     std::vector<AccumulatedSurfaceState<LayerType>> accumulated_surface_state; | 
| 2503     CalculateDrawPropertiesInternal<Layer>( | 2555     CalculateDrawPropertiesInternal<LayerType>( | 
| 2504         inputs->root_layer, globals, data_for_recursion, | 2556         inputs->root_layer, globals, data_for_recursion, | 
| 2505         inputs->render_surface_layer_list, &dummy_layer_list, | 2557         inputs->render_surface_layer_list, &dummy_layer_list, | 
| 2506         &accumulated_surface_state, | 2558         &accumulated_surface_state, | 
| 2507         inputs->current_render_surface_layer_list_id); | 2559         inputs->current_render_surface_layer_list_id); | 
| 2508   } else { | 2560   } else { | 
| 2509     { | 2561     { | 
| 2510       TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 2562       TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 
| 2511                    "LayerTreeHostCommon::CalculateDrawProperties"); | 2563                    "LayerTreeHostCommon::CalculateDrawProperties"); | 
| 2512       std::vector<AccumulatedSurfaceState<Layer>> accumulated_surface_state; | 2564       std::vector<AccumulatedSurfaceState<LayerType>> accumulated_surface_state; | 
| 2513       CalculateDrawPropertiesInternal<Layer>( | 2565       CalculateDrawPropertiesInternal<LayerType>( | 
| 2514           inputs->root_layer, globals, data_for_recursion, | 2566           inputs->root_layer, globals, data_for_recursion, | 
| 2515           inputs->render_surface_layer_list, &dummy_layer_list, | 2567           inputs->render_surface_layer_list, &dummy_layer_list, | 
| 2516           &accumulated_surface_state, | 2568           &accumulated_surface_state, | 
| 2517           inputs->current_render_surface_layer_list_id); | 2569           inputs->current_render_surface_layer_list_id); | 
| 2518     } | 2570     } | 
| 2519 | 2571 | 
| 2520     // The translation from layer to property trees is an intermediate state. We | 2572     // For testing purposes, sometimes property trees need to be built on the | 
| 2521     // will eventually get these data passed directly to the compositor. | 2573     // compositor thread, so this can't just switch on Layer vs LayerImpl, | 
| 2522     { | 2574     // even though in practice only the main thread builds property trees. | 
| 2523       TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 2575     switch (property_tree_option) { | 
| 2524                    "LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees"); | 2576       case BUILD_PROPERTY_TREES_IF_NEEDED: { | 
| 2525       ComputeVisibleRectsUsingPropertyTrees( | 2577         // The translation from layer to property trees is an intermediate | 
| 2526           inputs->root_layer, inputs->page_scale_application_layer, | 2578         // state. We will eventually get these data passed directly to the | 
| 2527           inputs->page_scale_factor, inputs->device_scale_factor, | 2579         // compositor. | 
| 2528           gfx::Rect(inputs->device_viewport_size), inputs->device_transform, | 2580         TRACE_EVENT0( | 
| 2529           inputs->property_trees); | 2581             TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 
|  | 2582             "LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees"); | 
|  | 2583         BuildPropertyTreesAndComputeVisibleRects( | 
|  | 2584             inputs->root_layer, inputs->page_scale_application_layer, | 
|  | 2585             inputs->page_scale_factor, inputs->device_scale_factor, | 
|  | 2586             gfx::Rect(inputs->device_viewport_size), inputs->device_transform, | 
|  | 2587             inputs->property_trees); | 
|  | 2588         break; | 
|  | 2589       } | 
|  | 2590       case DONT_BUILD_PROPERTY_TREES: { | 
|  | 2591         TRACE_EVENT0( | 
|  | 2592             TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 
|  | 2593             "LayerTreeHostCommon::ComputeJustVisibleRectsWithPropertyTrees"); | 
|  | 2594         ComputeVisibleRectsUsingPropertyTrees(inputs->root_layer, | 
|  | 2595                                               inputs->property_trees); | 
|  | 2596         break; | 
|  | 2597       } | 
| 2530     } | 2598     } | 
| 2531 | 2599 | 
| 2532     LayerIterator<Layer> it, end; | 2600     VerifyPropertyTreeValues(inputs); | 
| 2533     for (it = LayerIterator<Layer>::Begin(inputs->render_surface_layer_list), |  | 
| 2534         end = LayerIterator<Layer>::End(inputs->render_surface_layer_list); |  | 
| 2535          it != end; ++it) { |  | 
| 2536       Layer* current_layer = *it; |  | 
| 2537       if (!it.represents_itself() || !current_layer->DrawsContent()) |  | 
| 2538         continue; |  | 
| 2539 |  | 
| 2540       const bool visible_rects_match = |  | 
| 2541           ApproximatelyEqual(current_layer->visible_content_rect(), |  | 
| 2542                              current_layer->visible_rect_from_property_trees()); |  | 
| 2543       CHECK(visible_rects_match) |  | 
| 2544           << "expected: " << current_layer->visible_content_rect().ToString() |  | 
| 2545           << " actual: " |  | 
| 2546           << current_layer->visible_rect_from_property_trees().ToString(); |  | 
| 2547 |  | 
| 2548       const bool draw_transforms_match = |  | 
| 2549           ApproximatelyEqual(current_layer->draw_transform(), |  | 
| 2550                              current_layer->draw_transform_from_property_trees( |  | 
| 2551                                  inputs->property_trees->transform_tree)); |  | 
| 2552       CHECK(draw_transforms_match); |  | 
| 2553 |  | 
| 2554       const bool draw_opacities_match = |  | 
| 2555           current_layer->draw_opacity() == |  | 
| 2556           current_layer->DrawOpacityFromPropertyTrees( |  | 
| 2557               inputs->property_trees->opacity_tree); |  | 
| 2558       CHECK(draw_opacities_match) |  | 
| 2559           << "expected: " << current_layer->draw_opacity() << " actual: " |  | 
| 2560           << current_layer->DrawOpacityFromPropertyTrees( |  | 
| 2561                  inputs->property_trees->opacity_tree); |  | 
| 2562     } |  | 
| 2563   } | 2601   } | 
| 2564 | 2602 | 
| 2565   // The dummy layer list should not have been used. | 2603   // The dummy layer list should not have been used. | 
| 2566   DCHECK_EQ(0u, dummy_layer_list.size()); | 2604   DCHECK_EQ(0u, dummy_layer_list.size()); | 
| 2567   // A root layer render_surface should always exist after | 2605   // A root layer render_surface should always exist after | 
| 2568   // CalculateDrawProperties. | 2606   // CalculateDrawProperties. | 
| 2569   DCHECK(inputs->root_layer->render_surface()); | 2607   DCHECK(inputs->root_layer->render_surface()); | 
| 2570 } | 2608 } | 
| 2571 | 2609 | 
| 2572 void LayerTreeHostCommon::CalculateDrawProperties( | 2610 void LayerTreeHostCommon::CalculateDrawProperties( | 
|  | 2611     CalcDrawPropsMainInputs* inputs) { | 
|  | 2612   UpdateRenderSurfaces(inputs->root_layer, | 
|  | 2613                        inputs->can_render_to_separate_surface, gfx::Transform(), | 
|  | 2614                        false); | 
|  | 2615   CalculateDrawPropertiesAndVerify(inputs, BUILD_PROPERTY_TREES_IF_NEEDED); | 
|  | 2616 } | 
|  | 2617 | 
|  | 2618 void LayerTreeHostCommon::CalculateDrawProperties( | 
| 2573     CalcDrawPropsImplInputs* inputs) { | 2619     CalcDrawPropsImplInputs* inputs) { | 
| 2574   LayerImplList dummy_layer_list; | 2620   CalculateDrawPropertiesAndVerify(inputs, DONT_BUILD_PROPERTY_TREES); | 
| 2575   SubtreeGlobals<LayerImpl> globals; | 2621 } | 
| 2576   DataForRecursion<LayerImpl> data_for_recursion; |  | 
| 2577   ProcessCalcDrawPropsInputs(*inputs, &globals, &data_for_recursion); |  | 
| 2578 | 2622 | 
| 2579   PreCalculateMetaInformationRecursiveData recursive_data; | 2623 void LayerTreeHostCommon::CalculateDrawProperties( | 
| 2580   PreCalculateMetaInformation(inputs->root_layer, &recursive_data); | 2624     CalcDrawPropsImplInputsForTesting* inputs) { | 
| 2581   std::vector<AccumulatedSurfaceState<LayerImpl>> accumulated_surface_state; | 2625   CalculateDrawPropertiesAndVerify(inputs, BUILD_PROPERTY_TREES_IF_NEEDED); | 
| 2582   CalculateDrawPropertiesInternal<LayerImpl>( |  | 
| 2583       inputs->root_layer, |  | 
| 2584       globals, |  | 
| 2585       data_for_recursion, |  | 
| 2586       inputs->render_surface_layer_list, |  | 
| 2587       &dummy_layer_list, |  | 
| 2588       &accumulated_surface_state, |  | 
| 2589       inputs->current_render_surface_layer_list_id); |  | 
| 2590 |  | 
| 2591   // The dummy layer list should not have been used. |  | 
| 2592   DCHECK_EQ(0u, dummy_layer_list.size()); |  | 
| 2593   // A root layer render_surface should always exist after |  | 
| 2594   // CalculateDrawProperties. |  | 
| 2595   DCHECK(inputs->root_layer->render_surface()); |  | 
| 2596 } | 2626 } | 
| 2597 | 2627 | 
| 2598 PropertyTrees* GetPropertyTrees(Layer* layer, | 2628 PropertyTrees* GetPropertyTrees(Layer* layer, | 
| 2599                                 PropertyTrees* trees_from_inputs) { | 2629                                 PropertyTrees* trees_from_inputs) { | 
| 2600   return layer->layer_tree_host()->property_trees(); | 2630   return layer->layer_tree_host()->property_trees(); | 
| 2601 } | 2631 } | 
| 2602 | 2632 | 
| 2603 PropertyTrees* GetPropertyTrees(LayerImpl* layer, | 2633 PropertyTrees* GetPropertyTrees(LayerImpl* layer, | 
| 2604                                 PropertyTrees* trees_from_inputs) { | 2634                                 PropertyTrees* trees_from_inputs) { | 
| 2605   return trees_from_inputs; | 2635   return trees_from_inputs; | 
| 2606 } | 2636 } | 
| 2607 | 2637 | 
| 2608 }  // namespace cc | 2638 }  // namespace cc | 
| OLD | NEW | 
|---|