Index: cc/tile_manager.cc |
diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc |
index 80c2c74069c2d06db44d0c03b6c4c04c924b04ae..fdeb9eb7eee72f30cd755e4907231b2c424c1f46 100644 |
--- a/cc/tile_manager.cc |
+++ b/cc/tile_manager.cc |
@@ -100,6 +100,7 @@ class RasterThread : public base::Thread { |
ManagedTileState::ManagedTileState() |
: can_use_gpu_memory(false), |
can_be_freed(true), |
+ resource_id(0), |
resource_is_being_initialized(false), |
contents_swizzled(false) { |
} |
@@ -116,7 +117,8 @@ TileManager::TileManager( |
: client_(client), |
resource_pool_(ResourcePool::Create(resource_provider, |
Renderer::ImplPool)), |
- manage_tiles_pending_(false) { |
+ manage_tiles_pending_(false), |
+ check_for_completed_set_pixels_pending_(false) { |
// Initialize all threads. |
const std::string thread_name_prefix = kRasterThreadNamePrefix; |
while (raster_threads_.size() < num_raster_threads) { |
@@ -175,6 +177,13 @@ void TileManager::ScheduleManageTiles() { |
manage_tiles_pending_ = true; |
} |
+void TileManager::ScheduleCheckForCompletedSetPixels() { |
+ if (check_for_completed_set_pixels_pending_) |
+ return; |
+ client_->ScheduleCheckForCompletedSetPixels(); |
+ check_for_completed_set_pixels_pending_ = true; |
+} |
+ |
class BinComparator { |
public: |
bool operator() (const Tile* a, const Tile* b) const { |
@@ -279,6 +288,29 @@ void TileManager::ManageTiles() { |
DispatchMoreRasterTasks(); |
} |
epennerAtGoogle
2012/12/06 00:33:17
Could this possibly just be called at the beginnin
reveman
2012/12/06 15:28:20
For minimal latency I think we want to call this j
|
+void TileManager::CheckForCompletedSetPixels() { |
nduca
2012/12/06 03:21:30
I had asked for this before, and I'll ask again.
reveman
2012/12/06 15:28:20
We've moved away from using the "upload" term in r
|
+ check_for_completed_set_pixels_pending_ = false; |
+ |
+ while (!tiles_with_pending_set_pixels_.empty()) { |
+ Tile* tile = tiles_with_pending_set_pixels_.front(); |
+ DCHECK(tile->managed_state().resource); |
+ |
+ // Set pixel tasks complete in the order they are posted. |
nduca
2012/12/06 16:37:09
does async upload extension guarantee completion o
reveman
2012/12/06 20:40:35
Yes and it's advantages not to relax this requirem
|
+ if (!resource_pool_->resource_provider()->didSetPixelsComplete( |
+ tile->managed_state().resource->id())) { |
+ ScheduleCheckForCompletedSetPixels(); |
+ break; |
+ } |
+ |
+ // It's now safe to release the pixel buffer. |
+ resource_pool_->resource_provider()->releasePixelBuffer( |
+ tile->managed_state().resource->id()); |
+ |
+ DidFinishTileInitialization(tile); |
+ tiles_with_pending_set_pixels_.pop(); |
+ } |
+} |
+ |
void TileManager::renderingStats(RenderingStats* stats) { |
stats->totalRasterizeTimeInSeconds = |
rendering_stats_.totalRasterizeTimeInSeconds; |
@@ -420,16 +452,20 @@ void TileManager::OnRasterTaskCompleted( |
// Finish resource initialization if |can_use_gpu_memory| is true. |
if (managed_tile_state.can_use_gpu_memory) { |
- resource_pool_->resource_provider()->setPixelsFromBuffer(resource->id()); |
- resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
- |
- // The component order may be bgra if we uploaded bgra pixels to rgba |
+ // The component order may be bgra if we're uploading bgra pixels to rgba |
// texture. Mark contents as swizzled if image component order is |
// different than texture format. |
managed_tile_state.contents_swizzled = |
!PlatformColor::sameComponentOrder(tile->format_); |
- DidFinishTileInitialization(tile, resource.Pass()); |
+ // Tile resources can't be freed until upload has completed. |
+ managed_tile_state.can_be_freed = false; |
+ |
+ resource_pool_->resource_provider()->beginSetPixels(resource->id()); |
+ managed_tile_state.resource = resource.Pass(); |
nduca
2012/12/06 16:37:09
this is getting really insane to me that you have
reveman
2012/12/06 20:40:35
I got rid of ManagedTileState::resource_id by just
|
+ tiles_with_pending_set_pixels_.push(tile); |
+ |
+ ScheduleCheckForCompletedSetPixels(); |
} else { |
resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
resource_pool_->ReleaseResource(resource.Pass()); |
@@ -439,14 +475,12 @@ void TileManager::OnRasterTaskCompleted( |
DispatchMoreRasterTasks(); |
} |
-void TileManager::DidFinishTileInitialization( |
- Tile* tile, scoped_ptr<ResourcePool::Resource> resource) { |
+void TileManager::DidFinishTileInitialization(Tile* tile) { |
ManagedTileState& managed_tile_state = tile->managed_state(); |
- DCHECK(!managed_tile_state.resource); |
- managed_tile_state.resource = resource.Pass(); |
+ DCHECK(managed_tile_state.resource); |
+ managed_tile_state.resource_id = managed_tile_state.resource->id(); |
managed_tile_state.resource_is_being_initialized = false; |
- // TODO(qinmin): Make this conditional on managed_tile_state.bin == NOW_BIN. |
- client_->ScheduleRedraw(); |
+ managed_tile_state.can_be_freed = true; |
} |
} |