Index: cc/resources/direct_raster_worker_pool.cc |
diff --git a/cc/resources/direct_raster_worker_pool.cc b/cc/resources/direct_raster_worker_pool.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9bad9a5e43bd724db44a0ae8bea615fd9540c2ae |
--- /dev/null |
+++ b/cc/resources/direct_raster_worker_pool.cc |
@@ -0,0 +1,174 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "cc/resources/direct_raster_worker_pool.h" |
+ |
+#include "cc/output/context_provider.h" |
+#include "cc/resources/resource.h" |
+#include "cc/resources/resource_provider.h" |
+#include "gpu/command_buffer/client/gles2_interface.h" |
+#include "third_party/skia/include/gpu/GrContext.h" |
+ |
+namespace cc { |
+ |
+// static |
+scoped_ptr<RasterWorkerPool> DirectRasterWorkerPool::Create( |
+ ResourceProvider* resource_provider, |
+ ContextProvider* context_provider) { |
+ return make_scoped_ptr<RasterWorkerPool>( |
+ new DirectRasterWorkerPool(resource_provider, context_provider)); |
+} |
+ |
+DirectRasterWorkerPool::DirectRasterWorkerPool( |
+ ResourceProvider* resource_provider, |
+ ContextProvider* context_provider) |
+ : RasterWorkerPool(NULL, resource_provider), |
+ context_provider_(context_provider), |
+ run_tasks_on_origin_thread_pending_(false), |
+ raster_tasks_pending_(false), |
+ raster_tasks_required_for_activation_pending_(false), |
+ weak_factory_(this) {} |
+ |
+DirectRasterWorkerPool::~DirectRasterWorkerPool() { |
+ DCHECK_EQ(0u, completed_tasks_.size()); |
+} |
+ |
+void DirectRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
+ TRACE_EVENT0("cc", "DirectRasterWorkerPool::ScheduleTasks"); |
+ |
+ raster_tasks_pending_ = true; |
+ raster_tasks_required_for_activation_pending_ = true; |
+ |
+ scoped_refptr<internal::WorkerPoolTask> |
+ new_raster_required_for_activation_finished_task( |
+ CreateRasterRequiredForActivationFinishedTask( |
+ queue->required_for_activation_count())); |
+ scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( |
+ CreateRasterFinishedTask()); |
+ |
+ // Need to cancel tasks not present in new queue if we haven't had a |
+ // chance to run the previous set of tasks yet. |
+ // TODO(reveman): Remove this once only tasks for which |
+ // ::ScheduleOnOriginThread has been called need to be canceled. |
+ if (run_tasks_on_origin_thread_pending_) { |
+ for (RasterTaskQueueIterator it(&raster_tasks_); it; ++it) { |
+ internal::RasterWorkerPoolTask* task = *it; |
+ |
+ if (std::find_if(queue->tasks_.begin(), |
+ queue->tasks_.end(), |
+ RasterTask::Queue::QueuedTask::TaskComparator(task)) == |
+ queue->tasks_.end()) |
+ completed_tasks_.push_back(task); |
+ } |
+ } |
+ |
+ ScheduleRunTasksOnOriginThread(); |
+ |
+ raster_tasks_.Swap(queue); |
+ |
+ set_raster_finished_task(new_raster_finished_task); |
+ set_raster_required_for_activation_finished_task( |
+ new_raster_required_for_activation_finished_task); |
+} |
+ |
+unsigned DirectRasterWorkerPool::GetResourceTarget() const { |
+ return GL_TEXTURE_2D; |
+} |
+ |
+ResourceFormat DirectRasterWorkerPool::GetResourceFormat() const { |
+ return resource_provider()->best_texture_format(); |
+} |
+ |
+void DirectRasterWorkerPool::CheckForCompletedTasks() { |
+ TRACE_EVENT0("cc", "DirectRasterWorkerPool::CheckForCompletedTasks"); |
+ |
+ for (internal::WorkerPoolTask::Vector::const_iterator it = |
+ completed_tasks_.begin(); |
+ it != completed_tasks_.end(); |
+ ++it) { |
+ internal::WorkerPoolTask* task = it->get(); |
+ |
+ task->RunReplyOnOriginThread(); |
+ } |
+ completed_tasks_.clear(); |
+} |
+ |
+SkCanvas* DirectRasterWorkerPool::AcquireCanvasForRaster( |
+ internal::RasterWorkerPoolTask* task) { |
+ return resource_provider()->MapDirectRasterBuffer(task->resource()->id()); |
+} |
+ |
+void DirectRasterWorkerPool::OnRasterCompleted( |
+ internal::RasterWorkerPoolTask* task, |
+ const PicturePileImpl::Analysis& analysis) { |
+ resource_provider()->UnmapDirectRasterBuffer(task->resource()->id()); |
+} |
+ |
+void DirectRasterWorkerPool::OnRasterTasksFinished() { |
+ DCHECK(raster_tasks_pending_); |
+ raster_tasks_pending_ = false; |
+ client()->DidFinishRunningTasks(); |
+} |
+ |
+void DirectRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() { |
+ DCHECK(raster_tasks_required_for_activation_pending_); |
+ raster_tasks_required_for_activation_pending_ = false; |
+ client()->DidFinishRunningTasksRequiredForActivation(); |
+} |
+ |
+void DirectRasterWorkerPool::ScheduleRunTasksOnOriginThread() { |
+ if (run_tasks_on_origin_thread_pending_) |
+ return; |
+ |
+ base::MessageLoopProxy::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DirectRasterWorkerPool::RunTasksOnOriginThread, |
+ weak_factory_.GetWeakPtr())); |
+ run_tasks_on_origin_thread_pending_ = true; |
+} |
+ |
+void DirectRasterWorkerPool::RunTasksOnOriginThread() { |
+ DCHECK(run_tasks_on_origin_thread_pending_); |
+ run_tasks_on_origin_thread_pending_ = false; |
+ |
+ if (!raster_tasks_.tasks_.empty()) { |
+ GrContext* gr_context = context_provider_->GrContext(); |
+ // TODO(alokp): Implement TestContextProvider::GrContext(). |
+ if (gr_context) |
+ gr_context->resetContext(); |
+ |
+ for (RasterTaskQueueIterator it(&raster_tasks_); it; ++it) { |
+ internal::RasterWorkerPoolTask* task = *it; |
+ DCHECK(!task->HasCompleted()); |
+ |
+ // First need to run all dependencies. |
+ for (internal::WorkerPoolTask::Vector::const_iterator it = |
+ task->dependencies().begin(); |
+ it != task->dependencies().end(); |
+ ++it) { |
+ internal::WorkerPoolTask* dependency = it->get(); |
+ |
+ if (dependency->HasCompleted()) |
+ continue; |
+ |
+ RunTaskOnOriginThread(dependency); |
+ |
+ completed_tasks_.push_back(dependency); |
+ } |
+ |
+ RunTaskOnOriginThread(task); |
+ |
+ completed_tasks_.push_back(task); |
+ } |
+ |
+ // TODO(alokp): Implement TestContextProvider::GrContext(). |
+ if (gr_context) |
+ gr_context->flush(); |
+ } |
+ |
+ RunTaskOnOriginThread(raster_required_for_activation_finished_task()); |
+ RunTaskOnOriginThread(raster_finished_task()); |
+} |
+ |
+} // namespace cc |