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

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

Issue 2834123002: cc: Replace render surface layer list with a render surface list (Closed)
Patch Set: Address review comments Created 3 years, 7 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
« no previous file with comments | « cc/trees/layer_tree_host_common.h ('k') | cc/trees/layer_tree_host_common_perftest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 float device_scale_factor, 72 float device_scale_factor,
73 float page_scale_factor, 73 float page_scale_factor,
74 const LayerImpl* page_scale_layer, 74 const LayerImpl* page_scale_layer,
75 const LayerImpl* inner_viewport_scroll_layer, 75 const LayerImpl* inner_viewport_scroll_layer,
76 const LayerImpl* outer_viewport_scroll_layer, 76 const LayerImpl* outer_viewport_scroll_layer,
77 const gfx::Vector2dF& elastic_overscroll, 77 const gfx::Vector2dF& elastic_overscroll,
78 const LayerImpl* elastic_overscroll_application_layer, 78 const LayerImpl* elastic_overscroll_application_layer,
79 int max_texture_size, 79 int max_texture_size,
80 bool can_render_to_separate_surface, 80 bool can_render_to_separate_surface,
81 bool can_adjust_raster_scales, 81 bool can_adjust_raster_scales,
82 LayerImplList* render_surface_layer_list, 82 RenderSurfaceList* render_surface_list,
83 PropertyTrees* property_trees) 83 PropertyTrees* property_trees)
84 : root_layer(root_layer), 84 : root_layer(root_layer),
85 device_viewport_size(device_viewport_size), 85 device_viewport_size(device_viewport_size),
86 device_transform(device_transform), 86 device_transform(device_transform),
87 device_scale_factor(device_scale_factor), 87 device_scale_factor(device_scale_factor),
88 page_scale_factor(page_scale_factor), 88 page_scale_factor(page_scale_factor),
89 page_scale_layer(page_scale_layer), 89 page_scale_layer(page_scale_layer),
90 inner_viewport_scroll_layer(inner_viewport_scroll_layer), 90 inner_viewport_scroll_layer(inner_viewport_scroll_layer),
91 outer_viewport_scroll_layer(outer_viewport_scroll_layer), 91 outer_viewport_scroll_layer(outer_viewport_scroll_layer),
92 elastic_overscroll(elastic_overscroll), 92 elastic_overscroll(elastic_overscroll),
93 elastic_overscroll_application_layer( 93 elastic_overscroll_application_layer(
94 elastic_overscroll_application_layer), 94 elastic_overscroll_application_layer),
95 max_texture_size(max_texture_size), 95 max_texture_size(max_texture_size),
96 can_render_to_separate_surface(can_render_to_separate_surface), 96 can_render_to_separate_surface(can_render_to_separate_surface),
97 can_adjust_raster_scales(can_adjust_raster_scales), 97 can_adjust_raster_scales(can_adjust_raster_scales),
98 render_surface_layer_list(render_surface_layer_list), 98 render_surface_list(render_surface_list),
99 property_trees(property_trees) {} 99 property_trees(property_trees) {}
100 100
101 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting:: 101 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting::
102 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer, 102 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer,
103 const gfx::Size& device_viewport_size, 103 const gfx::Size& device_viewport_size,
104 const gfx::Transform& device_transform, 104 const gfx::Transform& device_transform,
105 float device_scale_factor, 105 float device_scale_factor,
106 LayerImplList* render_surface_layer_list) 106 RenderSurfaceList* render_surface_list)
107 : CalcDrawPropsImplInputs(root_layer, 107 : CalcDrawPropsImplInputs(root_layer,
108 device_viewport_size, 108 device_viewport_size,
109 device_transform, 109 device_transform,
110 device_scale_factor, 110 device_scale_factor,
111 1.f, 111 1.f,
112 NULL, 112 NULL,
113 NULL, 113 NULL,
114 NULL, 114 NULL,
115 gfx::Vector2dF(), 115 gfx::Vector2dF(),
116 NULL, 116 NULL,
117 std::numeric_limits<int>::max() / 2, 117 std::numeric_limits<int>::max() / 2,
118 true, 118 true,
119 false, 119 false,
120 render_surface_layer_list, 120 render_surface_list,
121 GetPropertyTrees(root_layer)) { 121 GetPropertyTrees(root_layer)) {
122 DCHECK(root_layer); 122 DCHECK(root_layer);
123 DCHECK(render_surface_layer_list); 123 DCHECK(render_surface_list);
124 } 124 }
125 125
126 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting:: 126 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting::
127 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer, 127 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer,
128 const gfx::Size& device_viewport_size, 128 const gfx::Size& device_viewport_size,
129 const gfx::Transform& device_transform, 129 const gfx::Transform& device_transform,
130 LayerImplList* render_surface_layer_list) 130 RenderSurfaceList* render_surface_list)
131 : CalcDrawPropsImplInputsForTesting(root_layer, 131 : CalcDrawPropsImplInputsForTesting(root_layer,
132 device_viewport_size, 132 device_viewport_size,
133 device_transform, 133 device_transform,
134 1.f, 134 1.f,
135 render_surface_layer_list) {} 135 render_surface_list) {}
136 136
137 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting:: 137 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting::
138 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer, 138 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer,
139 const gfx::Size& device_viewport_size, 139 const gfx::Size& device_viewport_size,
140 LayerImplList* render_surface_layer_list) 140 RenderSurfaceList* render_surface_list)
141 : CalcDrawPropsImplInputsForTesting(root_layer, 141 : CalcDrawPropsImplInputsForTesting(root_layer,
142 device_viewport_size, 142 device_viewport_size,
143 gfx::Transform(), 143 gfx::Transform(),
144 1.f, 144 1.f,
145 render_surface_layer_list) {} 145 render_surface_list) {}
146 146
147 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting:: 147 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting::
148 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer, 148 CalcDrawPropsImplInputsForTesting(LayerImpl* root_layer,
149 const gfx::Size& device_viewport_size, 149 const gfx::Size& device_viewport_size,
150 float device_scale_factor, 150 float device_scale_factor,
151 LayerImplList* render_surface_layer_list) 151 RenderSurfaceList* render_surface_list)
152 : CalcDrawPropsImplInputsForTesting(root_layer, 152 : CalcDrawPropsImplInputsForTesting(root_layer,
153 device_viewport_size, 153 device_viewport_size,
154 gfx::Transform(), 154 gfx::Transform(),
155 device_scale_factor, 155 device_scale_factor,
156 render_surface_layer_list) {} 156 render_surface_list) {}
157 157
158 LayerTreeHostCommon::ScrollUpdateInfo::ScrollUpdateInfo() 158 LayerTreeHostCommon::ScrollUpdateInfo::ScrollUpdateInfo()
159 : layer_id(Layer::INVALID_ID) {} 159 : layer_id(Layer::INVALID_ID) {}
160 160
161 bool LayerTreeHostCommon::ScrollUpdateInfo::operator==( 161 bool LayerTreeHostCommon::ScrollUpdateInfo::operator==(
162 const LayerTreeHostCommon::ScrollUpdateInfo& other) const { 162 const LayerTreeHostCommon::ScrollUpdateInfo& other) const {
163 return layer_id == other.layer_id && scroll_delta == other.scroll_delta; 163 return layer_id == other.layer_id && scroll_delta == other.scroll_delta;
164 } 164 }
165 165
166 LayerTreeHostCommon::ScrollbarsUpdateInfo::ScrollbarsUpdateInfo() 166 LayerTreeHostCommon::ScrollbarsUpdateInfo::ScrollbarsUpdateInfo()
(...skipping 26 matching lines...) Expand all
193 } 193 }
194 } 194 }
195 195
196 static inline void ClearMaskLayersAreDrawnRenderSurfaceLayerListMembers( 196 static inline void ClearMaskLayersAreDrawnRenderSurfaceLayerListMembers(
197 RenderSurfaceImpl* surface) { 197 RenderSurfaceImpl* surface) {
198 LayerImpl* mask_layer = surface->MaskLayer(); 198 LayerImpl* mask_layer = surface->MaskLayer();
199 if (mask_layer) 199 if (mask_layer)
200 mask_layer->set_is_drawn_render_surface_layer_list_member(false); 200 mask_layer->set_is_drawn_render_surface_layer_list_member(false);
201 } 201 }
202 202
203 static inline void ClearIsDrawnRenderSurfaceLayerListMember(
204 LayerImplList* layer_list,
205 ScrollTree* scroll_tree) {
206 for (LayerImpl* layer : *layer_list)
207 layer->set_is_drawn_render_surface_layer_list_member(false);
208 }
209
210 static bool CdpPerfTracingEnabled() { 203 static bool CdpPerfTracingEnabled() {
211 bool tracing_enabled; 204 bool tracing_enabled;
212 TRACE_EVENT_CATEGORY_GROUP_ENABLED("cdp.perf", &tracing_enabled); 205 TRACE_EVENT_CATEGORY_GROUP_ENABLED("cdp.perf", &tracing_enabled);
213 return tracing_enabled; 206 return tracing_enabled;
214 } 207 }
215 208
216 static float TranslationFromActiveTreeLayerScreenSpaceTransform( 209 static float TranslationFromActiveTreeLayerScreenSpaceTransform(
217 LayerImpl* pending_tree_layer) { 210 LayerImpl* pending_tree_layer) {
218 LayerTreeImpl* layer_tree_impl = pending_tree_layer->layer_tree_impl(); 211 LayerTreeImpl* layer_tree_impl = pending_tree_layer->layer_tree_impl();
219 if (layer_tree_impl) { 212 if (layer_tree_impl) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 } 263 }
271 } 264 }
272 return jitter; 265 return jitter;
273 } 266 }
274 267
275 enum PropertyTreeOption { 268 enum PropertyTreeOption {
276 BUILD_PROPERTY_TREES_IF_NEEDED, 269 BUILD_PROPERTY_TREES_IF_NEEDED,
277 DONT_BUILD_PROPERTY_TREES 270 DONT_BUILD_PROPERTY_TREES
278 }; 271 };
279 272
280 static void ComputeInitialRenderSurfaceLayerList( 273 static void AddSurfaceToRenderSurfaceList(
274 RenderSurfaceImpl* render_surface,
275 RenderSurfaceList* render_surface_list,
276 PropertyTrees* property_trees) {
277 // |render_surface| must appear after its target, so first make sure its
278 // target is in the list.
279 RenderSurfaceImpl* target = render_surface->render_target();
280 bool is_root =
281 render_surface->EffectTreeIndex() == EffectTree::kContentsRootNodeId;
282 if (!is_root && !target->is_render_surface_list_member()) {
283 AddSurfaceToRenderSurfaceList(target, render_surface_list, property_trees);
284 }
285 render_surface->ClearAccumulatedContentRect();
286 render_surface_list->push_back(render_surface);
287 render_surface->set_is_render_surface_list_member(true);
288 if (is_root) {
289 // The root surface does not contribute to any other surface, it has no
290 // target.
291 render_surface->set_contributes_to_drawn_surface(false);
292 } else {
293 bool contributes_to_drawn_surface =
294 property_trees->effect_tree.ContributesToDrawnSurface(
295 render_surface->EffectTreeIndex());
296 render_surface->set_contributes_to_drawn_surface(
297 contributes_to_drawn_surface);
298 }
299
300 draw_property_utils::ComputeSurfaceDrawProperties(property_trees,
301 render_surface);
302
303 // Ignore occlusion from outside the surface when surface contents need to be
304 // fully drawn. Layers with copy-request need to be complete. We could be
305 // smarter about layers with filters that move pixels and exclude regions
306 // where both layers and the filters are occluded, but this seems like
307 // overkill.
308 // TODO(senorblanco): make this smarter for the SkImageFilter case (check for
309 // pixel-moving filters)
310 const FilterOperations& filters = render_surface->Filters();
311 bool is_occlusion_immune = render_surface->HasCopyRequest() ||
312 filters.HasReferenceFilter() ||
313 filters.HasFilterThatMovesPixels();
314 if (is_occlusion_immune) {
315 render_surface->SetNearestOcclusionImmuneAncestor(render_surface);
316 } else if (is_root) {
317 render_surface->SetNearestOcclusionImmuneAncestor(nullptr);
318 } else {
319 render_surface->SetNearestOcclusionImmuneAncestor(
320 render_surface->render_target()->nearest_occlusion_immune_ancestor());
321 }
322 }
323
324 static void ComputeInitialRenderSurfaceList(
281 LayerTreeImpl* layer_tree_impl, 325 LayerTreeImpl* layer_tree_impl,
282 PropertyTrees* property_trees, 326 PropertyTrees* property_trees,
283 LayerImplList* render_surface_layer_list, 327 RenderSurfaceList* render_surface_list,
284 bool can_render_to_separate_surface) { 328 bool can_render_to_separate_surface) {
285 // Add all non-skipped surfaces to the initial render surface layer list. Add 329 EffectTree& effect_tree = property_trees->effect_tree;
286 // all non-skipped layers to the layer list of their target surface, and 330 for (int i = EffectTree::kContentsRootNodeId;
287 // add their content rect to their target surface's accumulated content rect. 331 i < static_cast<int>(effect_tree.size()); ++i) {
288 for (LayerImpl* layer : *layer_tree_impl) { 332 if (RenderSurfaceImpl* render_surface = effect_tree.GetRenderSurface(i)) {
289 RenderSurfaceImpl* render_surface = layer->GetRenderSurface(); 333 render_surface->set_is_render_surface_list_member(false);
290 if (render_surface) { 334 render_surface->reset_num_contributors();
291 render_surface->ClearLayerLists();
292 ClearMaskLayersAreDrawnRenderSurfaceLayerListMembers(render_surface); 335 ClearMaskLayersAreDrawnRenderSurfaceLayerListMembers(render_surface);
293 } 336 }
337 }
338
339 RenderSurfaceImpl* root_surface =
340 effect_tree.GetRenderSurface(EffectTree::kContentsRootNodeId);
341 // The root surface always gets added to the render surface list.
342 AddSurfaceToRenderSurfaceList(root_surface, render_surface_list,
343 property_trees);
344 // For all non-skipped layers, add their target to the render surface list if
345 // it's not already been added, and add their content rect to the target
346 // surface's accumulated content rect.
347 for (LayerImpl* layer : *layer_tree_impl) {
294 layer->set_is_drawn_render_surface_layer_list_member(false); 348 layer->set_is_drawn_render_surface_layer_list_member(false);
295 349
296 bool is_root = layer_tree_impl->IsRootLayer(layer); 350 bool is_root = layer_tree_impl->IsRootLayer(layer);
297 bool skip_layer = !is_root && draw_property_utils::LayerShouldBeSkipped( 351 bool skip_layer = !is_root && draw_property_utils::LayerShouldBeSkipped(
298 layer, property_trees->transform_tree, 352 layer, property_trees->transform_tree,
299 property_trees->effect_tree); 353 property_trees->effect_tree);
300 if (skip_layer) 354 if (skip_layer)
301 continue; 355 continue;
302 356
303 bool render_to_separate_surface =
304 is_root || (can_render_to_separate_surface && render_surface);
305
306 if (render_to_separate_surface) {
307 DCHECK(render_surface);
308 DCHECK(layer->render_target() == render_surface);
309 render_surface->ClearAccumulatedContentRect();
310 render_surface_layer_list->push_back(layer);
311 if (is_root) {
312 // The root surface does not contribute to any other surface, it has no
313 // target.
314 render_surface->set_contributes_to_drawn_surface(false);
315 } else {
316 render_surface->render_target()->layer_list().push_back(layer);
317 bool contributes_to_drawn_surface =
318 property_trees->effect_tree.ContributesToDrawnSurface(
319 layer->effect_tree_index());
320 render_surface->set_contributes_to_drawn_surface(
321 contributes_to_drawn_surface);
322 }
323
324 draw_property_utils::ComputeSurfaceDrawProperties(property_trees,
325 render_surface);
326
327 // Ignore occlusion from outside the surface when surface contents need to
328 // be fully drawn. Layers with copy-request need to be complete. We could
329 // be smarter about layers with filters that move pixels and exclude
330 // regions where both layers and the filters are occluded, but this seems
331 // like overkill.
332 // TODO(senorblanco): make this smarter for the SkImageFilter case (check
333 // for pixel-moving filters)
334 const FilterOperations& filters = render_surface->Filters();
335 bool is_occlusion_immune = render_surface->HasCopyRequest() ||
336 filters.HasReferenceFilter() ||
337 filters.HasFilterThatMovesPixels();
338 if (is_occlusion_immune) {
339 render_surface->SetNearestOcclusionImmuneAncestor(render_surface);
340 } else if (is_root) {
341 render_surface->SetNearestOcclusionImmuneAncestor(nullptr);
342 } else {
343 render_surface->SetNearestOcclusionImmuneAncestor(
344 render_surface->render_target()
345 ->nearest_occlusion_immune_ancestor());
346 }
347 }
348 bool layer_is_drawn = 357 bool layer_is_drawn =
349 property_trees->effect_tree.Node(layer->effect_tree_index())->is_drawn; 358 property_trees->effect_tree.Node(layer->effect_tree_index())->is_drawn;
350 bool layer_should_be_drawn = draw_property_utils::LayerNeedsUpdate( 359 bool layer_should_be_drawn = draw_property_utils::LayerNeedsUpdate(
351 layer, layer_is_drawn, property_trees); 360 layer, layer_is_drawn, property_trees);
352 if (!layer_should_be_drawn) 361 if (!layer_should_be_drawn)
353 continue; 362 continue;
354 363
364 RenderSurfaceImpl* render_target = layer->render_target();
365 if (!render_target->is_render_surface_list_member()) {
366 AddSurfaceToRenderSurfaceList(render_target, render_surface_list,
367 property_trees);
368 }
369
355 layer->set_is_drawn_render_surface_layer_list_member(true); 370 layer->set_is_drawn_render_surface_layer_list_member(true);
356 layer->render_target()->layer_list().push_back(layer);
357 371
358 // The layer contributes its drawable content rect to its render target. 372 // The layer contributes its drawable content rect to its render target.
359 layer->render_target()->AccumulateContentRectFromContributingLayer(layer); 373 render_target->AccumulateContentRectFromContributingLayer(layer);
374 render_target->increment_num_contributors();
360 } 375 }
361 } 376 }
362 377
363 static void ComputeSurfaceContentRects(LayerTreeImpl* layer_tree_impl, 378 static void ComputeSurfaceContentRects(LayerTreeImpl* layer_tree_impl,
364 PropertyTrees* property_trees, 379 PropertyTrees* property_trees,
365 LayerImplList* render_surface_layer_list, 380 RenderSurfaceList* render_surface_list,
366 int max_texture_size) { 381 int max_texture_size) {
367 // Walk the list backwards, accumulating each surface's content rect into its 382 // Walk the list backwards, accumulating each surface's content rect into its
368 // target's content rect. 383 // target's content rect.
369 for (LayerImpl* layer : base::Reversed(*render_surface_layer_list)) { 384 for (RenderSurfaceImpl* render_surface :
370 RenderSurfaceImpl* render_surface = layer->GetRenderSurface(); 385 base::Reversed(*render_surface_list)) {
371 if (layer_tree_impl->IsRootLayer(layer)) { 386 if (render_surface->EffectTreeIndex() == EffectTree::kContentsRootNodeId) {
372 // The root layer's surface content rect is always the entire viewport. 387 // The root surface's content rect is always the entire viewport.
373 render_surface->SetContentRectToViewport(); 388 render_surface->SetContentRectToViewport();
374 continue; 389 continue;
375 } 390 }
376 391
377 // Now all contributing drawable content rect has been accumulated to this 392 // Now all contributing drawable content rect has been accumulated to this
378 // render surface, calculate the content rect. 393 // render surface, calculate the content rect.
379 render_surface->CalculateContentRectFromAccumulatedContentRect( 394 render_surface->CalculateContentRectFromAccumulatedContentRect(
380 max_texture_size); 395 max_texture_size);
381 396
382 // Now the render surface's content rect is calculated correctly, it could 397 // Now the render surface's content rect is calculated correctly, it could
383 // contribute to its render target. 398 // contribute to its render target.
384 render_surface->render_target() 399 RenderSurfaceImpl* render_target = render_surface->render_target();
385 ->AccumulateContentRectFromContributingRenderSurface(render_surface); 400 DCHECK(render_target->is_render_surface_list_member());
401 render_target->AccumulateContentRectFromContributingRenderSurface(
402 render_surface);
403 render_target->increment_num_contributors();
386 } 404 }
387 } 405 }
388 406
389 static void ComputeListOfNonEmptySurfaces(LayerTreeImpl* layer_tree_impl, 407 static void ComputeListOfNonEmptySurfaces(
390 PropertyTrees* property_trees, 408 LayerTreeImpl* layer_tree_impl,
391 LayerImplList* initial_surface_list, 409 PropertyTrees* property_trees,
392 LayerImplList* final_surface_list) { 410 RenderSurfaceList* initial_surface_list,
411 RenderSurfaceList* final_surface_list) {
393 // Walk the initial surface list forwards. The root surface and each 412 // Walk the initial surface list forwards. The root surface and each
394 // surface with a non-empty content rect go into the final render surface 413 // surface with a non-empty content rect go into the final render surface
395 // layer list. Surfaces with empty content rects or whose target isn't in 414 // layer list. Surfaces with empty content rects or whose target isn't in
396 // the final list do not get added to the final list. 415 // the final list do not get added to the final list.
397 for (LayerImpl* layer : *initial_surface_list) { 416 bool removed_surface = false;
398 bool is_root = layer_tree_impl->IsRootLayer(layer); 417 for (RenderSurfaceImpl* surface : *initial_surface_list) {
399 RenderSurfaceImpl* surface = layer->GetRenderSurface(); 418 bool is_root =
419 surface->EffectTreeIndex() == EffectTree::kContentsRootNodeId;
400 RenderSurfaceImpl* target_surface = surface->render_target(); 420 RenderSurfaceImpl* target_surface = surface->render_target();
401 if (!is_root && (surface->content_rect().IsEmpty() || 421 if (!is_root && (surface->content_rect().IsEmpty() ||
402 target_surface->layer_list().empty())) { 422 !target_surface->is_render_surface_list_member())) {
403 ClearIsDrawnRenderSurfaceLayerListMember(&surface->layer_list(), 423 surface->set_is_render_surface_list_member(false);
404 &property_trees->scroll_tree); 424 removed_surface = true;
405 surface->ClearLayerLists(); 425 target_surface->decrement_num_contributors();
406 LayerImplList& target_list = target_surface->layer_list();
407 auto it = std::find(target_list.begin(), target_list.end(), layer);
408 if (it != target_list.end()) {
409 target_list.erase(it);
410 // This surface has an empty content rect. If its target's layer list
411 // had no other layers, then its target would also have had an empty
412 // content rect, meaning it would have been removed and had its layer
413 // list cleared when we visited it, unless the target surface is the
414 // root surface.
415 DCHECK(!target_surface->layer_list().empty() ||
416 target_surface->render_target() == target_surface);
417 }
418 continue; 426 continue;
419 } 427 }
420 SetMaskLayersAreDrawnRenderSurfaceLayerListMembers(surface, property_trees); 428 SetMaskLayersAreDrawnRenderSurfaceLayerListMembers(surface, property_trees);
421 final_surface_list->push_back(layer); 429 final_surface_list->push_back(surface);
430 }
431 if (removed_surface) {
432 for (LayerImpl* layer : *layer_tree_impl) {
433 if (layer->is_drawn_render_surface_layer_list_member()) {
434 RenderSurfaceImpl* render_target = layer->render_target();
435 if (!render_target->is_render_surface_list_member()) {
436 layer->set_is_drawn_render_surface_layer_list_member(false);
437 render_target->decrement_num_contributors();
438 }
439 }
440 }
422 } 441 }
423 } 442 }
424 443
425 static void CalculateRenderSurfaceLayerList( 444 static void CalculateRenderSurfaceLayerList(
426 LayerTreeImpl* layer_tree_impl, 445 LayerTreeImpl* layer_tree_impl,
427 PropertyTrees* property_trees, 446 PropertyTrees* property_trees,
428 LayerImplList* render_surface_layer_list, 447 RenderSurfaceList* render_surface_list,
429 const bool can_render_to_separate_surface, 448 const bool can_render_to_separate_surface,
430 const int max_texture_size) { 449 const int max_texture_size) {
431 // This calculates top level Render Surface Layer List, and Layer List for all 450 RenderSurfaceList initial_render_surface_list;
432 // Render Surfaces.
433 // |render_surface_layer_list| is the top level RenderSurfaceLayerList.
434 451
435 LayerImplList initial_render_surface_list; 452 // First compute a list that might include surfaces that later turn out to
436
437 // First compute an RSLL that might include surfaces that later turn out to
438 // have an empty content rect. After surface content rects are computed, 453 // have an empty content rect. After surface content rects are computed,
439 // produce a final RSLL that omits empty surfaces. 454 // produce a final list that omits empty surfaces.
440 ComputeInitialRenderSurfaceLayerList(layer_tree_impl, property_trees, 455 ComputeInitialRenderSurfaceList(layer_tree_impl, property_trees,
441 &initial_render_surface_list, 456 &initial_render_surface_list,
442 can_render_to_separate_surface); 457 can_render_to_separate_surface);
443 ComputeSurfaceContentRects(layer_tree_impl, property_trees, 458 ComputeSurfaceContentRects(layer_tree_impl, property_trees,
444 &initial_render_surface_list, max_texture_size); 459 &initial_render_surface_list, max_texture_size);
445 ComputeListOfNonEmptySurfaces(layer_tree_impl, property_trees, 460 ComputeListOfNonEmptySurfaces(layer_tree_impl, property_trees,
446 &initial_render_surface_list, 461 &initial_render_surface_list,
447 render_surface_layer_list); 462 render_surface_list);
448 } 463 }
449 464
450 void CalculateDrawPropertiesInternal( 465 void CalculateDrawPropertiesInternal(
451 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs, 466 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs,
452 PropertyTreeOption property_tree_option) { 467 PropertyTreeOption property_tree_option) {
453 inputs->render_surface_layer_list->clear(); 468 inputs->render_surface_list->clear();
454 469
455 const bool should_measure_property_tree_performance = 470 const bool should_measure_property_tree_performance =
456 property_tree_option == BUILD_PROPERTY_TREES_IF_NEEDED; 471 property_tree_option == BUILD_PROPERTY_TREES_IF_NEEDED;
457 472
458 LayerImplList visible_layer_list; 473 LayerImplList visible_layer_list;
459 switch (property_tree_option) { 474 switch (property_tree_option) {
460 case BUILD_PROPERTY_TREES_IF_NEEDED: { 475 case BUILD_PROPERTY_TREES_IF_NEEDED: {
461 // The translation from layer to property trees is an intermediate 476 // The translation from layer to property trees is an intermediate
462 // state. We will eventually get these data passed directly to the 477 // state. We will eventually get these data passed directly to the
463 // compositor. 478 // compositor.
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 draw_property_utils::FindLayersThatNeedUpdates( 553 draw_property_utils::FindLayersThatNeedUpdates(
539 inputs->root_layer->layer_tree_impl(), inputs->property_trees, 554 inputs->root_layer->layer_tree_impl(), inputs->property_trees,
540 &visible_layer_list); 555 &visible_layer_list);
541 DCHECK(inputs->can_render_to_separate_surface == 556 DCHECK(inputs->can_render_to_separate_surface ==
542 inputs->property_trees->non_root_surfaces_enabled); 557 inputs->property_trees->non_root_surfaces_enabled);
543 draw_property_utils::ComputeDrawPropertiesOfVisibleLayers( 558 draw_property_utils::ComputeDrawPropertiesOfVisibleLayers(
544 &visible_layer_list, inputs->property_trees); 559 &visible_layer_list, inputs->property_trees);
545 560
546 CalculateRenderSurfaceLayerList( 561 CalculateRenderSurfaceLayerList(
547 inputs->root_layer->layer_tree_impl(), inputs->property_trees, 562 inputs->root_layer->layer_tree_impl(), inputs->property_trees,
548 inputs->render_surface_layer_list, inputs->can_render_to_separate_surface, 563 inputs->render_surface_list, inputs->can_render_to_separate_surface,
549 inputs->max_texture_size); 564 inputs->max_texture_size);
550 565
551 if (should_measure_property_tree_performance) { 566 if (should_measure_property_tree_performance) {
552 TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), 567 TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"),
553 "LayerTreeHostCommon::CalculateDrawProperties"); 568 "LayerTreeHostCommon::CalculateDrawProperties");
554 } 569 }
555 570
556 // A root layer render_surface should always exist after 571 // A root layer render_surface should always exist after
557 // CalculateDrawProperties. 572 // CalculateDrawProperties.
558 DCHECK(inputs->root_layer->GetRenderSurface()); 573 DCHECK(inputs->root_layer->GetRenderSurface());
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 650
636 PropertyTrees* GetPropertyTrees(Layer* layer) { 651 PropertyTrees* GetPropertyTrees(Layer* layer) {
637 return layer->layer_tree_host()->property_trees(); 652 return layer->layer_tree_host()->property_trees();
638 } 653 }
639 654
640 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { 655 PropertyTrees* GetPropertyTrees(LayerImpl* layer) {
641 return layer->layer_tree_impl()->property_trees(); 656 return layer->layer_tree_impl()->property_trees();
642 } 657 }
643 658
644 } // namespace cc 659 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_common.h ('k') | cc/trees/layer_tree_host_common_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698