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 <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
195 // CalculateDrawPropertiesInternal. If we, say, create a render surface, these | 195 // CalculateDrawPropertiesInternal. If we, say, create a render surface, these |
196 // clip rects will want to be in its target space, not ours. | 196 // clip rects will want to be in its target space, not ours. |
197 if (clip_parent == layer->clip_parent()) { | 197 if (clip_parent == layer->clip_parent()) { |
198 *clip_rect_in_parent_target_space = TranslateRectToTargetSpace<LayerType>( | 198 *clip_rect_in_parent_target_space = TranslateRectToTargetSpace<LayerType>( |
199 *clip_parent, | 199 *clip_parent, |
200 *layer->parent(), | 200 *layer->parent(), |
201 *clip_rect_in_parent_target_space, | 201 *clip_rect_in_parent_target_space, |
202 TranslateRectDirectionToDescendant); | 202 TranslateRectDirectionToDescendant); |
203 } else { | 203 } else { |
204 // If we're being clipped by our scroll parent, we must translate through | 204 // If we're being clipped by our scroll parent, we must translate through |
205 // our common ancestor. This happens to be our parent, so it is sufficent to | 205 // our common ancestor. |
206 // translate from our clip parent's space to the space of its ancestor (our | 206 const LayerType* lca = |
207 // parent). | 207 HighestScrollParentAncestorNotOnChildAncestorChain( |
208 layer->draw_properties().sequence_number, layer, clip_parent) | |
209 ->parent(); | |
210 | |
208 *clip_rect_in_parent_target_space = | 211 *clip_rect_in_parent_target_space = |
209 TranslateRectToTargetSpace<LayerType>(*layer->parent(), | 212 TranslateRectToTargetSpace<LayerType>(*lca, |
210 *clip_parent, | 213 *clip_parent, |
211 *clip_rect_in_parent_target_space, | 214 *clip_rect_in_parent_target_space, |
212 TranslateRectDirectionToAncestor); | 215 TranslateRectDirectionToAncestor); |
216 | |
217 // The lowest common ancestor is usually, but not always, our parent. We | |
218 // must check if we need to transform from the lca's space to our parent's. | |
219 if (lca != layer->parent()) { | |
220 *clip_rect_in_parent_target_space = TranslateRectToTargetSpace<LayerType>( | |
221 *lca, | |
222 *layer->parent(), | |
223 *clip_rect_in_parent_target_space, | |
224 TranslateRectDirectionToDescendant); | |
225 } | |
213 } | 226 } |
214 } | 227 } |
215 | 228 |
216 // We collect an accumulated drawable content rect per render surface. | 229 // We collect an accumulated drawable content rect per render surface. |
217 // Typically, a layer will contribute to only one surface, the surface | 230 // Typically, a layer will contribute to only one surface, the surface |
218 // associated with its render target. Clip children, however, may affect | 231 // associated with its render target. Clip children, however, may affect |
219 // several surfaces since there may be several surfaces between the clip child | 232 // several surfaces since there may be several surfaces between the clip child |
220 // and its parent. | 233 // and its parent. |
221 // | 234 // |
222 // NB: we accumulate the layer's *clipped* drawable content rect. | 235 // NB: we accumulate the layer's *clipped* drawable content rect. |
(...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1148 it != layer_list->end(); | 1161 it != layer_list->end(); |
1149 ++it) { | 1162 ++it) { |
1150 MarkLayerWithRenderSurfaceLayerListId(*it, | 1163 MarkLayerWithRenderSurfaceLayerListId(*it, |
1151 current_render_surface_layer_list_id); | 1164 current_render_surface_layer_list_id); |
1152 MarkMasksWithRenderSurfaceLayerListId(*it, | 1165 MarkMasksWithRenderSurfaceLayerListId(*it, |
1153 current_render_surface_layer_list_id); | 1166 current_render_surface_layer_list_id); |
1154 } | 1167 } |
1155 } | 1168 } |
1156 | 1169 |
1157 template <typename LayerType> | 1170 template <typename LayerType> |
1171 static inline bool HaveVisited(LayerType* layer, size_t sequence_number) { | |
1172 return layer->draw_properties().sequence_number == sequence_number; | |
1173 } | |
1174 | |
1175 template <typename LayerType> | |
1176 static inline bool HaveAssignedSortWeight(LayerType* layer, | |
1177 size_t sequence_number) { | |
1178 return layer->draw_properties().sort_weight_sequence_number == | |
1179 sequence_number; | |
1180 } | |
1181 | |
1182 template <typename LayerType> | |
1158 static inline void RemoveSurfaceForEarlyExit( | 1183 static inline void RemoveSurfaceForEarlyExit( |
1159 LayerType* layer_to_remove, | 1184 LayerType* layer_to_remove, |
1160 typename LayerType::RenderSurfaceListType* render_surface_layer_list) { | 1185 typename LayerType::RenderSurfaceListType* render_surface_layer_list) { |
1161 DCHECK(layer_to_remove->render_surface()); | 1186 DCHECK(layer_to_remove->render_surface()); |
1162 // Technically, we know that the layer we want to remove should be | 1187 // Technically, we know that the layer we want to remove should be |
1163 // at the back of the render_surface_layer_list. However, we have had | 1188 // at the back of the render_surface_layer_list. However, we have had |
1164 // bugs before that added unnecessary layers here | 1189 // bugs before that added unnecessary layers here |
1165 // (https://bugs.webkit.org/show_bug.cgi?id=74147), but that causes | 1190 // (https://bugs.webkit.org/show_bug.cgi?id=74147), but that causes |
1166 // things to crash. So here we proactively remove any additional | 1191 // things to crash. So here we proactively remove any additional |
1167 // layers from the end of the list. | 1192 // layers from the end of the list. |
1168 while (render_surface_layer_list->back() != layer_to_remove) { | 1193 while (render_surface_layer_list->back() != layer_to_remove) { |
1169 MarkLayerListWithRenderSurfaceLayerListId( | 1194 MarkLayerListWithRenderSurfaceLayerListId( |
1170 &render_surface_layer_list->back()->render_surface()->layer_list(), 0); | 1195 &render_surface_layer_list->back()->render_surface()->layer_list(), 0); |
1171 MarkLayerWithRenderSurfaceLayerListId(render_surface_layer_list->back(), 0); | 1196 MarkLayerWithRenderSurfaceLayerListId(render_surface_layer_list->back(), 0); |
1172 | 1197 |
1173 render_surface_layer_list->back()->ClearRenderSurfaceLayerList(); | 1198 render_surface_layer_list->back()->ClearRenderSurfaceLayerList(); |
1174 render_surface_layer_list->pop_back(); | 1199 render_surface_layer_list->pop_back(); |
1175 } | 1200 } |
1176 DCHECK_EQ(render_surface_layer_list->back(), layer_to_remove); | 1201 DCHECK_EQ(render_surface_layer_list->back(), layer_to_remove); |
1177 MarkLayerListWithRenderSurfaceLayerListId( | 1202 MarkLayerListWithRenderSurfaceLayerListId( |
1178 &layer_to_remove->render_surface()->layer_list(), 0); | 1203 &layer_to_remove->render_surface()->layer_list(), 0); |
1179 MarkLayerWithRenderSurfaceLayerListId(layer_to_remove, 0); | 1204 MarkLayerWithRenderSurfaceLayerListId(layer_to_remove, 0); |
1180 render_surface_layer_list->pop_back(); | 1205 render_surface_layer_list->pop_back(); |
1181 layer_to_remove->ClearRenderSurfaceLayerList(); | 1206 layer_to_remove->ClearRenderSurfaceLayerList(); |
1182 } | 1207 } |
1183 | 1208 |
1209 template <typename LayerType> | |
1210 static inline LayerType* HighestScrollParentAncestorNotOnChildAncestorChain( | |
1211 size_t sequence_number, | |
1212 LayerType* scroll_child, | |
1213 LayerType* scroll_parent) { | |
1214 // Say we have the following tree. | |
1215 // | |
1216 // a | |
1217 // +-b | |
1218 // | +-c | |
1219 // | +-scroll_child | |
1220 // +-d | |
1221 // +-e | |
1222 // +-scroll_parent | |
1223 // | |
1224 // This function aims to find find the highest ancestor of |scroll_parent| | |
1225 // that's not on |scroll_child|'s ancestor chain. d, in this case. | |
1226 // | |
1227 // Fortunately, we have some hints that make finding the lowest common | |
1228 // ancestor a bit easier than usual. We know if we've visited a layer, and for | |
1229 // those layers that we've visited, we know their depth in the tree. | |
1230 if (!HaveVisited(scroll_parent, sequence_number)) { | |
1231 DCHECK(scroll_parent->parent()); | |
1232 // This case is easy. Since we walk the tree in DFS order, if we haven't | |
1233 // visited the scroll parent, we just have to walk up to the first visited | |
1234 // layer, which will be the LCA. | |
1235 while (!HaveVisited(scroll_parent->parent(), sequence_number)) | |
1236 scroll_parent = scroll_parent->parent(); | |
1237 // This would mean that |scroll_parent| is a descendant of |scroll_child|, | |
1238 // which is an error. | |
1239 DCHECK_NE(scroll_child, scroll_parent->parent()); | |
1240 } else { | |
1241 // In this case, we've visited both the scroll_parent and scroll_child, so | |
1242 // it's not as easy as walking to the first visited ancestor of the scroll | |
1243 // parent. But since we've visited the layers, we know their depths, and we | |
1244 // can efficiently find the LCA by walking up nodes at the same height. | |
1245 | |
1246 // First get the layers to the same depth. | |
danakj
2014/09/11 19:22:05
nit: I think this comment was clearer before. Now
Ian Vollick
2014/09/11 19:58:08
Yeah, I've switched it up for something that's hop
| |
1247 while (scroll_child->draw_properties().depth != | |
1248 scroll_parent->draw_properties().depth) { | |
1249 int child_is_deeper = scroll_child->draw_properties().depth > | |
1250 scroll_parent->draw_properties().depth; | |
1251 if (child_is_deeper) | |
1252 scroll_child = scroll_child->parent(); | |
1253 else | |
1254 scroll_parent = scroll_parent->parent(); | |
1255 } | |
1256 | |
1257 // This would only happen if |scroll_child| and |scroll_parent| were on the | |
1258 // same ancestor chain, which is an error. We set up scroll parent scroll | |
1259 // child relationships in blink precisely because the scroll child is not a | |
danakj
2014/09/11 19:22:05
oh thanks for this comment, that's helpful. but ca
Ian Vollick
2014/09/11 19:58:08
Done.
| |
1260 // descendant of the scroll parent and will therefore not scroll with it | |
1261 // naturally and needs special treatment by the compositor. | |
1262 DCHECK_NE(scroll_child, scroll_parent); | |
1263 | |
1264 // Now that scroll_child and scroll_parent are at the same depth, we can | |
1265 // walk up in tandem to find the LCA. | |
1266 while (scroll_child->parent() != scroll_parent->parent()) { | |
1267 scroll_child = scroll_child->parent(); | |
1268 scroll_parent = scroll_parent->parent(); | |
1269 } | |
1270 } | |
1271 | |
1272 return scroll_parent; | |
1273 } | |
1274 | |
1184 struct PreCalculateMetaInformationRecursiveData { | 1275 struct PreCalculateMetaInformationRecursiveData { |
1185 bool layer_or_descendant_has_copy_request; | 1276 bool layer_or_descendant_has_copy_request; |
1186 bool layer_or_descendant_has_input_handler; | 1277 bool layer_or_descendant_has_input_handler; |
1187 int num_unclipped_descendants; | 1278 int num_unclipped_descendants; |
1188 | 1279 |
1189 PreCalculateMetaInformationRecursiveData() | 1280 PreCalculateMetaInformationRecursiveData() |
1190 : layer_or_descendant_has_copy_request(false), | 1281 : layer_or_descendant_has_copy_request(false), |
1191 layer_or_descendant_has_input_handler(false), | 1282 layer_or_descendant_has_input_handler(false), |
1192 num_unclipped_descendants(0) {} | 1283 num_unclipped_descendants(0) {} |
1193 | 1284 |
1194 void Merge(const PreCalculateMetaInformationRecursiveData& data) { | 1285 void Merge(const PreCalculateMetaInformationRecursiveData& data) { |
1195 layer_or_descendant_has_copy_request |= | 1286 layer_or_descendant_has_copy_request |= |
1196 data.layer_or_descendant_has_copy_request; | 1287 data.layer_or_descendant_has_copy_request; |
1197 layer_or_descendant_has_input_handler |= | 1288 layer_or_descendant_has_input_handler |= |
1198 data.layer_or_descendant_has_input_handler; | 1289 data.layer_or_descendant_has_input_handler; |
1199 num_unclipped_descendants += | 1290 num_unclipped_descendants += |
1200 data.num_unclipped_descendants; | 1291 data.num_unclipped_descendants; |
1201 } | 1292 } |
1202 }; | 1293 }; |
1203 | 1294 |
1295 static int next_sort_weight(int* last_sort_weight) { | |
1296 return ++(*last_sort_weight); | |
1297 } | |
1298 | |
1299 template <typename LayerType> | |
1300 static inline void AssignSortWeights(LayerType* layer, | |
1301 size_t sequence_number, | |
1302 int* last_sort_weight) { | |
1303 // Give |layer| the highest sort weight in the tree so far. | |
1304 if (!HaveAssignedSortWeight(layer, sequence_number)) { | |
1305 layer->draw_properties().sort_weight = next_sort_weight(last_sort_weight); | |
1306 layer->draw_properties().sort_weight_sequence_number = sequence_number; | |
1307 } | |
1308 | |
1309 if (LayerType* scroll_parent = layer->scroll_parent()) { | |
1310 // It's important to note where we need to take care of ordering so that | |
1311 // scroll parents are visited before scroll children; it's at their lowest | |
1312 // common ancestor. | |
1313 // | |
1314 // LCA | |
1315 // +-scroll_parent_ancestor | |
1316 // | +- ... | |
1317 // | + scroll_parent | |
1318 // | | |
1319 // +-scroll_child_ancestor | |
1320 // +- .. | |
1321 // + scroll_child | |
1322 // | |
1323 // So given the above tree, we need to guarentee that scroll_parent_ancestor | |
1324 // is processed before scroll_child. We ensure that by assigning it the | |
1325 // lowest sort weight in the tree. We also want to flag LCA if we need to do | |
1326 // any funny business with sort weights so that it knows to do special | |
1327 // sorting of its descendants. | |
1328 LayerType* scroll_parent_ancestor = | |
1329 HighestScrollParentAncestorNotOnChildAncestorChain( | |
1330 sequence_number, layer, scroll_parent); | |
1331 | |
1332 // We know we need to reorder if we haven't yet assigned | |
1333 // |scroll_parent_ancestor| a sort weight. Sort weights are monotonically | |
1334 // increasing, so unless we intervene, it will be given a higher sort weight | |
1335 // than |layer|. | |
1336 bool need_to_reorder = | |
1337 !HaveAssignedSortWeight(scroll_parent_ancestor, sequence_number); | |
1338 | |
1339 LayerType* lca = scroll_parent_ancestor->parent(); | |
1340 | |
1341 // We also might need to reorder if scroll_parent_ancestor has been visited | |
1342 // and has an unacceptable sort weight. | |
1343 if (!need_to_reorder) { | |
1344 LayerType* scroll_child_ancestor = layer; | |
1345 while (scroll_child_ancestor->parent() && | |
1346 scroll_child_ancestor->parent() != lca) { | |
1347 scroll_child_ancestor = scroll_child_ancestor->parent(); | |
1348 } | |
1349 // We must have assigned a sort weight to this layer since its on our | |
1350 // ancestor chain. | |
1351 DCHECK(HaveAssignedSortWeight(scroll_child_ancestor, sequence_number)); | |
1352 if (scroll_child_ancestor->draw_properties().sort_weight < | |
1353 scroll_parent_ancestor->draw_properties().sort_weight) | |
1354 need_to_reorder = true; | |
1355 } | |
1356 | |
1357 if (need_to_reorder) { | |
1358 // Give |scroll_parent_ancestor| the lowest weight in the tree so far. | |
1359 scroll_parent_ancestor->draw_properties().sort_weight = | |
1360 -next_sort_weight(last_sort_weight); | |
1361 scroll_parent_ancestor->draw_properties().sort_weight_sequence_number = | |
1362 sequence_number; | |
1363 | |
1364 // Mark the LCA as needing to sort. | |
1365 lca->draw_properties().children_need_sorting = true; | |
1366 } | |
1367 } | |
1368 } | |
1369 | |
1204 // Recursively walks the layer tree to compute any information that is needed | 1370 // Recursively walks the layer tree to compute any information that is needed |
1205 // before doing the main recursion. | 1371 // before doing the main recursion. |
1206 template <typename LayerType> | 1372 template <typename LayerType> |
1207 static void PreCalculateMetaInformation( | 1373 static void PreCalculateMetaInformation( |
1208 LayerType* layer, | 1374 LayerType* layer, |
1209 PreCalculateMetaInformationRecursiveData* recursive_data) { | 1375 PreCalculateMetaInformationRecursiveData* recursive_data, |
1210 | 1376 int depth, |
1211 layer->draw_properties().sorted_for_recursion = false; | 1377 size_t sequence_number, |
1212 layer->draw_properties().has_child_with_a_scroll_parent = false; | 1378 int* last_sort_weight) { |
1379 layer->draw_properties().children_need_sorting = false; | |
1380 layer->draw_properties().depth = depth; | |
1381 layer->draw_properties().sequence_number = sequence_number; | |
1213 | 1382 |
1214 if (!HasInvertibleOrAnimatedTransform(layer)) { | 1383 if (!HasInvertibleOrAnimatedTransform(layer)) { |
1215 // Layers with singular transforms should not be drawn, the whole subtree | 1384 // Layers with singular transforms should not be drawn, the whole subtree |
1216 // can be skipped. | 1385 // can be skipped. |
1217 return; | 1386 return; |
1218 } | 1387 } |
1219 | 1388 |
1220 if (layer->clip_parent()) | 1389 if (layer->clip_parent()) |
1221 recursive_data->num_unclipped_descendants++; | 1390 recursive_data->num_unclipped_descendants++; |
1222 | 1391 |
1392 AssignSortWeights(layer, sequence_number, last_sort_weight); | |
1393 | |
1223 for (size_t i = 0; i < layer->children().size(); ++i) { | 1394 for (size_t i = 0; i < layer->children().size(); ++i) { |
1224 LayerType* child_layer = | 1395 LayerType* child_layer = |
1225 LayerTreeHostCommon::get_layer_as_raw_ptr(layer->children(), i); | 1396 LayerTreeHostCommon::get_layer_as_raw_ptr(layer->children(), i); |
1226 | 1397 |
1227 PreCalculateMetaInformationRecursiveData data_for_child; | 1398 PreCalculateMetaInformationRecursiveData data_for_child; |
1228 PreCalculateMetaInformation(child_layer, &data_for_child); | 1399 PreCalculateMetaInformation(child_layer, |
1229 | 1400 &data_for_child, |
1230 if (child_layer->scroll_parent()) | 1401 depth + 1, |
1231 layer->draw_properties().has_child_with_a_scroll_parent = true; | 1402 sequence_number, |
1403 last_sort_weight); | |
1232 recursive_data->Merge(data_for_child); | 1404 recursive_data->Merge(data_for_child); |
1233 } | 1405 } |
1234 | 1406 |
1235 if (layer->clip_children()) { | 1407 if (layer->clip_children()) { |
1236 int num_clip_children = layer->clip_children()->size(); | 1408 int num_clip_children = layer->clip_children()->size(); |
1237 DCHECK_GE(recursive_data->num_unclipped_descendants, num_clip_children); | 1409 DCHECK_GE(recursive_data->num_unclipped_descendants, num_clip_children); |
1238 recursive_data->num_unclipped_descendants -= num_clip_children; | 1410 recursive_data->num_unclipped_descendants -= num_clip_children; |
1239 } | 1411 } |
1240 | 1412 |
1241 if (layer->HasCopyRequest()) | 1413 if (layer->HasCopyRequest()) |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1308 bool ancestor_is_animating_scale; | 1480 bool ancestor_is_animating_scale; |
1309 bool ancestor_clips_subtree; | 1481 bool ancestor_clips_subtree; |
1310 typename LayerType::RenderSurfaceType* | 1482 typename LayerType::RenderSurfaceType* |
1311 nearest_occlusion_immune_ancestor_surface; | 1483 nearest_occlusion_immune_ancestor_surface; |
1312 bool in_subtree_of_page_scale_application_layer; | 1484 bool in_subtree_of_page_scale_application_layer; |
1313 bool subtree_can_use_lcd_text; | 1485 bool subtree_can_use_lcd_text; |
1314 bool subtree_is_visible_from_ancestor; | 1486 bool subtree_is_visible_from_ancestor; |
1315 }; | 1487 }; |
1316 | 1488 |
1317 template <typename LayerType> | 1489 template <typename LayerType> |
1318 static LayerType* GetChildContainingLayer(const LayerType& parent, | 1490 struct AscendingScrollWeightComparator { |
1319 LayerType* layer) { | 1491 bool operator()(LayerType* lhs, LayerType* rhs) { |
1320 for (LayerType* ancestor = layer; ancestor; ancestor = ancestor->parent()) { | 1492 return lhs->draw_properties().sort_weight < |
1321 if (ancestor->parent() == &parent) | 1493 rhs->draw_properties().sort_weight; |
1322 return ancestor; | |
1323 } | 1494 } |
1324 NOTREACHED(); | 1495 }; |
1325 return 0; | 1496 |
1497 template <typename LayerType> | |
1498 static void SortChildrenForRecursion(std::vector<LayerType*>* out, | |
1499 const LayerType& parent) { | |
1500 out->resize(parent.children().size()); | |
1501 for (size_t i = 0; i < parent.children().size(); ++i) | |
1502 (*out)[i] = LayerTreeHostCommon::get_layer_as_raw_ptr(parent.children(), i); | |
1503 | |
1504 // Ensures the children are sorted in ascending sort weight. | |
1505 std::sort( | |
1506 out->begin(), out->end(), AscendingScrollWeightComparator<LayerType>()); | |
1326 } | 1507 } |
1327 | 1508 |
1328 template <typename LayerType> | 1509 template <typename LayerType> |
1329 static void AddScrollParentChain(std::vector<LayerType*>* out, | |
1330 const LayerType& parent, | |
1331 LayerType* layer) { | |
1332 // At a high level, this function walks up the chain of scroll parents | |
1333 // recursively, and once we reach the end of the chain, we add the child | |
1334 // of |parent| containing each scroll ancestor as we unwind. The result is | |
1335 // an ordering of parent's children that ensures that scroll parents are | |
1336 // visited before their descendants. | |
1337 // Take for example this layer tree: | |
1338 // | |
1339 // + stacking_context | |
1340 // + scroll_child (1) | |
1341 // + scroll_parent_graphics_layer (*) | |
1342 // | + scroll_parent_scrolling_layer | |
1343 // | + scroll_parent_scrolling_content_layer (2) | |
1344 // + scroll_grandparent_graphics_layer (**) | |
1345 // + scroll_grandparent_scrolling_layer | |
1346 // + scroll_grandparent_scrolling_content_layer (3) | |
1347 // | |
1348 // The scroll child is (1), its scroll parent is (2) and its scroll | |
1349 // grandparent is (3). Note, this doesn't mean that (2)'s scroll parent is | |
1350 // (3), it means that (*)'s scroll parent is (3). We don't want our list to | |
1351 // look like [ (3), (2), (1) ], even though that does have the ancestor chain | |
1352 // in the right order. Instead, we want [ (**), (*), (1) ]. That is, only want | |
1353 // (1)'s siblings in the list, but we want them to appear in such an order | |
1354 // that the scroll ancestors get visited in the correct order. | |
1355 // | |
1356 // So our first task at this step of the recursion is to determine the layer | |
1357 // that we will potentionally add to the list. That is, the child of parent | |
1358 // containing |layer|. | |
1359 LayerType* child = GetChildContainingLayer(parent, layer); | |
1360 if (child->draw_properties().sorted_for_recursion) | |
1361 return; | |
1362 | |
1363 if (LayerType* scroll_parent = child->scroll_parent()) | |
1364 AddScrollParentChain(out, parent, scroll_parent); | |
1365 | |
1366 out->push_back(child); | |
1367 child->draw_properties().sorted_for_recursion = true; | |
1368 } | |
1369 | |
1370 template <typename LayerType> | |
1371 static bool SortChildrenForRecursion(std::vector<LayerType*>* out, | |
1372 const LayerType& parent) { | |
1373 out->reserve(parent.children().size()); | |
1374 bool order_changed = false; | |
1375 for (size_t i = 0; i < parent.children().size(); ++i) { | |
1376 LayerType* current = | |
1377 LayerTreeHostCommon::get_layer_as_raw_ptr(parent.children(), i); | |
1378 | |
1379 if (current->draw_properties().sorted_for_recursion) { | |
1380 order_changed = true; | |
1381 continue; | |
1382 } | |
1383 | |
1384 AddScrollParentChain(out, parent, current); | |
1385 } | |
1386 | |
1387 DCHECK_EQ(parent.children().size(), out->size()); | |
1388 return order_changed; | |
1389 } | |
1390 | |
1391 template <typename LayerType> | |
1392 static void GetNewDescendantsStartIndexAndCount(LayerType* layer, | 1510 static void GetNewDescendantsStartIndexAndCount(LayerType* layer, |
1393 size_t* start_index, | 1511 size_t* start_index, |
1394 size_t* count) { | 1512 size_t* count) { |
1395 *start_index = layer->draw_properties().index_of_first_descendants_addition; | 1513 *start_index = layer->draw_properties().index_of_first_descendants_addition; |
1396 *count = layer->draw_properties().num_descendants_added; | 1514 *count = layer->draw_properties().num_descendants_added; |
1397 } | 1515 } |
1398 | 1516 |
1399 template <typename LayerType> | 1517 template <typename LayerType> |
1400 static void GetNewRenderSurfacesStartIndexAndCount(LayerType* layer, | 1518 static void GetNewRenderSurfacesStartIndexAndCount(LayerType* layer, |
1401 size_t* start_index, | 1519 size_t* start_index, |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1681 // 3.0, then 1 physical pixel is only 1/3 of a CSS pixel. | 1799 // 3.0, then 1 physical pixel is only 1/3 of a CSS pixel. |
1682 gfx::Vector2dF parent_scales = MathUtil::ComputeTransform2dScaleComponents( | 1800 gfx::Vector2dF parent_scales = MathUtil::ComputeTransform2dScaleComponents( |
1683 data_from_ancestor.parent_matrix, 1.f); | 1801 data_from_ancestor.parent_matrix, 1.f); |
1684 effective_scroll_delta -= | 1802 effective_scroll_delta -= |
1685 gfx::ScaleVector2d(current_translation - previous_translation, | 1803 gfx::ScaleVector2d(current_translation - previous_translation, |
1686 1.f / parent_scales.x(), | 1804 1.f / parent_scales.x(), |
1687 1.f / parent_scales.y()); | 1805 1.f / parent_scales.y()); |
1688 } | 1806 } |
1689 | 1807 |
1690 // Apply adjustment from position constraints. | 1808 // Apply adjustment from position constraints. |
1691 ApplyPositionAdjustment(layer, data_from_ancestor.fixed_container, | 1809 ApplyPositionAdjustment(layer, |
1692 data_from_ancestor.scroll_compensation_matrix, &combined_transform); | 1810 data_from_ancestor.fixed_container, |
1811 data_from_ancestor.scroll_compensation_matrix, | |
1812 &combined_transform); | |
1693 | 1813 |
1694 bool combined_is_animating_scale = false; | 1814 bool combined_is_animating_scale = false; |
1695 float combined_maximum_animation_contents_scale = 0.f; | 1815 float combined_maximum_animation_contents_scale = 0.f; |
1696 if (globals.can_adjust_raster_scales) { | 1816 if (globals.can_adjust_raster_scales) { |
1697 CalculateAnimationContentsScale( | 1817 CalculateAnimationContentsScale( |
1698 layer, | 1818 layer, |
1699 data_from_ancestor.ancestor_is_animating_scale, | 1819 data_from_ancestor.ancestor_is_animating_scale, |
1700 data_from_ancestor.maximum_animation_contents_scale, | 1820 data_from_ancestor.maximum_animation_contents_scale, |
1701 data_from_ancestor.parent_matrix, | 1821 data_from_ancestor.parent_matrix, |
1702 combined_transform, | 1822 combined_transform, |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1783 layer_draw_properties.screen_space_transform.FlattenTo2d(); | 1903 layer_draw_properties.screen_space_transform.FlattenTo2d(); |
1784 layer_draw_properties.screen_space_transform.PreconcatTransform | 1904 layer_draw_properties.screen_space_transform.PreconcatTransform |
1785 (layer_draw_properties.target_space_transform); | 1905 (layer_draw_properties.target_space_transform); |
1786 | 1906 |
1787 // Adjusting text AA method during animation may cause repaints, which in-turn | 1907 // Adjusting text AA method during animation may cause repaints, which in-turn |
1788 // causes jank. | 1908 // causes jank. |
1789 bool adjust_text_aa = | 1909 bool adjust_text_aa = |
1790 !animating_opacity_to_screen && !animating_transform_to_screen; | 1910 !animating_opacity_to_screen && !animating_transform_to_screen; |
1791 // To avoid color fringing, LCD text should only be used on opaque layers with | 1911 // To avoid color fringing, LCD text should only be used on opaque layers with |
1792 // just integral translation. | 1912 // just integral translation. |
1793 bool layer_can_use_lcd_text = | 1913 bool layer_can_use_lcd_text = data_from_ancestor.subtree_can_use_lcd_text && |
1794 data_from_ancestor.subtree_can_use_lcd_text && | 1914 accumulated_draw_opacity == 1.f && |
1795 accumulated_draw_opacity == 1.f && | 1915 layer_draw_properties.target_space_transform |
1796 layer_draw_properties.target_space_transform. | 1916 .IsIdentityOrIntegerTranslation(); |
1797 IsIdentityOrIntegerTranslation(); | |
1798 | 1917 |
1799 gfx::Rect content_rect(layer->content_bounds()); | 1918 gfx::Rect content_rect(layer->content_bounds()); |
1800 | 1919 |
1801 // full_hierarchy_matrix is the matrix that transforms objects between screen | 1920 // full_hierarchy_matrix is the matrix that transforms objects between screen |
1802 // space (except projection matrix) and the most recent RenderSurfaceImpl's | 1921 // space (except projection matrix) and the most recent RenderSurfaceImpl's |
1803 // space. next_hierarchy_matrix will only change if this layer uses a new | 1922 // space. next_hierarchy_matrix will only change if this layer uses a new |
1804 // RenderSurfaceImpl, otherwise remains the same. | 1923 // RenderSurfaceImpl, otherwise remains the same. |
1805 data_for_children.full_hierarchy_matrix = | 1924 data_for_children.full_hierarchy_matrix = |
1806 data_from_ancestor.full_hierarchy_matrix; | 1925 data_from_ancestor.full_hierarchy_matrix; |
1807 | 1926 |
1808 // If the subtree will scale layer contents by the transform hierarchy, then | 1927 // If the subtree will scale layer contents by the transform hierarchy, then |
1809 // we should scale things into the render surface by the transform hierarchy | 1928 // we should scale things into the render surface by the transform hierarchy |
1810 // to take advantage of that. | 1929 // to take advantage of that. |
1811 gfx::Vector2dF render_surface_sublayer_scale = | 1930 gfx::Vector2dF render_surface_sublayer_scale = |
1812 globals.can_adjust_raster_scales | 1931 globals.can_adjust_raster_scales |
1813 ? combined_transform_scales | 1932 ? combined_transform_scales |
1814 : gfx::Vector2dF(layer_scale_factors, layer_scale_factors); | 1933 : gfx::Vector2dF(layer_scale_factors, layer_scale_factors); |
1815 | 1934 |
1816 bool render_to_separate_surface; | 1935 bool render_to_separate_surface; |
1817 if (globals.can_render_to_separate_surface) { | 1936 if (globals.can_render_to_separate_surface) { |
1818 render_to_separate_surface = SubtreeShouldRenderToSeparateSurface( | 1937 render_to_separate_surface = SubtreeShouldRenderToSeparateSurface( |
1819 layer, combined_transform.Preserves2dAxisAlignment()); | 1938 layer, combined_transform.Preserves2dAxisAlignment()); |
danakj
2014/09/11 19:22:05
these unrelated format changes may make future mer
Ian Vollick
2014/09/11 19:58:08
I put 'em back. (This was the work of git cl forma
| |
1820 } else { | 1939 } else { |
1821 render_to_separate_surface = IsRootLayer(layer); | 1940 render_to_separate_surface = IsRootLayer(layer); |
1822 } | 1941 } |
1823 if (render_to_separate_surface) { | 1942 if (render_to_separate_surface) { |
1824 // Check back-face visibility before continuing with this surface and its | 1943 // Check back-face visibility before continuing with this surface and its |
1825 // subtree | 1944 // subtree |
1826 if (!layer->double_sided() && TransformToParentIsKnown(layer) && | 1945 if (!layer->double_sided() && TransformToParentIsKnown(layer) && |
1827 IsSurfaceBackFaceVisible(layer, combined_transform)) { | 1946 IsSurfaceBackFaceVisible(layer, combined_transform)) { |
1828 layer->ClearRenderSurfaceLayerList(); | 1947 layer->ClearRenderSurfaceLayerList(); |
1829 return; | 1948 return; |
(...skipping 29 matching lines...) Expand all Loading... | |
1859 render_surface_sublayer_scale.y() / layer->contents_scale_y()); | 1978 render_surface_sublayer_scale.y() / layer->contents_scale_y()); |
1860 | 1979 |
1861 // Inside the surface's subtree, we scale everything to the owning layer's | 1980 // Inside the surface's subtree, we scale everything to the owning layer's |
1862 // scale. The sublayer matrix transforms layer rects into target surface | 1981 // scale. The sublayer matrix transforms layer rects into target surface |
1863 // content space. Conceptually, all layers in the subtree inherit the | 1982 // content space. Conceptually, all layers in the subtree inherit the |
1864 // scale at the point of the render surface in the transform hierarchy, | 1983 // scale at the point of the render surface in the transform hierarchy, |
1865 // but we apply it explicitly to the owning layer and the remainder of the | 1984 // but we apply it explicitly to the owning layer and the remainder of the |
1866 // subtree independently. | 1985 // subtree independently. |
1867 DCHECK(data_for_children.parent_matrix.IsIdentity()); | 1986 DCHECK(data_for_children.parent_matrix.IsIdentity()); |
1868 data_for_children.parent_matrix.Scale(render_surface_sublayer_scale.x(), | 1987 data_for_children.parent_matrix.Scale(render_surface_sublayer_scale.x(), |
1869 render_surface_sublayer_scale.y()); | 1988 render_surface_sublayer_scale.y()); |
1870 | 1989 |
1871 // Even if the |layer_is_drawn|, it only contributes to a drawn surface | 1990 // Even if the |layer_is_drawn|, it only contributes to a drawn surface |
1872 // when the |layer_is_visible|. | 1991 // when the |layer_is_visible|. |
1873 layer->render_surface()->set_contributes_to_drawn_surface( | 1992 layer->render_surface()->set_contributes_to_drawn_surface( |
1874 layer_is_visible); | 1993 layer_is_visible); |
1875 } | 1994 } |
1876 | 1995 |
1877 // The opacity value is moved from the layer to its surface, so that the | 1996 // The opacity value is moved from the layer to its surface, so that the |
1878 // entire subtree properly inherits opacity. | 1997 // entire subtree properly inherits opacity. |
1879 render_surface->SetDrawOpacity(accumulated_draw_opacity); | 1998 render_surface->SetDrawOpacity(accumulated_draw_opacity); |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2090 if (layer->should_flatten_transform()) | 2209 if (layer->should_flatten_transform()) |
2091 data_for_children.parent_matrix.FlattenTo2d(); | 2210 data_for_children.parent_matrix.FlattenTo2d(); |
2092 | 2211 |
2093 data_for_children.scroll_compensation_matrix = | 2212 data_for_children.scroll_compensation_matrix = |
2094 ComputeScrollCompensationMatrixForChildren( | 2213 ComputeScrollCompensationMatrixForChildren( |
2095 layer, | 2214 layer, |
2096 data_from_ancestor.parent_matrix, | 2215 data_from_ancestor.parent_matrix, |
2097 data_from_ancestor.scroll_compensation_matrix, | 2216 data_from_ancestor.scroll_compensation_matrix, |
2098 effective_scroll_delta); | 2217 effective_scroll_delta); |
2099 data_for_children.fixed_container = | 2218 data_for_children.fixed_container = |
2100 layer->IsContainerForFixedPositionLayers() ? | 2219 layer->IsContainerForFixedPositionLayers() |
2101 layer : data_from_ancestor.fixed_container; | 2220 ? layer |
2221 : data_from_ancestor.fixed_container; | |
2102 | 2222 |
2103 data_for_children.clip_rect_in_target_space = clip_rect_in_target_space; | 2223 data_for_children.clip_rect_in_target_space = clip_rect_in_target_space; |
2104 data_for_children.clip_rect_of_target_surface_in_target_space = | 2224 data_for_children.clip_rect_of_target_surface_in_target_space = |
2105 clip_rect_of_target_surface_in_target_space; | 2225 clip_rect_of_target_surface_in_target_space; |
2106 data_for_children.ancestor_clips_subtree = | 2226 data_for_children.ancestor_clips_subtree = |
2107 layer_or_ancestor_clips_descendants; | 2227 layer_or_ancestor_clips_descendants; |
2108 data_for_children.nearest_occlusion_immune_ancestor_surface = | 2228 data_for_children.nearest_occlusion_immune_ancestor_surface = |
2109 nearest_occlusion_immune_ancestor_surface; | 2229 nearest_occlusion_immune_ancestor_surface; |
2110 data_for_children.subtree_is_visible_from_ancestor = layer_is_drawn; | 2230 data_for_children.subtree_is_visible_from_ancestor = layer_is_drawn; |
2111 } | 2231 } |
2112 | 2232 |
2113 std::vector<LayerType*> sorted_children; | 2233 std::vector<LayerType*> sorted_children; |
2114 bool child_order_changed = false; | 2234 if (layer_draw_properties.children_need_sorting) |
2115 if (layer_draw_properties.has_child_with_a_scroll_parent) | 2235 SortChildrenForRecursion(&sorted_children, *layer); |
2116 child_order_changed = SortChildrenForRecursion(&sorted_children, *layer); | |
2117 | 2236 |
2118 for (size_t i = 0; i < layer->children().size(); ++i) { | 2237 for (size_t i = 0; i < layer->children().size(); ++i) { |
2119 // If one of layer's children has a scroll parent, then we may have to | 2238 // If one of layer's children has a scroll parent, then we may have to |
2120 // visit the children out of order. The new order is stored in | 2239 // visit the children out of order. The new order is stored in |
2121 // sorted_children. Otherwise, we'll grab the child directly from the | 2240 // sorted_children. Otherwise, we'll grab the child directly from the |
2122 // layer's list of children. | 2241 // layer's list of children. |
2123 LayerType* child = | 2242 LayerType* child = |
2124 layer_draw_properties.has_child_with_a_scroll_parent | 2243 layer_draw_properties.children_need_sorting |
2125 ? sorted_children[i] | 2244 ? sorted_children[i] |
2126 : LayerTreeHostCommon::get_layer_as_raw_ptr(layer->children(), i); | 2245 : LayerTreeHostCommon::get_layer_as_raw_ptr(layer->children(), i); |
2127 | 2246 |
2128 child->draw_properties().index_of_first_descendants_addition = | 2247 child->draw_properties().index_of_first_descendants_addition = |
2129 descendants.size(); | 2248 descendants.size(); |
2130 child->draw_properties().index_of_first_render_surface_layer_list_addition = | 2249 child->draw_properties().index_of_first_render_surface_layer_list_addition = |
2131 render_surface_layer_list->size(); | 2250 render_surface_layer_list->size(); |
2132 | 2251 |
2133 CalculateDrawPropertiesInternal<LayerType>( | 2252 CalculateDrawPropertiesInternal<LayerType>( |
2134 child, | 2253 child, |
(...skipping 17 matching lines...) Expand all Loading... | |
2152 child->draw_properties().num_descendants_added = | 2271 child->draw_properties().num_descendants_added = |
2153 descendants.size() - | 2272 descendants.size() - |
2154 child->draw_properties().index_of_first_descendants_addition; | 2273 child->draw_properties().index_of_first_descendants_addition; |
2155 child->draw_properties().num_render_surfaces_added = | 2274 child->draw_properties().num_render_surfaces_added = |
2156 render_surface_layer_list->size() - | 2275 render_surface_layer_list->size() - |
2157 child->draw_properties() | 2276 child->draw_properties() |
2158 .index_of_first_render_surface_layer_list_addition; | 2277 .index_of_first_render_surface_layer_list_addition; |
2159 } | 2278 } |
2160 | 2279 |
2161 // Add the unsorted layer list contributions, if necessary. | 2280 // Add the unsorted layer list contributions, if necessary. |
2162 if (child_order_changed) { | 2281 if (layer_draw_properties.children_need_sorting) { |
2163 SortLayerListContributions( | 2282 SortLayerListContributions( |
2164 *layer, | 2283 *layer, |
2165 GetLayerListForSorting(render_surface_layer_list), | 2284 GetLayerListForSorting(render_surface_layer_list), |
2166 render_surface_layer_list_child_sorting_start_index, | 2285 render_surface_layer_list_child_sorting_start_index, |
2167 &GetNewRenderSurfacesStartIndexAndCount<LayerType>); | 2286 &GetNewRenderSurfacesStartIndexAndCount<LayerType>); |
2168 | 2287 |
2169 SortLayerListContributions( | 2288 SortLayerListContributions( |
2170 *layer, | 2289 *layer, |
2171 &descendants, | 2290 &descendants, |
2172 layer_list_child_sorting_start_index, | 2291 layer_list_child_sorting_start_index, |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2383 data_for_recursion->subtree_is_visible_from_ancestor = true; | 2502 data_for_recursion->subtree_is_visible_from_ancestor = true; |
2384 } | 2503 } |
2385 | 2504 |
2386 void LayerTreeHostCommon::CalculateDrawProperties( | 2505 void LayerTreeHostCommon::CalculateDrawProperties( |
2387 CalcDrawPropsMainInputs* inputs) { | 2506 CalcDrawPropsMainInputs* inputs) { |
2388 LayerList dummy_layer_list; | 2507 LayerList dummy_layer_list; |
2389 SubtreeGlobals<Layer> globals; | 2508 SubtreeGlobals<Layer> globals; |
2390 DataForRecursion<Layer> data_for_recursion; | 2509 DataForRecursion<Layer> data_for_recursion; |
2391 ProcessCalcDrawPropsInputs(*inputs, &globals, &data_for_recursion); | 2510 ProcessCalcDrawPropsInputs(*inputs, &globals, &data_for_recursion); |
2392 | 2511 |
2512 // This is used as a global throughout the precalculate recursion. | |
2513 int last_sort_weight = 0; | |
2393 PreCalculateMetaInformationRecursiveData recursive_data; | 2514 PreCalculateMetaInformationRecursiveData recursive_data; |
2394 PreCalculateMetaInformation(inputs->root_layer, &recursive_data); | 2515 PreCalculateMetaInformation(inputs->root_layer, |
2516 &recursive_data, | |
2517 0, | |
2518 inputs->current_render_surface_layer_list_id + 1, | |
danakj
2014/09/11 19:22:05
why +1?
Ian Vollick
2014/09/11 19:58:08
0 doesn't work as a sequence number. Although no r
| |
2519 &last_sort_weight); | |
2520 | |
2395 std::vector<AccumulatedSurfaceState<Layer> > accumulated_surface_state; | 2521 std::vector<AccumulatedSurfaceState<Layer> > accumulated_surface_state; |
2396 CalculateDrawPropertiesInternal<Layer>( | 2522 CalculateDrawPropertiesInternal<Layer>( |
2397 inputs->root_layer, | 2523 inputs->root_layer, |
2398 globals, | 2524 globals, |
2399 data_for_recursion, | 2525 data_for_recursion, |
2400 inputs->render_surface_layer_list, | 2526 inputs->render_surface_layer_list, |
2401 &dummy_layer_list, | 2527 &dummy_layer_list, |
2402 &accumulated_surface_state, | 2528 &accumulated_surface_state, |
2403 inputs->current_render_surface_layer_list_id); | 2529 inputs->current_render_surface_layer_list_id); |
2404 | 2530 |
2405 // The dummy layer list should not have been used. | 2531 // The dummy layer list should not have been used. |
2406 DCHECK_EQ(0u, dummy_layer_list.size()); | 2532 DCHECK_EQ(0u, dummy_layer_list.size()); |
2407 // A root layer render_surface should always exist after | 2533 // A root layer render_surface should always exist after |
2408 // CalculateDrawProperties. | 2534 // CalculateDrawProperties. |
2409 DCHECK(inputs->root_layer->render_surface()); | 2535 DCHECK(inputs->root_layer->render_surface()); |
2410 } | 2536 } |
2411 | 2537 |
2412 void LayerTreeHostCommon::CalculateDrawProperties( | 2538 void LayerTreeHostCommon::CalculateDrawProperties( |
2413 CalcDrawPropsImplInputs* inputs) { | 2539 CalcDrawPropsImplInputs* inputs) { |
2414 LayerImplList dummy_layer_list; | 2540 LayerImplList dummy_layer_list; |
2415 SubtreeGlobals<LayerImpl> globals; | 2541 SubtreeGlobals<LayerImpl> globals; |
2416 DataForRecursion<LayerImpl> data_for_recursion; | 2542 DataForRecursion<LayerImpl> data_for_recursion; |
2417 ProcessCalcDrawPropsInputs(*inputs, &globals, &data_for_recursion); | 2543 ProcessCalcDrawPropsInputs(*inputs, &globals, &data_for_recursion); |
2418 | 2544 |
2419 LayerSorter layer_sorter; | 2545 LayerSorter layer_sorter; |
2420 globals.layer_sorter = &layer_sorter; | 2546 globals.layer_sorter = &layer_sorter; |
2421 | 2547 |
2548 // This is used as a global throughout the precalculate recursion. | |
2549 int last_sort_weight = 0; | |
2422 PreCalculateMetaInformationRecursiveData recursive_data; | 2550 PreCalculateMetaInformationRecursiveData recursive_data; |
2423 PreCalculateMetaInformation(inputs->root_layer, &recursive_data); | 2551 PreCalculateMetaInformation(inputs->root_layer, |
2552 &recursive_data, | |
2553 0, | |
2554 inputs->current_render_surface_layer_list_id + 1, | |
danakj
2014/09/11 19:22:05
why +1?
Ian Vollick
2014/09/11 19:58:08
Zero doesn't work here. In practice, no real calle
| |
2555 &last_sort_weight); | |
2556 | |
2424 std::vector<AccumulatedSurfaceState<LayerImpl> > | 2557 std::vector<AccumulatedSurfaceState<LayerImpl> > |
2425 accumulated_surface_state; | 2558 accumulated_surface_state; |
2426 CalculateDrawPropertiesInternal<LayerImpl>( | 2559 CalculateDrawPropertiesInternal<LayerImpl>( |
2427 inputs->root_layer, | 2560 inputs->root_layer, |
2428 globals, | 2561 globals, |
2429 data_for_recursion, | 2562 data_for_recursion, |
2430 inputs->render_surface_layer_list, | 2563 inputs->render_surface_layer_list, |
2431 &dummy_layer_list, | 2564 &dummy_layer_list, |
2432 &accumulated_surface_state, | 2565 &accumulated_surface_state, |
2433 inputs->current_render_surface_layer_list_id); | 2566 inputs->current_render_surface_layer_list_id); |
2434 | 2567 |
2435 // The dummy layer list should not have been used. | 2568 // The dummy layer list should not have been used. |
2436 DCHECK_EQ(0u, dummy_layer_list.size()); | 2569 DCHECK_EQ(0u, dummy_layer_list.size()); |
2437 // A root layer render_surface should always exist after | 2570 // A root layer render_surface should always exist after |
2438 // CalculateDrawProperties. | 2571 // CalculateDrawProperties. |
2439 DCHECK(inputs->root_layer->render_surface()); | 2572 DCHECK(inputs->root_layer->render_surface()); |
2440 } | 2573 } |
2441 | 2574 |
2442 } // namespace cc | 2575 } // namespace cc |
OLD | NEW |