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

Unified Diff: cc/trees/layer_tree_host_common.cc

Issue 1868003002: cc: Move RenderTarget Information to Effect Tree (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: cc/trees/layer_tree_host_common.cc
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index fd636302fc6ae8ebfd21c4c7b5d988f0157f9324..ddfcf1da4d7d6651622a82a07dd8d0da7c730eff 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -527,51 +527,6 @@ enum PropertyTreeOption {
DONT_BUILD_PROPERTY_TREES
};
-void CalculateRenderTarget(LayerImpl* layer,
- PropertyTrees* property_trees,
- bool subtree_visible_from_ancestor,
- bool can_render_to_separate_surface) {
- bool layer_is_drawn;
- DCHECK_GE(layer->effect_tree_index(), 0);
- layer_is_drawn = property_trees->effect_tree.Node(layer->effect_tree_index())
- ->data.is_drawn;
-
- // The root layer cannot be skipped.
- if (!IsRootLayer(layer) &&
- draw_property_utils::LayerShouldBeSkipped(
- layer, layer_is_drawn, property_trees->transform_tree)) {
- layer->draw_properties().render_target = nullptr;
- return;
- }
-
- bool render_to_separate_surface =
- IsRootLayer(layer) ||
- (can_render_to_separate_surface && layer->render_surface());
-
- if (render_to_separate_surface) {
- DCHECK(layer->render_surface()) << IsRootLayer(layer)
- << can_render_to_separate_surface
- << layer->has_render_surface();
- layer->draw_properties().render_target = layer;
-
- if (layer->mask_layer())
- layer->mask_layer()->draw_properties().render_target = layer;
-
- if (layer->replica_layer() && layer->replica_layer()->mask_layer())
- layer->replica_layer()->mask_layer()->draw_properties().render_target =
- layer;
-
- } else {
- DCHECK(!IsRootLayer(layer));
- layer->draw_properties().render_target = layer->parent()->render_target();
- }
- for (size_t i = 0; i < layer->children().size(); ++i) {
- CalculateRenderTarget(
- LayerTreeHostCommon::get_layer_as_raw_ptr(layer->children(), i),
- property_trees, layer_is_drawn, can_render_to_separate_surface);
- }
-}
-
void CalculateRenderSurfaceLayerList(
LayerImpl* layer,
PropertyTrees* property_trees,
@@ -608,7 +563,6 @@ void CalculateRenderSurfaceLayerList(
layer, layer_is_drawn, property_trees->transform_tree)) {
if (layer->render_surface())
layer->ClearRenderSurfaceLayerList();
- layer->draw_properties().render_target = nullptr;
return;
}
@@ -668,7 +622,7 @@ void CalculateRenderSurfaceLayerList(
// Clear the old accumulated content rect of surface.
if (render_to_separate_surface)
- layer->render_surface()->SetAccumulatedContentRect(gfx::Rect());
+ layer->render_surface()->ClearAccumulatedContentRect();
for (auto* child_layer : layer->children()) {
CalculateRenderSurfaceLayerList(
@@ -678,7 +632,8 @@ void CalculateRenderSurfaceLayerList(
max_texture_size);
// If the child is its own render target, then it has a render surface.
- if (child_layer->render_target() == child_layer &&
+ if (child_layer->has_render_surface() &&
+ child_layer->render_target() == child_layer->render_surface() &&
!child_layer->render_surface()->layer_list().empty() &&
!child_layer->render_surface()->content_rect().IsEmpty()) {
// This child will contribute its render surface, which means
@@ -705,14 +660,13 @@ void CalculateRenderSurfaceLayerList(
// of the layers that draw into the surface. If the render surface is clipped,
// it is also intersected with the render's surface clip rect.
if (!IsRootLayer(layer)) {
+ // Layer contriubutes its drawable content rect to its render target.
+ if (layer->DrawsContent())
+ layer->render_target()->AccumulateContentRectFromContributingLayer(layer);
+
if (render_to_separate_surface) {
gfx::Rect surface_content_rect =
layer->render_surface()->accumulated_content_rect();
- // If the owning layer of a render surface draws content, the content
- // rect of the render surface is expanded to include the drawable
- // content rect of the layer.
- if (layer->DrawsContent())
- surface_content_rect.Union(layer->drawable_content_rect());
if (!layer->replica_layer() && !layer->HasCopyRequest() &&
layer->render_surface()->is_clipped()) {
@@ -736,25 +690,13 @@ void CalculateRenderSurfaceLayerList(
surface_content_rect.set_height(
std::min(surface_content_rect.height(), max_texture_size));
layer->render_surface()->SetContentRect(surface_content_rect);
- }
- const LayerImpl* parent_target = layer->parent()->render_target();
- if (!IsRootLayer(parent_target)) {
- gfx::Rect surface_content_rect =
- parent_target->render_surface()->accumulated_content_rect();
- if (render_to_separate_surface) {
- // If the layer owns a surface, then the content rect is in the wrong
- // space. Instead, we will use the surface's DrawableContentRect which
- // is in target space as required. We also need to clip it with the
- // target's clip if the target is clipped.
- surface_content_rect.Union(gfx::ToEnclosedRect(
- layer->render_surface()->DrawableContentRect()));
- if (parent_target->is_clipped())
- surface_content_rect.Intersect(parent_target->clip_rect());
- } else if (layer->DrawsContent()) {
- surface_content_rect.Union(layer->drawable_content_rect());
- }
- parent_target->render_surface()->SetAccumulatedContentRect(
- surface_content_rect);
+
+ // Now the render surface's content rect is calculated correctly, it could
+ // contribute to its render target.
+ layer->render_surface()
+ ->render_target()
+ ->AccumulateContentRectFromContributingRenderSurface(
+ layer->render_surface());
}
} else {
// The root layer's surface content rect is always the entire viewport.
@@ -873,11 +815,6 @@ void CalculateDrawPropertiesInternal(
DCHECK(inputs->can_render_to_separate_surface ==
inputs->property_trees->non_root_surfaces_enabled);
const bool subtree_visible_from_ancestor = true;
- for (auto* layer : *inputs->root_layer->layer_tree_impl())
- layer->draw_properties().render_target = nullptr;
- CalculateRenderTarget(inputs->root_layer, inputs->property_trees,
- subtree_visible_from_ancestor,
- inputs->can_render_to_separate_surface);
for (LayerImpl* layer : visible_layer_list) {
draw_property_utils::ComputeLayerDrawProperties(
layer, inputs->property_trees, inputs->layers_always_allowed_lcd_text,

Powered by Google App Engine
This is Rietveld 408576698