Index: cc/resources/pixel_buffer_raster_worker_pool.cc |
diff --git a/cc/resources/pixel_buffer_raster_worker_pool.cc b/cc/resources/pixel_buffer_raster_worker_pool.cc |
index 9f72d04d75bf38bda6f2c8e6df486840ba352b87..738dd580b4ea4ed834898005fa5af7a5c7f52cf4 100644 |
--- a/cc/resources/pixel_buffer_raster_worker_pool.cc |
+++ b/cc/resources/pixel_buffer_raster_worker_pool.cc |
@@ -18,19 +18,20 @@ const int kCheckForCompletedRasterTasksDelayMs = 6; |
const size_t kMaxScheduledRasterTasks = 48; |
-typedef base::StackVector<internal::WorkerPoolTask*, kMaxScheduledRasterTasks> |
- WorkerPoolTaskVector; |
+typedef base::StackVector<internal::RasterTask*, kMaxScheduledRasterTasks> |
+ RasterTaskVector; |
} // namespace |
// static |
-scoped_ptr<PixelBufferRasterWorkerPool> PixelBufferRasterWorkerPool::Create( |
+scoped_ptr<RasterWorkerPool> PixelBufferRasterWorkerPool::Create( |
base::SequencedTaskRunner* task_runner, |
+ internal::TaskGraphRunner* task_graph_runner, |
ResourceProvider* resource_provider, |
size_t max_transfer_buffer_usage_bytes) { |
- return make_scoped_ptr( |
+ return make_scoped_ptr<RasterWorkerPool>( |
new PixelBufferRasterWorkerPool(task_runner, |
- GetTaskGraphRunner(), |
+ task_graph_runner, |
resource_provider, |
max_transfer_buffer_usage_bytes)); |
} |
@@ -68,7 +69,9 @@ PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() { |
DCHECK_EQ(0u, raster_tasks_required_for_activation_count_); |
} |
-void PixelBufferRasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { |
+Rasterizer* PixelBufferRasterWorkerPool::AsRasterizer() { return this; } |
+ |
+void PixelBufferRasterWorkerPool::SetClient(RasterizerClient* client) { |
client_ = client; |
} |
@@ -81,7 +84,7 @@ void PixelBufferRasterWorkerPool::Shutdown() { |
task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
- CheckForCompletedWorkerPoolTasks(); |
+ CheckForCompletedRasterizerTasks(); |
CheckForCompletedUploads(); |
check_for_completed_raster_tasks_pending_ = false; |
@@ -122,7 +125,7 @@ void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { |
it != queue->items.end(); |
++it) { |
const RasterTaskQueue::Item& item = *it; |
- internal::WorkerPoolTask* task = item.task; |
+ internal::RasterTask* task = item.task; |
// Remove any old items that are associated with this task. The result is |
// that the old queue is left with all items not present in this queue, |
@@ -166,7 +169,7 @@ void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { |
it != raster_tasks_.items.end(); |
++it) { |
const RasterTaskQueue::Item& item = *it; |
- internal::WorkerPoolTask* task = item.task; |
+ internal::RasterTask* task = item.task; |
RasterTaskState::Vector::iterator state_it = |
std::find_if(raster_task_states_.begin(), |
@@ -198,7 +201,7 @@ void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { |
// Check for completed tasks when ScheduleTasks() is called as |
// priorities might have changed and this maximizes the number |
// of top priority tasks that are scheduled. |
- CheckForCompletedWorkerPoolTasks(); |
+ CheckForCompletedRasterizerTasks(); |
CheckForCompletedUploads(); |
FlushUploads(); |
@@ -230,24 +233,24 @@ ResourceFormat PixelBufferRasterWorkerPool::GetResourceFormat() const { |
void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { |
TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks"); |
- CheckForCompletedWorkerPoolTasks(); |
+ CheckForCompletedRasterizerTasks(); |
CheckForCompletedUploads(); |
FlushUploads(); |
- for (internal::WorkerPoolTask::Vector::const_iterator it = |
+ for (internal::RasterizerTask::Vector::const_iterator it = |
completed_image_decode_tasks_.begin(); |
it != completed_image_decode_tasks_.end(); |
++it) { |
- internal::WorkerPoolTask* task = it->get(); |
+ internal::RasterizerTask* task = it->get(); |
task->RunReplyOnOriginThread(); |
} |
completed_image_decode_tasks_.clear(); |
- for (internal::WorkerPoolTask::Vector::const_iterator it = |
+ for (internal::RasterTask::Vector::const_iterator it = |
completed_raster_tasks_.begin(); |
it != completed_raster_tasks_.end(); |
++it) { |
- internal::WorkerPoolTask* task = it->get(); |
+ internal::RasterTask* task = it->get(); |
RasterTaskState::Vector::iterator state_it = |
std::find_if(raster_task_states_.begin(), |
raster_task_states_.end(), |
@@ -264,29 +267,24 @@ void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { |
} |
SkCanvas* PixelBufferRasterWorkerPool::AcquireCanvasForRaster( |
- internal::WorkerPoolTask* task, |
- const Resource* resource) { |
+ internal::RasterTask* task) { |
RasterTaskState::Vector::iterator it = |
std::find_if(raster_task_states_.begin(), |
raster_task_states_.end(), |
RasterTaskState::TaskComparator(task)); |
DCHECK(it != raster_task_states_.end()); |
- DCHECK(!it->resource); |
- it->resource = resource; |
- resource_provider_->AcquirePixelRasterBuffer(resource->id()); |
- return resource_provider_->MapPixelRasterBuffer(resource->id()); |
+ resource_provider_->AcquirePixelRasterBuffer(task->resource()->id()); |
+ return resource_provider_->MapPixelRasterBuffer(task->resource()->id()); |
} |
void PixelBufferRasterWorkerPool::ReleaseCanvasForRaster( |
- internal::WorkerPoolTask* task, |
- const Resource* resource) { |
+ internal::RasterTask* task) { |
RasterTaskState::Vector::iterator it = |
std::find_if(raster_task_states_.begin(), |
raster_task_states_.end(), |
RasterTaskState::TaskComparator(task)); |
DCHECK(it != raster_task_states_.end()); |
- DCHECK(it->resource == resource); |
- resource_provider_->ReleasePixelRasterBuffer(resource->id()); |
+ resource_provider_->ReleasePixelRasterBuffer(task->resource()->id()); |
} |
void PixelBufferRasterWorkerPool::OnRasterFinished() { |
@@ -332,21 +330,23 @@ void PixelBufferRasterWorkerPool::FlushUploads() { |
} |
void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { |
- internal::WorkerPoolTask::Vector tasks_with_completed_uploads; |
+ internal::RasterTask::Vector tasks_with_completed_uploads; |
// First check if any have completed. |
while (!raster_tasks_with_pending_upload_.empty()) { |
- internal::WorkerPoolTask* task = |
+ internal::RasterTask* task = |
raster_tasks_with_pending_upload_.front().get(); |
- RasterTaskState::Vector::const_iterator it = |
- std::find_if(raster_task_states_.begin(), |
- raster_task_states_.end(), |
- RasterTaskState::TaskComparator(task)); |
- DCHECK(it != raster_task_states_.end()); |
- DCHECK_EQ(RasterTaskState::UPLOADING, it->type); |
+ DCHECK(std::find_if(raster_task_states_.begin(), |
+ raster_task_states_.end(), |
+ RasterTaskState::TaskComparator(task)) != |
+ raster_task_states_.end()); |
+ DCHECK_EQ(RasterTaskState::UPLOADING, |
+ std::find_if(raster_task_states_.begin(), |
+ raster_task_states_.end(), |
+ RasterTaskState::TaskComparator(task))->type); |
// Uploads complete in the order they are issued. |
- if (!resource_provider_->DidSetPixelsComplete(it->resource->id())) |
+ if (!resource_provider_->DidSetPixelsComplete(task->resource()->id())) |
break; |
tasks_with_completed_uploads.push_back(task); |
@@ -358,19 +358,20 @@ void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { |
shutdown_ || client_->ShouldForceTasksRequiredForActivationToComplete(); |
if (should_force_some_uploads_to_complete) { |
- internal::WorkerPoolTask::Vector tasks_with_uploads_to_force; |
- TaskDeque::iterator it = raster_tasks_with_pending_upload_.begin(); |
+ internal::RasterTask::Vector tasks_with_uploads_to_force; |
+ RasterTaskDeque::iterator it = raster_tasks_with_pending_upload_.begin(); |
while (it != raster_tasks_with_pending_upload_.end()) { |
- internal::WorkerPoolTask* task = it->get(); |
+ internal::RasterTask* task = it->get(); |
RasterTaskState::Vector::const_iterator state_it = |
std::find_if(raster_task_states_.begin(), |
raster_task_states_.end(), |
RasterTaskState::TaskComparator(task)); |
DCHECK(state_it != raster_task_states_.end()); |
+ const RasterTaskState& state = *state_it; |
// Force all uploads required for activation to complete. |
// During shutdown, force all pending uploads to complete. |
- if (shutdown_ || state_it->required_for_activation) { |
+ if (shutdown_ || state.required_for_activation) { |
tasks_with_uploads_to_force.push_back(task); |
tasks_with_completed_uploads.push_back(task); |
it = raster_tasks_with_pending_upload_.erase(it); |
@@ -382,30 +383,24 @@ void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { |
// Force uploads in reverse order. Since forcing can cause a wait on |
// all previous uploads, we would rather wait only once downstream. |
- for (internal::WorkerPoolTask::Vector::reverse_iterator it = |
+ for (internal::RasterTask::Vector::reverse_iterator it = |
tasks_with_uploads_to_force.rbegin(); |
it != tasks_with_uploads_to_force.rend(); |
++it) { |
- internal::WorkerPoolTask* task = it->get(); |
- RasterTaskState::Vector::const_iterator state_it = |
- std::find_if(raster_task_states_.begin(), |
- raster_task_states_.end(), |
- RasterTaskState::TaskComparator(task)); |
- DCHECK(state_it != raster_task_states_.end()); |
- DCHECK(state_it->resource); |
+ internal::RasterTask* task = it->get(); |
- resource_provider_->ForceSetPixelsToComplete(state_it->resource->id()); |
+ resource_provider_->ForceSetPixelsToComplete(task->resource()->id()); |
has_performed_uploads_since_last_flush_ = true; |
} |
} |
// Release shared memory and move tasks with completed uploads |
// to |completed_raster_tasks_|. |
- for (internal::WorkerPoolTask::Vector::const_iterator it = |
+ for (internal::RasterTask::Vector::const_iterator it = |
tasks_with_completed_uploads.begin(); |
it != tasks_with_completed_uploads.end(); |
++it) { |
- internal::WorkerPoolTask* task = it->get(); |
+ internal::RasterTask* task = it->get(); |
RasterTaskState::Vector::iterator state_it = |
std::find_if(raster_task_states_.begin(), |
raster_task_states_.end(), |
@@ -413,7 +408,7 @@ void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { |
DCHECK(state_it != raster_task_states_.end()); |
RasterTaskState& state = *state_it; |
- bytes_pending_upload_ -= state.resource->bytes(); |
+ bytes_pending_upload_ -= task->resource()->bytes(); |
task->WillComplete(); |
task->CompleteOnOriginThread(this); |
@@ -479,7 +474,7 @@ void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() { |
DCHECK(should_notify_client_if_no_tasks_are_pending_); |
check_for_completed_raster_tasks_time_ = base::TimeTicks(); |
- CheckForCompletedWorkerPoolTasks(); |
+ CheckForCompletedRasterizerTasks(); |
CheckForCompletedUploads(); |
FlushUploads(); |
@@ -531,8 +526,8 @@ void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() { |
void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { |
TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); |
- WorkerPoolTaskVector tasks; |
- WorkerPoolTaskVector tasks_required_for_activation; |
+ RasterTaskVector tasks; |
+ RasterTaskVector tasks_required_for_activation; |
unsigned priority = kRasterTaskPriorityBase; |
@@ -547,7 +542,7 @@ void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { |
it != raster_tasks_.items.end(); |
++it) { |
const RasterTaskQueue::Item& item = *it; |
- internal::RasterWorkerPoolTask* task = item.task; |
+ internal::RasterTask* task = item.task; |
// |raster_task_states_| contains the state of all tasks that we have not |
// yet run reply callbacks for. |
@@ -611,7 +606,7 @@ void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { |
// Cancel existing OnRasterFinished callbacks. |
raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
- scoped_refptr<internal::WorkerPoolTask> |
+ scoped_refptr<internal::RasterizerTask> |
new_raster_required_for_activation_finished_task; |
size_t scheduled_raster_task_required_for_activation_count = |
@@ -635,7 +630,7 @@ void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { |
new_raster_required_for_activation_finished_task.get(), |
kRasterRequiredForActivationFinishedTaskPriority, |
scheduled_raster_task_required_for_activation_count); |
- for (WorkerPoolTaskVector::ContainerType::const_iterator it = |
+ for (RasterTaskVector::ContainerType::const_iterator it = |
tasks_required_for_activation.container().begin(); |
it != tasks_required_for_activation.container().end(); |
++it) { |
@@ -644,7 +639,7 @@ void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { |
} |
} |
- scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task; |
+ scoped_refptr<internal::RasterizerTask> new_raster_finished_task; |
size_t scheduled_raster_task_count = tasks.container().size(); |
DCHECK_LE(scheduled_raster_task_count, PendingRasterTaskCount()); |
@@ -661,7 +656,7 @@ void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { |
new_raster_finished_task.get(), |
kRasterFinishedTaskPriority, |
scheduled_raster_task_count); |
- for (WorkerPoolTaskVector::ContainerType::const_iterator it = |
+ for (RasterTaskVector::ContainerType::const_iterator it = |
tasks.container().begin(); |
it != tasks.container().end(); |
++it) { |
@@ -706,23 +701,20 @@ const char* PixelBufferRasterWorkerPool::StateName() const { |
return "finishing"; |
} |
-void PixelBufferRasterWorkerPool::CheckForCompletedWorkerPoolTasks() { |
+void PixelBufferRasterWorkerPool::CheckForCompletedRasterizerTasks() { |
TRACE_EVENT0("cc", |
- "PixelBufferRasterWorkerPool::CheckForCompletedWorkerPoolTasks"); |
+ "PixelBufferRasterWorkerPool::CheckForCompletedRasterizerTasks"); |
task_graph_runner_->CollectCompletedTasks(namespace_token_, |
&completed_tasks_); |
for (internal::Task::Vector::const_iterator it = completed_tasks_.begin(); |
it != completed_tasks_.end(); |
++it) { |
- internal::WorkerPoolTask* task = |
- static_cast<internal::WorkerPoolTask*>(it->get()); |
+ internal::RasterizerTask* task = |
+ static_cast<internal::RasterizerTask*>(it->get()); |
- RasterTaskState::Vector::iterator state_it = |
- std::find_if(raster_task_states_.begin(), |
- raster_task_states_.end(), |
- RasterTaskState::TaskComparator(task)); |
- if (state_it == raster_task_states_.end()) { |
+ internal::RasterTask* raster_task = task->AsRasterTask(); |
+ if (!raster_task) { |
task->WillComplete(); |
task->CompleteOnOriginThread(this); |
task->DidComplete(); |
@@ -731,41 +723,45 @@ void PixelBufferRasterWorkerPool::CheckForCompletedWorkerPoolTasks() { |
continue; |
} |
+ RasterTaskState::Vector::iterator state_it = |
+ std::find_if(raster_task_states_.begin(), |
+ raster_task_states_.end(), |
+ RasterTaskState::TaskComparator(raster_task)); |
+ DCHECK(state_it != raster_task_states_.end()); |
+ |
RasterTaskState& state = *state_it; |
DCHECK_EQ(RasterTaskState::SCHEDULED, state.type); |
- DCHECK(state.resource); |
// Balanced with MapPixelRasterBuffer() call in AcquireCanvasForRaster(). |
- bool content_has_changed = |
- resource_provider_->UnmapPixelRasterBuffer(state.resource->id()); |
+ bool content_has_changed = resource_provider_->UnmapPixelRasterBuffer( |
+ raster_task->resource()->id()); |
// |content_has_changed| can be false as result of task being canceled or |
// task implementation deciding not to modify bitmap (ie. analysis of raster |
// commands detected content as a solid color). |
if (!content_has_changed) { |
- task->WillComplete(); |
- task->CompleteOnOriginThread(this); |
- task->DidComplete(); |
+ raster_task->WillComplete(); |
+ raster_task->CompleteOnOriginThread(this); |
+ raster_task->DidComplete(); |
- if (!task->HasFinishedRunning()) { |
+ if (!raster_task->HasFinishedRunning()) { |
// When priorites change, a raster task can be canceled as a result of |
// no longer being of high enough priority to fit in our throttled |
// raster task budget. The task has not yet completed in this case. |
RasterTaskQueue::Item::Vector::const_iterator item_it = |
std::find_if(raster_tasks_.items.begin(), |
raster_tasks_.items.end(), |
- RasterTaskQueue::Item::TaskComparator(task)); |
+ RasterTaskQueue::Item::TaskComparator(raster_task)); |
if (item_it != raster_tasks_.items.end()) { |
state.type = RasterTaskState::UNSCHEDULED; |
- state.resource = NULL; |
continue; |
} |
} |
DCHECK(std::find(completed_raster_tasks_.begin(), |
completed_raster_tasks_.end(), |
- task) == completed_raster_tasks_.end()); |
- completed_raster_tasks_.push_back(task); |
+ raster_task) == completed_raster_tasks_.end()); |
+ completed_raster_tasks_.push_back(raster_task); |
state.type = RasterTaskState::COMPLETED; |
DCHECK_LE(static_cast<size_t>(state.required_for_activation), |
raster_tasks_required_for_activation_count_); |
@@ -774,13 +770,13 @@ void PixelBufferRasterWorkerPool::CheckForCompletedWorkerPoolTasks() { |
continue; |
} |
- DCHECK(task->HasFinishedRunning()); |
+ DCHECK(raster_task->HasFinishedRunning()); |
- resource_provider_->BeginSetPixels(state.resource->id()); |
+ resource_provider_->BeginSetPixels(raster_task->resource()->id()); |
has_performed_uploads_since_last_flush_ = true; |
- bytes_pending_upload_ += state.resource->bytes(); |
- raster_tasks_with_pending_upload_.push_back(task); |
+ bytes_pending_upload_ += raster_task->resource()->bytes(); |
+ raster_tasks_with_pending_upload_.push_back(raster_task); |
state.type = RasterTaskState::UPLOADING; |
} |
completed_tasks_.clear(); |