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

Unified Diff: cc/resources/pixel_buffer_raster_worker_pool.cc

Issue 170783007: Re-land: cc: Cleanup internal::WorkerPoolTaskClient interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 months 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
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 b5b978874048255be38b40e26c11e1f24fad75b0..e144b3e3bf4a1168c2e6c1605ccdbef0cdad0525 100644
--- a/cc/resources/pixel_buffer_raster_worker_pool.cc
+++ b/cc/resources/pixel_buffer_raster_worker_pool.cc
@@ -21,7 +21,7 @@ typedef base::StackVector<internal::WorkerPoolTask*, kMaxScheduledRasterTasks>
WorkerPoolTaskVector;
// Only used as std::find_if predicate for DCHECKs.
-bool WasCanceled(const internal::RasterWorkerPoolTask* task) {
+bool WasCanceled(const internal::WorkerPoolTask* task) {
return !task->HasFinishedRunning();
}
@@ -77,12 +77,13 @@ void PixelBufferRasterWorkerPool::Shutdown() {
for (RasterTaskStateMap::iterator it = raster_task_states_.begin();
it != raster_task_states_.end();
++it) {
- internal::RasterWorkerPoolTask* task = it->first;
+ internal::WorkerPoolTask* task = it->first;
+ RasterTaskState& state = it->second;
// All unscheduled tasks need to be canceled.
- if (it->second == UNSCHEDULED) {
+ if (state.type == RasterTaskState::UNSCHEDULED) {
completed_raster_tasks_.push_back(task);
- it->second = COMPLETED;
+ state.type = RasterTaskState::COMPLETED;
}
}
DCHECK_EQ(completed_raster_tasks_.size(), raster_task_states_.size());
@@ -111,24 +112,25 @@ void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
it != queue->items.end();
++it) {
const RasterTaskQueue::Item& item = *it;
- internal::RasterWorkerPoolTask* task = item.task;
+ internal::WorkerPoolTask* task = item.task;
DCHECK(new_raster_task_states.find(task) == new_raster_task_states.end());
RasterTaskStateMap::iterator state_it = raster_task_states_.find(task);
if (state_it != raster_task_states_.end()) {
- RasterTaskState state = state_it->second;
+ RasterTaskState& state = state_it->second;
new_raster_task_states[task] = state;
// |raster_tasks_required_for_activation_| contains all tasks that need to
// complete before we can send a "ready to activate" signal. Tasks that
// have already completed should not be part of this set.
- if (state != COMPLETED && item.required_for_activation)
+ if (state.type != RasterTaskState::COMPLETED &&
+ item.required_for_activation)
raster_tasks_required_for_activation_.insert(task);
raster_task_states_.erase(state_it);
} else {
DCHECK(!task->HasBeenScheduled());
- new_raster_task_states[task] = UNSCHEDULED;
+ new_raster_task_states[task].type = RasterTaskState::UNSCHEDULED;
vmpstr 2014/02/19 00:49:31 You either need to set resource to NULL here or ha
reveman 2014/02/19 01:41:13 added an explicit default ctor.
if (item.required_for_activation)
raster_tasks_required_for_activation_.insert(task);
}
@@ -139,22 +141,23 @@ void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
for (RasterTaskStateMap::iterator it = raster_task_states_.begin();
it != raster_task_states_.end();
++it) {
- internal::RasterWorkerPoolTask* task = it->first;
+ internal::WorkerPoolTask* task = it->first;
+ RasterTaskState& state = it->second;
DCHECK(new_raster_task_states.find(task) == new_raster_task_states.end());
// Unscheduled task can be canceled.
- if (it->second == UNSCHEDULED) {
+ if (state.type == RasterTaskState::UNSCHEDULED) {
DCHECK(!task->HasBeenScheduled());
DCHECK(std::find(completed_raster_tasks_.begin(),
completed_raster_tasks_.end(),
task) == completed_raster_tasks_.end());
completed_raster_tasks_.push_back(task);
- new_raster_task_states[task] = COMPLETED;
+ new_raster_task_states[task].type = RasterTaskState::COMPLETED;
continue;
}
// Move state to |new_raster_task_states|.
- new_raster_task_states[task] = it->second;
+ new_raster_task_states[task] = state;
}
raster_tasks_.Swap(queue);
@@ -209,10 +212,9 @@ void PixelBufferRasterWorkerPool::CheckForCompletedTasks() {
}
while (!completed_raster_tasks_.empty()) {
- internal::RasterWorkerPoolTask* task =
- completed_raster_tasks_.front().get();
+ internal::WorkerPoolTask* task = completed_raster_tasks_.front().get();
DCHECK(raster_task_states_.find(task) != raster_task_states_.end());
- DCHECK_EQ(COMPLETED, raster_task_states_[task]);
+ DCHECK_EQ(RasterTaskState::COMPLETED, raster_task_states_[task].type);
raster_task_states_.erase(task);
@@ -223,67 +225,21 @@ void PixelBufferRasterWorkerPool::CheckForCompletedTasks() {
}
SkCanvas* PixelBufferRasterWorkerPool::AcquireCanvasForRaster(
- internal::RasterWorkerPoolTask* task) {
- resource_provider()->AcquirePixelRasterBuffer(task->resource()->id());
- return resource_provider()->MapPixelRasterBuffer(task->resource()->id());
-}
-
-void PixelBufferRasterWorkerPool::OnRasterCompleted(
- internal::RasterWorkerPoolTask* task,
- const PicturePileImpl::Analysis& analysis) {
- TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc"),
- "PixelBufferRasterWorkerPool::OnRasterCompleted",
- "was_canceled",
- !task->HasFinishedRunning(),
- "needs_upload",
- task->HasFinishedRunning() && !analysis.is_solid_color);
-
+ internal::WorkerPoolTask* task,
+ const Resource* resource) {
DCHECK(raster_task_states_.find(task) != raster_task_states_.end());
- DCHECK_EQ(SCHEDULED, raster_task_states_[task]);
-
- // Balanced with MapPixelRasterBuffer() call in AcquireCanvasForRaster().
- resource_provider()->UnmapPixelRasterBuffer(task->resource()->id());
-
- if (!task->HasFinishedRunning() || analysis.is_solid_color) {
- resource_provider()->ReleasePixelRasterBuffer(task->resource()->id());
-
- if (!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.
- for (RasterTaskQueue::Item::Vector::const_iterator it =
- raster_tasks_.items.begin();
- it != raster_tasks_.items.end();
- ++it) {
- if (it->task == task) {
- raster_task_states_[task] = UNSCHEDULED;
- return;
- }
- }
- }
-
- DCHECK(std::find(completed_raster_tasks_.begin(),
- completed_raster_tasks_.end(),
- task) == completed_raster_tasks_.end());
- completed_raster_tasks_.push_back(task);
- raster_task_states_[task] = COMPLETED;
- raster_tasks_required_for_activation_.erase(task);
- return;
- }
-
- DCHECK(task->HasFinishedRunning());
-
- resource_provider()->BeginSetPixels(task->resource()->id());
- has_performed_uploads_since_last_flush_ = true;
-
- bytes_pending_upload_ += task->resource()->bytes();
- raster_tasks_with_pending_upload_.push_back(task);
- raster_task_states_[task] = UPLOADING;
+ DCHECK(!raster_task_states_[task].resource);
+ raster_task_states_[task].resource = resource;
+ resource_provider()->AcquirePixelRasterBuffer(resource->id());
+ return resource_provider()->MapPixelRasterBuffer(resource->id());
}
-void PixelBufferRasterWorkerPool::OnImageDecodeCompleted(
- internal::WorkerPoolTask* task) {
- completed_image_decode_tasks_.push_back(task);
+void PixelBufferRasterWorkerPool::ReleaseCanvasForRaster(
+ internal::WorkerPoolTask* task,
+ const Resource* resource) {
+ DCHECK(raster_task_states_.find(task) != raster_task_states_.end());
+ DCHECK(raster_task_states_[task].resource == resource);
+ resource_provider()->ReleasePixelRasterBuffer(resource->id());
}
void PixelBufferRasterWorkerPool::OnRasterTasksFinished() {
@@ -323,17 +279,18 @@ void PixelBufferRasterWorkerPool::FlushUploads() {
}
void PixelBufferRasterWorkerPool::CheckForCompletedUploads() {
- RasterTaskDeque tasks_with_completed_uploads;
+ TaskDeque tasks_with_completed_uploads;
// First check if any have completed.
while (!raster_tasks_with_pending_upload_.empty()) {
- internal::RasterWorkerPoolTask* task =
+ internal::WorkerPoolTask* task =
raster_tasks_with_pending_upload_.front().get();
DCHECK(raster_task_states_.find(task) != raster_task_states_.end());
- DCHECK_EQ(UPLOADING, raster_task_states_[task]);
+ RasterTaskState& state = raster_task_states_[task];
+ DCHECK_EQ(RasterTaskState::UPLOADING, state.type);
// Uploads complete in the order they are issued.
- if (!resource_provider()->DidSetPixelsComplete(task->resource()->id()))
+ if (!resource_provider()->DidSetPixelsComplete(state.resource->id()))
break;
tasks_with_completed_uploads.push_back(task);
@@ -345,10 +302,10 @@ void PixelBufferRasterWorkerPool::CheckForCompletedUploads() {
shutdown_ || client()->ShouldForceTasksRequiredForActivationToComplete();
if (should_force_some_uploads_to_complete) {
- RasterTaskDeque tasks_with_uploads_to_force;
- RasterTaskDeque::iterator it = raster_tasks_with_pending_upload_.begin();
+ TaskDeque tasks_with_uploads_to_force;
+ TaskDeque::iterator it = raster_tasks_with_pending_upload_.begin();
while (it != raster_tasks_with_pending_upload_.end()) {
- internal::RasterWorkerPoolTask* task = it->get();
+ internal::WorkerPoolTask* task = it->get();
DCHECK(raster_task_states_.find(task) != raster_task_states_.end());
// Force all uploads required for activation to complete.
@@ -365,11 +322,14 @@ 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 (RasterTaskDeque::reverse_iterator it =
- tasks_with_uploads_to_force.rbegin();
+ for (TaskDeque::reverse_iterator it = tasks_with_uploads_to_force.rbegin();
it != tasks_with_uploads_to_force.rend();
++it) {
- resource_provider()->ForceSetPixelsToComplete((*it)->resource()->id());
+ internal::WorkerPoolTask* task = it->get();
+ RasterTaskState& state = raster_task_states_[task];
+ DCHECK(state.resource);
+
+ resource_provider()->ForceSetPixelsToComplete(state.resource->id());
has_performed_uploads_since_last_flush_ = true;
}
}
@@ -377,19 +337,20 @@ void PixelBufferRasterWorkerPool::CheckForCompletedUploads() {
// Release shared memory and move tasks with completed uploads
// to |completed_raster_tasks_|.
while (!tasks_with_completed_uploads.empty()) {
- internal::RasterWorkerPoolTask* task =
- tasks_with_completed_uploads.front().get();
+ internal::WorkerPoolTask* task = tasks_with_completed_uploads.front().get();
+ RasterTaskState& state = raster_task_states_[task];
- // It's now safe to release the pixel buffer and the shared memory.
- resource_provider()->ReleasePixelRasterBuffer(task->resource()->id());
+ bytes_pending_upload_ -= state.resource->bytes();
- bytes_pending_upload_ -= task->resource()->bytes();
+ task->WillComplete();
+ task->CompleteOnOriginThread(this);
+ task->DidComplete();
DCHECK(std::find(completed_raster_tasks_.begin(),
completed_raster_tasks_.end(),
task) == completed_raster_tasks_.end());
completed_raster_tasks_.push_back(task);
- raster_task_states_[task] = COMPLETED;
+ state.type = RasterTaskState::COMPLETED;
raster_tasks_required_for_activation_.erase(task);
@@ -523,8 +484,10 @@ void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
if (state_it == raster_task_states_.end())
continue;
+ RasterTaskState& state = state_it->second;
+
// Skip task if completed.
- if (state_it->second == COMPLETED) {
+ if (state.type == RasterTaskState::COMPLETED) {
DCHECK(std::find(completed_raster_tasks_.begin(),
completed_raster_tasks_.end(),
task) != completed_raster_tasks_.end());
@@ -540,7 +503,7 @@ void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
}
// If raster has finished, just update |bytes_pending_upload|.
- if (state_it->second == UPLOADING) {
+ if (state.type == RasterTaskState::UPLOADING) {
DCHECK(task->HasCompleted());
bytes_pending_upload = new_bytes_pending_upload;
continue;
@@ -556,8 +519,9 @@ void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
// throttling limits.
bytes_pending_upload = new_bytes_pending_upload;
- DCHECK(state_it->second == UNSCHEDULED || state_it->second == SCHEDULED);
- state_it->second = SCHEDULED;
+ DCHECK(state.type == RasterTaskState::UNSCHEDULED ||
+ state.type == RasterTaskState::SCHEDULED);
+ state.type = RasterTaskState::SCHEDULED;
InsertNodeForRasterTask(&graph_, task, task->dependencies(), priority++);
@@ -662,15 +626,69 @@ void PixelBufferRasterWorkerPool::CheckForCompletedWorkerPoolTasks() {
internal::WorkerPoolTask* task =
static_cast<internal::WorkerPoolTask*>(it->get());
+ RasterTaskStateMap::iterator state_it = raster_task_states_.find(task);
+ if (state_it != raster_task_states_.end()) {
vmpstr 2014/02/19 00:49:31 Can you put the smaller block in if? if (state_i
reveman 2014/02/19 01:41:13 Done.
+ RasterTaskState& state = state_it->second;
+
+ 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());
+
+ if (!content_has_changed) {
vmpstr 2014/02/19 00:49:31 Can you put a comment here explaining what has hap
reveman 2014/02/19 01:41:13 Done.
+ task->WillComplete();
+ task->CompleteOnOriginThread(this);
+ task->DidComplete();
+
+ if (!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.
+ for (RasterTaskQueue::Item::Vector::const_iterator it =
+ raster_tasks_.items.begin();
+ it != raster_tasks_.items.end();
+ ++it) {
+ if (it->task == task) {
+ 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);
+ state.type = RasterTaskState::COMPLETED;
+ raster_tasks_required_for_activation_.erase(task);
+ continue;
+ }
+
+ DCHECK(task->HasFinishedRunning());
+
+ resource_provider()->BeginSetPixels(state.resource->id());
+ has_performed_uploads_since_last_flush_ = true;
+
+ bytes_pending_upload_ += state.resource->bytes();
+ raster_tasks_with_pending_upload_.push_back(task);
+ state.type = RasterTaskState::UPLOADING;
+ continue;
+ }
+
task->WillComplete();
task->CompleteOnOriginThread(this);
task->DidComplete();
+
+ completed_image_decode_tasks_.push_back(task);
}
completed_tasks_.clear();
}
bool PixelBufferRasterWorkerPool::IsRasterTaskRequiredForActivation(
- internal::RasterWorkerPoolTask* task) const {
+ internal::WorkerPoolTask* task) const {
return raster_tasks_required_for_activation_.find(task) !=
raster_tasks_required_for_activation_.end();
}

Powered by Google App Engine
This is Rietveld 408576698