OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/resources/eviction_tile_priority_queue.h" | 5 #include "cc/resources/eviction_tile_priority_queue.h" |
6 #include "cc/resources/raster_tile_priority_queue.h" | 6 #include "cc/resources/raster_tile_priority_queue.h" |
7 #include "cc/resources/tile.h" | 7 #include "cc/resources/tile.h" |
8 #include "cc/resources/tile_priority.h" | 8 #include "cc/resources/tile_priority.h" |
9 #include "cc/resources/tiling_set_raster_queue_all.h" | |
9 #include "cc/test/begin_frame_args_test.h" | 10 #include "cc/test/begin_frame_args_test.h" |
10 #include "cc/test/fake_impl_proxy.h" | 11 #include "cc/test/fake_impl_proxy.h" |
11 #include "cc/test/fake_layer_tree_host_impl.h" | 12 #include "cc/test/fake_layer_tree_host_impl.h" |
12 #include "cc/test/fake_output_surface.h" | 13 #include "cc/test/fake_output_surface.h" |
13 #include "cc/test/fake_output_surface_client.h" | 14 #include "cc/test/fake_output_surface_client.h" |
14 #include "cc/test/fake_picture_layer_impl.h" | 15 #include "cc/test/fake_picture_layer_impl.h" |
15 #include "cc/test/fake_picture_layer_tiling_client.h" | 16 #include "cc/test/fake_picture_layer_tiling_client.h" |
16 #include "cc/test/fake_picture_pile_impl.h" | 17 #include "cc/test/fake_picture_pile_impl.h" |
17 #include "cc/test/fake_tile_manager.h" | 18 #include "cc/test/fake_tile_manager.h" |
18 #include "cc/test/impl_side_painting_settings.h" | 19 #include "cc/test/impl_side_painting_settings.h" |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
144 FakePictureLayerImpl* pending_layer_; | 145 FakePictureLayerImpl* pending_layer_; |
145 FakePictureLayerImpl* active_layer_; | 146 FakePictureLayerImpl* active_layer_; |
146 }; | 147 }; |
147 | 148 |
148 TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueue) { | 149 TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueue) { |
149 const gfx::Size layer_bounds(1000, 1000); | 150 const gfx::Size layer_bounds(1000, 1000); |
150 host_impl_.SetViewportSize(layer_bounds); | 151 host_impl_.SetViewportSize(layer_bounds); |
151 SetupDefaultTrees(layer_bounds); | 152 SetupDefaultTrees(layer_bounds); |
152 | 153 |
153 RasterTilePriorityQueue queue; | 154 RasterTilePriorityQueue queue; |
154 host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES); | 155 host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES, |
156 RasterTilePriorityQueue::Type::ALL); | |
155 EXPECT_FALSE(queue.IsEmpty()); | 157 EXPECT_FALSE(queue.IsEmpty()); |
156 | 158 |
157 size_t tile_count = 0; | 159 size_t tile_count = 0; |
158 std::set<Tile*> all_tiles; | 160 std::set<Tile*> all_tiles; |
159 while (!queue.IsEmpty()) { | 161 while (!queue.IsEmpty()) { |
160 EXPECT_TRUE(queue.Top()); | 162 EXPECT_TRUE(queue.Top()); |
161 all_tiles.insert(queue.Top()); | 163 all_tiles.insert(queue.Top()); |
162 ++tile_count; | 164 ++tile_count; |
163 queue.Pop(); | 165 queue.Pop(); |
164 } | 166 } |
165 | 167 |
166 EXPECT_EQ(tile_count, all_tiles.size()); | 168 EXPECT_EQ(tile_count, all_tiles.size()); |
167 EXPECT_EQ(16u, tile_count); | 169 EXPECT_EQ(16u, tile_count); |
168 | 170 |
169 // Sanity check, all tiles should be visible. | 171 // Sanity check, all tiles should be visible. |
170 std::set<Tile*> smoothness_tiles; | 172 std::set<Tile*> smoothness_tiles; |
171 queue.Reset(); | 173 queue.Reset(); |
172 host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY); | 174 host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY, |
175 RasterTilePriorityQueue::Type::ALL); | |
173 bool had_low_res = false; | 176 bool had_low_res = false; |
174 while (!queue.IsEmpty()) { | 177 while (!queue.IsEmpty()) { |
175 Tile* tile = queue.Top(); | 178 Tile* tile = queue.Top(); |
176 EXPECT_TRUE(tile); | 179 EXPECT_TRUE(tile); |
177 EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin); | 180 EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin); |
178 EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin); | 181 EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin); |
179 if (tile->priority(ACTIVE_TREE).resolution == LOW_RESOLUTION) | 182 if (tile->priority(ACTIVE_TREE).resolution == LOW_RESOLUTION) |
180 had_low_res = true; | 183 had_low_res = true; |
181 else | 184 else |
182 smoothness_tiles.insert(tile); | 185 smoothness_tiles.insert(tile); |
183 queue.Pop(); | 186 queue.Pop(); |
184 } | 187 } |
185 EXPECT_EQ(all_tiles, smoothness_tiles); | 188 EXPECT_EQ(all_tiles, smoothness_tiles); |
186 EXPECT_TRUE(had_low_res); | 189 EXPECT_TRUE(had_low_res); |
187 | 190 |
191 // Check that everything is required for activation. | |
192 queue.Reset(); | |
193 host_impl_.BuildRasterQueue( | |
194 &queue, SMOOTHNESS_TAKES_PRIORITY, | |
195 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | |
196 std::set<Tile*> required_for_activation_tiles; | |
197 while (!queue.IsEmpty()) { | |
198 Tile* tile = queue.Top(); | |
199 EXPECT_TRUE(tile->required_for_activation()); | |
200 required_for_activation_tiles.insert(tile); | |
201 queue.Pop(); | |
202 } | |
203 EXPECT_EQ(all_tiles, required_for_activation_tiles); | |
204 | |
205 // Check that everything is required for draw. | |
206 queue.Reset(); | |
207 host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY, | |
208 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | |
209 std::set<Tile*> required_for_draw_tiles; | |
210 while (!queue.IsEmpty()) { | |
211 Tile* tile = queue.Top(); | |
212 EXPECT_TRUE(tile->required_for_draw()); | |
213 required_for_draw_tiles.insert(tile); | |
214 queue.Pop(); | |
215 } | |
216 EXPECT_EQ(all_tiles, required_for_draw_tiles); | |
217 | |
188 Region invalidation(gfx::Rect(0, 0, 500, 500)); | 218 Region invalidation(gfx::Rect(0, 0, 500, 500)); |
189 | 219 |
190 // Invalidate the pending tree. | 220 // Invalidate the pending tree. |
191 pending_layer_->set_invalidation(invalidation); | 221 pending_layer_->set_invalidation(invalidation); |
192 pending_layer_->HighResTiling()->Invalidate(invalidation); | 222 pending_layer_->HighResTiling()->Invalidate(invalidation); |
193 pending_layer_->LowResTiling()->Invalidate(invalidation); | 223 pending_layer_->LowResTiling()->Invalidate(invalidation); |
194 | 224 |
195 active_layer_->ResetAllTilesPriorities(); | 225 active_layer_->ResetAllTilesPriorities(); |
196 pending_layer_->ResetAllTilesPriorities(); | 226 pending_layer_->ResetAllTilesPriorities(); |
197 | 227 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
232 active_layer_->LowResTiling()->AllTilesForTesting(); | 262 active_layer_->LowResTiling()->AllTilesForTesting(); |
233 for (size_t i = 0; i < active_low_res_tiles.size(); ++i) | 263 for (size_t i = 0; i < active_low_res_tiles.size(); ++i) |
234 all_tiles.insert(active_low_res_tiles[i]); | 264 all_tiles.insert(active_low_res_tiles[i]); |
235 | 265 |
236 Tile* last_tile = NULL; | 266 Tile* last_tile = NULL; |
237 smoothness_tiles.clear(); | 267 smoothness_tiles.clear(); |
238 tile_count = 0; | 268 tile_count = 0; |
239 size_t correct_order_tiles = 0u; | 269 size_t correct_order_tiles = 0u; |
240 // Here we expect to get increasing ACTIVE_TREE priority_bin. | 270 // Here we expect to get increasing ACTIVE_TREE priority_bin. |
241 queue.Reset(); | 271 queue.Reset(); |
242 host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY); | 272 host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY, |
273 RasterTilePriorityQueue::Type::ALL); | |
274 std::set<Tile*> expected_required_for_draw_tiles; | |
275 std::set<Tile*> expected_required_for_activation_tiles; | |
243 while (!queue.IsEmpty()) { | 276 while (!queue.IsEmpty()) { |
244 Tile* tile = queue.Top(); | 277 Tile* tile = queue.Top(); |
245 EXPECT_TRUE(tile); | 278 EXPECT_TRUE(tile); |
246 | 279 |
247 if (!last_tile) | 280 if (!last_tile) |
248 last_tile = tile; | 281 last_tile = tile; |
249 | 282 |
250 EXPECT_LE(last_tile->priority(ACTIVE_TREE).priority_bin, | 283 EXPECT_LE(last_tile->priority(ACTIVE_TREE).priority_bin, |
251 tile->priority(ACTIVE_TREE).priority_bin); | 284 tile->priority(ACTIVE_TREE).priority_bin); |
252 bool skip_updating_last_tile = false; | 285 bool skip_updating_last_tile = false; |
(...skipping 15 matching lines...) Expand all Loading... | |
268 last_tile->priority(ACTIVE_TREE).resolution != | 301 last_tile->priority(ACTIVE_TREE).resolution != |
269 tile->priority(ACTIVE_TREE).resolution) { | 302 tile->priority(ACTIVE_TREE).resolution) { |
270 // Low resolution should come first. | 303 // Low resolution should come first. |
271 EXPECT_EQ(LOW_RESOLUTION, last_tile->priority(ACTIVE_TREE).resolution); | 304 EXPECT_EQ(LOW_RESOLUTION, last_tile->priority(ACTIVE_TREE).resolution); |
272 } | 305 } |
273 | 306 |
274 if (!skip_updating_last_tile) | 307 if (!skip_updating_last_tile) |
275 last_tile = tile; | 308 last_tile = tile; |
276 ++tile_count; | 309 ++tile_count; |
277 smoothness_tiles.insert(tile); | 310 smoothness_tiles.insert(tile); |
311 if (tile->required_for_draw()) | |
312 expected_required_for_draw_tiles.insert(tile); | |
313 if (tile->required_for_activation()) | |
314 expected_required_for_activation_tiles.insert(tile); | |
278 queue.Pop(); | 315 queue.Pop(); |
279 } | 316 } |
280 | 317 |
281 EXPECT_EQ(tile_count, smoothness_tiles.size()); | 318 EXPECT_EQ(tile_count, smoothness_tiles.size()); |
282 EXPECT_EQ(all_tiles, smoothness_tiles); | 319 EXPECT_EQ(all_tiles, smoothness_tiles); |
283 // Since we don't guarantee increasing distance due to spiral iterator, we | 320 // Since we don't guarantee increasing distance due to spiral iterator, we |
284 // should check that we're _mostly_ right. | 321 // should check that we're _mostly_ right. |
285 EXPECT_GT(correct_order_tiles, 3 * tile_count / 4); | 322 EXPECT_GT(correct_order_tiles, 3 * tile_count / 4); |
286 | 323 |
324 // Check that we have consistent required_for_activation tiles. | |
325 queue.Reset(); | |
326 host_impl_.BuildRasterQueue( | |
327 &queue, SMOOTHNESS_TAKES_PRIORITY, | |
328 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | |
329 required_for_activation_tiles.clear(); | |
330 while (!queue.IsEmpty()) { | |
331 Tile* tile = queue.Top(); | |
332 EXPECT_TRUE(tile->required_for_activation()); | |
333 required_for_activation_tiles.insert(tile); | |
334 queue.Pop(); | |
335 } | |
336 EXPECT_EQ(expected_required_for_activation_tiles, | |
337 required_for_activation_tiles); | |
338 EXPECT_NE(all_tiles, required_for_activation_tiles); | |
339 | |
340 // Check that we have consistent required_for_draw tiles. | |
341 queue.Reset(); | |
342 host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY, | |
343 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | |
344 required_for_draw_tiles.clear(); | |
345 while (!queue.IsEmpty()) { | |
346 Tile* tile = queue.Top(); | |
347 EXPECT_TRUE(tile->required_for_draw()); | |
348 required_for_draw_tiles.insert(tile); | |
349 queue.Pop(); | |
350 } | |
351 EXPECT_EQ(expected_required_for_draw_tiles, required_for_draw_tiles); | |
352 EXPECT_NE(all_tiles, required_for_draw_tiles); | |
353 | |
287 std::set<Tile*> new_content_tiles; | 354 std::set<Tile*> new_content_tiles; |
288 last_tile = NULL; | 355 last_tile = NULL; |
289 size_t increasing_distance_tiles = 0u; | 356 size_t increasing_distance_tiles = 0u; |
290 // Here we expect to get increasing PENDING_TREE priority_bin. | 357 // Here we expect to get increasing PENDING_TREE priority_bin. |
291 queue.Reset(); | 358 queue.Reset(); |
292 host_impl_.BuildRasterQueue(&queue, NEW_CONTENT_TAKES_PRIORITY); | 359 host_impl_.BuildRasterQueue(&queue, NEW_CONTENT_TAKES_PRIORITY, |
360 RasterTilePriorityQueue::Type::ALL); | |
293 tile_count = 0; | 361 tile_count = 0; |
294 while (!queue.IsEmpty()) { | 362 while (!queue.IsEmpty()) { |
295 Tile* tile = queue.Top(); | 363 Tile* tile = queue.Top(); |
296 EXPECT_TRUE(tile); | 364 EXPECT_TRUE(tile); |
297 | 365 |
298 if (!last_tile) | 366 if (!last_tile) |
299 last_tile = tile; | 367 last_tile = tile; |
300 | 368 |
301 EXPECT_LE(last_tile->priority(PENDING_TREE).priority_bin, | 369 EXPECT_LE(last_tile->priority(PENDING_TREE).priority_bin, |
302 tile->priority(PENDING_TREE).priority_bin); | 370 tile->priority(PENDING_TREE).priority_bin); |
(...skipping 15 matching lines...) Expand all Loading... | |
318 new_content_tiles.insert(tile); | 386 new_content_tiles.insert(tile); |
319 ++tile_count; | 387 ++tile_count; |
320 queue.Pop(); | 388 queue.Pop(); |
321 } | 389 } |
322 | 390 |
323 EXPECT_EQ(tile_count, new_content_tiles.size()); | 391 EXPECT_EQ(tile_count, new_content_tiles.size()); |
324 EXPECT_EQ(high_res_tiles, new_content_tiles); | 392 EXPECT_EQ(high_res_tiles, new_content_tiles); |
325 // Since we don't guarantee increasing distance due to spiral iterator, we | 393 // Since we don't guarantee increasing distance due to spiral iterator, we |
326 // should check that we're _mostly_ right. | 394 // should check that we're _mostly_ right. |
327 EXPECT_GE(increasing_distance_tiles, 3 * tile_count / 4); | 395 EXPECT_GE(increasing_distance_tiles, 3 * tile_count / 4); |
396 | |
397 // Check that we have consistent required_for_activation tiles. | |
398 queue.Reset(); | |
399 host_impl_.BuildRasterQueue( | |
400 &queue, NEW_CONTENT_TAKES_PRIORITY, | |
401 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | |
402 required_for_activation_tiles.clear(); | |
403 while (!queue.IsEmpty()) { | |
404 Tile* tile = queue.Top(); | |
405 EXPECT_TRUE(tile->required_for_activation()); | |
406 required_for_activation_tiles.insert(tile); | |
407 queue.Pop(); | |
408 } | |
409 EXPECT_EQ(expected_required_for_activation_tiles, | |
410 required_for_activation_tiles); | |
411 EXPECT_NE(new_content_tiles, required_for_activation_tiles); | |
412 | |
413 // Check that we have consistent required_for_draw tiles. | |
414 queue.Reset(); | |
415 host_impl_.BuildRasterQueue(&queue, NEW_CONTENT_TAKES_PRIORITY, | |
416 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | |
417 required_for_draw_tiles.clear(); | |
418 while (!queue.IsEmpty()) { | |
419 Tile* tile = queue.Top(); | |
420 EXPECT_TRUE(tile->required_for_draw()); | |
421 required_for_draw_tiles.insert(tile); | |
422 queue.Pop(); | |
423 } | |
424 EXPECT_EQ(expected_required_for_draw_tiles, required_for_draw_tiles); | |
425 EXPECT_NE(new_content_tiles, required_for_draw_tiles); | |
426 } | |
427 | |
428 TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueInvalidation) { | |
danakj
2015/01/12 18:23:13
Great test!
| |
429 const gfx::Size layer_bounds(1000, 1000); | |
430 host_impl_.SetViewportSize(gfx::Size(500, 500)); | |
431 SetupDefaultTrees(layer_bounds); | |
432 | |
433 // Use a tile's content rect as an invalidation. We should inset it a bit to | |
434 // ensure that border math doesn't invalidate neighbouring tiles. | |
435 gfx::Rect invalidation = | |
436 pending_layer_->HighResTiling()->TileAt(1, 0)->content_rect(); | |
437 invalidation.Inset(2, 2); | |
438 | |
439 pending_layer_->set_invalidation(invalidation); | |
440 pending_layer_->HighResTiling()->Invalidate(invalidation); | |
441 pending_layer_->LowResTiling()->Invalidate(invalidation); | |
442 | |
443 // Sanity checks: Tile at 0, 0 should be the same on both trees, tile at 1, 0 | |
444 // should be different. | |
445 ASSERT_TRUE(pending_layer_->HighResTiling()->TileAt(0, 0)); | |
danakj
2015/01/12 18:23:13
nit: i prefer s/ASSERT/EXPECT/ throughout, you don
vmpstr
2015/01/12 19:17:26
Done.
| |
446 ASSERT_TRUE(active_layer_->HighResTiling()->TileAt(0, 0)); | |
447 ASSERT_EQ(pending_layer_->HighResTiling()->TileAt(0, 0), | |
448 active_layer_->HighResTiling()->TileAt(0, 0)); | |
449 ASSERT_TRUE(pending_layer_->HighResTiling()->TileAt(1, 0)); | |
450 ASSERT_TRUE(active_layer_->HighResTiling()->TileAt(1, 0)); | |
451 ASSERT_NE(pending_layer_->HighResTiling()->TileAt(1, 0), | |
452 active_layer_->HighResTiling()->TileAt(1, 0)); | |
453 | |
454 std::set<Tile*> expected_now_tiles; | |
455 std::set<Tile*> expected_required_for_draw_tiles; | |
456 std::set<Tile*> expected_required_for_activation_tiles; | |
457 for (int i = 0; i <= 1; ++i) { | |
458 for (int j = 0; j <= 1; ++j) { | |
459 expected_now_tiles.insert(pending_layer_->HighResTiling()->TileAt(i, j)); | |
460 expected_now_tiles.insert(active_layer_->HighResTiling()->TileAt(i, j)); | |
461 | |
462 expected_required_for_activation_tiles.insert( | |
463 pending_layer_->HighResTiling()->TileAt(i, j)); | |
464 expected_required_for_draw_tiles.insert( | |
465 active_layer_->HighResTiling()->TileAt(i, j)); | |
466 } | |
467 } | |
468 // Expect 3 shared tiles and 1 unshared tile in total. | |
469 ASSERT_EQ(5u, expected_now_tiles.size()); | |
470 // Expect 4 tiles for each draw and activation, but not all the same. | |
471 ASSERT_EQ(4u, expected_required_for_activation_tiles.size()); | |
472 ASSERT_EQ(4u, expected_required_for_draw_tiles.size()); | |
473 ASSERT_NE(expected_required_for_draw_tiles, | |
474 expected_required_for_activation_tiles); | |
475 | |
476 std::set<Tile*> expected_all_tiles; | |
477 for (int i = 0; i <= 3; ++i) { | |
478 for (int j = 0; j <= 3; ++j) { | |
479 expected_all_tiles.insert(pending_layer_->HighResTiling()->TileAt(i, j)); | |
480 expected_all_tiles.insert(active_layer_->HighResTiling()->TileAt(i, j)); | |
481 } | |
482 } | |
483 // Expect 15 shared tiles and 1 unshared tile. | |
484 ASSERT_EQ(17u, expected_all_tiles.size()); | |
485 | |
486 // The actual test will now build different queues and verify that the queues | |
487 // return the same information as computed manually above. | |
488 RasterTilePriorityQueue queue; | |
489 host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES, | |
490 RasterTilePriorityQueue::Type::ALL); | |
491 std::set<Tile*> actual_now_tiles; | |
492 std::set<Tile*> actual_all_tiles; | |
493 while (!queue.IsEmpty()) { | |
494 Tile* tile = queue.Top(); | |
495 queue.Pop(); | |
496 if (tile->combined_priority().priority_bin == TilePriority::NOW) | |
497 actual_now_tiles.insert(tile); | |
498 actual_all_tiles.insert(tile); | |
499 } | |
500 EXPECT_EQ(expected_now_tiles, actual_now_tiles); | |
501 EXPECT_EQ(expected_all_tiles, actual_all_tiles); | |
502 | |
503 queue.Reset(); | |
504 host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES, | |
505 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | |
506 std::set<Tile*> actual_required_for_draw_tiles; | |
507 while (!queue.IsEmpty()) { | |
508 Tile* tile = queue.Top(); | |
509 queue.Pop(); | |
510 actual_required_for_draw_tiles.insert(tile); | |
511 } | |
512 EXPECT_EQ(expected_required_for_draw_tiles, actual_required_for_draw_tiles); | |
513 | |
514 queue.Reset(); | |
515 host_impl_.BuildRasterQueue( | |
516 &queue, SAME_PRIORITY_FOR_BOTH_TREES, | |
517 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | |
518 std::set<Tile*> actual_required_for_activation_tiles; | |
519 while (!queue.IsEmpty()) { | |
520 Tile* tile = queue.Top(); | |
521 queue.Pop(); | |
522 actual_required_for_activation_tiles.insert(tile); | |
523 } | |
524 EXPECT_EQ(expected_required_for_activation_tiles, | |
525 actual_required_for_activation_tiles); | |
328 } | 526 } |
329 | 527 |
330 TEST_F(TileManagerTilePriorityQueueTest, ActivationComesBeforeEventually) { | 528 TEST_F(TileManagerTilePriorityQueueTest, ActivationComesBeforeEventually) { |
331 base::TimeTicks time_ticks; | 529 base::TimeTicks time_ticks; |
332 time_ticks += base::TimeDelta::FromMilliseconds(1); | 530 time_ticks += base::TimeDelta::FromMilliseconds(1); |
333 host_impl_.SetCurrentBeginFrameArgs( | 531 host_impl_.SetCurrentBeginFrameArgs( |
334 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); | 532 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
335 | 533 |
336 gfx::Size layer_bounds(1000, 1000); | 534 gfx::Size layer_bounds(1000, 1000); |
337 SetupDefaultTrees(layer_bounds); | 535 SetupDefaultTrees(layer_bounds); |
(...skipping 11 matching lines...) Expand all Loading... | |
349 | 547 |
350 // Set a small viewport, so we have soon and eventually tiles. | 548 // Set a small viewport, so we have soon and eventually tiles. |
351 host_impl_.SetViewportSize(gfx::Size(200, 200)); | 549 host_impl_.SetViewportSize(gfx::Size(200, 200)); |
352 time_ticks += base::TimeDelta::FromMilliseconds(1); | 550 time_ticks += base::TimeDelta::FromMilliseconds(1); |
353 host_impl_.SetCurrentBeginFrameArgs( | 551 host_impl_.SetCurrentBeginFrameArgs( |
354 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); | 552 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
355 host_impl_.pending_tree()->UpdateDrawProperties(); | 553 host_impl_.pending_tree()->UpdateDrawProperties(); |
356 | 554 |
357 RasterTilePriorityQueue queue; | 555 RasterTilePriorityQueue queue; |
358 host_impl_.SetRequiresHighResToDraw(); | 556 host_impl_.SetRequiresHighResToDraw(); |
359 host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY); | 557 host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY, |
558 RasterTilePriorityQueue::Type::ALL); | |
360 EXPECT_FALSE(queue.IsEmpty()); | 559 EXPECT_FALSE(queue.IsEmpty()); |
361 | 560 |
362 // Get all the tiles that are NOW or SOON and make sure they are ready to | 561 // Get all the tiles that are NOW or SOON and make sure they are ready to |
363 // draw. | 562 // draw. |
364 std::vector<Tile*> all_tiles; | 563 std::vector<Tile*> all_tiles; |
365 while (!queue.IsEmpty()) { | 564 while (!queue.IsEmpty()) { |
366 Tile* tile = queue.Top(); | 565 Tile* tile = queue.Top(); |
367 if (tile->combined_priority().priority_bin >= TilePriority::EVENTUALLY) | 566 if (tile->combined_priority().priority_bin >= TilePriority::EVENTUALLY) |
368 break; | 567 break; |
369 | 568 |
(...skipping 14 matching lines...) Expand all Loading... | |
384 host_impl_.SetViewportSize(layer_bounds); | 583 host_impl_.SetViewportSize(layer_bounds); |
385 SetupDefaultTrees(layer_bounds); | 584 SetupDefaultTrees(layer_bounds); |
386 | 585 |
387 EvictionTilePriorityQueue empty_queue; | 586 EvictionTilePriorityQueue empty_queue; |
388 host_impl_.BuildEvictionQueue(&empty_queue, SAME_PRIORITY_FOR_BOTH_TREES); | 587 host_impl_.BuildEvictionQueue(&empty_queue, SAME_PRIORITY_FOR_BOTH_TREES); |
389 EXPECT_TRUE(empty_queue.IsEmpty()); | 588 EXPECT_TRUE(empty_queue.IsEmpty()); |
390 std::set<Tile*> all_tiles; | 589 std::set<Tile*> all_tiles; |
391 size_t tile_count = 0; | 590 size_t tile_count = 0; |
392 | 591 |
393 RasterTilePriorityQueue raster_queue; | 592 RasterTilePriorityQueue raster_queue; |
394 host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES); | 593 host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES, |
594 RasterTilePriorityQueue::Type::ALL); | |
395 while (!raster_queue.IsEmpty()) { | 595 while (!raster_queue.IsEmpty()) { |
396 ++tile_count; | 596 ++tile_count; |
397 EXPECT_TRUE(raster_queue.Top()); | 597 EXPECT_TRUE(raster_queue.Top()); |
398 all_tiles.insert(raster_queue.Top()); | 598 all_tiles.insert(raster_queue.Top()); |
399 raster_queue.Pop(); | 599 raster_queue.Pop(); |
400 } | 600 } |
401 | 601 |
402 EXPECT_EQ(tile_count, all_tiles.size()); | 602 EXPECT_EQ(tile_count, all_tiles.size()); |
403 EXPECT_EQ(16u, tile_count); | 603 EXPECT_EQ(16u, tile_count); |
404 | 604 |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
581 pending_child_layer->SetDrawsContent(true); | 781 pending_child_layer->SetDrawsContent(true); |
582 | 782 |
583 time_ticks += base::TimeDelta::FromMilliseconds(1); | 783 time_ticks += base::TimeDelta::FromMilliseconds(1); |
584 host_impl_.SetCurrentBeginFrameArgs( | 784 host_impl_.SetCurrentBeginFrameArgs( |
585 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); | 785 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
586 host_impl_.pending_tree()->UpdateDrawProperties(); | 786 host_impl_.pending_tree()->UpdateDrawProperties(); |
587 | 787 |
588 std::set<Tile*> all_tiles; | 788 std::set<Tile*> all_tiles; |
589 size_t tile_count = 0; | 789 size_t tile_count = 0; |
590 RasterTilePriorityQueue raster_queue; | 790 RasterTilePriorityQueue raster_queue; |
591 host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES); | 791 host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES, |
792 RasterTilePriorityQueue::Type::ALL); | |
592 while (!raster_queue.IsEmpty()) { | 793 while (!raster_queue.IsEmpty()) { |
593 ++tile_count; | 794 ++tile_count; |
594 EXPECT_TRUE(raster_queue.Top()); | 795 EXPECT_TRUE(raster_queue.Top()); |
595 all_tiles.insert(raster_queue.Top()); | 796 all_tiles.insert(raster_queue.Top()); |
596 raster_queue.Pop(); | 797 raster_queue.Pop(); |
597 } | 798 } |
598 EXPECT_EQ(tile_count, all_tiles.size()); | 799 EXPECT_EQ(tile_count, all_tiles.size()); |
599 EXPECT_EQ(32u, tile_count); | 800 EXPECT_EQ(32u, tile_count); |
600 | 801 |
601 pending_layer_->ResetAllTilesPriorities(); | 802 pending_layer_->ResetAllTilesPriorities(); |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
786 EXPECT_EQ(tile_count, new_content_tiles.size()); | 987 EXPECT_EQ(tile_count, new_content_tiles.size()); |
787 EXPECT_EQ(all_tiles, new_content_tiles); | 988 EXPECT_EQ(all_tiles, new_content_tiles); |
788 } | 989 } |
789 | 990 |
790 TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueEmptyLayers) { | 991 TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueEmptyLayers) { |
791 const gfx::Size layer_bounds(1000, 1000); | 992 const gfx::Size layer_bounds(1000, 1000); |
792 host_impl_.SetViewportSize(layer_bounds); | 993 host_impl_.SetViewportSize(layer_bounds); |
793 SetupDefaultTrees(layer_bounds); | 994 SetupDefaultTrees(layer_bounds); |
794 | 995 |
795 RasterTilePriorityQueue queue; | 996 RasterTilePriorityQueue queue; |
796 host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES); | 997 host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES, |
998 RasterTilePriorityQueue::Type::ALL); | |
797 EXPECT_FALSE(queue.IsEmpty()); | 999 EXPECT_FALSE(queue.IsEmpty()); |
798 | 1000 |
799 size_t tile_count = 0; | 1001 size_t tile_count = 0; |
800 std::set<Tile*> all_tiles; | 1002 std::set<Tile*> all_tiles; |
801 while (!queue.IsEmpty()) { | 1003 while (!queue.IsEmpty()) { |
802 EXPECT_TRUE(queue.Top()); | 1004 EXPECT_TRUE(queue.Top()); |
803 all_tiles.insert(queue.Top()); | 1005 all_tiles.insert(queue.Top()); |
804 ++tile_count; | 1006 ++tile_count; |
805 queue.Pop(); | 1007 queue.Pop(); |
806 } | 1008 } |
807 | 1009 |
808 EXPECT_EQ(tile_count, all_tiles.size()); | 1010 EXPECT_EQ(tile_count, all_tiles.size()); |
809 EXPECT_EQ(16u, tile_count); | 1011 EXPECT_EQ(16u, tile_count); |
810 | 1012 |
811 queue.Reset(); | 1013 queue.Reset(); |
812 for (int i = 1; i < 10; ++i) { | 1014 for (int i = 1; i < 10; ++i) { |
813 scoped_ptr<FakePictureLayerImpl> pending_layer = | 1015 scoped_ptr<FakePictureLayerImpl> pending_layer = |
814 FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i); | 1016 FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i); |
815 pending_layer->SetDrawsContent(true); | 1017 pending_layer->SetDrawsContent(true); |
816 pending_layer->set_has_valid_tile_priorities(true); | 1018 pending_layer->set_has_valid_tile_priorities(true); |
817 pending_layer_->AddChild(pending_layer.Pass()); | 1019 pending_layer_->AddChild(pending_layer.Pass()); |
818 } | 1020 } |
819 | 1021 |
820 host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES); | 1022 host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES, |
1023 RasterTilePriorityQueue::Type::ALL); | |
821 EXPECT_FALSE(queue.IsEmpty()); | 1024 EXPECT_FALSE(queue.IsEmpty()); |
822 | 1025 |
823 tile_count = 0; | 1026 tile_count = 0; |
824 all_tiles.clear(); | 1027 all_tiles.clear(); |
825 while (!queue.IsEmpty()) { | 1028 while (!queue.IsEmpty()) { |
826 EXPECT_TRUE(queue.Top()); | 1029 EXPECT_TRUE(queue.Top()); |
827 all_tiles.insert(queue.Top()); | 1030 all_tiles.insert(queue.Top()); |
828 ++tile_count; | 1031 ++tile_count; |
829 queue.Pop(); | 1032 queue.Pop(); |
830 } | 1033 } |
831 EXPECT_EQ(tile_count, all_tiles.size()); | 1034 EXPECT_EQ(tile_count, all_tiles.size()); |
832 EXPECT_EQ(16u, tile_count); | 1035 EXPECT_EQ(16u, tile_count); |
833 } | 1036 } |
834 | 1037 |
835 TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueueEmptyLayers) { | 1038 TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueueEmptyLayers) { |
836 const gfx::Size layer_bounds(1000, 1000); | 1039 const gfx::Size layer_bounds(1000, 1000); |
837 host_impl_.SetViewportSize(layer_bounds); | 1040 host_impl_.SetViewportSize(layer_bounds); |
838 SetupDefaultTrees(layer_bounds); | 1041 SetupDefaultTrees(layer_bounds); |
839 | 1042 |
840 RasterTilePriorityQueue raster_queue; | 1043 RasterTilePriorityQueue raster_queue; |
841 host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES); | 1044 host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES, |
1045 RasterTilePriorityQueue::Type::ALL); | |
842 EXPECT_FALSE(raster_queue.IsEmpty()); | 1046 EXPECT_FALSE(raster_queue.IsEmpty()); |
843 | 1047 |
844 size_t tile_count = 0; | 1048 size_t tile_count = 0; |
845 std::set<Tile*> all_tiles; | 1049 std::set<Tile*> all_tiles; |
846 while (!raster_queue.IsEmpty()) { | 1050 while (!raster_queue.IsEmpty()) { |
847 EXPECT_TRUE(raster_queue.Top()); | 1051 EXPECT_TRUE(raster_queue.Top()); |
848 all_tiles.insert(raster_queue.Top()); | 1052 all_tiles.insert(raster_queue.Top()); |
849 ++tile_count; | 1053 ++tile_count; |
850 raster_queue.Pop(); | 1054 raster_queue.Pop(); |
851 } | 1055 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
898 &client, settings.max_tiles_for_interest_area, | 1102 &client, settings.max_tiles_for_interest_area, |
899 settings.skewport_target_time_in_seconds, | 1103 settings.skewport_target_time_in_seconds, |
900 settings.skewport_extrapolation_limit_in_content_pixels); | 1104 settings.skewport_extrapolation_limit_in_content_pixels); |
901 | 1105 |
902 scoped_refptr<FakePicturePileImpl> pile = | 1106 scoped_refptr<FakePicturePileImpl> pile = |
903 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds); | 1107 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds); |
904 PictureLayerTiling* tiling = tiling_set->AddTiling(1.0f, pile); | 1108 PictureLayerTiling* tiling = tiling_set->AddTiling(1.0f, pile); |
905 tiling->set_resolution(HIGH_RESOLUTION); | 1109 tiling->set_resolution(HIGH_RESOLUTION); |
906 | 1110 |
907 tiling_set->UpdateTilePriorities(viewport, 1.0f, 1.0, Occlusion(), true); | 1111 tiling_set->UpdateTilePriorities(viewport, 1.0f, 1.0, Occlusion(), true); |
908 | |
909 TilingSetRasterQueue empty_queue; | |
910 EXPECT_TRUE(empty_queue.IsEmpty()); | |
911 | |
912 std::vector<Tile*> all_tiles = tiling->AllTilesForTesting(); | 1112 std::vector<Tile*> all_tiles = tiling->AllTilesForTesting(); |
913 | |
914 // Sanity check. | 1113 // Sanity check. |
915 EXPECT_EQ(841u, all_tiles.size()); | 1114 EXPECT_EQ(841u, all_tiles.size()); |
916 | 1115 |
917 // The explanation of each iteration is as follows: | 1116 // The explanation of each iteration is as follows: |
918 // 1. First iteration tests that we can get all of the tiles correctly. | 1117 // 1. First iteration tests that we can get all of the tiles correctly. |
919 // 2. Second iteration ensures that we can get all of the tiles again (first | 1118 // 2. Second iteration ensures that we can get all of the tiles again (first |
920 // iteration didn't change any tiles), as well set all tiles to be ready to | 1119 // iteration didn't change any tiles), as well set all tiles to be ready to |
921 // draw. | 1120 // draw. |
922 // 3. Third iteration ensures that no tiles are returned, since they were all | 1121 // 3. Third iteration ensures that no tiles are returned, since they were all |
923 // marked as ready to draw. | 1122 // marked as ready to draw. |
924 for (int i = 0; i < 3; ++i) { | 1123 for (int i = 0; i < 3; ++i) { |
925 TilingSetRasterQueue queue(tiling_set.get(), false); | 1124 scoped_ptr<TilingSetRasterQueue> queue( |
1125 new TilingSetRasterQueueAll(tiling_set.get(), false)); | |
926 | 1126 |
927 // There are 3 bins in TilePriority. | 1127 // There are 3 bins in TilePriority. |
928 bool have_tiles[3] = {}; | 1128 bool have_tiles[3] = {}; |
929 | 1129 |
930 // On the third iteration, we should get no tiles since everything was | 1130 // On the third iteration, we should get no tiles since everything was |
931 // marked as ready to draw. | 1131 // marked as ready to draw. |
932 if (i == 2) { | 1132 if (i == 2) { |
933 EXPECT_TRUE(queue.IsEmpty()); | 1133 EXPECT_TRUE(queue->IsEmpty()); |
934 continue; | 1134 continue; |
935 } | 1135 } |
936 | 1136 |
937 EXPECT_FALSE(queue.IsEmpty()); | 1137 EXPECT_FALSE(queue->IsEmpty()); |
938 std::set<Tile*> unique_tiles; | 1138 std::set<Tile*> unique_tiles; |
939 unique_tiles.insert(queue.Top()); | 1139 unique_tiles.insert(queue->Top()); |
940 Tile* last_tile = queue.Top(); | 1140 Tile* last_tile = queue->Top(); |
941 have_tiles[last_tile->priority(ACTIVE_TREE).priority_bin] = true; | 1141 have_tiles[last_tile->priority(ACTIVE_TREE).priority_bin] = true; |
942 | 1142 |
943 // On the second iteration, mark everything as ready to draw (solid color). | 1143 // On the second iteration, mark everything as ready to draw (solid color). |
944 if (i == 1) { | 1144 if (i == 1) { |
945 TileDrawInfo& draw_info = last_tile->draw_info(); | 1145 TileDrawInfo& draw_info = last_tile->draw_info(); |
946 draw_info.SetSolidColorForTesting(SK_ColorRED); | 1146 draw_info.SetSolidColorForTesting(SK_ColorRED); |
947 } | 1147 } |
948 queue.Pop(); | 1148 queue->Pop(); |
949 int eventually_bin_order_correct_count = 0; | 1149 int eventually_bin_order_correct_count = 0; |
950 int eventually_bin_order_incorrect_count = 0; | 1150 int eventually_bin_order_incorrect_count = 0; |
951 while (!queue.IsEmpty()) { | 1151 while (!queue->IsEmpty()) { |
952 Tile* new_tile = queue.Top(); | 1152 Tile* new_tile = queue->Top(); |
953 queue.Pop(); | 1153 queue->Pop(); |
954 unique_tiles.insert(new_tile); | 1154 unique_tiles.insert(new_tile); |
955 | 1155 |
956 TilePriority last_priority = last_tile->priority(ACTIVE_TREE); | 1156 TilePriority last_priority = last_tile->priority(ACTIVE_TREE); |
957 TilePriority new_priority = new_tile->priority(ACTIVE_TREE); | 1157 TilePriority new_priority = new_tile->priority(ACTIVE_TREE); |
958 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); | 1158 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); |
959 if (last_priority.priority_bin == new_priority.priority_bin) { | 1159 if (last_priority.priority_bin == new_priority.priority_bin) { |
960 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { | 1160 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { |
961 bool order_correct = last_priority.distance_to_visible <= | 1161 bool order_correct = last_priority.distance_to_visible <= |
962 new_priority.distance_to_visible; | 1162 new_priority.distance_to_visible; |
963 eventually_bin_order_correct_count += order_correct; | 1163 eventually_bin_order_correct_count += order_correct; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1024 true); | 1224 true); |
1025 | 1225 |
1026 gfx::Rect soon_rect = moved_viewport; | 1226 gfx::Rect soon_rect = moved_viewport; |
1027 soon_rect.Inset(-312.f, -312.f, -312.f, -312.f); | 1227 soon_rect.Inset(-312.f, -312.f, -312.f, -312.f); |
1028 | 1228 |
1029 // There are 3 bins in TilePriority. | 1229 // There are 3 bins in TilePriority. |
1030 bool have_tiles[3] = {}; | 1230 bool have_tiles[3] = {}; |
1031 Tile* last_tile = NULL; | 1231 Tile* last_tile = NULL; |
1032 int eventually_bin_order_correct_count = 0; | 1232 int eventually_bin_order_correct_count = 0; |
1033 int eventually_bin_order_incorrect_count = 0; | 1233 int eventually_bin_order_incorrect_count = 0; |
1034 for (TilingSetRasterQueue queue(tiling_set.get(), false); !queue.IsEmpty(); | 1234 scoped_ptr<TilingSetRasterQueue> queue( |
1035 queue.Pop()) { | 1235 new TilingSetRasterQueueAll(tiling_set.get(), false)); |
1236 for (; !queue->IsEmpty(); queue->Pop()) { | |
1036 if (!last_tile) | 1237 if (!last_tile) |
1037 last_tile = queue.Top(); | 1238 last_tile = queue->Top(); |
1038 | 1239 |
1039 Tile* new_tile = queue.Top(); | 1240 Tile* new_tile = queue->Top(); |
1040 | 1241 |
1041 TilePriority last_priority = last_tile->priority(ACTIVE_TREE); | 1242 TilePriority last_priority = last_tile->priority(ACTIVE_TREE); |
1042 TilePriority new_priority = new_tile->priority(ACTIVE_TREE); | 1243 TilePriority new_priority = new_tile->priority(ACTIVE_TREE); |
1043 | 1244 |
1044 have_tiles[new_priority.priority_bin] = true; | 1245 have_tiles[new_priority.priority_bin] = true; |
1045 | 1246 |
1046 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); | 1247 EXPECT_LE(last_priority.priority_bin, new_priority.priority_bin); |
1047 if (last_priority.priority_bin == new_priority.priority_bin) { | 1248 if (last_priority.priority_bin == new_priority.priority_bin) { |
1048 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { | 1249 if (last_priority.priority_bin == TilePriority::EVENTUALLY) { |
1049 bool order_correct = last_priority.distance_to_visible <= | 1250 bool order_correct = last_priority.distance_to_visible <= |
(...skipping 14 matching lines...) Expand all Loading... | |
1064 EXPECT_GT(eventually_bin_order_correct_count, | 1265 EXPECT_GT(eventually_bin_order_correct_count, |
1065 eventually_bin_order_incorrect_count); | 1266 eventually_bin_order_incorrect_count); |
1066 | 1267 |
1067 EXPECT_TRUE(have_tiles[TilePriority::NOW]); | 1268 EXPECT_TRUE(have_tiles[TilePriority::NOW]); |
1068 EXPECT_TRUE(have_tiles[TilePriority::SOON]); | 1269 EXPECT_TRUE(have_tiles[TilePriority::SOON]); |
1069 EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]); | 1270 EXPECT_TRUE(have_tiles[TilePriority::EVENTUALLY]); |
1070 } | 1271 } |
1071 | 1272 |
1072 } // namespace | 1273 } // namespace |
1073 } // namespace cc | 1274 } // namespace cc |
OLD | NEW |