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

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: Remove ManagedTileState::resource_id. 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 80c2c74069c2d06db44d0c03b6c4c04c924b04ae..53ef4daa9f8ef5ea5ead233a2f26c915ffa05a7b 100644
--- a/cc/tile_manager.cc
+++ b/cc/tile_manager.cc
@@ -116,7 +116,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 +176,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 +287,29 @@ void TileManager::ManageTiles() {
DispatchMoreRasterTasks();
}
+void TileManager::CheckForCompletedSetPixels() {
+ 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.
+ 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 +451,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();
+ tiles_with_pending_set_pixels_.push(tile);
+
+ ScheduleCheckForCompletedSetPixels();
} else {
resource_pool_->resource_provider()->releasePixelBuffer(resource->id());
resource_pool_->ReleaseResource(resource.Pass());
@@ -439,14 +474,11 @@ 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_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;
}
}
« 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