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/tile_manager.h" | 5 #include "cc/tile_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 130 "UPLOAD_STATE")); | 130 "UPLOAD_STATE")); |
| 131 default: | 131 default: |
| 132 DCHECK(false) << "Unrecognized TileRasterState value"; | 132 DCHECK(false) << "Unrecognized TileRasterState value"; |
| 133 return scoped_ptr<base::Value>(base::Value::CreateStringValue( | 133 return scoped_ptr<base::Value>(base::Value::CreateStringValue( |
| 134 "<unknown TileRasterState value>")); | 134 "<unknown TileRasterState value>")); |
| 135 } | 135 } |
| 136 } | 136 } |
| 137 | 137 |
| 138 ManagedTileState::ManagedTileState() | 138 ManagedTileState::ManagedTileState() |
| 139 : can_use_gpu_memory(false), | 139 : can_use_gpu_memory(false), |
| 140 can_be_freed(true), | |
| 141 resource_is_being_initialized(false), | |
| 142 contents_swizzled(false), | |
| 143 need_to_gather_pixel_refs(true), | 140 need_to_gather_pixel_refs(true), |
| 144 gpu_memmgr_stats_bin(NEVER_BIN), | 141 gpu_memmgr_stats_bin(NEVER_BIN), |
| 145 raster_state(IDLE_STATE), | 142 raster_state(IDLE_STATE), |
| 146 resolution(NON_IDEAL_RESOLUTION), | 143 resolution(NON_IDEAL_RESOLUTION), |
| 147 time_to_needed_in_seconds(std::numeric_limits<float>::infinity()), | 144 time_to_needed_in_seconds(std::numeric_limits<float>::infinity()), |
| 148 distance_to_visible_in_pixels(std::numeric_limits<float>::infinity()) { | 145 distance_to_visible_in_pixels(std::numeric_limits<float>::infinity()) { |
| 149 for (int i = 0; i < NUM_TREES; ++i) { | 146 for (int i = 0; i < NUM_TREES; ++i) { |
| 150 tree_bin[i] = NEVER_BIN; | 147 tree_bin[i] = NEVER_BIN; |
| 151 bin[i] = NEVER_BIN; | 148 bin[i] = NEVER_BIN; |
| 152 } | 149 } |
| 153 } | 150 } |
| 154 | 151 |
| 155 ManagedTileState::~ManagedTileState() { | 152 ManagedTileState::~ManagedTileState() { |
| 156 DCHECK(!resource); | 153 DCHECK(!drawing_info.resource_); |
| 157 DCHECK(!resource_is_being_initialized); | 154 DCHECK(!drawing_info.resource_is_being_initialized_); |
| 158 } | 155 } |
| 159 | 156 |
| 160 scoped_ptr<base::Value> ManagedTileState::AsValue() const { | 157 scoped_ptr<base::Value> ManagedTileState::AsValue() const { |
| 161 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 158 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
| 162 state->SetBoolean("can_use_gpu_memory", can_use_gpu_memory); | 159 state->SetBoolean("can_use_gpu_memory", can_use_gpu_memory); |
| 163 state->SetBoolean("can_be_freed", can_be_freed); | 160 state->SetBoolean("can_be_freed", drawing_info.can_be_freed_); |
| 164 state->SetBoolean("has_resource", resource.get() != 0); | 161 state->SetBoolean("has_resource", drawing_info.resource_.get() != 0); |
| 165 state->SetBoolean("resource_is_being_initialized", resource_is_being_initializ ed); | 162 state->SetBoolean("resource_is_being_initialized", drawing_info.resource_is_be ing_initialized_); |
|
enne (OOO)
2013/03/12 19:42:13
style nit: 80 col, here and the rest of this funct
| |
| 166 state->Set("raster_state", TileRasterStateAsValue(raster_state).release()); | 163 state->Set("raster_state", TileRasterStateAsValue(raster_state).release()); |
| 167 state->Set("bin.0", TileManagerBinAsValue(bin[ACTIVE_TREE]).release()); | 164 state->Set("bin.0", TileManagerBinAsValue(bin[ACTIVE_TREE]).release()); |
| 168 state->Set("bin.1", TileManagerBinAsValue(bin[PENDING_TREE]).release()); | 165 state->Set("bin.1", TileManagerBinAsValue(bin[PENDING_TREE]).release()); |
| 169 state->Set("gpu_memmgr_stats_bin", TileManagerBinAsValue(bin[ACTIVE_TREE]).rel ease()); | 166 state->Set("gpu_memmgr_stats_bin", TileManagerBinAsValue(bin[ACTIVE_TREE]).rel ease()); |
| 170 state->Set("resolution", TileResolutionAsValue(resolution).release()); | 167 state->Set("resolution", TileResolutionAsValue(resolution).release()); |
| 171 state->Set("time_to_needed_in_seconds", MathUtil::asValueSafely(time_to_needed _in_seconds).release()); | 168 state->Set("time_to_needed_in_seconds", MathUtil::asValueSafely(time_to_needed _in_seconds).release()); |
| 172 state->Set("distance_to_visible_in_pixels", MathUtil::asValueSafely(distance_t o_visible_in_pixels).release()); | 169 state->Set("distance_to_visible_in_pixels", MathUtil::asValueSafely(distance_t o_visible_in_pixels).release()); |
| 173 return state.PassAs<base::Value>(); | 170 return state.PassAs<base::Value>(); |
| 174 } | 171 } |
| 175 | 172 |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 366 ACTIVE_TREE); | 363 ACTIVE_TREE); |
| 367 DidTileTreeBinChange(tile, | 364 DidTileTreeBinChange(tile, |
| 368 bin_map[BinFromTilePriority(tile->priority(PENDING_TREE))], | 365 bin_map[BinFromTilePriority(tile->priority(PENDING_TREE))], |
| 369 PENDING_TREE); | 366 PENDING_TREE); |
| 370 | 367 |
| 371 for (int i = 0; i < NUM_BIN_PRIORITIES; ++i) | 368 for (int i = 0; i < NUM_BIN_PRIORITIES; ++i) |
| 372 mts.bin[i] = bin_map[mts.bin[i]]; | 369 mts.bin[i] = bin_map[mts.bin[i]]; |
| 373 | 370 |
| 374 if (tile->priority(ACTIVE_TREE).is_live || | 371 if (tile->priority(ACTIVE_TREE).is_live || |
| 375 tile->priority(PENDING_TREE).is_live || | 372 tile->priority(PENDING_TREE).is_live || |
| 376 tile->managed_state().resource || | 373 mts.drawing_info.resource_ || |
| 377 tile->managed_state().resource_is_being_initialized) { | 374 mts.drawing_info.resource_is_being_initialized_) { |
| 378 live_or_allocated_tiles_.push_back(tile); | 375 live_or_allocated_tiles_.push_back(tile); |
| 379 } | 376 } |
| 380 } | 377 } |
| 381 TRACE_COUNTER_ID1("cc", "LiveOrAllocatedTileCount", this, | 378 TRACE_COUNTER_ID1("cc", "LiveOrAllocatedTileCount", this, |
| 382 live_or_allocated_tiles_.size()); | 379 live_or_allocated_tiles_.size()); |
| 383 | 380 |
| 384 SortTiles(); | 381 SortTiles(); |
| 385 | 382 |
| 386 // Assign gpu memory and determine what tiles need to be rasterized. | 383 // Assign gpu memory and determine what tiles need to be rasterized. |
| 387 AssignGpuMemoryToTiles(); | 384 AssignGpuMemoryToTiles(); |
| 388 | 385 |
| 389 TRACE_EVENT_INSTANT1("cc", "DidManage", "state", | 386 TRACE_EVENT_INSTANT1("cc", "DidManage", "state", |
| 390 ValueToString(BasicStateAsValue())); | 387 ValueToString(BasicStateAsValue())); |
| 391 | 388 |
| 392 // Finally, kick the rasterizer. | 389 // Finally, kick the rasterizer. |
| 393 DispatchMoreTasks(); | 390 DispatchMoreTasks(); |
| 394 } | 391 } |
| 395 | 392 |
| 396 void TileManager::CheckForCompletedTileUploads() { | 393 void TileManager::CheckForCompletedTileUploads() { |
| 397 while (!tiles_with_pending_upload_.empty()) { | 394 while (!tiles_with_pending_upload_.empty()) { |
| 398 Tile* tile = tiles_with_pending_upload_.front(); | 395 Tile* tile = tiles_with_pending_upload_.front(); |
| 399 DCHECK(tile->managed_state().resource); | 396 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 397 DCHECK(managed_tile_state.drawing_info.resource_); | |
| 400 | 398 |
| 401 // Set pixel tasks complete in the order they are posted. | 399 // Set pixel tasks complete in the order they are posted. |
| 402 if (!resource_pool_->resource_provider()->DidSetPixelsComplete( | 400 if (!resource_pool_->resource_provider()->DidSetPixelsComplete( |
| 403 tile->managed_state().resource->id())) { | 401 managed_tile_state.drawing_info.resource_->id())) { |
| 404 break; | 402 break; |
| 405 } | 403 } |
| 406 | 404 |
| 407 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0 && | 405 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0 && |
| 408 tile->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) | 406 tile->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) |
| 409 client_->DidUploadVisibleHighResolutionTile(); | 407 client_->DidUploadVisibleHighResolutionTile(); |
| 410 | 408 |
| 411 // It's now safe to release the pixel buffer. | 409 // It's now safe to release the pixel buffer. |
| 412 resource_pool_->resource_provider()->ReleasePixelBuffer( | 410 resource_pool_->resource_provider()->ReleasePixelBuffer( |
| 413 tile->managed_state().resource->id()); | 411 managed_tile_state.drawing_info.resource_->id()); |
| 414 | 412 |
| 415 DidFinishTileInitialization(tile); | 413 DidFinishTileInitialization(tile); |
| 416 | 414 |
| 417 bytes_pending_upload_ -= tile->bytes_consumed_if_allocated(); | 415 bytes_pending_upload_ -= tile->bytes_consumed_if_allocated(); |
| 418 DidTileRasterStateChange(tile, IDLE_STATE); | 416 DidTileRasterStateChange(tile, IDLE_STATE); |
| 419 tiles_with_pending_upload_.pop(); | 417 tiles_with_pending_upload_.pop(); |
| 420 } | 418 } |
| 421 | 419 |
| 422 DispatchMoreTasks(); | 420 DispatchMoreTasks(); |
| 423 } | 421 } |
| 424 | 422 |
| 425 void TileManager::AbortPendingTileUploads() { | 423 void TileManager::AbortPendingTileUploads() { |
| 426 while (!tiles_with_pending_upload_.empty()) { | 424 while (!tiles_with_pending_upload_.empty()) { |
| 427 Tile* tile = tiles_with_pending_upload_.front(); | 425 Tile* tile = tiles_with_pending_upload_.front(); |
| 428 ManagedTileState& managed_tile_state = tile->managed_state(); | 426 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 429 DCHECK(managed_tile_state.resource); | 427 DCHECK(managed_tile_state.drawing_info.resource_); |
| 430 | 428 |
| 431 resource_pool_->resource_provider()->AbortSetPixels( | 429 resource_pool_->resource_provider()->AbortSetPixels( |
| 432 managed_tile_state.resource->id()); | 430 managed_tile_state.drawing_info.resource_->id()); |
| 433 resource_pool_->resource_provider()->ReleasePixelBuffer( | 431 resource_pool_->resource_provider()->ReleasePixelBuffer( |
| 434 managed_tile_state.resource->id()); | 432 managed_tile_state.drawing_info.resource_->id()); |
| 435 | 433 |
| 436 managed_tile_state.resource_is_being_initialized = false; | 434 managed_tile_state.drawing_info.resource_is_being_initialized_ = false; |
| 437 managed_tile_state.can_be_freed = true; | 435 managed_tile_state.drawing_info.can_be_freed_ = true; |
| 438 managed_tile_state.can_use_gpu_memory = false; | 436 managed_tile_state.can_use_gpu_memory = false; |
| 439 FreeResourcesForTile(tile); | 437 FreeResourcesForTile(tile); |
| 440 | 438 |
| 441 bytes_pending_upload_ -= tile->bytes_consumed_if_allocated(); | 439 bytes_pending_upload_ -= tile->bytes_consumed_if_allocated(); |
| 442 DidTileRasterStateChange(tile, IDLE_STATE); | 440 DidTileRasterStateChange(tile, IDLE_STATE); |
| 443 tiles_with_pending_upload_.pop(); | 441 tiles_with_pending_upload_.pop(); |
| 444 } | 442 } |
| 445 } | 443 } |
| 446 | 444 |
| 447 void TileManager::DidCompleteFrame() { | 445 void TileManager::DidCompleteFrame() { |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 572 // By clearing the tiles_that_need_to_be_rasterized_ vector and | 570 // By clearing the tiles_that_need_to_be_rasterized_ vector and |
| 573 // tiles_with_image_decoding_tasks_ list above we move all tiles | 571 // tiles_with_image_decoding_tasks_ list above we move all tiles |
| 574 // currently waiting for raster to idle state. | 572 // currently waiting for raster to idle state. |
| 575 // Call DidTileRasterStateChange() for each of these tiles to | 573 // Call DidTileRasterStateChange() for each of these tiles to |
| 576 // have this state change take effect. | 574 // have this state change take effect. |
| 577 // Some memory cannot be released. We figure out how much in this | 575 // Some memory cannot be released. We figure out how much in this |
| 578 // loop as well. | 576 // loop as well. |
| 579 for (TileVector::iterator it = live_or_allocated_tiles_.begin(); | 577 for (TileVector::iterator it = live_or_allocated_tiles_.begin(); |
| 580 it != live_or_allocated_tiles_.end(); ++it) { | 578 it != live_or_allocated_tiles_.end(); ++it) { |
| 581 Tile* tile = *it; | 579 Tile* tile = *it; |
| 582 if (!tile->managed_state().can_be_freed) | 580 if (!tile->managed_state().drawing_info.can_be_freed_) |
| 583 unreleasable_bytes += tile->bytes_consumed_if_allocated(); | 581 unreleasable_bytes += tile->bytes_consumed_if_allocated(); |
| 584 if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE) | 582 if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE) |
| 585 DidTileRasterStateChange(tile, IDLE_STATE); | 583 DidTileRasterStateChange(tile, IDLE_STATE); |
| 586 } | 584 } |
| 587 | 585 |
| 588 size_t bytes_allocatable = global_state_.memory_limit_in_bytes - unreleasable_ bytes; | 586 size_t bytes_allocatable = global_state_.memory_limit_in_bytes - unreleasable_ bytes; |
| 589 size_t bytes_that_exceeded_memory_budget_in_now_bin = 0; | 587 size_t bytes_that_exceeded_memory_budget_in_now_bin = 0; |
| 590 size_t bytes_left = bytes_allocatable; | 588 size_t bytes_left = bytes_allocatable; |
| 591 for (TileVector::iterator it = live_or_allocated_tiles_.begin(); it != live_or _allocated_tiles_.end(); ++it) { | 589 for (TileVector::iterator it = live_or_allocated_tiles_.begin(); it != live_or _allocated_tiles_.end(); ++it) { |
| 592 Tile* tile = *it; | 590 Tile* tile = *it; |
| 593 size_t tile_bytes = tile->bytes_consumed_if_allocated(); | 591 size_t tile_bytes = tile->bytes_consumed_if_allocated(); |
| 594 ManagedTileState& managed_tile_state = tile->managed_state(); | 592 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 595 if (!managed_tile_state.can_be_freed) | 593 if (!managed_tile_state.drawing_info.can_be_freed_) |
| 596 continue; | 594 continue; |
| 597 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NEVER_BIN && | 595 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NEVER_BIN && |
| 598 managed_tile_state.bin[LOW_PRIORITY_BIN] == NEVER_BIN) { | 596 managed_tile_state.bin[LOW_PRIORITY_BIN] == NEVER_BIN) { |
| 599 managed_tile_state.can_use_gpu_memory = false; | 597 managed_tile_state.can_use_gpu_memory = false; |
| 600 FreeResourcesForTile(tile); | 598 FreeResourcesForTile(tile); |
| 601 continue; | 599 continue; |
| 602 } | 600 } |
| 603 if (tile_bytes > bytes_left) { | 601 if (tile_bytes > bytes_left) { |
| 604 managed_tile_state.can_use_gpu_memory = false; | 602 managed_tile_state.can_use_gpu_memory = false; |
| 605 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NOW_BIN || | 603 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NOW_BIN || |
| 606 managed_tile_state.bin[LOW_PRIORITY_BIN] == NOW_BIN) | 604 managed_tile_state.bin[LOW_PRIORITY_BIN] == NOW_BIN) |
| 607 bytes_that_exceeded_memory_budget_in_now_bin += tile_bytes; | 605 bytes_that_exceeded_memory_budget_in_now_bin += tile_bytes; |
| 608 FreeResourcesForTile(tile); | 606 FreeResourcesForTile(tile); |
| 609 continue; | 607 continue; |
| 610 } | 608 } |
| 611 bytes_left -= tile_bytes; | 609 bytes_left -= tile_bytes; |
| 612 managed_tile_state.can_use_gpu_memory = true; | 610 managed_tile_state.can_use_gpu_memory = true; |
| 613 if (!managed_tile_state.resource && | 611 if (!managed_tile_state.drawing_info.resource_ && |
| 614 !managed_tile_state.resource_is_being_initialized) { | 612 !managed_tile_state.drawing_info.resource_is_being_initialized_) { |
| 615 tiles_that_need_to_be_rasterized_.push_back(tile); | 613 tiles_that_need_to_be_rasterized_.push_back(tile); |
| 616 DidTileRasterStateChange(tile, WAITING_FOR_RASTER_STATE); | 614 DidTileRasterStateChange(tile, WAITING_FOR_RASTER_STATE); |
| 617 } | 615 } |
| 618 } | 616 } |
| 619 | 617 |
| 620 ever_exceeded_memory_budget_ |= | 618 ever_exceeded_memory_budget_ |= |
| 621 bytes_that_exceeded_memory_budget_in_now_bin > 0; | 619 bytes_that_exceeded_memory_budget_in_now_bin > 0; |
| 622 if (ever_exceeded_memory_budget_) { | 620 if (ever_exceeded_memory_budget_) { |
| 623 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, | 621 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, |
| 624 "budget", global_state_.memory_limit_in_bytes, | 622 "budget", global_state_.memory_limit_in_bytes, |
| 625 "over", bytes_that_exceeded_memory_budget_in_now_bin); | 623 "over", bytes_that_exceeded_memory_budget_in_now_bin); |
| 626 } | 624 } |
| 627 memory_stats_from_last_assign_.total_budget_in_bytes = | 625 memory_stats_from_last_assign_.total_budget_in_bytes = |
| 628 global_state_.memory_limit_in_bytes; | 626 global_state_.memory_limit_in_bytes; |
| 629 memory_stats_from_last_assign_.bytes_allocated = | 627 memory_stats_from_last_assign_.bytes_allocated = |
| 630 bytes_allocatable - bytes_left; | 628 bytes_allocatable - bytes_left; |
| 631 memory_stats_from_last_assign_.bytes_unreleasable = unreleasable_bytes; | 629 memory_stats_from_last_assign_.bytes_unreleasable = unreleasable_bytes; |
| 632 memory_stats_from_last_assign_.bytes_over = | 630 memory_stats_from_last_assign_.bytes_over = |
| 633 bytes_that_exceeded_memory_budget_in_now_bin; | 631 bytes_that_exceeded_memory_budget_in_now_bin; |
| 634 | 632 |
| 635 // Reverse two tiles_that_need_* vectors such that pop_back gets | 633 // Reverse two tiles_that_need_* vectors such that pop_back gets |
| 636 // the highest priority tile. | 634 // the highest priority tile. |
| 637 std::reverse( | 635 std::reverse( |
| 638 tiles_that_need_to_be_rasterized_.begin(), | 636 tiles_that_need_to_be_rasterized_.begin(), |
| 639 tiles_that_need_to_be_rasterized_.end()); | 637 tiles_that_need_to_be_rasterized_.end()); |
| 640 } | 638 } |
| 641 | 639 |
| 642 void TileManager::FreeResourcesForTile(Tile* tile) { | 640 void TileManager::FreeResourcesForTile(Tile* tile) { |
| 643 ManagedTileState& managed_tile_state = tile->managed_state(); | 641 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 644 DCHECK(managed_tile_state.can_be_freed); | 642 DCHECK(managed_tile_state.drawing_info.can_be_freed_); |
| 645 if (managed_tile_state.resource) | 643 if (managed_tile_state.drawing_info.resource_) |
| 646 resource_pool_->ReleaseResource(managed_tile_state.resource.Pass()); | 644 resource_pool_->ReleaseResource( |
| 645 managed_tile_state.drawing_info.resource_.Pass()); | |
| 647 } | 646 } |
| 648 | 647 |
| 649 bool TileManager::CanDispatchRasterTask(Tile* tile) const { | 648 bool TileManager::CanDispatchRasterTask(Tile* tile) const { |
| 650 if (raster_worker_pool_->IsBusy()) | 649 if (raster_worker_pool_->IsBusy()) |
| 651 return false; | 650 return false; |
| 652 size_t new_bytes_pending = bytes_pending_upload_; | 651 size_t new_bytes_pending = bytes_pending_upload_; |
| 653 new_bytes_pending += tile->bytes_consumed_if_allocated(); | 652 new_bytes_pending += tile->bytes_consumed_if_allocated(); |
| 654 return new_bytes_pending <= kMaxPendingUploadBytes && | 653 return new_bytes_pending <= kMaxPendingUploadBytes && |
| 655 tiles_with_pending_upload_.size() < kMaxPendingUploads; | 654 tiles_with_pending_upload_.size() < kMaxPendingUploads; |
| 656 } | 655 } |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 773 } | 772 } |
| 774 | 773 |
| 775 scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster( | 774 scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster( |
| 776 Tile* tile) { | 775 Tile* tile) { |
| 777 ManagedTileState& managed_tile_state = tile->managed_state(); | 776 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 778 DCHECK(managed_tile_state.can_use_gpu_memory); | 777 DCHECK(managed_tile_state.can_use_gpu_memory); |
| 779 scoped_ptr<ResourcePool::Resource> resource = | 778 scoped_ptr<ResourcePool::Resource> resource = |
| 780 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); | 779 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); |
| 781 resource_pool_->resource_provider()->AcquirePixelBuffer(resource->id()); | 780 resource_pool_->resource_provider()->AcquirePixelBuffer(resource->id()); |
| 782 | 781 |
| 783 managed_tile_state.resource_is_being_initialized = true; | 782 managed_tile_state.drawing_info.resource_is_being_initialized_ = true; |
| 784 managed_tile_state.can_be_freed = false; | 783 managed_tile_state.drawing_info.can_be_freed_ = false; |
| 785 | 784 |
| 786 DidTileRasterStateChange(tile, RASTER_STATE); | 785 DidTileRasterStateChange(tile, RASTER_STATE); |
| 787 return resource.Pass(); | 786 return resource.Pass(); |
| 788 } | 787 } |
| 789 | 788 |
| 790 void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { | 789 void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { |
| 791 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); | 790 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); |
| 792 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); | 791 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); |
| 793 ResourceProvider::ResourceId resource_id = resource->id(); | 792 ResourceProvider::ResourceId resource_id = resource->id(); |
| 794 uint8* buffer = | 793 uint8* buffer = |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 828 void TileManager::OnRasterTaskCompleted( | 827 void TileManager::OnRasterTaskCompleted( |
| 829 scoped_refptr<Tile> tile, | 828 scoped_refptr<Tile> tile, |
| 830 scoped_ptr<ResourcePool::Resource> resource, | 829 scoped_ptr<ResourcePool::Resource> resource, |
| 831 int manage_tiles_call_count_when_dispatched) { | 830 int manage_tiles_call_count_when_dispatched) { |
| 832 TRACE_EVENT0("cc", "TileManager::OnRasterTaskCompleted"); | 831 TRACE_EVENT0("cc", "TileManager::OnRasterTaskCompleted"); |
| 833 | 832 |
| 834 // Release raster resources. | 833 // Release raster resources. |
| 835 resource_pool_->resource_provider()->UnmapPixelBuffer(resource->id()); | 834 resource_pool_->resource_provider()->UnmapPixelBuffer(resource->id()); |
| 836 | 835 |
| 837 ManagedTileState& managed_tile_state = tile->managed_state(); | 836 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 838 managed_tile_state.can_be_freed = true; | 837 managed_tile_state.drawing_info.can_be_freed_ = true; |
| 839 | 838 |
| 840 // Tile can be freed after the completion of the raster task. Call | 839 // Tile can be freed after the completion of the raster task. Call |
| 841 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority | 840 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority |
| 842 // tiles if ManageTiles() was called since task was dispatched. The result | 841 // tiles if ManageTiles() was called since task was dispatched. The result |
| 843 // of this could be that this tile is no longer allowed to use gpu | 842 // of this could be that this tile is no longer allowed to use gpu |
| 844 // memory and in that case we need to abort initialization and free all | 843 // memory and in that case we need to abort initialization and free all |
| 845 // associated resources before calling DispatchMoreTasks(). | 844 // associated resources before calling DispatchMoreTasks(). |
| 846 if (manage_tiles_call_count_when_dispatched != manage_tiles_call_count_) | 845 if (manage_tiles_call_count_when_dispatched != manage_tiles_call_count_) |
| 847 AssignGpuMemoryToTiles(); | 846 AssignGpuMemoryToTiles(); |
| 848 | 847 |
| 849 // Finish resource initialization if |can_use_gpu_memory| is true. | 848 // Finish resource initialization if |can_use_gpu_memory| is true. |
| 850 if (managed_tile_state.can_use_gpu_memory) { | 849 if (managed_tile_state.can_use_gpu_memory) { |
| 851 // The component order may be bgra if we're uploading bgra pixels to rgba | 850 // The component order may be bgra if we're uploading bgra pixels to rgba |
| 852 // texture. Mark contents as swizzled if image component order is | 851 // texture. Mark contents as swizzled if image component order is |
| 853 // different than texture format. | 852 // different than texture format. |
| 854 managed_tile_state.contents_swizzled = | 853 managed_tile_state.drawing_info.contents_swizzled_ = |
| 855 !PlatformColor::sameComponentOrder(tile->format_); | 854 !PlatformColor::sameComponentOrder(tile->format_); |
| 856 | 855 |
| 857 // Tile resources can't be freed until upload has completed. | 856 // Tile resources can't be freed until upload has completed. |
| 858 managed_tile_state.can_be_freed = false; | 857 managed_tile_state.drawing_info.can_be_freed_ = false; |
| 859 | 858 |
| 860 resource_pool_->resource_provider()->BeginSetPixels(resource->id()); | 859 resource_pool_->resource_provider()->BeginSetPixels(resource->id()); |
| 861 has_performed_uploads_since_last_flush_ = true; | 860 has_performed_uploads_since_last_flush_ = true; |
| 862 | 861 |
| 863 managed_tile_state.resource = resource.Pass(); | 862 managed_tile_state.drawing_info.resource_ = resource.Pass(); |
| 864 | 863 |
| 865 bytes_pending_upload_ += tile->bytes_consumed_if_allocated(); | 864 bytes_pending_upload_ += tile->bytes_consumed_if_allocated(); |
| 866 DidTileRasterStateChange(tile, UPLOAD_STATE); | 865 DidTileRasterStateChange(tile, UPLOAD_STATE); |
| 867 tiles_with_pending_upload_.push(tile); | 866 tiles_with_pending_upload_.push(tile); |
| 868 } else { | 867 } else { |
| 869 resource_pool_->resource_provider()->ReleasePixelBuffer(resource->id()); | 868 resource_pool_->resource_provider()->ReleasePixelBuffer(resource->id()); |
| 870 resource_pool_->ReleaseResource(resource.Pass()); | 869 resource_pool_->ReleaseResource(resource.Pass()); |
| 871 managed_tile_state.resource_is_being_initialized = false; | 870 managed_tile_state.drawing_info.resource_is_being_initialized_ = false; |
| 872 DidTileRasterStateChange(tile, IDLE_STATE); | 871 DidTileRasterStateChange(tile, IDLE_STATE); |
| 873 } | 872 } |
| 874 } | 873 } |
| 875 | 874 |
| 876 void TileManager::DidFinishTileInitialization(Tile* tile) { | 875 void TileManager::DidFinishTileInitialization(Tile* tile) { |
| 877 ManagedTileState& managed_tile_state = tile->managed_state(); | 876 ManagedTileState& managed_state = tile->managed_state(); |
| 878 DCHECK(managed_tile_state.resource); | 877 DCHECK(managed_state.drawing_info.resource_); |
| 879 managed_tile_state.resource_is_being_initialized = false; | 878 managed_state.drawing_info.resource_is_being_initialized_ = false; |
| 880 managed_tile_state.can_be_freed = true; | 879 managed_state.drawing_info.can_be_freed_ = true; |
| 881 } | 880 } |
| 882 | 881 |
| 883 void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { | 882 void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { |
| 884 ManagedTileState& mts = tile->managed_state(); | 883 ManagedTileState& mts = tile->managed_state(); |
| 885 DCHECK_LT(state, NUM_STATES); | 884 DCHECK_LT(state, NUM_STATES); |
| 886 | 885 |
| 887 for (int i = 0; i < NUM_TREES; ++i) { | 886 for (int i = 0; i < NUM_TREES; ++i) { |
| 888 // Decrement count for current state. | 887 // Decrement count for current state. |
| 889 --raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; | 888 --raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; |
| 890 DCHECK_GE(raster_state_count_[mts.raster_state][i][mts.tree_bin[i]], 0); | 889 DCHECK_GE(raster_state_count_[mts.raster_state][i][mts.tree_bin[i]], 0); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 988 decode_begin_time = base::TimeTicks::HighResNow(); | 987 decode_begin_time = base::TimeTicks::HighResNow(); |
| 989 pixel_ref->Decode(); | 988 pixel_ref->Decode(); |
| 990 if (stats) { | 989 if (stats) { |
| 991 stats->totalDeferredImageDecodeCount++; | 990 stats->totalDeferredImageDecodeCount++; |
| 992 stats->totalDeferredImageDecodeTime += | 991 stats->totalDeferredImageDecodeTime += |
| 993 base::TimeTicks::HighResNow() - decode_begin_time; | 992 base::TimeTicks::HighResNow() - decode_begin_time; |
| 994 } | 993 } |
| 995 } | 994 } |
| 996 | 995 |
| 997 } // namespace cc | 996 } // namespace cc |
| OLD | NEW |