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; |