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

Unified Diff: cc/tile_manager.cc

Issue 11348384: cc: Use asynchronous set pixels API for impl-side painting. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/tile_manager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/tile_manager.cc
diff --git a/cc/tile_manager.cc b/cc/tile_manager.cc
index a80f1dd8380c04320c67fa1c4aa218efc86bd5bb..06aa08bd4238b1142f07952e248aa09153c4eabe 100644
--- a/cc/tile_manager.cc
+++ b/cc/tile_manager.cc
@@ -57,6 +57,15 @@ ManagedTileState::~ManagedTileState() {
DCHECK(!resource_is_being_initialized);
}
+PendingSetPixels::PendingSetPixels(
nduca 2012/12/04 23:59:26 I think this is overkill. Just do what I told you
reveman 2012/12/05 23:21:19 Done.
+ Tile* tile, scoped_ptr<ResourcePool::Resource> resource)
+ : tile_(tile),
+ resource_(resource.Pass()) {
+}
+
+PendingSetPixels::~PendingSetPixels() {
+}
+
TileManager::TileManager(
TileManagerClient* client,
ResourceProvider* resource_provider,
@@ -65,6 +74,7 @@ TileManager::TileManager(
resource_pool_(ResourcePool::Create(resource_provider,
Renderer::ImplPool)),
manage_tiles_pending_(false),
+ in_prepare_to_draw_(false),
pending_raster_tasks_(0),
num_raster_threads_(num_raster_threads),
worker_pool_(new base::SequencedWorkerPool(num_raster_threads,
@@ -222,6 +232,12 @@ void TileManager::ManageTiles() {
DispatchMoreRasterTasks();
}
+void TileManager::PrepareToDraw() {
nduca 2012/12/04 23:59:26 Lets call this CheckForCompletedUploads() so its o
reveman 2012/12/05 23:21:19 Done. Now CheckForCompletedSetPixels().
+ in_prepare_to_draw_ = true;
+ CheckForPendingSetPixelsCompletion();
+ in_prepare_to_draw_ = false;
+}
+
void TileManager::renderingStats(RenderingStats* stats) {
stats->totalRasterizeTimeInSeconds =
rendering_stats_.totalRasterizeTimeInSeconds;
@@ -294,6 +310,8 @@ void TileManager::DispatchMoreRasterTasks() {
DispatchOneRasterTask(tiles_that_need_to_be_rasterized_.back());
tiles_that_need_to_be_rasterized_.pop_back();
}
+
+ CheckForPendingSetPixelsCompletion();
}
void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) {
@@ -360,16 +378,18 @@ 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());
+ pending_set_pixels_.append(
+ make_scoped_ptr(new PendingSetPixels(tile, resource.Pass())));
} else {
resource_pool_->resource_provider()->releasePixelBuffer(resource->id());
resource_pool_->ReleaseResource(resource.Pass());
@@ -379,14 +399,33 @@ void TileManager::OnRasterTaskCompleted(
DispatchMoreRasterTasks();
}
+void TileManager::CheckForPendingSetPixelsCompletion() {
+ while (!pending_set_pixels_.isEmpty()) {
+ // Set pixel tasks complete in the order they are posted.
+ if (!resource_pool_->resource_provider()->didSetPixelsComplete(
+ pending_set_pixels_.first()->resource()->id()))
+ break;
+
+ scoped_ptr<PendingSetPixels> set_pixels = pending_set_pixels_.takeFirst();
+ scoped_ptr<ResourcePool::Resource> resource = set_pixels->takeResource();
+
+ // It's now safe to release the pixel buffer.
+ resource_pool_->resource_provider()->releasePixelBuffer(resource->id());
+
+ DidFinishTileInitialization(set_pixels->tile(), resource.Pass());
+ }
+}
+
void TileManager::DidFinishTileInitialization(
Tile* tile, scoped_ptr<ResourcePool::Resource> resource) {
ManagedTileState& managed_tile_state = tile->managed_state();
DCHECK(!managed_tile_state.resource);
managed_tile_state.resource = resource.Pass();
managed_tile_state.resource_is_being_initialized = false;
+ managed_tile_state.can_be_freed = true;
// TODO(qinmin): Make this conditional on managed_tile_state.bin == NOW_BIN.
- client_->ScheduleRedraw();
+ if (!in_prepare_to_draw_)
+ client_->ScheduleRedraw();
}
}
« no previous file with comments | « cc/tile_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698