Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Side by Side Diff: cc/resources/tile_manager.cc

Issue 15995033: cc: Low quality support for low res tiles (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698