| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/resources/direct_raster_worker_pool.h" | 5 #include "cc/resources/direct_raster_worker_pool.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "cc/output/context_provider.h" | 8 #include "cc/output/context_provider.h" |
| 9 #include "cc/resources/resource.h" | 9 #include "cc/resources/resource.h" |
| 10 #include "cc/resources/resource_provider.h" | 10 #include "cc/resources/resource_provider.h" |
| 11 #include "gpu/command_buffer/client/gles2_interface.h" | 11 #include "gpu/command_buffer/client/gles2_interface.h" |
| 12 #include "third_party/skia/include/gpu/GrContext.h" | 12 #include "third_party/skia/include/gpu/GrContext.h" |
| 13 | 13 |
| 14 namespace cc { | 14 namespace cc { |
| 15 | 15 |
| 16 // static | 16 // static |
| 17 scoped_ptr<DirectRasterWorkerPool> DirectRasterWorkerPool::Create( | 17 scoped_ptr<RasterWorkerPool> DirectRasterWorkerPool::Create( |
| 18 base::SequencedTaskRunner* task_runner, | 18 base::SequencedTaskRunner* task_runner, |
| 19 ResourceProvider* resource_provider, | 19 ResourceProvider* resource_provider, |
| 20 ContextProvider* context_provider) { | 20 ContextProvider* context_provider) { |
| 21 return make_scoped_ptr(new DirectRasterWorkerPool( | 21 return make_scoped_ptr<RasterWorkerPool>(new DirectRasterWorkerPool( |
| 22 task_runner, resource_provider, context_provider)); | 22 task_runner, resource_provider, context_provider)); |
| 23 } | 23 } |
| 24 | 24 |
| 25 DirectRasterWorkerPool::DirectRasterWorkerPool( | 25 DirectRasterWorkerPool::DirectRasterWorkerPool( |
| 26 base::SequencedTaskRunner* task_runner, | 26 base::SequencedTaskRunner* task_runner, |
| 27 ResourceProvider* resource_provider, | 27 ResourceProvider* resource_provider, |
| 28 ContextProvider* context_provider) | 28 ContextProvider* context_provider) |
| 29 : task_runner_(task_runner), | 29 : task_runner_(task_runner), |
| 30 resource_provider_(resource_provider), | 30 resource_provider_(resource_provider), |
| 31 context_provider_(context_provider), | 31 context_provider_(context_provider), |
| 32 run_tasks_on_origin_thread_pending_(false), | 32 run_tasks_on_origin_thread_pending_(false), |
| 33 raster_tasks_pending_(false), | 33 raster_tasks_pending_(false), |
| 34 raster_tasks_required_for_activation_pending_(false), | 34 raster_tasks_required_for_activation_pending_(false), |
| 35 raster_finished_weak_ptr_factory_(this), | 35 raster_finished_weak_ptr_factory_(this), |
| 36 weak_ptr_factory_(this) {} | 36 weak_ptr_factory_(this) {} |
| 37 | 37 |
| 38 DirectRasterWorkerPool::~DirectRasterWorkerPool() { | 38 DirectRasterWorkerPool::~DirectRasterWorkerPool() { |
| 39 DCHECK_EQ(0u, completed_tasks_.size()); | 39 DCHECK_EQ(0u, completed_tasks_.size()); |
| 40 } | 40 } |
| 41 | 41 |
| 42 void DirectRasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { | 42 Rasterizer* DirectRasterWorkerPool::AsRasterizer() { return this; } |
| 43 |
| 44 void DirectRasterWorkerPool::SetClient(RasterizerClient* client) { |
| 43 client_ = client; | 45 client_ = client; |
| 44 } | 46 } |
| 45 | 47 |
| 46 void DirectRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { | 48 void DirectRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { |
| 47 TRACE_EVENT0("cc", "DirectRasterWorkerPool::ScheduleTasks"); | 49 TRACE_EVENT0("cc", "DirectRasterWorkerPool::ScheduleTasks"); |
| 48 | 50 |
| 49 DCHECK_EQ(queue->required_for_activation_count, | 51 DCHECK_EQ(queue->required_for_activation_count, |
| 50 static_cast<size_t>( | 52 static_cast<size_t>( |
| 51 std::count_if(queue->items.begin(), | 53 std::count_if(queue->items.begin(), |
| 52 queue->items.end(), | 54 queue->items.end(), |
| 53 RasterTaskQueue::Item::IsRequiredForActivation))); | 55 RasterTaskQueue::Item::IsRequiredForActivation))); |
| 54 | 56 |
| 55 raster_tasks_pending_ = true; | 57 raster_tasks_pending_ = true; |
| 56 raster_tasks_required_for_activation_pending_ = true; | 58 raster_tasks_required_for_activation_pending_ = true; |
| 57 | 59 |
| 58 // Cancel existing OnRasterFinished callbacks. | 60 // Cancel existing OnRasterFinished callbacks. |
| 59 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 61 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 60 | 62 |
| 61 scoped_refptr<internal::WorkerPoolTask> | 63 scoped_refptr<internal::RasterizerTask> |
| 62 new_raster_required_for_activation_finished_task( | 64 new_raster_required_for_activation_finished_task( |
| 63 CreateRasterRequiredForActivationFinishedTask( | 65 CreateRasterRequiredForActivationFinishedTask( |
| 64 queue->required_for_activation_count, | 66 queue->required_for_activation_count, |
| 65 task_runner_.get(), | 67 task_runner_.get(), |
| 66 base::Bind(&DirectRasterWorkerPool:: | 68 base::Bind(&DirectRasterWorkerPool:: |
| 67 OnRasterRequiredForActivationFinished, | 69 OnRasterRequiredForActivationFinished, |
| 68 raster_finished_weak_ptr_factory_.GetWeakPtr()))); | 70 raster_finished_weak_ptr_factory_.GetWeakPtr()))); |
| 69 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( | 71 scoped_refptr<internal::RasterizerTask> new_raster_finished_task( |
| 70 CreateRasterFinishedTask( | 72 CreateRasterFinishedTask( |
| 71 task_runner_.get(), | 73 task_runner_.get(), |
| 72 base::Bind(&DirectRasterWorkerPool::OnRasterFinished, | 74 base::Bind(&DirectRasterWorkerPool::OnRasterFinished, |
| 73 raster_finished_weak_ptr_factory_.GetWeakPtr()))); | 75 raster_finished_weak_ptr_factory_.GetWeakPtr()))); |
| 74 | 76 |
| 75 // Need to cancel tasks not present in new queue if we haven't had a | 77 // Need to cancel tasks not present in new queue if we haven't had a |
| 76 // chance to run the previous set of tasks yet. | 78 // chance to run the previous set of tasks yet. |
| 77 // TODO(reveman): Remove this once only tasks for which | 79 // TODO(reveman): Remove this once only tasks for which |
| 78 // ::ScheduleOnOriginThread has been called need to be canceled. | 80 // ::ScheduleOnOriginThread has been called need to be canceled. |
| 79 if (run_tasks_on_origin_thread_pending_) { | 81 if (run_tasks_on_origin_thread_pending_) { |
| 80 for (RasterTaskQueue::Item::Vector::const_iterator it = | 82 for (RasterTaskQueue::Item::Vector::const_iterator it = |
| 81 raster_tasks_.items.begin(); | 83 raster_tasks_.items.begin(); |
| 82 it != raster_tasks_.items.end(); | 84 it != raster_tasks_.items.end(); |
| 83 ++it) { | 85 ++it) { |
| 84 internal::RasterWorkerPoolTask* task = it->task; | 86 internal::RasterTask* task = it->task; |
| 85 | 87 |
| 86 if (std::find_if(queue->items.begin(), | 88 if (std::find_if(queue->items.begin(), |
| 87 queue->items.end(), | 89 queue->items.end(), |
| 88 RasterTaskQueue::Item::TaskComparator(task)) == | 90 RasterTaskQueue::Item::TaskComparator(task)) == |
| 89 queue->items.end()) | 91 queue->items.end()) |
| 90 completed_tasks_.push_back(task); | 92 completed_tasks_.push_back(task); |
| 91 } | 93 } |
| 92 } | 94 } |
| 93 | 95 |
| 94 ScheduleRunTasksOnOriginThread(); | 96 ScheduleRunTasksOnOriginThread(); |
| 95 | 97 |
| 96 raster_tasks_.Swap(queue); | 98 raster_tasks_.Swap(queue); |
| 97 | 99 |
| 98 raster_finished_task_ = new_raster_finished_task; | 100 raster_finished_task_ = new_raster_finished_task; |
| 99 raster_required_for_activation_finished_task_ = | 101 raster_required_for_activation_finished_task_ = |
| 100 new_raster_required_for_activation_finished_task; | 102 new_raster_required_for_activation_finished_task; |
| 101 } | 103 } |
| 102 | 104 |
| 103 unsigned DirectRasterWorkerPool::GetResourceTarget() const { | 105 unsigned DirectRasterWorkerPool::GetResourceTarget() const { |
| 104 return GL_TEXTURE_2D; | 106 return GL_TEXTURE_2D; |
| 105 } | 107 } |
| 106 | 108 |
| 107 ResourceFormat DirectRasterWorkerPool::GetResourceFormat() const { | 109 ResourceFormat DirectRasterWorkerPool::GetResourceFormat() const { |
| 108 return resource_provider_->best_texture_format(); | 110 return resource_provider_->best_texture_format(); |
| 109 } | 111 } |
| 110 | 112 |
| 111 void DirectRasterWorkerPool::CheckForCompletedTasks() { | 113 void DirectRasterWorkerPool::CheckForCompletedTasks() { |
| 112 TRACE_EVENT0("cc", "DirectRasterWorkerPool::CheckForCompletedTasks"); | 114 TRACE_EVENT0("cc", "DirectRasterWorkerPool::CheckForCompletedTasks"); |
| 113 | 115 |
| 114 for (internal::WorkerPoolTask::Vector::const_iterator it = | 116 for (internal::RasterizerTask::Vector::const_iterator it = |
| 115 completed_tasks_.begin(); | 117 completed_tasks_.begin(); |
| 116 it != completed_tasks_.end(); | 118 it != completed_tasks_.end(); |
| 117 ++it) { | 119 ++it) { |
| 118 internal::WorkerPoolTask* task = it->get(); | 120 internal::RasterizerTask* task = it->get(); |
| 119 | 121 |
| 120 task->RunReplyOnOriginThread(); | 122 task->RunReplyOnOriginThread(); |
| 121 } | 123 } |
| 122 completed_tasks_.clear(); | 124 completed_tasks_.clear(); |
| 123 } | 125 } |
| 124 | 126 |
| 125 SkCanvas* DirectRasterWorkerPool::AcquireCanvasForRaster( | 127 SkCanvas* DirectRasterWorkerPool::AcquireCanvasForRaster( |
| 126 internal::WorkerPoolTask* task, | 128 internal::RasterTask* task) { |
| 127 const Resource* resource) { | 129 return resource_provider_->MapDirectRasterBuffer(task->resource()->id()); |
| 128 return resource_provider_->MapDirectRasterBuffer(resource->id()); | |
| 129 } | 130 } |
| 130 | 131 |
| 131 void DirectRasterWorkerPool::ReleaseCanvasForRaster( | 132 void DirectRasterWorkerPool::ReleaseCanvasForRaster( |
| 132 internal::WorkerPoolTask* task, | 133 internal::RasterTask* task) { |
| 133 const Resource* resource) { | 134 resource_provider_->UnmapDirectRasterBuffer(task->resource()->id()); |
| 134 resource_provider_->UnmapDirectRasterBuffer(resource->id()); | |
| 135 } | 135 } |
| 136 | 136 |
| 137 void DirectRasterWorkerPool::OnRasterFinished() { | 137 void DirectRasterWorkerPool::OnRasterFinished() { |
| 138 TRACE_EVENT0("cc", "DirectRasterWorkerPool::OnRasterFinished"); | 138 TRACE_EVENT0("cc", "DirectRasterWorkerPool::OnRasterFinished"); |
| 139 | 139 |
| 140 DCHECK(raster_tasks_pending_); | 140 DCHECK(raster_tasks_pending_); |
| 141 raster_tasks_pending_ = false; | 141 raster_tasks_pending_ = false; |
| 142 client_->DidFinishRunningTasks(); | 142 client_->DidFinishRunningTasks(); |
| 143 } | 143 } |
| 144 | 144 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 | 179 |
| 180 GrContext* gr_context = context_provider_->GrContext(); | 180 GrContext* gr_context = context_provider_->GrContext(); |
| 181 // TODO(alokp): Implement TestContextProvider::GrContext(). | 181 // TODO(alokp): Implement TestContextProvider::GrContext(). |
| 182 if (gr_context) | 182 if (gr_context) |
| 183 gr_context->resetContext(); | 183 gr_context->resetContext(); |
| 184 | 184 |
| 185 for (RasterTaskQueue::Item::Vector::const_iterator it = | 185 for (RasterTaskQueue::Item::Vector::const_iterator it = |
| 186 raster_tasks_.items.begin(); | 186 raster_tasks_.items.begin(); |
| 187 it != raster_tasks_.items.end(); | 187 it != raster_tasks_.items.end(); |
| 188 ++it) { | 188 ++it) { |
| 189 internal::RasterWorkerPoolTask* task = it->task; | 189 internal::RasterTask* task = it->task; |
| 190 DCHECK(!task->HasCompleted()); | 190 DCHECK(!task->HasCompleted()); |
| 191 | 191 |
| 192 // First need to run all dependencies. | 192 // First need to run all dependencies. |
| 193 for (internal::WorkerPoolTask::Vector::const_iterator it = | 193 for (internal::ImageDecodeTask::Vector::const_iterator it = |
| 194 task->dependencies().begin(); | 194 task->dependencies().begin(); |
| 195 it != task->dependencies().end(); | 195 it != task->dependencies().end(); |
| 196 ++it) { | 196 ++it) { |
| 197 internal::WorkerPoolTask* dependency = it->get(); | 197 internal::ImageDecodeTask* dependency = it->get(); |
| 198 if (dependency->HasCompleted()) | 198 if (dependency->HasCompleted()) |
| 199 continue; | 199 continue; |
| 200 | 200 |
| 201 RunTaskOnOriginThread(dependency); | 201 RunTaskOnOriginThread(dependency); |
| 202 completed_tasks_.push_back(dependency); | 202 completed_tasks_.push_back(dependency); |
| 203 } | 203 } |
| 204 | 204 |
| 205 RunTaskOnOriginThread(task); | 205 RunTaskOnOriginThread(task); |
| 206 completed_tasks_.push_back(task); | 206 completed_tasks_.push_back(task); |
| 207 } | 207 } |
| 208 | 208 |
| 209 // TODO(alokp): Implement TestContextProvider::GrContext(). | 209 // TODO(alokp): Implement TestContextProvider::GrContext(). |
| 210 if (gr_context) | 210 if (gr_context) |
| 211 gr_context->flush(); | 211 gr_context->flush(); |
| 212 | 212 |
| 213 context_provider_->ContextGL()->PopGroupMarkerEXT(); | 213 context_provider_->ContextGL()->PopGroupMarkerEXT(); |
| 214 } | 214 } |
| 215 | 215 |
| 216 RunTaskOnOriginThread(raster_required_for_activation_finished_task_.get()); | 216 RunTaskOnOriginThread(raster_required_for_activation_finished_task_.get()); |
| 217 RunTaskOnOriginThread(raster_finished_task_.get()); | 217 RunTaskOnOriginThread(raster_finished_task_.get()); |
| 218 } | 218 } |
| 219 | 219 |
| 220 void DirectRasterWorkerPool::RunTaskOnOriginThread( | 220 void DirectRasterWorkerPool::RunTaskOnOriginThread( |
| 221 internal::WorkerPoolTask* task) { | 221 internal::RasterizerTask* task) { |
| 222 task->WillSchedule(); | 222 task->WillSchedule(); |
| 223 task->ScheduleOnOriginThread(this); | 223 task->ScheduleOnOriginThread(this); |
| 224 task->DidSchedule(); | 224 task->DidSchedule(); |
| 225 | 225 |
| 226 task->WillRun(); | 226 task->WillRun(); |
| 227 task->RunOnOriginThread(); | 227 task->RunOnOriginThread(); |
| 228 task->DidRun(); | 228 task->DidRun(); |
| 229 | 229 |
| 230 task->WillComplete(); | 230 task->WillComplete(); |
| 231 task->CompleteOnOriginThread(this); | 231 task->CompleteOnOriginThread(this); |
| 232 task->DidComplete(); | 232 task->DidComplete(); |
| 233 } | 233 } |
| 234 | 234 |
| 235 } // namespace cc | 235 } // namespace cc |
| OLD | NEW |