Commit c3011475 authored by enne's avatar enne Committed by Commit bot

cc: Plumbing for storing property trees

In order to commit property trees to the compositor thread, they need to
be stored on the LayerTreeHost/LayerTreeImpl.  This change adds plumbing
so that the PropertyTree computation is not entirely internal to CDP.

BUG=386793

Review URL: https://codereview.chromium.org/1062403002

Cr-Commit-Position: refs/heads/master@{#324331}
parent fa8bbd38
...@@ -306,21 +306,20 @@ void ComputeVisibleRectsUsingPropertyTrees( ...@@ -306,21 +306,20 @@ void ComputeVisibleRectsUsingPropertyTrees(
float device_scale_factor, float device_scale_factor,
const gfx::Rect& viewport, const gfx::Rect& viewport,
const gfx::Transform& device_transform, const gfx::Transform& device_transform,
TransformTree* transform_tree, PropertyTrees* property_trees) {
ClipTree* clip_tree,
OpacityTree* opacity_tree) {
PropertyTreeBuilder::BuildPropertyTrees( PropertyTreeBuilder::BuildPropertyTrees(
root_layer, page_scale_layer, page_scale_factor, device_scale_factor, root_layer, page_scale_layer, page_scale_factor, device_scale_factor,
viewport, device_transform, transform_tree, clip_tree, opacity_tree); viewport, device_transform, property_trees);
ComputeTransforms(transform_tree); ComputeTransforms(&property_trees->transform_tree);
ComputeClips(clip_tree, *transform_tree); ComputeClips(&property_trees->clip_tree, property_trees->transform_tree);
std::vector<Layer*> layers_to_update; std::vector<Layer*> layers_to_update;
const bool subtree_is_visible_from_ancestor = true; const bool subtree_is_visible_from_ancestor = true;
FindLayersThatNeedVisibleRects(root_layer, *transform_tree, FindLayersThatNeedVisibleRects(root_layer, property_trees->transform_tree,
subtree_is_visible_from_ancestor, subtree_is_visible_from_ancestor,
&layers_to_update); &layers_to_update);
CalculateVisibleRects(layers_to_update, *clip_tree, *transform_tree); CalculateVisibleRects(layers_to_update, property_trees->clip_tree,
property_trees->transform_tree);
} }
} // namespace cc } // namespace cc
...@@ -18,6 +18,7 @@ class ClipTree; ...@@ -18,6 +18,7 @@ class ClipTree;
class Layer; class Layer;
class OpacityTree; class OpacityTree;
class TransformTree; class TransformTree;
class PropertyTrees;
// Computes combined clips for every node in |clip_tree|. This function requires // Computes combined clips for every node in |clip_tree|. This function requires
// that |transform_tree| has been updated via |ComputeTransforms|. // that |transform_tree| has been updated via |ComputeTransforms|.
...@@ -40,9 +41,7 @@ ComputeVisibleRectsUsingPropertyTrees(Layer* root_layer, ...@@ -40,9 +41,7 @@ ComputeVisibleRectsUsingPropertyTrees(Layer* root_layer,
float device_scale_factor, float device_scale_factor,
const gfx::Rect& viewport, const gfx::Rect& viewport,
const gfx::Transform& device_transform, const gfx::Transform& device_transform,
TransformTree* transform_tree, PropertyTrees* property_trees);
ClipTree* clip_tree,
OpacityTree* opacity_tree);
} // namespace cc } // namespace cc
......
...@@ -796,6 +796,7 @@ bool LayerTreeHost::UpdateLayers(Layer* root_layer, ...@@ -796,6 +796,7 @@ bool LayerTreeHost::UpdateLayers(Layer* root_layer,
// that we won't be able to detect if a layer is part of |update_list|. // that we won't be able to detect if a layer is part of |update_list|.
// Change this if this information is required. // Change this if this information is required.
int render_surface_layer_list_id = 0; int render_surface_layer_list_id = 0;
PropertyTrees property_trees;
LayerTreeHostCommon::CalcDrawPropsMainInputs inputs( LayerTreeHostCommon::CalcDrawPropsMainInputs inputs(
root_layer, device_viewport_size(), gfx::Transform(), root_layer, device_viewport_size(), gfx::Transform(),
device_scale_factor_, page_scale_factor_, page_scale_layer, device_scale_factor_, page_scale_factor_, page_scale_layer,
...@@ -805,7 +806,7 @@ bool LayerTreeHost::UpdateLayers(Layer* root_layer, ...@@ -805,7 +806,7 @@ bool LayerTreeHost::UpdateLayers(Layer* root_layer,
can_render_to_separate_surface, can_render_to_separate_surface,
settings_.layer_transforms_should_scale_layer_contents, settings_.layer_transforms_should_scale_layer_contents,
settings_.verify_property_trees, &update_list, settings_.verify_property_trees, &update_list,
render_surface_layer_list_id); render_surface_layer_list_id, &property_trees);
LayerTreeHostCommon::CalculateDrawProperties(&inputs); LayerTreeHostCommon::CalculateDrawProperties(&inputs);
} }
......
...@@ -2504,9 +2504,6 @@ void LayerTreeHostCommon::CalculateDrawProperties( ...@@ -2504,9 +2504,6 @@ void LayerTreeHostCommon::CalculateDrawProperties(
// The translation from layer to property trees is an intermediate state. We // The translation from layer to property trees is an intermediate state. We
// will eventually get these data passed directly to the compositor. // will eventually get these data passed directly to the compositor.
TransformTree transform_tree;
ClipTree clip_tree;
OpacityTree opacity_tree;
{ {
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"),
"LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees"); "LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees");
...@@ -2514,7 +2511,7 @@ void LayerTreeHostCommon::CalculateDrawProperties( ...@@ -2514,7 +2511,7 @@ void LayerTreeHostCommon::CalculateDrawProperties(
inputs->root_layer, inputs->page_scale_application_layer, inputs->root_layer, inputs->page_scale_application_layer,
inputs->page_scale_factor, inputs->device_scale_factor, inputs->page_scale_factor, inputs->device_scale_factor,
gfx::Rect(inputs->device_viewport_size), inputs->device_transform, gfx::Rect(inputs->device_viewport_size), inputs->device_transform,
&transform_tree, &clip_tree, &opacity_tree); inputs->property_trees);
} }
LayerIterator<Layer> it, end; LayerIterator<Layer> it, end;
...@@ -2533,14 +2530,16 @@ void LayerTreeHostCommon::CalculateDrawProperties( ...@@ -2533,14 +2530,16 @@ void LayerTreeHostCommon::CalculateDrawProperties(
<< " actual: " << " actual: "
<< current_layer->visible_rect_from_property_trees().ToString(); << current_layer->visible_rect_from_property_trees().ToString();
const bool draw_transforms_match = ApproximatelyEqual( const bool draw_transforms_match =
current_layer->draw_transform(), ApproximatelyEqual(current_layer->draw_transform(),
current_layer->draw_transform_from_property_trees(transform_tree)); current_layer->draw_transform_from_property_trees(
inputs->property_trees->transform_tree));
CHECK(draw_transforms_match); CHECK(draw_transforms_match);
const bool draw_opacities_match = const bool draw_opacities_match =
current_layer->draw_opacity() == current_layer->draw_opacity() ==
current_layer->DrawOpacityFromPropertyTrees(opacity_tree); current_layer->DrawOpacityFromPropertyTrees(
inputs->property_trees->opacity_tree);
CHECK(draw_opacities_match); CHECK(draw_opacities_match);
} }
} }
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "cc/base/cc_export.h" #include "cc/base/cc_export.h"
#include "cc/base/scoped_ptr_vector.h" #include "cc/base/scoped_ptr_vector.h"
#include "cc/layers/layer_lists.h" #include "cc/layers/layer_lists.h"
#include "cc/trees/property_tree.h"
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/vector2d.h" #include "ui/gfx/geometry/vector2d.h"
#include "ui/gfx/transform.h" #include "ui/gfx/transform.h"
...@@ -22,6 +23,7 @@ namespace cc { ...@@ -22,6 +23,7 @@ namespace cc {
class LayerImpl; class LayerImpl;
class Layer; class Layer;
class SwapPromise; class SwapPromise;
class PropertyTrees;
class CC_EXPORT LayerTreeHostCommon { class CC_EXPORT LayerTreeHostCommon {
public: public:
...@@ -47,7 +49,8 @@ class CC_EXPORT LayerTreeHostCommon { ...@@ -47,7 +49,8 @@ class CC_EXPORT LayerTreeHostCommon {
bool can_adjust_raster_scales, bool can_adjust_raster_scales,
bool verify_property_trees, bool verify_property_trees,
RenderSurfaceLayerListType* render_surface_layer_list, RenderSurfaceLayerListType* render_surface_layer_list,
int current_render_surface_layer_list_id) int current_render_surface_layer_list_id,
PropertyTrees* property_trees)
: root_layer(root_layer), : root_layer(root_layer),
device_viewport_size(device_viewport_size), device_viewport_size(device_viewport_size),
device_transform(device_transform), device_transform(device_transform),
...@@ -65,7 +68,8 @@ class CC_EXPORT LayerTreeHostCommon { ...@@ -65,7 +68,8 @@ class CC_EXPORT LayerTreeHostCommon {
verify_property_trees(verify_property_trees), verify_property_trees(verify_property_trees),
render_surface_layer_list(render_surface_layer_list), render_surface_layer_list(render_surface_layer_list),
current_render_surface_layer_list_id( current_render_surface_layer_list_id(
current_render_surface_layer_list_id) {} current_render_surface_layer_list_id),
property_trees(property_trees) {}
LayerType* root_layer; LayerType* root_layer;
gfx::Size device_viewport_size; gfx::Size device_viewport_size;
...@@ -83,6 +87,7 @@ class CC_EXPORT LayerTreeHostCommon { ...@@ -83,6 +87,7 @@ class CC_EXPORT LayerTreeHostCommon {
bool verify_property_trees; bool verify_property_trees;
RenderSurfaceLayerListType* render_surface_layer_list; RenderSurfaceLayerListType* render_surface_layer_list;
int current_render_surface_layer_list_id; int current_render_surface_layer_list_id;
PropertyTrees* property_trees;
}; };
template <typename LayerType, typename RenderSurfaceLayerListType> template <typename LayerType, typename RenderSurfaceLayerListType>
...@@ -100,6 +105,7 @@ class CC_EXPORT LayerTreeHostCommon { ...@@ -100,6 +105,7 @@ class CC_EXPORT LayerTreeHostCommon {
private: private:
const gfx::Transform identity_transform_; const gfx::Transform identity_transform_;
PropertyTrees property_trees;
}; };
typedef CalcDrawPropsInputs<Layer, RenderSurfaceLayerList> typedef CalcDrawPropsInputs<Layer, RenderSurfaceLayerList>
...@@ -251,7 +257,8 @@ LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType, ...@@ -251,7 +257,8 @@ LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType,
false, false,
true, true,
render_surface_layer_list, render_surface_layer_list,
0) { 0,
&property_trees) {
DCHECK(root_layer); DCHECK(root_layer);
DCHECK(render_surface_layer_list); DCHECK(render_surface_layer_list);
} }
...@@ -279,7 +286,8 @@ LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType, ...@@ -279,7 +286,8 @@ LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType,
false, false,
true, true,
render_surface_layer_list, render_surface_layer_list,
0) { 0,
&property_trees) {
DCHECK(root_layer); DCHECK(root_layer);
DCHECK(render_surface_layer_list); DCHECK(render_surface_layer_list);
} }
......
...@@ -89,6 +89,7 @@ class CalcDrawPropsMainTest : public LayerTreeHostCommonPerfTest { ...@@ -89,6 +89,7 @@ class CalcDrawPropsMainTest : public LayerTreeHostCommonPerfTest {
bool verify_property_trees = false; bool verify_property_trees = false;
int max_texture_size = 8096; int max_texture_size = 8096;
RenderSurfaceLayerList update_list; RenderSurfaceLayerList update_list;
PropertyTrees property_trees;
LayerTreeHostCommon::CalcDrawPropsMainInputs inputs( LayerTreeHostCommon::CalcDrawPropsMainInputs inputs(
layer_tree_host()->root_layer(), layer_tree_host()->root_layer(),
layer_tree_host()->device_viewport_size(), gfx::Transform(), layer_tree_host()->device_viewport_size(), gfx::Transform(),
...@@ -103,7 +104,7 @@ class CalcDrawPropsMainTest : public LayerTreeHostCommonPerfTest { ...@@ -103,7 +104,7 @@ class CalcDrawPropsMainTest : public LayerTreeHostCommonPerfTest {
layer_tree_host() layer_tree_host()
->settings() ->settings()
.layer_transforms_should_scale_layer_contents, .layer_transforms_should_scale_layer_contents,
verify_property_trees, &update_list, 0); verify_property_trees, &update_list, 0, &property_trees);
LayerTreeHostCommon::CalculateDrawProperties(&inputs); LayerTreeHostCommon::CalculateDrawProperties(&inputs);
timer_.NextLap(); timer_.NextLap();
...@@ -144,6 +145,7 @@ class CalcDrawPropsImplTest : public LayerTreeHostCommonPerfTest { ...@@ -144,6 +145,7 @@ class CalcDrawPropsImplTest : public LayerTreeHostCommonPerfTest {
LayerTreeImpl* active_tree, LayerTreeImpl* active_tree,
LayerTreeHostImpl* host_impl) { LayerTreeHostImpl* host_impl) {
LayerImplList update_list; LayerImplList update_list;
PropertyTrees property_trees;
bool verify_property_trees = false; bool verify_property_trees = false;
LayerTreeHostCommon::CalcDrawPropsImplInputs inputs( LayerTreeHostCommon::CalcDrawPropsImplInputs inputs(
active_tree->root_layer(), active_tree->DrawViewportSize(), active_tree->root_layer(), active_tree->DrawViewportSize(),
...@@ -156,7 +158,7 @@ class CalcDrawPropsImplTest : public LayerTreeHostCommonPerfTest { ...@@ -156,7 +158,7 @@ class CalcDrawPropsImplTest : public LayerTreeHostCommonPerfTest {
host_impl->settings().layers_always_allowed_lcd_text, host_impl->settings().layers_always_allowed_lcd_text,
can_render_to_separate_surface, can_render_to_separate_surface,
host_impl->settings().layer_transforms_should_scale_layer_contents, host_impl->settings().layer_transforms_should_scale_layer_contents,
verify_property_trees, &update_list, 0); verify_property_trees, &update_list, 0, &property_trees);
LayerTreeHostCommon::CalculateDrawProperties(&inputs); LayerTreeHostCommon::CalculateDrawProperties(&inputs);
} }
}; };
......
...@@ -539,6 +539,10 @@ bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) { ...@@ -539,6 +539,10 @@ bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) {
DRAW_MODE_RESOURCELESS_SOFTWARE); DRAW_MODE_RESOURCELESS_SOFTWARE);
++render_surface_layer_list_id_; ++render_surface_layer_list_id_;
// TODO(enne): Synchronize property trees to compositor thread and use
// them here.
PropertyTrees* property_trees = nullptr;
LayerTreeHostCommon::CalcDrawPropsImplInputs inputs( LayerTreeHostCommon::CalcDrawPropsImplInputs inputs(
root_layer(), DrawViewportSize(), root_layer(), DrawViewportSize(),
layer_tree_host_impl_->DrawTransform(), device_scale_factor(), layer_tree_host_impl_->DrawTransform(), device_scale_factor(),
...@@ -548,8 +552,8 @@ bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) { ...@@ -548,8 +552,8 @@ bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) {
settings().can_use_lcd_text, settings().layers_always_allowed_lcd_text, settings().can_use_lcd_text, settings().layers_always_allowed_lcd_text,
can_render_to_separate_surface, can_render_to_separate_surface,
settings().layer_transforms_should_scale_layer_contents, settings().layer_transforms_should_scale_layer_contents,
settings().verify_property_trees, settings().verify_property_trees, &render_surface_layer_list_,
&render_surface_layer_list_, render_surface_layer_list_id_); render_surface_layer_list_id_, property_trees);
LayerTreeHostCommon::CalculateDrawProperties(&inputs); LayerTreeHostCommon::CalculateDrawProperties(&inputs);
} }
......
...@@ -197,6 +197,13 @@ class CC_EXPORT ClipTree final : public PropertyTree<ClipNode> {}; ...@@ -197,6 +197,13 @@ class CC_EXPORT ClipTree final : public PropertyTree<ClipNode> {};
class CC_EXPORT OpacityTree final : public PropertyTree<OpacityNode> {}; class CC_EXPORT OpacityTree final : public PropertyTree<OpacityNode> {};
class CC_EXPORT PropertyTrees final {
public:
TransformTree transform_tree;
OpacityTree opacity_tree;
ClipTree clip_tree;
};
} // namespace cc } // namespace cc
#endif // CC_TREES_PROPERTY_TREE_H_ #endif // CC_TREES_PROPERTY_TREE_H_
...@@ -318,13 +318,11 @@ void PropertyTreeBuilder::BuildPropertyTrees( ...@@ -318,13 +318,11 @@ void PropertyTreeBuilder::BuildPropertyTrees(
float device_scale_factor, float device_scale_factor,
const gfx::Rect& viewport, const gfx::Rect& viewport,
const gfx::Transform& device_transform, const gfx::Transform& device_transform,
TransformTree* transform_tree, PropertyTrees* property_trees) {
ClipTree* clip_tree,
OpacityTree* opacity_tree) {
DataForRecursion data_for_recursion; DataForRecursion data_for_recursion;
data_for_recursion.transform_tree = transform_tree; data_for_recursion.transform_tree = &property_trees->transform_tree;
data_for_recursion.clip_tree = clip_tree; data_for_recursion.clip_tree = &property_trees->clip_tree;
data_for_recursion.opacity_tree = opacity_tree; data_for_recursion.opacity_tree = &property_trees->opacity_tree;
data_for_recursion.transform_tree_parent = nullptr; data_for_recursion.transform_tree_parent = nullptr;
data_for_recursion.transform_fixed_parent = nullptr; data_for_recursion.transform_fixed_parent = nullptr;
data_for_recursion.render_target = root_layer; data_for_recursion.render_target = root_layer;
...@@ -340,7 +338,8 @@ void PropertyTreeBuilder::BuildPropertyTrees( ...@@ -340,7 +338,8 @@ void PropertyTreeBuilder::BuildPropertyTrees(
ClipNode root_clip; ClipNode root_clip;
root_clip.data.clip = viewport; root_clip.data.clip = viewport;
root_clip.data.transform_id = 0; root_clip.data.transform_id = 0;
data_for_recursion.clip_tree_parent = clip_tree->Insert(root_clip, 0); data_for_recursion.clip_tree_parent =
data_for_recursion.clip_tree->Insert(root_clip, 0);
BuildPropertyTreesInternal(root_layer, data_for_recursion); BuildPropertyTreesInternal(root_layer, data_for_recursion);
} }
......
...@@ -24,9 +24,7 @@ class PropertyTreeBuilder { ...@@ -24,9 +24,7 @@ class PropertyTreeBuilder {
float device_scale_factor, float device_scale_factor,
const gfx::Rect& viewport, const gfx::Rect& viewport,
const gfx::Transform& device_transform, const gfx::Transform& device_transform,
TransformTree* transform_tree, PropertyTrees* property_trees);
ClipTree* clip_tree,
OpacityTree* opacity_tree);
}; };
} // namespace cc } // namespace cc
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment