Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/tile_manager.h" | 5 #include "cc/resources/tile_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/json/json_writer.h" | 11 #include "base/json/json_writer.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 14 #include "cc/debug/devtools_instrumentation.h" | 14 #include "cc/debug/devtools_instrumentation.h" |
| 15 #include "cc/debug/traced_value.h" | 15 #include "cc/debug/traced_value.h" |
| 16 #include "cc/resources/image_raster_worker_pool.h" | 16 #include "cc/resources/image_raster_worker_pool.h" |
| 17 #include "cc/resources/pixel_buffer_raster_worker_pool.h" | 17 #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
| 18 #include "cc/resources/tile.h" | 18 #include "cc/resources/tile.h" |
| 19 #include "skia/ext/paint_simplifier.h" | |
| 19 #include "third_party/skia/include/core/SkCanvas.h" | 20 #include "third_party/skia/include/core/SkCanvas.h" |
| 20 #include "ui/gfx/rect_conversions.h" | 21 #include "ui/gfx/rect_conversions.h" |
| 21 | 22 |
| 22 namespace cc { | 23 namespace cc { |
| 23 | 24 |
| 24 namespace { | 25 namespace { |
| 25 | 26 |
| 27 class DisableLCDTextFilter : public SkDrawFilter { | |
| 28 public: | |
| 29 // SkDrawFilter interface. | |
| 30 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE { | |
| 31 if (type != SkDrawFilter::kText_Type) | |
| 32 return true; | |
| 33 | |
| 34 paint->setLCDRenderText(false); | |
| 35 return true; | |
| 36 } | |
| 37 }; | |
| 38 | |
| 26 // Determine bin based on three categories of tiles: things we need now, | 39 // Determine bin based on three categories of tiles: things we need now, |
| 27 // things we need soon, and eventually. | 40 // things we need soon, and eventually. |
| 28 inline TileManagerBin BinFromTilePriority(const TilePriority& prio) { | 41 inline TileManagerBin BinFromTilePriority(const TilePriority& prio) { |
| 29 // The amount of time for which we want to have prepainting coverage. | 42 // The amount of time for which we want to have prepainting coverage. |
| 30 const float kPrepaintingWindowTimeSeconds = 1.0f; | 43 const float kPrepaintingWindowTimeSeconds = 1.0f; |
| 31 const float kBackflingGuardDistancePixels = 314.0f; | 44 const float kBackflingGuardDistancePixels = 314.0f; |
| 32 | 45 |
| 33 if (prio.time_to_visible_in_seconds == 0) | 46 if (prio.time_to_visible_in_seconds == 0) |
| 34 return NOW_BIN; | 47 return NOW_BIN; |
| 35 | 48 |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 299 | 312 |
| 300 if (!client_->ShouldForceTileUploadsRequiredForActivationToComplete()) | 313 if (!client_->ShouldForceTileUploadsRequiredForActivationToComplete()) |
| 301 return; | 314 return; |
| 302 | 315 |
| 303 TileSet initialized_tiles; | 316 TileSet initialized_tiles; |
| 304 for (TileSet::iterator it = | 317 for (TileSet::iterator it = |
| 305 tiles_that_need_to_be_initialized_for_activation_.begin(); | 318 tiles_that_need_to_be_initialized_for_activation_.begin(); |
| 306 it != tiles_that_need_to_be_initialized_for_activation_.end(); | 319 it != tiles_that_need_to_be_initialized_for_activation_.end(); |
| 307 ++it) { | 320 ++it) { |
| 308 Tile* tile = *it; | 321 Tile* tile = *it; |
| 309 if (!tile->managed_state().raster_task.is_null() && | 322 ManagedTileState& mts = tile->managed_state(); |
| 310 !tile->tile_version().forced_upload_) { | |
| 311 if (!raster_worker_pool_->ForceUploadToComplete( | |
| 312 tile->managed_state().raster_task)) | |
| 313 continue; | |
| 314 | 323 |
| 315 // Setting |forced_upload_| to true makes this tile ready to draw. | 324 for (int mode = NUM_RASTER_MODES - 1; mode >= 0; --mode) { |
|
reveman
2013/06/05 18:01:32
lets keep this comment. just s/this tile/this tile
vmpstr
2013/06/06 01:54:20
Done.
| |
| 316 tile->tile_version().forced_upload_ = true; | 325 ManagedTileState::TileVersion& pending_version = |
| 317 initialized_tiles.insert(tile); | 326 mts.tile_versions[mode]; |
| 327 if (!pending_version.raster_task_.is_null() && | |
| 328 !pending_version.forced_upload_) { | |
| 329 if (!raster_worker_pool_->ForceUploadToComplete( | |
| 330 pending_version.raster_task_)) { | |
| 331 continue; | |
| 332 } | |
| 333 pending_version.forced_upload_ = true; | |
| 334 initialized_tiles.insert(tile); | |
| 335 break; | |
| 336 } | |
| 318 } | 337 } |
| 319 } | 338 } |
| 320 | 339 |
| 321 for (TileSet::iterator it = initialized_tiles.begin(); | 340 for (TileSet::iterator it = initialized_tiles.begin(); |
| 322 it != initialized_tiles.end(); | 341 it != initialized_tiles.end(); |
| 323 ++it) { | 342 ++it) { |
| 324 Tile* tile = *it; | 343 Tile* tile = *it; |
| 325 DidFinishTileInitialization(tile); | 344 DidFinishTileInitialization(tile); |
| 326 DCHECK(tile->tile_version().IsReadyToDraw()); | 345 DCHECK(tile->tile_version().IsReadyToDraw()); |
| 327 } | 346 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 386 } | 405 } |
| 387 | 406 |
| 388 void TileManager::AddRequiredTileForActivation(Tile* tile) { | 407 void TileManager::AddRequiredTileForActivation(Tile* tile) { |
| 389 DCHECK(std::find(tiles_that_need_to_be_initialized_for_activation_.begin(), | 408 DCHECK(std::find(tiles_that_need_to_be_initialized_for_activation_.begin(), |
| 390 tiles_that_need_to_be_initialized_for_activation_.end(), | 409 tiles_that_need_to_be_initialized_for_activation_.end(), |
| 391 tile) == | 410 tile) == |
| 392 tiles_that_need_to_be_initialized_for_activation_.end()); | 411 tiles_that_need_to_be_initialized_for_activation_.end()); |
| 393 tiles_that_need_to_be_initialized_for_activation_.insert(tile); | 412 tiles_that_need_to_be_initialized_for_activation_.insert(tile); |
| 394 } | 413 } |
| 395 | 414 |
| 415 TileRasterMode TileManager::DetermineRasterMode(const Tile* tile) const { | |
| 416 DCHECK(tile); | |
| 417 DCHECK(tile->picture_pile()); | |
| 418 | |
| 419 TileRasterMode raster_mode; | |
| 420 | |
| 421 if (tile->managed_state().resolution == LOW_RESOLUTION) | |
| 422 raster_mode = LOW_QUALITY_RASTER_MODE; | |
| 423 else if (!tile->picture_pile()->can_use_lcd_text()) | |
| 424 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; | |
| 425 else | |
| 426 raster_mode = HIGH_QUALITY_RASTER_MODE; | |
| 427 | |
| 428 return raster_mode; | |
| 429 } | |
| 430 | |
| 396 void TileManager::AssignGpuMemoryToTiles() { | 431 void TileManager::AssignGpuMemoryToTiles() { |
| 397 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); | 432 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); |
| 398 | 433 |
| 399 // Now give memory out to the tiles until we're out, and build | 434 // Now give memory out to the tiles until we're out, and build |
| 400 // the needs-to-be-rasterized queue. | 435 // the needs-to-be-rasterized queue. |
| 401 tiles_that_need_to_be_rasterized_.clear(); | 436 tiles_that_need_to_be_rasterized_.clear(); |
| 402 tiles_that_need_to_be_initialized_for_activation_.clear(); | 437 tiles_that_need_to_be_initialized_for_activation_.clear(); |
| 403 | 438 |
| 404 size_t bytes_releasable = 0; | 439 size_t bytes_releasable = 0; |
| 405 for (TileVector::const_iterator it = tiles_.begin(); | 440 for (TileVector::const_iterator it = tiles_.begin(); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 422 size_t bytes_that_exceeded_memory_budget_in_now_bin = 0; | 457 size_t bytes_that_exceeded_memory_budget_in_now_bin = 0; |
| 423 size_t bytes_left = bytes_allocatable; | 458 size_t bytes_left = bytes_allocatable; |
| 424 size_t bytes_oom_in_now_bin_on_pending_tree = 0; | 459 size_t bytes_oom_in_now_bin_on_pending_tree = 0; |
| 425 TileVector tiles_requiring_memory_but_oomed; | 460 TileVector tiles_requiring_memory_but_oomed; |
| 426 bool higher_priority_tile_oomed = false; | 461 bool higher_priority_tile_oomed = false; |
| 427 for (TileVector::iterator it = tiles_.begin(); | 462 for (TileVector::iterator it = tiles_.begin(); |
| 428 it != tiles_.end(); | 463 it != tiles_.end(); |
| 429 ++it) { | 464 ++it) { |
| 430 Tile* tile = *it; | 465 Tile* tile = *it; |
| 431 ManagedTileState& mts = tile->managed_state(); | 466 ManagedTileState& mts = tile->managed_state(); |
| 432 ManagedTileState::TileVersion& tile_version = tile->tile_version(); | 467 mts.raster_mode = DetermineRasterMode(tile); |
|
reveman
2013/06/05 18:01:32
Please DCHECK that new raster_mode is not worse th
vmpstr
2013/06/06 01:54:20
Turns out that when you switch tabs, the inactive
| |
| 468 ManagedTileState::TileVersion& tile_version = | |
| 469 mts.tile_versions[mts.raster_mode]; | |
| 433 | 470 |
| 434 // If this tile doesn't need a resource, then nothing to do. | 471 // If this tile doesn't need a resource, then nothing to do. |
| 435 if (!tile_version.requires_resource()) | 472 if (!tile_version.requires_resource()) |
| 436 continue; | 473 continue; |
| 437 | 474 |
| 438 // If the tile is not needed, free it up. | 475 // If the tile is not needed, free it up. |
| 439 if (mts.is_in_never_bin_on_both_trees()) { | 476 if (mts.is_in_never_bin_on_both_trees()) { |
| 440 FreeResourcesForTile(tile); | 477 FreeResourcesForTile(tile); |
| 441 continue; | 478 continue; |
| 442 } | 479 } |
| 443 | 480 |
| 444 size_t tile_bytes = 0; | 481 size_t tile_bytes = 0; |
| 445 | 482 |
| 446 // It costs to maintain a resource. | 483 // It costs to maintain a resource. |
| 447 if (tile_version.resource_) | 484 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { |
| 485 if (mts.tile_versions[mode].resource_) | |
| 486 tile_bytes += tile->bytes_consumed_if_allocated(); | |
| 487 } | |
| 488 | |
| 489 // If we don't have the required version, and it's not in flight | |
| 490 // then we'll have to pay to create a new task. | |
| 491 if (!tile_version.resource_ && tile_version.raster_task_.is_null()) { | |
| 448 tile_bytes += tile->bytes_consumed_if_allocated(); | 492 tile_bytes += tile->bytes_consumed_if_allocated(); |
| 449 | 493 } |
|
reveman
2013/06/05 18:01:32
nit: {} not required
vmpstr
2013/06/06 01:54:20
Done.
| |
| 450 // It will cost to allocate a resource. | |
| 451 // Note that this is separate from the above condition, | |
| 452 // so that it's clear why we're adding memory. | |
| 453 if (!tile_version.resource_ && mts.raster_task.is_null()) | |
| 454 tile_bytes += tile->bytes_consumed_if_allocated(); | |
| 455 | 494 |
| 456 // Tile is OOM. | 495 // Tile is OOM. |
| 457 if (tile_bytes > bytes_left) { | 496 if (tile_bytes > bytes_left) { |
| 458 tile->tile_version().set_rasterize_on_demand(); | 497 tile->tile_version().set_rasterize_on_demand(); |
| 459 if (mts.tree_bin[PENDING_TREE] == NOW_BIN) { | 498 if (mts.tree_bin[PENDING_TREE] == NOW_BIN) { |
| 460 tiles_requiring_memory_but_oomed.push_back(tile); | 499 tiles_requiring_memory_but_oomed.push_back(tile); |
| 461 bytes_oom_in_now_bin_on_pending_tree += tile_bytes; | 500 bytes_oom_in_now_bin_on_pending_tree += tile_bytes; |
| 462 } | 501 } |
| 463 FreeResourcesForTile(tile); | 502 FreeResourcesForTile(tile); |
| 464 higher_priority_tile_oomed = true; | 503 higher_priority_tile_oomed = true; |
| 465 continue; | 504 continue; |
| 466 } | 505 } |
| 467 | 506 |
| 468 tile_version.set_use_resource(); | 507 tile_version.set_use_resource(); |
| 469 bytes_left -= tile_bytes; | 508 bytes_left -= tile_bytes; |
| 470 | 509 |
| 471 // Tile shouldn't be rasterized if we've failed to assign | 510 // Tile shouldn't be rasterized if we've failed to assign |
| 472 // gpu memory to a higher priority tile. This is important for | 511 // gpu memory to a higher priority tile. This is important for |
| 473 // two reasons: | 512 // two reasons: |
| 474 // 1. Tile size should not impact raster priority. | 513 // 1. Tile size should not impact raster priority. |
| 475 // 2. Tile with unreleasable memory could otherwise incorrectly | 514 // 2. Tile with unreleasable memory could otherwise incorrectly |
| 476 // be added as it's not affected by |bytes_allocatable|. | 515 // be added as it's not affected by |bytes_allocatable|. |
| 477 if (higher_priority_tile_oomed) | 516 if (higher_priority_tile_oomed) |
| 478 continue; | 517 continue; |
| 479 | 518 |
| 480 if (!tile_version.resource_) | 519 if (!tile_version.resource_) |
| 481 tiles_that_need_to_be_rasterized_.push_back(tile); | 520 tiles_that_need_to_be_rasterized_.push_back(tile); |
| 482 | 521 |
| 483 if (!tile_version.resource_ && tile->required_for_activation()) | 522 if (!tile_version.resource_ && |
|
reveman
2013/06/05 18:01:32
should the "!tile_version.resource_" be here? seem
vmpstr
2013/06/06 01:54:20
Done.
| |
| 523 !tile->tile_version().IsReadyToDraw() && | |
| 524 tile->required_for_activation()) { | |
| 484 AddRequiredTileForActivation(tile); | 525 AddRequiredTileForActivation(tile); |
| 526 } | |
| 485 } | 527 } |
| 486 | 528 |
| 487 // In OOM situation, we iterate tiles_, remove the memory for active tree | 529 // In OOM situation, we iterate tiles_, remove the memory for active tree |
| 488 // and not the now bin. And give them to bytes_oom_in_now_bin_on_pending_tree | 530 // and not the now bin. And give them to bytes_oom_in_now_bin_on_pending_tree |
| 489 if (!tiles_requiring_memory_but_oomed.empty()) { | 531 if (!tiles_requiring_memory_but_oomed.empty()) { |
| 490 size_t bytes_freed = 0; | 532 size_t bytes_freed = 0; |
| 491 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 533 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| 492 Tile* tile = *it; | 534 Tile* tile = *it; |
| 493 ManagedTileState& mts = tile->managed_state(); | 535 ManagedTileState& mts = tile->managed_state(); |
| 494 ManagedTileState::TileVersion& tile_version = tile->tile_version(); | 536 ManagedTileState::TileVersion& tile_version = |
| 537 mts.tile_versions[mts.raster_mode]; | |
|
reveman
2013/06/05 18:01:32
Do you need a TileRasterMode loop here to free all
vmpstr
2013/06/06 01:54:20
Done.
| |
| 495 if (tile_version.resource_ && | 538 if (tile_version.resource_ && |
| 496 mts.tree_bin[PENDING_TREE] == NEVER_BIN && | 539 mts.tree_bin[PENDING_TREE] == NEVER_BIN && |
| 497 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) { | 540 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) { |
| 498 DCHECK(!tile->required_for_activation()); | 541 DCHECK(!tile->required_for_activation()); |
| 499 FreeResourcesForTile(tile); | 542 FreeResourcesForTile(tile); |
| 500 tile_version.set_rasterize_on_demand(); | 543 tile_version.set_rasterize_on_demand(); |
| 501 bytes_freed += tile->bytes_consumed_if_allocated(); | 544 bytes_freed += tile->bytes_consumed_if_allocated(); |
| 502 TileVector::iterator it = std::find( | 545 TileVector::iterator it = std::find( |
| 503 tiles_that_need_to_be_rasterized_.begin(), | 546 tiles_that_need_to_be_rasterized_.begin(), |
| 504 tiles_that_need_to_be_rasterized_.end(), | 547 tiles_that_need_to_be_rasterized_.end(), |
| 505 tile); | 548 tile); |
| 506 if (it != tiles_that_need_to_be_rasterized_.end()) | 549 if (it != tiles_that_need_to_be_rasterized_.end()) |
| 507 tiles_that_need_to_be_rasterized_.erase(it); | 550 tiles_that_need_to_be_rasterized_.erase(it); |
| 508 if (bytes_oom_in_now_bin_on_pending_tree <= bytes_freed) | 551 if (bytes_oom_in_now_bin_on_pending_tree <= bytes_freed) |
| 509 break; | 552 break; |
| 510 } | 553 } |
| 511 } | 554 } |
| 512 | 555 |
| 513 for (TileVector::iterator it = tiles_requiring_memory_but_oomed.begin(); | 556 for (TileVector::iterator it = tiles_requiring_memory_but_oomed.begin(); |
| 514 it != tiles_requiring_memory_but_oomed.end() && bytes_freed > 0; | 557 it != tiles_requiring_memory_but_oomed.end() && bytes_freed > 0; |
| 515 ++it) { | 558 ++it) { |
| 516 Tile* tile = *it; | 559 Tile* tile = *it; |
| 560 ManagedTileState& mts = tile->managed_state(); | |
| 517 size_t bytes_needed = tile->bytes_consumed_if_allocated(); | 561 size_t bytes_needed = tile->bytes_consumed_if_allocated(); |
| 518 if (bytes_needed > bytes_freed) | 562 if (bytes_needed > bytes_freed) |
| 519 continue; | 563 continue; |
| 520 tile->tile_version().set_use_resource(); | 564 mts.tile_versions[mts.raster_mode].set_use_resource(); |
| 521 bytes_freed -= bytes_needed; | 565 bytes_freed -= bytes_needed; |
| 522 tiles_that_need_to_be_rasterized_.push_back(tile); | 566 tiles_that_need_to_be_rasterized_.push_back(tile); |
| 523 if (tile->required_for_activation()) | 567 if (tile->required_for_activation()) |
| 524 AddRequiredTileForActivation(tile); | 568 AddRequiredTileForActivation(tile); |
| 525 } | 569 } |
| 526 } | 570 } |
| 527 | 571 |
| 528 ever_exceeded_memory_budget_ |= | 572 ever_exceeded_memory_budget_ |= |
| 529 bytes_that_exceeded_memory_budget_in_now_bin > 0; | 573 bytes_that_exceeded_memory_budget_in_now_bin > 0; |
| 530 if (ever_exceeded_memory_budget_) { | 574 if (ever_exceeded_memory_budget_) { |
| 531 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, | 575 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, |
| 532 "budget", global_state_.memory_limit_in_bytes, | 576 "budget", global_state_.memory_limit_in_bytes, |
| 533 "over", bytes_that_exceeded_memory_budget_in_now_bin); | 577 "over", bytes_that_exceeded_memory_budget_in_now_bin); |
| 534 } | 578 } |
| 535 memory_stats_from_last_assign_.total_budget_in_bytes = | 579 memory_stats_from_last_assign_.total_budget_in_bytes = |
| 536 global_state_.memory_limit_in_bytes; | 580 global_state_.memory_limit_in_bytes; |
| 537 memory_stats_from_last_assign_.bytes_allocated = | 581 memory_stats_from_last_assign_.bytes_allocated = |
| 538 bytes_allocatable - bytes_left; | 582 bytes_allocatable - bytes_left; |
| 539 memory_stats_from_last_assign_.bytes_unreleasable = | 583 memory_stats_from_last_assign_.bytes_unreleasable = |
| 540 bytes_allocatable - bytes_releasable; | 584 bytes_allocatable - bytes_releasable; |
| 541 memory_stats_from_last_assign_.bytes_over = | 585 memory_stats_from_last_assign_.bytes_over = |
| 542 bytes_that_exceeded_memory_budget_in_now_bin; | 586 bytes_that_exceeded_memory_budget_in_now_bin; |
| 543 } | 587 } |
| 544 | 588 |
| 545 void TileManager::FreeResourcesForTile(Tile* tile) { | 589 void TileManager::FreeResourcesForTile(Tile* tile) { |
| 546 if (tile->tile_version().resource_) { | 590 ManagedTileState& mts = tile->managed_state(); |
| 547 resource_pool_->ReleaseResource( | 591 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { |
| 548 tile->tile_version().resource_.Pass()); | 592 if (mts.tile_versions[mode].resource_) { |
| 593 resource_pool_->ReleaseResource( | |
| 594 mts.tile_versions[mode].resource_.Pass()); | |
| 595 } | |
| 549 } | 596 } |
| 550 } | 597 } |
| 551 | 598 |
| 599 void TileManager::FreeUnusedResourcesForTile(Tile* tile) { | |
| 600 ManagedTileState& mts = tile->managed_state(); | |
| 601 ManagedTileState::TileVersion& used_tile_version = tile->tile_version(); | |
| 602 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { | |
| 603 if (&mts.tile_versions[mode] != &used_tile_version && | |
| 604 mts.tile_versions[mode].resource_) { | |
| 605 resource_pool_->ReleaseResource( | |
| 606 mts.tile_versions[mode].resource_.Pass()); | |
| 607 } | |
| 608 } | |
| 609 } | |
| 610 | |
| 552 void TileManager::ScheduleTasks() { | 611 void TileManager::ScheduleTasks() { |
| 553 TRACE_EVENT0("cc", "TileManager::ScheduleTasks"); | 612 TRACE_EVENT0("cc", "TileManager::ScheduleTasks"); |
| 554 RasterWorkerPool::RasterTask::Queue tasks; | 613 RasterWorkerPool::RasterTask::Queue tasks; |
| 555 | 614 |
| 556 // Build a new task queue containing all task currently needed. Tasks | 615 // Build a new task queue containing all task currently needed. Tasks |
| 557 // are added in order of priority, highest priority task first. | 616 // are added in order of priority, highest priority task first. |
| 558 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); | 617 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); |
| 559 it != tiles_that_need_to_be_rasterized_.end(); | 618 it != tiles_that_need_to_be_rasterized_.end(); |
| 560 ++it) { | 619 ++it) { |
| 561 Tile* tile = *it; | 620 Tile* tile = *it; |
| 562 ManagedTileState& mts = tile->managed_state(); | 621 ManagedTileState& mts = tile->managed_state(); |
| 622 ManagedTileState::TileVersion& tile_version = | |
| 623 mts.tile_versions[mts.raster_mode]; | |
| 563 | 624 |
| 564 DCHECK(tile->tile_version().requires_resource()); | 625 DCHECK(tile_version.requires_resource()); |
| 565 DCHECK(!tile->tile_version().resource_); | |
| 566 | 626 |
| 567 // Create raster task for this tile if necessary. | 627 if (tile_version.raster_task_.is_null()) |
| 568 if (mts.raster_task.is_null()) | 628 tile_version.raster_task_ = CreateRasterTask(tile); |
| 569 mts.raster_task = CreateRasterTask(tile); | |
| 570 | 629 |
| 571 // Finally append raster task. | 630 tasks.Append(tile_version.raster_task_); |
| 572 tasks.Append(mts.raster_task); | |
| 573 } | 631 } |
| 574 | 632 |
| 575 // Schedule running of |tasks|. This replaces any previously | 633 // Schedule running of |tasks|. This replaces any previously |
| 576 // scheduled tasks and effectively cancels all tasks not present | 634 // scheduled tasks and effectively cancels all tasks not present |
| 577 // in |tasks|. | 635 // in |tasks|. |
| 578 raster_worker_pool_->ScheduleTasks(&tasks); | 636 raster_worker_pool_->ScheduleTasks(&tasks); |
| 579 } | 637 } |
| 580 | 638 |
| 581 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( | 639 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( |
| 582 Tile* tile, skia::LazyPixelRef* pixel_ref) { | 640 Tile* tile, skia::LazyPixelRef* pixel_ref) { |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 604 TileManager::RasterTaskMetadata TileManager::GetRasterTaskMetadata( | 662 TileManager::RasterTaskMetadata TileManager::GetRasterTaskMetadata( |
| 605 const Tile& tile) const { | 663 const Tile& tile) const { |
| 606 RasterTaskMetadata metadata; | 664 RasterTaskMetadata metadata; |
| 607 const ManagedTileState& mts = tile.managed_state(); | 665 const ManagedTileState& mts = tile.managed_state(); |
| 608 metadata.is_tile_in_pending_tree_now_bin = | 666 metadata.is_tile_in_pending_tree_now_bin = |
| 609 mts.tree_bin[PENDING_TREE] == NOW_BIN; | 667 mts.tree_bin[PENDING_TREE] == NOW_BIN; |
| 610 metadata.tile_resolution = mts.resolution; | 668 metadata.tile_resolution = mts.resolution; |
| 611 metadata.layer_id = tile.layer_id(); | 669 metadata.layer_id = tile.layer_id(); |
| 612 metadata.tile_id = &tile; | 670 metadata.tile_id = &tile; |
| 613 metadata.source_frame_number = tile.source_frame_number(); | 671 metadata.source_frame_number = tile.source_frame_number(); |
| 672 metadata.raster_mode = mts.raster_mode; | |
| 614 return metadata; | 673 return metadata; |
| 615 } | 674 } |
| 616 | 675 |
| 617 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { | 676 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { |
| 618 TRACE_EVENT0("cc", "TileManager::CreateRasterTask"); | 677 TRACE_EVENT0("cc", "TileManager::CreateRasterTask"); |
| 619 | 678 |
| 620 scoped_ptr<ResourcePool::Resource> resource = | 679 scoped_ptr<ResourcePool::Resource> resource = |
| 621 resource_pool_->AcquireResource( | 680 resource_pool_->AcquireResource( |
| 622 tile->tile_size_.size(), | 681 tile->tile_size_.size(), |
| 623 tile->tile_version().resource_format_); | 682 tile->tile_version().resource_format_); |
| 624 const Resource* const_resource = resource.get(); | 683 const Resource* const_resource = resource.get(); |
| 625 | 684 |
| 626 tile->tile_version().resource_id_ = resource->id(); | 685 ManagedTileState& mts = tile->managed_state(); |
| 686 mts.tile_versions[mts.raster_mode].resource_id_ = resource->id(); | |
| 627 | 687 |
| 628 PicturePileImpl::Analysis* analysis = new PicturePileImpl::Analysis; | 688 PicturePileImpl::Analysis* analysis = new PicturePileImpl::Analysis; |
| 629 | 689 |
| 630 // Create and queue all image decode tasks that this tile depends on. | 690 // Create and queue all image decode tasks that this tile depends on. |
| 631 RasterWorkerPool::Task::Set decode_tasks; | 691 RasterWorkerPool::Task::Set decode_tasks; |
| 632 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(), | 692 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(), |
| 633 tile->contents_scale(), | 693 tile->contents_scale(), |
| 634 tile->picture_pile()); | 694 tile->picture_pile()); |
| 635 iter; ++iter) { | 695 iter; ++iter) { |
| 636 skia::LazyPixelRef* pixel_ref = *iter; | 696 skia::LazyPixelRef* pixel_ref = *iter; |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 649 continue; | 709 continue; |
| 650 } | 710 } |
| 651 | 711 |
| 652 // Create and append new image decode task for this pixel ref. | 712 // Create and append new image decode task for this pixel ref. |
| 653 RasterWorkerPool::Task decode_task = CreateImageDecodeTask( | 713 RasterWorkerPool::Task decode_task = CreateImageDecodeTask( |
| 654 tile, pixel_ref); | 714 tile, pixel_ref); |
| 655 decode_tasks.Insert(decode_task); | 715 decode_tasks.Insert(decode_task); |
| 656 pending_decode_tasks_[id] = decode_task; | 716 pending_decode_tasks_[id] = decode_task; |
| 657 } | 717 } |
| 658 | 718 |
| 719 RasterTaskMetadata metadata = GetRasterTaskMetadata(*tile); | |
| 659 return RasterWorkerPool::RasterTask( | 720 return RasterWorkerPool::RasterTask( |
| 660 tile->picture_pile(), | 721 tile->picture_pile(), |
| 661 const_resource, | 722 const_resource, |
| 662 base::Bind(&TileManager::RunAnalyzeAndRasterTask, | 723 base::Bind(&TileManager::RunAnalyzeAndRasterTask, |
| 663 base::Bind(&TileManager::RunAnalyzeTask, | 724 base::Bind(&TileManager::RunAnalyzeTask, |
| 664 analysis, | 725 analysis, |
| 665 tile->content_rect(), | 726 tile->content_rect(), |
| 666 tile->contents_scale(), | 727 tile->contents_scale(), |
| 667 use_color_estimator_, | 728 use_color_estimator_, |
| 668 GetRasterTaskMetadata(*tile), | 729 metadata, |
| 669 rendering_stats_instrumentation_), | 730 rendering_stats_instrumentation_), |
| 670 base::Bind(&TileManager::RunRasterTask, | 731 base::Bind(&TileManager::RunRasterTask, |
| 671 analysis, | 732 analysis, |
| 672 tile->content_rect(), | 733 tile->content_rect(), |
| 673 tile->contents_scale(), | 734 tile->contents_scale(), |
| 674 GetRasterTaskMetadata(*tile), | 735 metadata, |
| 675 rendering_stats_instrumentation_)), | 736 rendering_stats_instrumentation_)), |
| 676 base::Bind(&TileManager::OnRasterTaskCompleted, | 737 base::Bind(&TileManager::OnRasterTaskCompleted, |
| 677 base::Unretained(this), | 738 base::Unretained(this), |
| 678 make_scoped_refptr(tile), | 739 make_scoped_refptr(tile), |
| 679 base::Passed(&resource), | 740 base::Passed(&resource), |
| 680 base::Owned(analysis)), | 741 base::Owned(analysis), |
| 742 metadata.raster_mode), | |
| 681 &decode_tasks); | 743 &decode_tasks); |
| 682 } | 744 } |
| 683 | 745 |
| 684 void TileManager::OnRasterTaskCompleted( | 746 void TileManager::OnRasterTaskCompleted( |
| 685 scoped_refptr<Tile> tile, | 747 scoped_refptr<Tile> tile, |
| 686 scoped_ptr<ResourcePool::Resource> resource, | 748 scoped_ptr<ResourcePool::Resource> resource, |
| 687 PicturePileImpl::Analysis* analysis, | 749 PicturePileImpl::Analysis* analysis, |
| 750 TileRasterMode raster_mode, | |
| 688 bool was_canceled) { | 751 bool was_canceled) { |
| 689 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", | 752 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", |
| 690 "was_canceled", was_canceled); | 753 "was_canceled", was_canceled); |
| 691 | 754 |
| 692 ManagedTileState& mts = tile->managed_state(); | 755 ManagedTileState& mts = tile->managed_state(); |
| 693 DCHECK(!mts.raster_task.is_null()); | 756 ManagedTileState::TileVersion& tile_version = |
|
reveman
2013/06/05 18:01:32
please keep this DCHECK.
vmpstr
2013/06/06 01:54:20
Done.
| |
| 694 mts.raster_task.Reset(); | 757 mts.tile_versions[raster_mode]; |
| 758 tile_version.raster_task_.Reset(); | |
| 759 tile_version.resource_ = resource.Pass(); | |
|
reveman
2013/06/05 18:01:32
can you do this below the was_canceled check as be
vmpstr
2013/06/06 01:54:20
Done.
| |
| 760 tile_version.forced_upload_ = false; | |
|
reveman
2013/06/05 18:01:32
this is new. do we need it?
vmpstr
2013/06/06 01:54:20
I don't really see where the flag is reset back in
reveman
2013/06/06 06:02:02
Good call. This might be causing some of the rende
| |
| 695 | 761 |
| 696 if (was_canceled) { | 762 if (was_canceled) { |
| 697 resource_pool_->ReleaseResource(resource.Pass()); | 763 resource_pool_->ReleaseResource(tile_version.resource_.Pass()); |
| 698 return; | 764 return; |
| 699 } | 765 } |
| 700 | 766 |
| 701 mts.picture_pile_analysis = *analysis; | 767 mts.picture_pile_analysis = *analysis; |
| 702 mts.picture_pile_analyzed = true; | 768 mts.picture_pile_analyzed = true; |
| 703 | 769 |
| 704 if (analysis->is_solid_color) { | 770 if (analysis->is_solid_color) { |
| 705 tile->tile_version().set_solid_color(analysis->solid_color); | 771 resource_pool_->ReleaseResource(tile_version.resource_.Pass()); |
| 706 resource_pool_->ReleaseResource(resource.Pass()); | 772 tile_version.set_solid_color(analysis->solid_color); |
| 707 } else { | |
| 708 tile->tile_version().resource_ = resource.Pass(); | |
| 709 } | 773 } |
| 710 | 774 |
| 775 FreeUnusedResourcesForTile(tile.get()); | |
| 776 | |
| 711 DidFinishTileInitialization(tile.get()); | 777 DidFinishTileInitialization(tile.get()); |
| 712 } | 778 } |
| 713 | 779 |
| 714 void TileManager::DidFinishTileInitialization(Tile* tile) { | 780 void TileManager::DidFinishTileInitialization(Tile* tile) { |
| 715 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | 781 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
| 716 did_initialize_visible_tile_ = true; | 782 did_initialize_visible_tile_ = true; |
| 717 if (tile->required_for_activation()) { | 783 if (tile->required_for_activation()) { |
| 718 // It's possible that a tile required for activation is not in this list | 784 // It's possible that a tile required for activation is not in this list |
| 719 // if it was marked as being required after being dispatched for | 785 // if it was marked as being required after being dispatched for |
| 720 // rasterization but before AssignGPUMemory was called again. | 786 // rasterization but before AssignGPUMemory was called again. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 784 analysis->is_solid_color &= use_color_estimator; | 850 analysis->is_solid_color &= use_color_estimator; |
| 785 } | 851 } |
| 786 | 852 |
| 787 scoped_ptr<base::Value> TileManager::RasterTaskMetadata::AsValue() const { | 853 scoped_ptr<base::Value> TileManager::RasterTaskMetadata::AsValue() const { |
| 788 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); | 854 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); |
| 789 res->Set("tile_id", TracedValue::CreateIDRef(tile_id).release()); | 855 res->Set("tile_id", TracedValue::CreateIDRef(tile_id).release()); |
| 790 res->SetBoolean("is_tile_in_pending_tree_now_bin", | 856 res->SetBoolean("is_tile_in_pending_tree_now_bin", |
| 791 is_tile_in_pending_tree_now_bin); | 857 is_tile_in_pending_tree_now_bin); |
| 792 res->Set("resolution", TileResolutionAsValue(tile_resolution).release()); | 858 res->Set("resolution", TileResolutionAsValue(tile_resolution).release()); |
| 793 res->SetInteger("source_frame_number", source_frame_number); | 859 res->SetInteger("source_frame_number", source_frame_number); |
| 860 res->SetInteger("raster_mode", raster_mode); | |
| 794 return res.PassAs<base::Value>(); | 861 return res.PassAs<base::Value>(); |
| 795 } | 862 } |
| 796 | 863 |
| 797 // static | 864 // static |
| 798 bool TileManager::RunRasterTask( | 865 bool TileManager::RunRasterTask( |
| 799 PicturePileImpl::Analysis* analysis, | 866 PicturePileImpl::Analysis* analysis, |
| 800 gfx::Rect rect, | 867 gfx::Rect rect, |
| 801 float contents_scale, | 868 float contents_scale, |
| 802 const RasterTaskMetadata& metadata, | 869 const RasterTaskMetadata& metadata, |
| 803 RenderingStatsInstrumentation* stats_instrumentation, | 870 RenderingStatsInstrumentation* stats_instrumentation, |
| 804 SkDevice* device, | 871 SkDevice* device, |
| 805 PicturePileImpl* picture_pile) { | 872 PicturePileImpl* picture_pile) { |
| 806 TRACE_EVENT1( | 873 TRACE_EVENT1( |
| 807 "cc", "TileManager::RunRasterTask", | 874 "cc", "TileManager::RunRasterTask", |
| 808 "metadata", TracedValue::FromValue(metadata.AsValue().release())); | 875 "metadata", TracedValue::FromValue(metadata.AsValue().release())); |
| 809 devtools_instrumentation::ScopedLayerTask raster_task( | 876 devtools_instrumentation::ScopedLayerTask raster_task( |
| 810 devtools_instrumentation::kRasterTask, metadata.layer_id); | 877 devtools_instrumentation::kRasterTask, metadata.layer_id); |
| 811 | 878 |
| 812 DCHECK(picture_pile); | 879 DCHECK(picture_pile); |
| 813 DCHECK(analysis); | 880 DCHECK(analysis); |
| 814 DCHECK(device); | 881 DCHECK(device); |
| 815 | 882 |
| 816 if (analysis->is_solid_color) | 883 if (analysis->is_solid_color) |
| 817 return false; | 884 return false; |
| 818 | 885 |
| 819 SkCanvas canvas(device); | 886 SkCanvas canvas(device); |
| 820 | 887 |
| 888 skia::RefPtr<SkDrawFilter> draw_filter; | |
| 889 switch (metadata.raster_mode) { | |
| 890 case LOW_QUALITY_RASTER_MODE: | |
| 891 draw_filter = skia::AdoptRef(new skia::PaintSimplifier); | |
| 892 break; | |
| 893 case HIGH_QUALITY_NO_LCD_RASTER_MODE: | |
| 894 draw_filter = skia::AdoptRef(new DisableLCDTextFilter); | |
| 895 break; | |
| 896 case HIGH_QUALITY_RASTER_MODE: | |
| 897 break; | |
| 898 case NUM_RASTER_MODES: | |
| 899 default: | |
| 900 NOTREACHED(); | |
| 901 } | |
| 902 | |
| 903 canvas.setDrawFilter(draw_filter.get()); | |
| 904 | |
| 821 if (stats_instrumentation->record_rendering_stats()) { | 905 if (stats_instrumentation->record_rendering_stats()) { |
| 822 PicturePileImpl::RasterStats raster_stats; | 906 PicturePileImpl::RasterStats raster_stats; |
| 823 picture_pile->RasterToBitmap(&canvas, rect, contents_scale, &raster_stats); | 907 picture_pile->RasterToBitmap(&canvas, rect, contents_scale, &raster_stats); |
| 824 stats_instrumentation->AddRaster( | 908 stats_instrumentation->AddRaster( |
| 825 raster_stats.total_rasterize_time, | 909 raster_stats.total_rasterize_time, |
| 826 raster_stats.best_rasterize_time, | 910 raster_stats.best_rasterize_time, |
| 827 raster_stats.total_pixels_rasterized, | 911 raster_stats.total_pixels_rasterized, |
| 828 metadata.is_tile_in_pending_tree_now_bin); | 912 metadata.is_tile_in_pending_tree_now_bin); |
| 829 | 913 |
| 830 HISTOGRAM_CUSTOM_COUNTS( | 914 HISTOGRAM_CUSTOM_COUNTS( |
| 831 "Renderer4.PictureRasterTimeUS", | 915 "Renderer4.PictureRasterTimeUS", |
| 832 raster_stats.total_rasterize_time.InMicroseconds(), | 916 raster_stats.total_rasterize_time.InMicroseconds(), |
| 833 0, | 917 0, |
| 834 100000, | 918 100000, |
| 835 100); | 919 100); |
| 836 } else { | 920 } else { |
| 837 picture_pile->RasterToBitmap(&canvas, rect, contents_scale, NULL); | 921 picture_pile->RasterToBitmap(&canvas, rect, contents_scale, NULL); |
| 838 } | 922 } |
| 839 | 923 |
| 840 return true; | 924 return true; |
| 841 } | 925 } |
| 842 | 926 |
| 843 } // namespace cc | 927 } // namespace cc |
| OLD | NEW |