Index: cc/resources/raster_worker_pool.cc |
diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc |
index 630640b6b7a89dad9f0959f9226364052be5a518..3a87c49ce4a63600dda46f4a6c1166d1778392a5 100644 |
--- a/cc/resources/raster_worker_pool.cc |
+++ b/cc/resources/raster_worker_pool.cc |
@@ -69,22 +69,21 @@ class DisableLCDTextFilter : public SkDrawFilter { |
class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
public: |
- RasterWorkerPoolTaskImpl(const Resource* resource, |
- PicturePileImpl* picture_pile, |
- const gfx::Rect& content_rect, |
- float contents_scale, |
- RasterMode raster_mode, |
- TileResolution tile_resolution, |
- int layer_id, |
- const void* tile_id, |
- int source_frame_number, |
- bool use_gpu_rasterization, |
- RenderingStatsInstrumentation* rendering_stats, |
- const RasterWorkerPool::RasterTask::Reply& reply, |
- internal::Task::Vector* dependencies) |
- : internal::RasterWorkerPoolTask(resource, |
- dependencies, |
- use_gpu_rasterization), |
+ RasterWorkerPoolTaskImpl( |
+ const Resource* resource, |
+ PicturePileImpl* picture_pile, |
+ const gfx::Rect& content_rect, |
+ float contents_scale, |
+ RasterMode raster_mode, |
+ TileResolution tile_resolution, |
+ int layer_id, |
+ const void* tile_id, |
+ int source_frame_number, |
+ RenderingStatsInstrumentation* rendering_stats, |
+ const base::Callback<void(const PicturePileImpl::Analysis&, bool)>& reply, |
+ internal::WorkerPoolTask::Vector* dependencies, |
+ ContextProvider* context_provider) |
+ : internal::RasterWorkerPoolTask(resource, dependencies), |
picture_pile_(picture_pile), |
content_rect_(content_rect), |
contents_scale_(contents_scale), |
@@ -95,6 +94,7 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
source_frame_number_(source_frame_number), |
rendering_stats_(rendering_stats), |
reply_(reply), |
+ context_provider_(context_provider), |
canvas_(NULL) {} |
void RunAnalysisOnThread(unsigned thread_index) { |
@@ -140,8 +140,6 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
// Overridden from internal::Task: |
virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { |
- // TODO(alokp): For now run-on-worker-thread implies software rasterization. |
- DCHECK(!use_gpu_rasterization()); |
RunAnalysisOnThread(thread_index); |
if (canvas_ && !analysis_.is_solid_color) |
RunRasterOnThread(thread_index); |
@@ -153,6 +151,20 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
DCHECK(!canvas_); |
canvas_ = client->AcquireCanvasForRaster(this); |
} |
+ virtual void RunOnOriginThread() OVERRIDE { |
+ // TODO(alokp): Use a trace macro to push/pop markers. |
+ // Using push/pop functions directly incurs cost to evaluate function |
+ // arguments even when tracing is disabled. |
+ DCHECK(context_provider_); |
+ context_provider_->ContextGL()->PushGroupMarkerEXT( |
+ 0, |
+ base::StringPrintf( |
+ "Raster-%d-%d-%p", source_frame_number_, layer_id_, tile_id_) |
+ .c_str()); |
+ if (canvas_) |
+ Raster(picture_pile_); |
+ context_provider_->ContextGL()->PopGroupMarkerEXT(); |
+ } |
virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) |
OVERRIDE { |
canvas_ = NULL; |
@@ -163,23 +175,6 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
reply_.Run(analysis_, !HasFinishedRunning()); |
} |
- // Overridden from internal::RasterWorkerPoolTask: |
- virtual void RunOnOriginThread(ResourceProvider* resource_provider, |
- ContextProvider* context_provider) OVERRIDE { |
- // TODO(alokp): Use a trace macro to push/pop markers. |
- // Using push/pop functions directly incurs cost to evaluate function |
- // arguments even when tracing is disabled. |
- context_provider->ContextGL()->PushGroupMarkerEXT( |
- 0, |
- base::StringPrintf( |
- "Raster-%d-%d-%p", source_frame_number_, layer_id_, tile_id_) |
- .c_str()); |
- // TODO(alokp): For now run-on-origin-thread implies gpu rasterization. |
- DCHECK(use_gpu_rasterization()); |
- Raster(picture_pile_); |
- context_provider->ContextGL()->PopGroupMarkerEXT(); |
- } |
- |
protected: |
virtual ~RasterWorkerPoolTaskImpl() { DCHECK(!canvas_); } |
@@ -219,6 +214,7 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
// before we draw and sometimes they aren't) |
RenderingStatsInstrumentation* stats = |
tile_resolution_ == HIGH_RESOLUTION ? rendering_stats_ : NULL; |
+ DCHECK(picture_pile); |
picture_pile->RasterToBitmap( |
canvas_, content_rect_, contents_scale_, stats); |
@@ -244,7 +240,8 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
const void* tile_id_; |
int source_frame_number_; |
RenderingStatsInstrumentation* rendering_stats_; |
- const RasterWorkerPool::RasterTask::Reply reply_; |
+ const base::Callback<void(const PicturePileImpl::Analysis&, bool)> reply_; |
+ ContextProvider* context_provider_; |
SkCanvas* canvas_; |
DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); |
@@ -252,10 +249,11 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
public: |
- ImageDecodeWorkerPoolTaskImpl(SkPixelRef* pixel_ref, |
- int layer_id, |
- RenderingStatsInstrumentation* rendering_stats, |
- const RasterWorkerPool::Task::Reply& reply) |
+ ImageDecodeWorkerPoolTaskImpl( |
+ SkPixelRef* pixel_ref, |
+ int layer_id, |
+ RenderingStatsInstrumentation* rendering_stats, |
+ const base::Callback<void(bool was_canceled)>& reply) |
: pixel_ref_(skia::SharePtr(pixel_ref)), |
layer_id_(layer_id), |
rendering_stats_(rendering_stats), |
@@ -274,6 +272,7 @@ class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
// Overridden from internal::WorkerPoolTask: |
virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) |
OVERRIDE {} |
+ virtual void RunOnOriginThread() OVERRIDE {} |
virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) |
OVERRIDE { |
client->OnImageDecodeCompleted(this); |
@@ -289,7 +288,7 @@ class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
skia::RefPtr<SkPixelRef> pixel_ref_; |
int layer_id_; |
RenderingStatsInstrumentation* rendering_stats_; |
- const RasterWorkerPool::Task::Reply reply_; |
+ const base::Callback<void(bool was_canceled)>& reply_; |
DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl); |
}; |
@@ -308,12 +307,21 @@ class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread"); |
origin_loop_->PostTask( |
FROM_HERE, |
- base::Bind(&RasterFinishedWorkerPoolTaskImpl::RunOnOriginThread, this)); |
+ base::Bind( |
+ &RasterFinishedWorkerPoolTaskImpl::OnRasterFinishedOnOriginThread, |
+ this)); |
} |
// Overridden from internal::WorkerPoolTask: |
virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) |
OVERRIDE {} |
+ virtual void RunOnOriginThread() OVERRIDE { |
+ origin_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &RasterFinishedWorkerPoolTaskImpl::OnRasterFinishedOnOriginThread, |
+ this)); |
+ } |
virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) |
OVERRIDE {} |
virtual void RunReplyOnOriginThread() OVERRIDE {} |
@@ -322,7 +330,9 @@ class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
virtual ~RasterFinishedWorkerPoolTaskImpl() {} |
private: |
- void RunOnOriginThread() const { on_raster_finished_callback_.Run(this); } |
+ void OnRasterFinishedOnOriginThread() const { |
+ on_raster_finished_callback_.Run(this); |
+ } |
scoped_refptr<base::MessageLoopProxy> origin_loop_; |
const Callback on_raster_finished_callback_; |
@@ -411,10 +421,10 @@ void WorkerPoolTask::DidComplete() { |
bool WorkerPoolTask::HasCompleted() const { return did_complete_; } |
-RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource, |
- internal::Task::Vector* dependencies, |
- bool use_gpu_rasterization) |
- : resource_(resource), use_gpu_rasterization_(use_gpu_rasterization) { |
+RasterWorkerPoolTask::RasterWorkerPoolTask( |
+ const Resource* resource, |
+ internal::WorkerPoolTask::Vector* dependencies) |
+ : resource_(resource) { |
dependencies_.swap(*dependencies); |
} |
@@ -422,64 +432,27 @@ RasterWorkerPoolTask::~RasterWorkerPoolTask() {} |
} // namespace internal |
-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(internal::WorkerPoolTask* internal) |
- : internal_(internal) {} |
- |
-RasterWorkerPool::Task::~Task() {} |
- |
-void RasterWorkerPool::Task::Reset() { internal_ = NULL; } |
- |
-RasterWorkerPool::RasterTask::Queue::QueuedTask::QueuedTask( |
- internal::RasterWorkerPoolTask* task, |
- bool required_for_activation) |
+RasterTaskQueue::Task::Task(internal::RasterWorkerPoolTask* task, |
+ bool required_for_activation) |
: task(task), required_for_activation(required_for_activation) {} |
-RasterWorkerPool::RasterTask::Queue::QueuedTask::~QueuedTask() {} |
+RasterTaskQueue::Task::~Task() {} |
-RasterWorkerPool::RasterTask::Queue::Queue() |
- : required_for_activation_count_(0u) {} |
+RasterTaskQueue::RasterTaskQueue() : required_for_activation_count(0u) {} |
-RasterWorkerPool::RasterTask::Queue::~Queue() {} |
+RasterTaskQueue::~RasterTaskQueue() {} |
-void RasterWorkerPool::RasterTask::Queue::Reset() { |
- tasks_.clear(); |
- required_for_activation_count_ = 0u; |
+void RasterTaskQueue::Swap(RasterTaskQueue* other) { |
+ tasks.swap(other->tasks); |
+ std::swap(required_for_activation_count, |
+ other->required_for_activation_count); |
} |
-void RasterWorkerPool::RasterTask::Queue::Append(const RasterTask& task, |
- bool required_for_activation) { |
- DCHECK(!task.is_null()); |
- tasks_.push_back(QueuedTask(task.internal_, required_for_activation)); |
- required_for_activation_count_ += required_for_activation; |
+void RasterTaskQueue::Reset() { |
+ required_for_activation_count = 0u; |
+ tasks.clear(); |
} |
-void RasterWorkerPool::RasterTask::Queue::Swap(Queue* other) { |
- tasks_.swap(other->tasks_); |
- std::swap(required_for_activation_count_, |
- other->required_for_activation_count_); |
-} |
- |
-RasterWorkerPool::RasterTask::RasterTask() {} |
- |
-RasterWorkerPool::RasterTask::RasterTask( |
- internal::RasterWorkerPoolTask* internal) |
- : internal_(internal) {} |
- |
-void RasterWorkerPool::RasterTask::Reset() { internal_ = NULL; } |
- |
-RasterWorkerPool::RasterTask::~RasterTask() {} |
- |
// This allows an external rasterize on-demand system to run raster tasks |
// with highest priority using the same task graph runner instance. |
unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u; |
@@ -491,14 +464,14 @@ unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority = |
unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u; |
RasterWorkerPool::RasterWorkerPool(internal::TaskGraphRunner* task_graph_runner, |
- ResourceProvider* resource_provider, |
- ContextProvider* context_provider) |
+ ResourceProvider* resource_provider) |
: task_graph_runner_(task_graph_runner), |
- namespace_token_(task_graph_runner_->GetNamespaceToken()), |
client_(NULL), |
resource_provider_(resource_provider), |
- context_provider_(context_provider), |
- weak_ptr_factory_(this) {} |
+ weak_ptr_factory_(this) { |
+ if (task_graph_runner_) |
+ namespace_token_ = task_graph_runner_->GetNamespaceToken(); |
+} |
RasterWorkerPool::~RasterWorkerPool() {} |
@@ -524,7 +497,8 @@ internal::TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() { |
} |
// static |
-RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
+scoped_refptr<internal::RasterWorkerPoolTask> |
+RasterWorkerPool::CreateRasterTask( |
const Resource* resource, |
PicturePileImpl* picture_pile, |
const gfx::Rect& content_rect, |
@@ -534,32 +508,32 @@ RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
int layer_id, |
const void* tile_id, |
int source_frame_number, |
- bool use_gpu_rasterization, |
RenderingStatsInstrumentation* rendering_stats, |
- const RasterTask::Reply& reply, |
- Task::Set* dependencies) { |
- return RasterTask(new RasterWorkerPoolTaskImpl(resource, |
- picture_pile, |
- content_rect, |
- contents_scale, |
- raster_mode, |
- tile_resolution, |
- layer_id, |
- tile_id, |
- source_frame_number, |
- use_gpu_rasterization, |
- rendering_stats, |
- reply, |
- &dependencies->tasks_)); |
+ const base::Callback<void(const PicturePileImpl::Analysis&, bool)>& reply, |
+ internal::WorkerPoolTask::Vector* dependencies, |
+ ContextProvider* context_provider) { |
+ return make_scoped_refptr(new RasterWorkerPoolTaskImpl(resource, |
+ picture_pile, |
+ content_rect, |
+ contents_scale, |
+ raster_mode, |
+ tile_resolution, |
+ layer_id, |
+ tile_id, |
+ source_frame_number, |
+ rendering_stats, |
+ reply, |
+ dependencies, |
+ context_provider)); |
} |
// static |
-RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( |
+scoped_refptr<internal::WorkerPoolTask> RasterWorkerPool::CreateImageDecodeTask( |
SkPixelRef* pixel_ref, |
int layer_id, |
RenderingStatsInstrumentation* rendering_stats, |
- const Task::Reply& reply) { |
- return Task(new ImageDecodeWorkerPoolTaskImpl( |
+ const base::Callback<void(bool was_canceled)>& reply) { |
+ return make_scoped_refptr(new ImageDecodeWorkerPoolTaskImpl( |
pixel_ref, layer_id, rendering_stats, reply)); |
} |
@@ -570,15 +544,19 @@ void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { |
void RasterWorkerPool::Shutdown() { |
TRACE_EVENT0("cc", "RasterWorkerPool::Shutdown"); |
- internal::TaskGraph empty; |
- SetTaskGraph(&empty); |
- task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
+ if (task_graph_runner_) { |
+ internal::TaskGraph empty; |
+ task_graph_runner_->SetTaskGraph(namespace_token_, &empty); |
+ task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
+ } |
+ |
weak_ptr_factory_.InvalidateWeakPtrs(); |
} |
void RasterWorkerPool::SetTaskGraph(internal::TaskGraph* graph) { |
TRACE_EVENT0("cc", "RasterWorkerPool::SetTaskGraph"); |
+ DCHECK(task_graph_runner_); |
for (internal::TaskGraph::Node::Vector::iterator it = graph->nodes.begin(); |
it != graph->nodes.end(); |
++it) { |
@@ -598,55 +576,10 @@ void RasterWorkerPool::SetTaskGraph(internal::TaskGraph* graph) { |
void RasterWorkerPool::CollectCompletedWorkerPoolTasks( |
internal::Task::Vector* completed_tasks) { |
+ DCHECK(task_graph_runner_); |
task_graph_runner_->CollectCompletedTasks(namespace_token_, completed_tasks); |
} |
-void RasterWorkerPool::RunGpuRasterTasks(const RasterTaskVector& tasks) { |
- DCHECK(!tasks.empty()); |
- TRACE_EVENT1( |
- "cc", "RasterWorkerPool::RunGpuRasterTasks", "num_tasks", tasks.size()); |
- |
- GrContext* gr_context = context_provider_->GrContext(); |
- // TODO(alokp): Implement TestContextProvider::GrContext(). |
- if (gr_context) |
- gr_context->resetContext(); |
- |
- for (RasterTaskVector::const_iterator it = tasks.begin(); it != tasks.end(); |
- ++it) { |
- internal::RasterWorkerPoolTask* task = it->get(); |
- DCHECK(task->use_gpu_rasterization()); |
- |
- task->WillSchedule(); |
- task->ScheduleOnOriginThread(this); |
- task->DidSchedule(); |
- |
- task->WillRun(); |
- task->RunOnOriginThread(resource_provider_, context_provider_); |
- task->DidRun(); |
- |
- task->WillComplete(); |
- task->CompleteOnOriginThread(this); |
- task->DidComplete(); |
- |
- completed_gpu_raster_tasks_.push_back(task); |
- } |
- |
- // TODO(alokp): Implement TestContextProvider::GrContext(). |
- if (gr_context) |
- gr_context->flush(); |
-} |
- |
-void RasterWorkerPool::CheckForCompletedGpuRasterTasks() { |
- // Complete gpu rasterization tasks. |
- while (!completed_gpu_raster_tasks_.empty()) { |
- internal::WorkerPoolTask* task = completed_gpu_raster_tasks_.front().get(); |
- |
- task->RunReplyOnOriginThread(); |
- |
- completed_gpu_raster_tasks_.pop_front(); |
- } |
-} |
- |
scoped_refptr<internal::WorkerPoolTask> |
RasterWorkerPool::CreateRasterFinishedTask() { |
return make_scoped_refptr(new RasterFinishedWorkerPoolTaskImpl(base::Bind( |
@@ -663,6 +596,20 @@ RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask( |
tasks_required_for_activation_count)); |
} |
+void RasterWorkerPool::RunTaskOnOriginThread(internal::WorkerPoolTask* task) { |
+ task->WillSchedule(); |
+ task->ScheduleOnOriginThread(this); |
+ task->DidSchedule(); |
+ |
+ task->WillRun(); |
+ task->RunOnOriginThread(); |
+ task->DidRun(); |
+ |
+ task->WillComplete(); |
+ task->CompleteOnOriginThread(this); |
+ task->DidComplete(); |
+} |
+ |
void RasterWorkerPool::OnRasterFinished( |
const internal::WorkerPoolTask* source) { |
TRACE_EVENT0("cc", "RasterWorkerPool::OnRasterFinished"); |
@@ -703,16 +650,16 @@ void RasterWorkerPool::InsertNodeForTask(internal::TaskGraph* graph, |
void RasterWorkerPool::InsertNodeForRasterTask( |
internal::TaskGraph* graph, |
internal::WorkerPoolTask* raster_task, |
- const internal::Task::Vector& decode_tasks, |
+ const internal::WorkerPoolTask::Vector& decode_tasks, |
unsigned priority) { |
size_t dependencies = 0u; |
// Insert image decode tasks. |
- for (internal::Task::Vector::const_iterator it = decode_tasks.begin(); |
+ for (internal::WorkerPoolTask::Vector::const_iterator it = |
+ decode_tasks.begin(); |
it != decode_tasks.end(); |
++it) { |
- internal::WorkerPoolTask* decode_task = |
- static_cast<internal::WorkerPoolTask*>(it->get()); |
+ internal::WorkerPoolTask* decode_task = it->get(); |
// Skip if already decoded. |
if (decode_task->HasCompleted()) |