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 |