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

Side by Side Diff: cc/tile_manager.cc

Issue 12353003: cc: Refactored Tile::GetResourceId (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 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 | Annotate | Revision Log
« cc/tile_drawing_info.h ('K') | « cc/tile_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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
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
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
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
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
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
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
OLDNEW
« cc/tile_drawing_info.h ('K') | « cc/tile_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698