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