Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index b443516887c8e65c6c0ba464dec3820ef926042b..70337a978184a51a080903977d7368e5863b462f 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -168,6 +168,7 @@ scoped_ptr<base::Value> RasterTaskCompletionStatsAsValue( |
scoped_ptr<TileManager> TileManager::Create( |
TileManagerClient* client, |
ResourceProvider* resource_provider, |
+ ContextProvider* context_provider, |
size_t num_raster_threads, |
RenderingStatsInstrumentation* rendering_stats_instrumentation, |
bool use_map_image, |
@@ -177,6 +178,7 @@ scoped_ptr<TileManager> TileManager::Create( |
return make_scoped_ptr( |
new TileManager(client, |
resource_provider, |
+ context_provider, |
use_map_image ? |
ImageRasterWorkerPool::Create( |
resource_provider, |
@@ -194,6 +196,7 @@ scoped_ptr<TileManager> TileManager::Create( |
TileManager::TileManager( |
TileManagerClient* client, |
ResourceProvider* resource_provider, |
+ ContextProvider* context_provider, |
scoped_ptr<RasterWorkerPool> raster_worker_pool, |
size_t num_raster_threads, |
size_t max_raster_usage_bytes, |
@@ -204,6 +207,8 @@ TileManager::TileManager( |
raster_worker_pool->GetResourceTarget(), |
raster_worker_pool->GetResourceFormat())), |
raster_worker_pool_(raster_worker_pool.Pass()), |
+ gpu_rasterizer_(GpuRasterizer::Create( |
nduca
2013/12/02 19:50:17
you should have unit tests that ensure that tiles
slavi
2013/12/04 02:06:50
Done.
|
+ this, context_provider, resource_provider)), |
prioritized_tiles_dirty_(false), |
all_tiles_that_need_to_be_rasterized_have_memory_(true), |
all_tiles_required_for_activation_have_memory_(true), |
@@ -800,6 +805,7 @@ void TileManager::ScheduleTasks( |
TRACE_EVENT1("cc", "TileManager::ScheduleTasks", |
"count", tiles_that_need_to_be_rasterized.size()); |
RasterWorkerPool::RasterTask::Queue tasks; |
+ GpuRasterizer::Queue gpu_raster_tasks; |
DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); |
@@ -816,10 +822,17 @@ void TileManager::ScheduleTasks( |
DCHECK(tile_version.requires_resource()); |
DCHECK(!tile_version.resource_); |
- if (tile_version.raster_task_.is_null()) |
- tile_version.raster_task_ = CreateRasterTask(tile); |
+ if (tile->use_gpu_rasterizer()) { |
+ scoped_ptr<ResourcePool::Resource> resource = |
+ resource_pool_->AcquireResource(tile->tile_size_.size()); |
- tasks.Append(tile_version.raster_task_, tile->required_for_activation()); |
+ gpu_raster_tasks.Append(tile, resource.Pass()); |
+ } else { |
+ if (tile_version.raster_task_.is_null()) |
+ tile_version.raster_task_ = CreateRasterTask(tile); |
+ |
+ tasks.Append(tile_version.raster_task_, tile->required_for_activation()); |
+ } |
} |
// We must reduce the amount of unused resoruces before calling |
@@ -832,6 +845,9 @@ void TileManager::ScheduleTasks( |
raster_worker_pool_->ScheduleTasks(&tasks); |
did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
+ |
+ gpu_rasterizer_->Rasterize(gpu_raster_tasks, |
+ rendering_stats_instrumentation_); |
} |
RasterWorkerPool::Task TileManager::CreateImageDecodeTask( |
@@ -964,6 +980,27 @@ void TileManager::OnRasterTaskCompleted( |
did_initialize_visible_tile_ = true; |
} |
+void TileManager::OnGpuRasterTaskCompleted( |
+ Tile* tile, |
+ scoped_ptr<ResourcePool::Resource> resource) { |
+ ManagedTileState& mts = tile->managed_state(); |
+ ManagedTileState::TileVersion& tile_version = |
+ mts.tile_versions[mts.raster_mode]; |
+ DCHECK(tile_version.raster_task_.is_null()); |
+ |
+ ++update_visible_tiles_stats_.completed_count; |
+ |
+ tile_version.set_use_resource(); |
+ tile_version.resource_ = resource.Pass(); |
+ |
+ bytes_releasable_ += BytesConsumedIfAllocated(tile); |
+ ++resources_releasable_; |
+ |
+ FreeUnusedResourcesForTile(tile); |
+ if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
+ did_initialize_visible_tile_ = true; |
+} |
+ |
scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, |
gfx::Size tile_size, |
gfx::Rect content_rect, |
@@ -971,7 +1008,8 @@ scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, |
float contents_scale, |
int layer_id, |
int source_frame_number, |
- bool can_use_lcd_text) { |
+ bool can_use_lcd_text, |
+ bool use_gpu_rasterizer) { |
scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, |
picture_pile, |
tile_size, |
@@ -980,7 +1018,8 @@ scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, |
contents_scale, |
layer_id, |
source_frame_number, |
- can_use_lcd_text)); |
+ can_use_lcd_text, |
+ use_gpu_rasterizer)); |
DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
tiles_[tile->id()] = tile; |