Chromium Code Reviews| Index: cc/resources/tile_manager.cc |
| diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
| index cd9adfaac1206a5b80d0f6ad18ae894beb086355..1be95d6943cb3aa3dbc06709fbb8041d764f535c 100644 |
| --- a/cc/resources/tile_manager.cc |
| +++ b/cc/resources/tile_manager.cc |
| @@ -13,14 +13,13 @@ |
| #include "base/logging.h" |
| #include "base/metrics/histogram.h" |
| #include "cc/debug/traced_value.h" |
| +#include "cc/resources/direct_raster_worker_pool.h" |
| #include "cc/resources/image_raster_worker_pool.h" |
| #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
| #include "cc/resources/tile.h" |
| -#include "third_party/skia/include/core/SkCanvas.h" |
| #include "ui/gfx/rect_conversions.h" |
| namespace cc { |
| - |
| namespace { |
| // Memory limit policy works by mapping some bin states to the NEVER bin. |
| @@ -132,6 +131,68 @@ inline ManagedTileBin BinFromTilePriority(const TilePriority& prio) { |
| } // namespace |
| +class RasterWorkerPoolDelegate : public RasterWorkerPoolClient { |
|
vmpstr
2014/02/14 17:16:51
Can you please make this a separate file?
I was t
reveman
2014/02/14 23:30:52
Done.
|
| + public: |
| + RasterWorkerPoolDelegate( |
| + scoped_ptr<RasterWorkerPool> raster_worker_pool, |
| + scoped_ptr<RasterWorkerPool> direct_raster_worker_pool) |
| + : client_(NULL), |
| + raster_worker_pool_(raster_worker_pool.Pass()), |
| + direct_raster_worker_pool_(direct_raster_worker_pool.Pass()), |
| + did_finish_running_tasks_pending_count_(0u), |
| + did_finish_running_tasks_required_for_activation_pending_count_(0u) { |
| + raster_worker_pool_->SetClient(this); |
| + direct_raster_worker_pool_->SetClient(this); |
| + } |
| + |
| + void SetClient(RasterWorkerPoolClient* client) { client_ = client; } |
| + |
| + void Shutdown() { |
| + raster_worker_pool_->Shutdown(); |
| + direct_raster_worker_pool_->Shutdown(); |
| + } |
| + |
| + void ScheduleTasks(RasterTaskQueue* raster_queue, |
| + RasterTaskQueue* direct_raster_queue) { |
| + raster_worker_pool_->ScheduleTasks(raster_queue); |
| + direct_raster_worker_pool_->ScheduleTasks(direct_raster_queue); |
| + |
| + did_finish_running_tasks_pending_count_ = 2u; |
| + did_finish_running_tasks_required_for_activation_pending_count_ = 2u; |
| + } |
| + |
| + void CheckForCompletedTasks() { |
| + raster_worker_pool_->CheckForCompletedTasks(); |
| + direct_raster_worker_pool_->CheckForCompletedTasks(); |
| + } |
| + |
| + // Overriden from RasterWorkerPoolClient: |
| + virtual bool ShouldForceTasksRequiredForActivationToComplete() |
| + const OVERRIDE { |
| + return client_->ShouldForceTasksRequiredForActivationToComplete(); |
| + } |
| + virtual void DidFinishRunningTasks() OVERRIDE { |
| + DCHECK_LT(0u, did_finish_running_tasks_pending_count_); |
| + if (--did_finish_running_tasks_pending_count_) |
| + return; |
| + client_->DidFinishRunningTasks(); |
| + } |
| + virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE { |
| + DCHECK_LT(0u, |
| + did_finish_running_tasks_required_for_activation_pending_count_); |
| + if (--did_finish_running_tasks_required_for_activation_pending_count_) |
| + return; |
| + client_->DidFinishRunningTasksRequiredForActivation(); |
| + } |
| + |
| + private: |
| + RasterWorkerPoolClient* client_; |
| + scoped_ptr<RasterWorkerPool> raster_worker_pool_; |
| + scoped_ptr<RasterWorkerPool> direct_raster_worker_pool_; |
| + size_t did_finish_running_tasks_pending_count_; |
| + size_t did_finish_running_tasks_required_for_activation_pending_count_; |
| +}; |
| + |
| RasterTaskCompletionStats::RasterTaskCompletionStats() |
| : completed_count(0u), canceled_count(0u) {} |
| @@ -157,13 +218,12 @@ scoped_ptr<TileManager> TileManager::Create( |
| return make_scoped_ptr(new TileManager( |
| client, |
| resource_provider, |
| - use_map_image |
| - ? ImageRasterWorkerPool::Create( |
| - resource_provider, context_provider, map_image_texture_target) |
| - : PixelBufferRasterWorkerPool::Create( |
| - resource_provider, |
| - context_provider, |
| - max_transfer_buffer_usage_bytes), |
| + context_provider, |
| + use_map_image ? ImageRasterWorkerPool::Create(resource_provider, |
| + map_image_texture_target) |
| + : PixelBufferRasterWorkerPool::Create( |
| + resource_provider, max_transfer_buffer_usage_bytes), |
| + DirectRasterWorkerPool::Create(resource_provider, context_provider), |
|
alokp
2014/02/14 18:50:59
I was under the impression that we would create a
reveman
2014/02/14 23:30:52
Yes, that might be what we want to do long term bu
|
| max_raster_usage_bytes, |
| rendering_stats_instrumentation, |
| use_rasterize_on_demand)); |
| @@ -172,16 +232,21 @@ scoped_ptr<TileManager> TileManager::Create( |
| TileManager::TileManager( |
| TileManagerClient* client, |
| ResourceProvider* resource_provider, |
| + ContextProvider* context_provider, |
| scoped_ptr<RasterWorkerPool> raster_worker_pool, |
| + scoped_ptr<RasterWorkerPool> direct_raster_worker_pool, |
| size_t max_raster_usage_bytes, |
| RenderingStatsInstrumentation* rendering_stats_instrumentation, |
| bool use_rasterize_on_demand) |
| : client_(client), |
| + resource_format_(raster_worker_pool->GetResourceFormat()), |
| resource_pool_( |
| ResourcePool::Create(resource_provider, |
| raster_worker_pool->GetResourceTarget(), |
| - raster_worker_pool->GetResourceFormat())), |
| - raster_worker_pool_(raster_worker_pool.Pass()), |
| + resource_format_)), |
| + raster_worker_pool_( |
| + new RasterWorkerPoolDelegate(raster_worker_pool.Pass(), |
| + direct_raster_worker_pool.Pass())), |
| prioritized_tiles_dirty_(false), |
| all_tiles_that_need_to_be_rasterized_have_memory_(true), |
| all_tiles_required_for_activation_have_memory_(true), |
| @@ -206,8 +271,8 @@ TileManager::~TileManager() { |
| CleanUpReleasedTiles(); |
| DCHECK_EQ(0u, tiles_.size()); |
| - RasterWorkerPool::RasterTask::Queue empty; |
| - raster_worker_pool_->ScheduleTasks(&empty); |
| + RasterTaskQueue empty; |
| + raster_worker_pool_->ScheduleTasks(&empty, &empty); |
| // This should finish all pending tasks and release any uninitialized |
| // resources. |
| @@ -346,9 +411,8 @@ void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) { |
| const ManagedTileState::TileVersion& tile_version = |
| tile->GetTileVersionForDrawing(); |
| bool tile_is_ready_to_draw = tile_version.IsReadyToDraw(); |
| - bool tile_is_active = |
| - tile_is_ready_to_draw || |
| - !mts.tile_versions[mts.raster_mode].raster_task_.is_null(); |
| + bool tile_is_active = tile_is_ready_to_draw || |
| + mts.tile_versions[mts.raster_mode].raster_task_; |
| // Get the active priority and bin. |
| TilePriority active_priority = tile->priority(ACTIVE_TREE); |
| @@ -664,7 +728,7 @@ void TileManager::AssignGpuMemoryToTiles( |
| if (raster_bytes_if_rastered <= max_raster_bytes) { |
| // If we don't have the required version, and it's not in flight |
| // then we'll have to pay to create a new task. |
| - if (!tile_version.resource_ && tile_version.raster_task_.is_null()) { |
| + if (!tile_version.resource_ && !tile_version.raster_task_) { |
| tile_bytes += bytes_if_allocated; |
| tile_resources++; |
| } |
| @@ -776,7 +840,8 @@ void TileManager::ScheduleTasks( |
| DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); |
| - raster_tasks_.Reset(); |
| + raster_queue_.Reset(); |
| + gpu_raster_queue_.Reset(); |
| // Build a new task queue containing all task currently needed. Tasks |
| // are added in order of priority, highest priority task first. |
| @@ -791,11 +856,20 @@ void TileManager::ScheduleTasks( |
| DCHECK(tile_version.requires_resource()); |
| DCHECK(!tile_version.resource_); |
| - if (tile_version.raster_task_.is_null()) |
| + if (!tile_version.raster_task_) |
| tile_version.raster_task_ = CreateRasterTask(tile); |
| - raster_tasks_.Append(tile_version.raster_task_, |
| - tile->required_for_activation()); |
| + if (tile->use_gpu_rasterization()) { |
| + gpu_raster_queue_.tasks.push_back(RasterTaskQueue::Task( |
| + tile_version.raster_task_.get(), tile->required_for_activation())); |
| + gpu_raster_queue_.required_for_activation_count += |
| + tile->required_for_activation(); |
| + } else { |
| + raster_queue_.tasks.push_back(RasterTaskQueue::Task( |
| + tile_version.raster_task_.get(), tile->required_for_activation())); |
| + raster_queue_.required_for_activation_count += |
| + tile->required_for_activation(); |
| + } |
| } |
| // We must reduce the amount of unused resoruces before calling |
| @@ -805,12 +879,12 @@ void TileManager::ScheduleTasks( |
| // Schedule running of |raster_tasks_|. This replaces any previously |
| // scheduled tasks and effectively cancels all tasks not present |
| // in |raster_tasks_|. |
| - raster_worker_pool_->ScheduleTasks(&raster_tasks_); |
| + raster_worker_pool_->ScheduleTasks(&raster_queue_, &gpu_raster_queue_); |
| did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
| } |
| -RasterWorkerPool::Task TileManager::CreateImageDecodeTask( |
| +scoped_refptr<internal::WorkerPoolTask> TileManager::CreateImageDecodeTask( |
| Tile* tile, |
| SkPixelRef* pixel_ref) { |
| return RasterWorkerPool::CreateImageDecodeTask( |
| @@ -823,7 +897,8 @@ RasterWorkerPool::Task TileManager::CreateImageDecodeTask( |
| base::Unretained(pixel_ref))); |
| } |
| -RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { |
| +scoped_refptr<internal::RasterWorkerPoolTask> TileManager::CreateRasterTask( |
| + Tile* tile) { |
| ManagedTileState& mts = tile->managed_state(); |
| scoped_ptr<ScopedResource> resource = |
| @@ -831,7 +906,7 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { |
| const ScopedResource* const_resource = resource.get(); |
| // Create and queue all image decode tasks that this tile depends on. |
| - RasterWorkerPool::Task::Set decode_tasks; |
| + internal::WorkerPoolTask::Vector decode_tasks; |
| PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; |
| for (PicturePileImpl::PixelRefIterator iter( |
| tile->content_rect(), tile->contents_scale(), tile->picture_pile()); |
| @@ -843,13 +918,14 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { |
| // Append existing image decode task if available. |
| PixelRefTaskMap::iterator decode_task_it = existing_pixel_refs.find(id); |
| if (decode_task_it != existing_pixel_refs.end()) { |
| - decode_tasks.Insert(decode_task_it->second); |
| + decode_tasks.push_back(decode_task_it->second); |
| continue; |
| } |
| // Create and append new image decode task for this pixel ref. |
| - RasterWorkerPool::Task decode_task = CreateImageDecodeTask(tile, pixel_ref); |
| - decode_tasks.Insert(decode_task); |
| + scoped_refptr<internal::WorkerPoolTask> decode_task = |
| + CreateImageDecodeTask(tile, pixel_ref); |
| + decode_tasks.push_back(decode_task); |
| existing_pixel_refs[id] = decode_task; |
| } |
| @@ -863,14 +939,14 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { |
| tile->layer_id(), |
| static_cast<const void*>(tile), |
| tile->source_frame_number(), |
| - tile->use_gpu_rasterization(), |
| rendering_stats_instrumentation_, |
| base::Bind(&TileManager::OnRasterTaskCompleted, |
| base::Unretained(this), |
| tile->id(), |
| base::Passed(&resource), |
| mts.raster_mode), |
| - &decode_tasks); |
| + &decode_tasks, |
| + context_provider_); |
| } |
| void TileManager::OnImageDecodeTaskCompleted(int layer_id, |
| @@ -910,8 +986,8 @@ void TileManager::OnRasterTaskCompleted( |
| Tile* tile = it->second; |
| ManagedTileState& mts = tile->managed_state(); |
| ManagedTileState::TileVersion& tile_version = mts.tile_versions[raster_mode]; |
| - DCHECK(!tile_version.raster_task_.is_null()); |
| - tile_version.raster_task_.Reset(); |
| + DCHECK(tile_version.raster_task_); |
| + tile_version.raster_task_ = NULL; |
| if (was_canceled) { |
| ++update_visible_tiles_stats_.canceled_count; |