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); |
ajuma
2017/04/27 23:35:23
LayerImpl::is_drawn_render_surface_layer_list_memb
| |
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(); |
jaydasika
2017/04/28 18:27:18
Can you DCHECK here for render_target->is_render_s
ajuma
2017/04/28 21:11:21
Done.
| |
385 ->AccumulateContentRectFromContributingRenderSurface(render_surface); | 400 render_target->AccumulateContentRectFromContributingRenderSurface( |
401 render_surface); | |
402 render_target->increment_num_contributors(); | |
386 } | 403 } |
387 } | 404 } |
388 | 405 |
389 static void ComputeListOfNonEmptySurfaces(LayerTreeImpl* layer_tree_impl, | 406 static void ComputeListOfNonEmptySurfaces( |
390 PropertyTrees* property_trees, | 407 LayerTreeImpl* layer_tree_impl, |
391 LayerImplList* initial_surface_list, | 408 PropertyTrees* property_trees, |
392 LayerImplList* final_surface_list) { | 409 RenderSurfaceList* initial_surface_list, |
410 RenderSurfaceList* final_surface_list) { | |
393 // Walk the initial surface list forwards. The root surface and each | 411 // 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 | 412 // 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 | 413 // 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. | 414 // the final list do not get added to the final list. |
397 for (LayerImpl* layer : *initial_surface_list) { | 415 bool removed_surface = false; |
398 bool is_root = layer_tree_impl->IsRootLayer(layer); | 416 for (RenderSurfaceImpl* surface : *initial_surface_list) { |
399 RenderSurfaceImpl* surface = layer->GetRenderSurface(); | 417 bool is_root = |
418 surface->EffectTreeIndex() == EffectTree::kContentsRootNodeId; | |
400 RenderSurfaceImpl* target_surface = surface->render_target(); | 419 RenderSurfaceImpl* target_surface = surface->render_target(); |
401 if (!is_root && (surface->content_rect().IsEmpty() || | 420 if (!is_root && (surface->content_rect().IsEmpty() || |
402 target_surface->layer_list().empty())) { | 421 !target_surface->is_render_surface_list_member())) { |
403 ClearIsDrawnRenderSurfaceLayerListMember(&surface->layer_list(), | 422 surface->set_is_render_surface_list_member(false); |
404 &property_trees->scroll_tree); | 423 removed_surface = true; |
405 surface->ClearLayerLists(); | 424 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; | 425 continue; |
419 } | 426 } |
420 SetMaskLayersAreDrawnRenderSurfaceLayerListMembers(surface, property_trees); | 427 SetMaskLayersAreDrawnRenderSurfaceLayerListMembers(surface, property_trees); |
421 final_surface_list->push_back(layer); | 428 final_surface_list->push_back(surface); |
429 } | |
430 if (removed_surface) { | |
431 for (LayerImpl* layer : *layer_tree_impl) { | |
432 if (layer->is_drawn_render_surface_layer_list_member() && | |
433 !layer->render_target()->is_render_surface_list_member()) { | |
434 layer->set_is_drawn_render_surface_layer_list_member(false); | |
jaydasika
2017/04/28 18:27:18
Should we also have layer->render_target()->decrem
ajuma
2017/04/28 21:11:21
Done.
| |
435 } | |
436 } | |
422 } | 437 } |
423 } | 438 } |
424 | 439 |
425 static void CalculateRenderSurfaceLayerList( | 440 static void CalculateRenderSurfaceLayerList( |
426 LayerTreeImpl* layer_tree_impl, | 441 LayerTreeImpl* layer_tree_impl, |
427 PropertyTrees* property_trees, | 442 PropertyTrees* property_trees, |
428 LayerImplList* render_surface_layer_list, | 443 RenderSurfaceList* render_surface_list, |
429 const bool can_render_to_separate_surface, | 444 const bool can_render_to_separate_surface, |
430 const int max_texture_size) { | 445 const int max_texture_size) { |
431 // This calculates top level Render Surface Layer List, and Layer List for all | 446 RenderSurfaceList initial_render_surface_list; |
432 // Render Surfaces. | |
433 // |render_surface_layer_list| is the top level RenderSurfaceLayerList. | |
434 | 447 |
435 LayerImplList initial_render_surface_list; | 448 // 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, | 449 // have an empty content rect. After surface content rects are computed, |
439 // produce a final RSLL that omits empty surfaces. | 450 // produce a final list that omits empty surfaces. |
440 ComputeInitialRenderSurfaceLayerList(layer_tree_impl, property_trees, | 451 ComputeInitialRenderSurfaceList(layer_tree_impl, property_trees, |
441 &initial_render_surface_list, | 452 &initial_render_surface_list, |
442 can_render_to_separate_surface); | 453 can_render_to_separate_surface); |
443 ComputeSurfaceContentRects(layer_tree_impl, property_trees, | 454 ComputeSurfaceContentRects(layer_tree_impl, property_trees, |
444 &initial_render_surface_list, max_texture_size); | 455 &initial_render_surface_list, max_texture_size); |
445 ComputeListOfNonEmptySurfaces(layer_tree_impl, property_trees, | 456 ComputeListOfNonEmptySurfaces(layer_tree_impl, property_trees, |
446 &initial_render_surface_list, | 457 &initial_render_surface_list, |
447 render_surface_layer_list); | 458 render_surface_list); |
448 } | 459 } |
449 | 460 |
450 void CalculateDrawPropertiesInternal( | 461 void CalculateDrawPropertiesInternal( |
451 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs, | 462 LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs, |
452 PropertyTreeOption property_tree_option) { | 463 PropertyTreeOption property_tree_option) { |
453 inputs->render_surface_layer_list->clear(); | 464 inputs->render_surface_list->clear(); |
454 | 465 |
455 const bool should_measure_property_tree_performance = | 466 const bool should_measure_property_tree_performance = |
456 property_tree_option == BUILD_PROPERTY_TREES_IF_NEEDED; | 467 property_tree_option == BUILD_PROPERTY_TREES_IF_NEEDED; |
457 | 468 |
458 LayerImplList visible_layer_list; | 469 LayerImplList visible_layer_list; |
459 switch (property_tree_option) { | 470 switch (property_tree_option) { |
460 case BUILD_PROPERTY_TREES_IF_NEEDED: { | 471 case BUILD_PROPERTY_TREES_IF_NEEDED: { |
461 // The translation from layer to property trees is an intermediate | 472 // The translation from layer to property trees is an intermediate |
462 // state. We will eventually get these data passed directly to the | 473 // state. We will eventually get these data passed directly to the |
463 // compositor. | 474 // compositor. |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
538 draw_property_utils::FindLayersThatNeedUpdates( | 549 draw_property_utils::FindLayersThatNeedUpdates( |
539 inputs->root_layer->layer_tree_impl(), inputs->property_trees, | 550 inputs->root_layer->layer_tree_impl(), inputs->property_trees, |
540 &visible_layer_list); | 551 &visible_layer_list); |
541 DCHECK(inputs->can_render_to_separate_surface == | 552 DCHECK(inputs->can_render_to_separate_surface == |
542 inputs->property_trees->non_root_surfaces_enabled); | 553 inputs->property_trees->non_root_surfaces_enabled); |
543 draw_property_utils::ComputeDrawPropertiesOfVisibleLayers( | 554 draw_property_utils::ComputeDrawPropertiesOfVisibleLayers( |
544 &visible_layer_list, inputs->property_trees); | 555 &visible_layer_list, inputs->property_trees); |
545 | 556 |
546 CalculateRenderSurfaceLayerList( | 557 CalculateRenderSurfaceLayerList( |
547 inputs->root_layer->layer_tree_impl(), inputs->property_trees, | 558 inputs->root_layer->layer_tree_impl(), inputs->property_trees, |
548 inputs->render_surface_layer_list, inputs->can_render_to_separate_surface, | 559 inputs->render_surface_list, inputs->can_render_to_separate_surface, |
549 inputs->max_texture_size); | 560 inputs->max_texture_size); |
550 | 561 |
551 if (should_measure_property_tree_performance) { | 562 if (should_measure_property_tree_performance) { |
552 TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 563 TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), |
553 "LayerTreeHostCommon::CalculateDrawProperties"); | 564 "LayerTreeHostCommon::CalculateDrawProperties"); |
554 } | 565 } |
555 | 566 |
556 // A root layer render_surface should always exist after | 567 // A root layer render_surface should always exist after |
557 // CalculateDrawProperties. | 568 // CalculateDrawProperties. |
558 DCHECK(inputs->root_layer->GetRenderSurface()); | 569 DCHECK(inputs->root_layer->GetRenderSurface()); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
635 | 646 |
636 PropertyTrees* GetPropertyTrees(Layer* layer) { | 647 PropertyTrees* GetPropertyTrees(Layer* layer) { |
637 return layer->layer_tree_host()->property_trees(); | 648 return layer->layer_tree_host()->property_trees(); |
638 } | 649 } |
639 | 650 |
640 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { | 651 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { |
641 return layer->layer_tree_impl()->property_trees(); | 652 return layer->layer_tree_impl()->property_trees(); |
642 } | 653 } |
643 | 654 |
644 } // namespace cc | 655 } // namespace cc |
OLD | NEW |