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

Unified Diff: cc/resources/raster_worker_pool.cc

Issue 141163019: Re-land: cc: Remove WorkerPool class and instead use TaskGraphRunner directly. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: build fix Created 6 years, 11 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/raster_worker_pool.cc
diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc
index 786f145d656c42b680a7c2ded7771030d930860f..6246bc53a453a273f542373f27a34c67e3940fa2 100644
--- a/cc/resources/raster_worker_pool.cc
+++ b/cc/resources/raster_worker_pool.cc
@@ -6,11 +6,14 @@
#include "base/debug/trace_event_synthetic_delay.h"
#include "base/json/json_writer.h"
+#include "base/lazy_instance.h"
#include "base/metrics/histogram.h"
#include "base/values.h"
#include "cc/debug/devtools_instrumentation.h"
#include "cc/debug/traced_value.h"
#include "cc/resources/picture_pile_impl.h"
+#include "cc/resources/resource.h"
+#include "cc/resources/resource_provider.h"
#include "skia/ext/paint_simplifier.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkPixelRef.h"
@@ -75,7 +78,7 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
bool use_gpu_rasterization,
RenderingStatsInstrumentation* rendering_stats,
const RasterWorkerPool::RasterTask::Reply& reply,
- TaskVector* dependencies)
+ internal::Task::Vector* dependencies)
: internal::RasterWorkerPoolTask(resource,
dependencies,
use_gpu_rasterization),
@@ -88,7 +91,8 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
tile_id_(tile_id),
source_frame_number_(source_frame_number),
rendering_stats_(rendering_stats),
- reply_(reply) {}
+ reply_(reply) {
sohanjg 2014/01/21 09:41:08 nit: do we need this line here ?
reveman 2014/01/21 15:37:48 I'm trying to make the code consistent in that onl
danakj 2014/01/21 15:47:05 FWIW the easiest way to be consistent is to just r
reveman 2014/01/21 16:10:44 Good point. I'm not going to "cl format" this patc
+ }
void RunAnalysisOnThread(unsigned thread_index) {
TRACE_EVENT1("cc",
@@ -311,9 +315,10 @@ class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask {
: pixel_ref_(skia::SharePtr(pixel_ref)),
layer_id_(layer_id),
rendering_stats_(rendering_stats),
- reply_(reply) {}
+ reply_(reply) {
sohanjg 2014/01/21 09:41:08 nit: do we need this line here ?
reveman 2014/01/21 19:51:32 sohanjg, you're right. clang-format prefer it the
+ }
- // Overridden from internal::WorkerPoolTask:
+ // Overridden from internal::Task:
virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnWorkerThread");
devtools_instrumentation::ScopedImageDecodeTask image_decode_task(
@@ -322,6 +327,8 @@ class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask {
pixel_ref_->lockPixels();
pixel_ref_->unlockPixels();
}
+
+ // Overridden from internal::WorkerPoolTask:
virtual void CompleteOnOriginThread() OVERRIDE {
reply_.Run(!HasFinishedRunning());
}
@@ -340,8 +347,7 @@ class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask {
class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask {
public:
- typedef base::Callback<void(const internal::WorkerPoolTask* source)>
- Callback;
+ typedef base::Callback<void(const internal::WorkerPoolTask* source)> Callback;
RasterFinishedWorkerPoolTaskImpl(
const Callback& on_raster_finished_callback)
@@ -410,14 +416,49 @@ class RasterRequiredForActivationFinishedWorkerPoolTaskImpl
RasterRequiredForActivationFinishedWorkerPoolTaskImpl);
};
+class RasterTaskGraphRunner : public internal::TaskGraphRunner {
+ public:
+ RasterTaskGraphRunner()
+ : internal::TaskGraphRunner(RasterWorkerPool::GetNumRasterThreads(),
+ "CompositorRaster") {
+ }
+};
+base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner =
+ LAZY_INSTANCE_INITIALIZER;
+
+const int kDefaultNumRasterThreads = 1;
+
+int g_num_raster_threads = 0;
alokp 2014/01/21 18:42:50 make these static members of RasterTaskGraphRunner
reveman 2014/01/21 19:51:32 I prefer anonymous namespace and hiding these from
} // namespace
namespace internal {
-RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource,
- TaskVector* dependencies,
- bool use_gpu_rasterization)
+WorkerPoolTask::WorkerPoolTask() : did_complete_(false) {}
+
+WorkerPoolTask::~WorkerPoolTask() {
+ DCHECK_EQ(did_schedule_, did_complete_);
+ DCHECK(!did_run_ || did_complete_);
+}
+
+void WorkerPoolTask::WillComplete() {
+ DCHECK(!did_complete_);
+}
+
+void WorkerPoolTask::DidComplete() {
+ DCHECK(did_schedule_);
+ DCHECK(!did_complete_);
+ did_complete_ = true;
+}
+
+bool WorkerPoolTask::HasCompleted() const {
+ return did_complete_;
+}
+
+RasterWorkerPoolTask::RasterWorkerPoolTask(
+ const Resource* resource,
+ internal::Task::Vector* dependencies,
+ bool use_gpu_rasterization)
: did_run_(false),
did_complete_(false),
was_canceled_(false),
@@ -426,8 +467,7 @@ RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource,
dependencies_.swap(*dependencies);
}
-RasterWorkerPoolTask::~RasterWorkerPoolTask() {
-}
+RasterWorkerPoolTask::~RasterWorkerPoolTask() {}
void RasterWorkerPoolTask::DidRun(bool was_canceled) {
DCHECK(!did_run_);
@@ -458,36 +498,30 @@ bool RasterWorkerPoolTask::HasCompleted() const {
} // namespace internal
-RasterWorkerPool::Task::Set::Set() {
-}
+RasterWorkerPool::Task::Set::Set() {}
-RasterWorkerPool::Task::Set::~Set() {
-}
+RasterWorkerPool::Task::Set::~Set() {}
void RasterWorkerPool::Task::Set::Insert(const Task& task) {
DCHECK(!task.is_null());
tasks_.push_back(task.internal_);
}
-RasterWorkerPool::Task::Task() {
-}
+RasterWorkerPool::Task::Task() {}
RasterWorkerPool::Task::Task(internal::WorkerPoolTask* internal)
: internal_(internal) {
}
-RasterWorkerPool::Task::~Task() {
-}
+RasterWorkerPool::Task::~Task() {}
void RasterWorkerPool::Task::Reset() {
internal_ = NULL;
}
-RasterWorkerPool::RasterTask::Queue::Queue() {
-}
+RasterWorkerPool::RasterTask::Queue::Queue() {}
-RasterWorkerPool::RasterTask::Queue::~Queue() {
-}
+RasterWorkerPool::RasterTask::Queue::~Queue() {}
void RasterWorkerPool::RasterTask::Queue::Append(
const RasterTask& task, bool required_for_activation) {
@@ -497,8 +531,7 @@ void RasterWorkerPool::RasterTask::Queue::Append(
tasks_required_for_activation_.insert(task.internal_.get());
}
-RasterWorkerPool::RasterTask::RasterTask() {
-}
+RasterWorkerPool::RasterTask::RasterTask() {}
RasterWorkerPool::RasterTask::RasterTask(
internal::RasterWorkerPoolTask* internal)
@@ -509,7 +542,33 @@ void RasterWorkerPool::RasterTask::Reset() {
internal_ = NULL;
}
-RasterWorkerPool::RasterTask::~RasterTask() {
+RasterWorkerPool::RasterTask::~RasterTask() {}
+
+RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider,
+ ContextProvider* context_provider)
+ : namespace_token_(g_task_graph_runner.Pointer()->GetNamespaceToken()),
+ client_(NULL),
+ resource_provider_(resource_provider),
+ context_provider_(context_provider),
+ weak_ptr_factory_(this) {
+}
+
+RasterWorkerPool::~RasterWorkerPool() {}
+
+// static
+void RasterWorkerPool::SetNumRasterThreads(int num_threads) {
+ DCHECK_LT(0, num_threads);
+ DCHECK_EQ(0, g_num_raster_threads);
alokp 2014/01/21 18:42:50 Are you trying to make sure that SetNumRasterThrea
reveman 2014/01/21 19:51:32 I also want to make sure it's not called after Get
+
+ g_num_raster_threads = num_threads;
+}
+
+// static
+int RasterWorkerPool::GetNumRasterThreads() {
+ if (!g_num_raster_threads)
+ g_num_raster_threads = kDefaultNumRasterThreads;
+
+ return g_num_raster_threads;
}
// static
@@ -555,39 +614,30 @@ RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask(
reply));
}
-RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider,
- ContextProvider* context_provider)
- : client_(NULL),
- resource_provider_(resource_provider),
- context_provider_(context_provider),
- weak_ptr_factory_(this) {
-}
-
-RasterWorkerPool::~RasterWorkerPool() {
-}
-
void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) {
client_ = client;
}
void RasterWorkerPool::Shutdown() {
+ TRACE_EVENT0("cc", "RasterWorkerPool::Shutdown");
+
raster_tasks_.clear();
TaskGraph empty;
SetTaskGraph(&empty);
- WorkerPool::Shutdown();
+ g_task_graph_runner.Pointer()->WaitForTasksToFinishRunning(namespace_token_);
weak_ptr_factory_.InvalidateWeakPtrs();
}
void RasterWorkerPool::CheckForCompletedTasks() {
TRACE_EVENT0("cc", "RasterWorkerPool::CheckForCompletedTasks");
- // Check for completed worker-thread tasks.
- CheckForCompletedWorkerTasks();
+ CheckForCompletedWorkerPoolTasks();
// Complete gpu rasterization tasks.
while (!completed_gpu_raster_tasks_.empty()) {
internal::RasterWorkerPoolTask* task =
completed_gpu_raster_tasks_.front().get();
+
task->WillComplete();
task->CompleteOnOriginThread();
task->DidComplete();
@@ -596,6 +646,30 @@ void RasterWorkerPool::CheckForCompletedTasks() {
}
}
+void RasterWorkerPool::CheckForCompletedWorkerPoolTasks() {
+ internal::Task::Vector completed_tasks;
sohanjg 2014/01/21 09:41:08 nit: can we typedef internal::Task::Vector ?
reveman 2014/01/21 15:37:48 To what? I think it's good to not remove the inter
+ g_task_graph_runner.Pointer()->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());
+
+ task->WillComplete();
+ task->CompleteOnOriginThread();
+ task->DidComplete();
+ }
+}
+
+void RasterWorkerPool::SetTaskGraph(TaskGraph* graph) {
+ TRACE_EVENT1("cc", "RasterWorkerPool::SetTaskGraph",
+ "num_tasks", graph->size());
+
+ g_task_graph_runner.Pointer()->SetTaskGraph(namespace_token_, graph);
+}
+
void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) {
raster_tasks_.swap(queue->tasks_);
raster_tasks_required_for_activation_.swap(
@@ -643,7 +717,7 @@ scoped_refptr<internal::WorkerPoolTask>
scoped_refptr<internal::WorkerPoolTask>
RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask(
- size_t tasks_required_for_activation_count) {
+ size_t tasks_required_for_activation_count) {
return make_scoped_refptr(
new RasterRequiredForActivationFinishedWorkerPoolTaskImpl(
base::Bind(&RasterWorkerPool::OnRasterRequiredForActivationFinished,
@@ -696,7 +770,7 @@ internal::GraphNode* RasterWorkerPool::CreateGraphNodeForTask(
// static
internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask(
internal::WorkerPoolTask* raster_task,
- const TaskVector& decode_tasks,
+ const internal::Task::Vector& decode_tasks,
unsigned priority,
TaskGraph* graph) {
DCHECK(!raster_task->HasCompleted());
@@ -705,9 +779,10 @@ internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask(
raster_task, priority, graph);
// Insert image decode tasks.
- for (TaskVector::const_iterator it = decode_tasks.begin();
+ for (internal::Task::Vector::const_iterator it = decode_tasks.begin();
it != decode_tasks.end(); ++it) {
- internal::WorkerPoolTask* decode_task = it->get();
+ internal::WorkerPoolTask* decode_task =
+ static_cast<internal::WorkerPoolTask*>(it->get());
// Skip if already decoded.
if (decode_task->HasCompleted())
@@ -716,7 +791,7 @@ internal::GraphNode* RasterWorkerPool::CreateGraphNodeForRasterTask(
raster_node->add_dependency();
// Check if decode task already exists in graph.
- GraphNodeMap::iterator decode_it = graph->find(decode_task);
+ internal::GraphNode::Map::iterator decode_it = graph->find(decode_task);
sohanjg 2014/01/21 09:41:08 nit: And typedef internal::GraphNode::Map too ?
sohanjg 2014/01/21 09:41:08 nit: And typedef internal::GraphNode::Map too ?
reveman 2014/01/21 15:37:48 what are you suggesting we typedef to? I like to k
if (decode_it != graph->end()) {
internal::GraphNode* decode_node = decode_it->second;
decode_node->add_dependent(raster_node);

Powered by Google App Engine
This is Rietveld 408576698