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/layers/tiled_layer.h" | 5 #include "cc/layers/tiled_layer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "build/build_config.h" | 12 #include "build/build_config.h" |
13 #include "cc/debug/overdraw_metrics.h" | |
14 #include "cc/layers/layer_impl.h" | 13 #include "cc/layers/layer_impl.h" |
15 #include "cc/layers/tiled_layer_impl.h" | 14 #include "cc/layers/tiled_layer_impl.h" |
16 #include "cc/resources/layer_updater.h" | 15 #include "cc/resources/layer_updater.h" |
17 #include "cc/resources/prioritized_resource.h" | 16 #include "cc/resources/prioritized_resource.h" |
18 #include "cc/resources/priority_calculator.h" | 17 #include "cc/resources/priority_calculator.h" |
19 #include "cc/trees/layer_tree_host.h" | 18 #include "cc/trees/layer_tree_host.h" |
20 #include "cc/trees/occlusion_tracker.h" | 19 #include "cc/trees/occlusion_tracker.h" |
21 #include "third_party/khronos/GLES2/gl2.h" | 20 #include "third_party/khronos/GLES2/gl2.h" |
22 #include "ui/gfx/rect_conversions.h" | 21 #include "ui/gfx/rect_conversions.h" |
23 | 22 |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 if (!HaveTexturesForTiles(left, top, right, bottom, ignore_occlusions)) { | 334 if (!HaveTexturesForTiles(left, top, right, bottom, ignore_occlusions)) { |
336 failed_update_ = true; | 335 failed_update_ = true; |
337 return false; | 336 return false; |
338 } | 337 } |
339 | 338 |
340 gfx::Rect update_rect; | 339 gfx::Rect update_rect; |
341 gfx::Rect paint_rect; | 340 gfx::Rect paint_rect; |
342 MarkTilesForUpdate( | 341 MarkTilesForUpdate( |
343 &update_rect, &paint_rect, left, top, right, bottom, ignore_occlusions); | 342 &update_rect, &paint_rect, left, top, right, bottom, ignore_occlusions); |
344 | 343 |
345 if (occlusion) | |
346 occlusion->overdraw_metrics()->DidPaint(paint_rect); | |
347 | |
348 if (paint_rect.IsEmpty()) | 344 if (paint_rect.IsEmpty()) |
349 return true; | 345 return true; |
350 | 346 |
351 *updated = true; | 347 *updated = true; |
352 UpdateTileTextures( | 348 UpdateTileTextures( |
353 update_rect, paint_rect, left, top, right, bottom, queue, occlusion); | 349 update_rect, paint_rect, left, top, right, bottom, queue, occlusion); |
354 return true; | 350 return true; |
355 } | 351 } |
356 | 352 |
357 void TiledLayer::MarkOcclusionsAndRequestTextures( | 353 void TiledLayer::MarkOcclusionsAndRequestTextures( |
358 int left, | 354 int left, |
359 int top, | 355 int top, |
360 int right, | 356 int right, |
361 int bottom, | 357 int bottom, |
362 const OcclusionTracker<Layer>* occlusion) { | 358 const OcclusionTracker<Layer>* occlusion) { |
363 // There is some difficult dependancies between occlusions, recording | |
364 // occlusion metrics and requesting memory so those are encapsulated in this | |
365 // function: - We only want to call RequestLate on unoccluded textures (to | |
366 // preserve memory for other layers when near OOM). - We only want to record | |
367 // occlusion metrics if all memory requests succeed. | |
368 | |
369 int occluded_tile_count = 0; | 359 int occluded_tile_count = 0; |
370 bool succeeded = true; | 360 bool succeeded = true; |
371 for (int j = top; j <= bottom; ++j) { | 361 for (int j = top; j <= bottom; ++j) { |
372 for (int i = left; i <= right; ++i) { | 362 for (int i = left; i <= right; ++i) { |
373 UpdatableTile* tile = TileAt(i, j); | 363 UpdatableTile* tile = TileAt(i, j); |
374 DCHECK(tile); // Did SetTexturePriorities get skipped? | 364 DCHECK(tile); // Did SetTexturePriorities get skipped? |
375 // TODO(enne): This should not ever be null. | 365 // TODO(enne): This should not ever be null. |
376 if (!tile) | 366 if (!tile) |
377 continue; | 367 continue; |
378 // Did ResetUpdateState get skipped? Are we doing more than one occlusion | 368 // Did ResetUpdateState get skipped? Are we doing more than one occlusion |
379 // pass? | 369 // pass? |
380 DCHECK(!tile->occluded); | 370 DCHECK(!tile->occluded); |
381 gfx::Rect visible_tile_rect = gfx::IntersectRects( | 371 gfx::Rect visible_tile_rect = gfx::IntersectRects( |
382 tiler_->tile_bounds(i, j), visible_content_rect()); | 372 tiler_->tile_bounds(i, j), visible_content_rect()); |
383 if (!draw_transform_is_animating() && occlusion && | 373 if (!draw_transform_is_animating() && occlusion && |
384 occlusion->Occluded( | 374 occlusion->Occluded( |
385 render_target(), visible_tile_rect, draw_transform())) { | 375 render_target(), visible_tile_rect, draw_transform())) { |
386 tile->occluded = true; | 376 tile->occluded = true; |
387 occluded_tile_count++; | 377 occluded_tile_count++; |
388 } else { | 378 } else { |
389 succeeded &= tile->managed_resource()->RequestLate(); | 379 succeeded &= tile->managed_resource()->RequestLate(); |
390 } | 380 } |
391 } | 381 } |
392 } | 382 } |
393 | |
394 if (!succeeded) | |
395 return; | |
396 if (occlusion) | |
397 occlusion->overdraw_metrics()->DidCullTilesForUpload(occluded_tile_count); | |
398 } | 383 } |
399 | 384 |
400 bool TiledLayer::HaveTexturesForTiles(int left, | 385 bool TiledLayer::HaveTexturesForTiles(int left, |
401 int top, | 386 int top, |
402 int right, | 387 int right, |
403 int bottom, | 388 int bottom, |
404 bool ignore_occlusions) { | 389 bool ignore_occlusions) { |
405 for (int j = top; j <= bottom; ++j) { | 390 for (int j = top; j <= bottom; ++j) { |
406 for (int i = left; i <= right; ++i) { | 391 for (int i = left; i <= right; ++i) { |
407 UpdatableTile* tile = TileAt(i, j); | 392 UpdatableTile* tile = TileAt(i, j); |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 | 544 |
560 // Offset from paint rectangle to this tile's dirty rectangle. | 545 // Offset from paint rectangle to this tile's dirty rectangle. |
561 gfx::Vector2d paint_offset = source_rect.origin() - paint_rect.origin(); | 546 gfx::Vector2d paint_offset = source_rect.origin() - paint_rect.origin(); |
562 CHECK_GE(paint_offset.x(), 0); | 547 CHECK_GE(paint_offset.x(), 0); |
563 CHECK_GE(paint_offset.y(), 0); | 548 CHECK_GE(paint_offset.y(), 0); |
564 CHECK_LE(paint_offset.x() + source_rect.width(), paint_rect.width()); | 549 CHECK_LE(paint_offset.x() + source_rect.width(), paint_rect.width()); |
565 CHECK_LE(paint_offset.y() + source_rect.height(), paint_rect.height()); | 550 CHECK_LE(paint_offset.y() + source_rect.height(), paint_rect.height()); |
566 | 551 |
567 tile->updater_resource()->Update( | 552 tile->updater_resource()->Update( |
568 queue, source_rect, dest_offset, tile->partial_update); | 553 queue, source_rect, dest_offset, tile->partial_update); |
569 if (occlusion) { | |
570 occlusion->overdraw_metrics()-> | |
571 DidUpload(gfx::Transform(), source_rect, tile->opaque_rect()); | |
572 } | |
573 } | 554 } |
574 } | 555 } |
575 } | 556 } |
576 | 557 |
577 // This picks a small animated layer to be anything less than one viewport. This | 558 // This picks a small animated layer to be anything less than one viewport. This |
578 // is specifically for page transitions which are viewport-sized layers. The | 559 // is specifically for page transitions which are viewport-sized layers. The |
579 // extra tile of padding is due to these layers being slightly larger than the | 560 // extra tile of padding is due to these layers being slightly larger than the |
580 // viewport in some cases. | 561 // viewport in some cases. |
581 bool TiledLayer::IsSmallAnimatedLayer() const { | 562 bool TiledLayer::IsSmallAnimatedLayer() const { |
582 if (!draw_transform_is_animating() && !screen_space_transform_is_animating()) | 563 if (!draw_transform_is_animating() && !screen_space_transform_is_animating()) |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
913 gfx::Rect prepaint_rect = visible_content_rect(); | 894 gfx::Rect prepaint_rect = visible_content_rect(); |
914 prepaint_rect.Inset(-tiler_->tile_size().width() * kPrepaintColumns, | 895 prepaint_rect.Inset(-tiler_->tile_size().width() * kPrepaintColumns, |
915 -tiler_->tile_size().height() * kPrepaintRows); | 896 -tiler_->tile_size().height() * kPrepaintRows); |
916 gfx::Rect content_rect(content_bounds()); | 897 gfx::Rect content_rect(content_bounds()); |
917 prepaint_rect.Intersect(content_rect); | 898 prepaint_rect.Intersect(content_rect); |
918 | 899 |
919 return prepaint_rect; | 900 return prepaint_rect; |
920 } | 901 } |
921 | 902 |
922 } // namespace cc | 903 } // namespace cc |
OLD | NEW |