| 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/gpu_raster_worker_pool.h" | 5 #include "cc/resources/gpu_tile_task_worker_pool.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "cc/output/context_provider.h" | 10 #include "cc/output/context_provider.h" |
| 11 #include "cc/resources/raster_buffer.h" | 11 #include "cc/resources/raster_buffer.h" |
| 12 #include "cc/resources/raster_source.h" | 12 #include "cc/resources/raster_source.h" |
| 13 #include "cc/resources/resource.h" | 13 #include "cc/resources/resource.h" |
| 14 #include "cc/resources/resource_provider.h" | 14 #include "cc/resources/resource_provider.h" |
| 15 #include "cc/resources/scoped_gpu_raster.h" | 15 #include "cc/resources/scoped_gpu_raster.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 43 raster_source->ShouldAttemptToUseDistanceFieldText(); | 43 raster_source->ShouldAttemptToUseDistanceFieldText(); |
| 44 SkSurface* sk_surface = lock_.GetSkSurface(use_distance_field_text, | 44 SkSurface* sk_surface = lock_.GetSkSurface(use_distance_field_text, |
| 45 raster_source->CanUseLCDText()); | 45 raster_source->CanUseLCDText()); |
| 46 | 46 |
| 47 if (!sk_surface) | 47 if (!sk_surface) |
| 48 return; | 48 return; |
| 49 | 49 |
| 50 SkPictureRecorder recorder; | 50 SkPictureRecorder recorder; |
| 51 gfx::Size size = resource_->size(); | 51 gfx::Size size = resource_->size(); |
| 52 const int flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag; | 52 const int flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag; |
| 53 skia::RefPtr<SkCanvas> canvas = | 53 skia::RefPtr<SkCanvas> canvas = skia::SharePtr( |
| 54 skia::SharePtr(recorder.beginRecording(size.width(), size.height(), | 54 recorder.beginRecording(size.width(), size.height(), NULL, flags)); |
| 55 NULL, flags)); | |
| 56 | |
| 57 | 55 |
| 58 canvas->save(); | 56 canvas->save(); |
| 59 raster_source->PlaybackToCanvas(canvas.get(), rect, scale); | 57 raster_source->PlaybackToCanvas(canvas.get(), rect, scale); |
| 60 canvas->restore(); | 58 canvas->restore(); |
| 61 | 59 |
| 62 // Add the canvas and recorded picture to |multi_picture_draw_|. | 60 // Add the canvas and recorded picture to |multi_picture_draw_|. |
| 63 skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecording()); | 61 skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecording()); |
| 64 multi_picture_draw_->add(sk_surface->getCanvas(), picture.get()); | 62 multi_picture_draw_->add(sk_surface->getCanvas(), picture.get()); |
| 65 } | 63 } |
| 66 | 64 |
| 67 private: | 65 private: |
| 68 ResourceProvider::ScopedWriteLockGr lock_; | 66 ResourceProvider::ScopedWriteLockGr lock_; |
| 69 const Resource* resource_; | 67 const Resource* resource_; |
| 70 SkMultiPictureDraw* multi_picture_draw_; | 68 SkMultiPictureDraw* multi_picture_draw_; |
| 71 bool use_distance_field_text_; | 69 bool use_distance_field_text_; |
| 72 | 70 |
| 73 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | 71 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
| 74 }; | 72 }; |
| 75 | 73 |
| 76 } // namespace | 74 } // namespace |
| 77 | 75 |
| 78 // static | 76 // static |
| 79 scoped_ptr<RasterWorkerPool> GpuRasterWorkerPool::Create( | 77 scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create( |
| 80 base::SequencedTaskRunner* task_runner, | 78 base::SequencedTaskRunner* task_runner, |
| 81 ContextProvider* context_provider, | 79 ContextProvider* context_provider, |
| 82 ResourceProvider* resource_provider, | 80 ResourceProvider* resource_provider, |
| 83 bool use_distance_field_text) { | 81 bool use_distance_field_text) { |
| 84 return make_scoped_ptr<RasterWorkerPool>( | 82 return make_scoped_ptr<TileTaskWorkerPool>( |
| 85 new GpuRasterWorkerPool(task_runner, | 83 new GpuTileTaskWorkerPool(task_runner, context_provider, |
| 86 context_provider, | 84 resource_provider, use_distance_field_text)); |
| 87 resource_provider, | |
| 88 use_distance_field_text)); | |
| 89 } | 85 } |
| 90 | 86 |
| 91 GpuRasterWorkerPool::GpuRasterWorkerPool(base::SequencedTaskRunner* task_runner, | 87 GpuTileTaskWorkerPool::GpuTileTaskWorkerPool( |
| 92 ContextProvider* context_provider, | 88 base::SequencedTaskRunner* task_runner, |
| 93 ResourceProvider* resource_provider, | 89 ContextProvider* context_provider, |
| 94 bool use_distance_field_text) | 90 ResourceProvider* resource_provider, |
| 91 bool use_distance_field_text) |
| 95 : task_runner_(task_runner), | 92 : task_runner_(task_runner), |
| 96 task_graph_runner_(new TaskGraphRunner), | 93 task_graph_runner_(new TaskGraphRunner), |
| 97 namespace_token_(task_graph_runner_->GetNamespaceToken()), | 94 namespace_token_(task_graph_runner_->GetNamespaceToken()), |
| 98 context_provider_(context_provider), | 95 context_provider_(context_provider), |
| 99 resource_provider_(resource_provider), | 96 resource_provider_(resource_provider), |
| 100 run_tasks_on_origin_thread_pending_(false), | 97 run_tasks_on_origin_thread_pending_(false), |
| 101 use_distance_field_text_(use_distance_field_text), | 98 use_distance_field_text_(use_distance_field_text), |
| 102 raster_finished_weak_ptr_factory_(this), | 99 task_set_finished_weak_ptr_factory_(this), |
| 103 weak_ptr_factory_(this) { | 100 weak_ptr_factory_(this) { |
| 104 DCHECK(context_provider_); | 101 DCHECK(context_provider_); |
| 105 } | 102 } |
| 106 | 103 |
| 107 GpuRasterWorkerPool::~GpuRasterWorkerPool() { | 104 GpuTileTaskWorkerPool::~GpuTileTaskWorkerPool() { |
| 108 DCHECK_EQ(0u, completed_tasks_.size()); | 105 DCHECK_EQ(0u, completed_tasks_.size()); |
| 109 } | 106 } |
| 110 | 107 |
| 111 Rasterizer* GpuRasterWorkerPool::AsRasterizer() { | 108 TileTaskRunner* GpuTileTaskWorkerPool::AsTileTaskRunner() { |
| 112 return this; | 109 return this; |
| 113 } | 110 } |
| 114 | 111 |
| 115 void GpuRasterWorkerPool::SetClient(RasterizerClient* client) { | 112 void GpuTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) { |
| 116 client_ = client; | 113 client_ = client; |
| 117 } | 114 } |
| 118 | 115 |
| 119 void GpuRasterWorkerPool::Shutdown() { | 116 void GpuTileTaskWorkerPool::Shutdown() { |
| 120 TRACE_EVENT0("cc", "GpuRasterWorkerPool::Shutdown"); | 117 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::Shutdown"); |
| 121 | 118 |
| 122 TaskGraph empty; | 119 TaskGraph empty; |
| 123 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); | 120 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
| 124 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); | 121 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
| 125 } | 122 } |
| 126 | 123 |
| 127 void GpuRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { | 124 void GpuTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) { |
| 128 TRACE_EVENT0("cc", "GpuRasterWorkerPool::ScheduleTasks"); | 125 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::ScheduleTasks"); |
| 129 | 126 |
| 130 // Mark all task sets as pending. | 127 // Mark all task sets as pending. |
| 131 raster_pending_.set(); | 128 tasks_pending_.set(); |
| 132 | 129 |
| 133 unsigned priority = kRasterTaskPriorityBase; | 130 unsigned priority = kTileTaskPriorityBase; |
| 134 | 131 |
| 135 graph_.Reset(); | 132 graph_.Reset(); |
| 136 | 133 |
| 137 // Cancel existing OnRasterFinished callbacks. | 134 // Cancel existing OnTaskSetFinished callbacks. |
| 138 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 135 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 139 | 136 |
| 140 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; | 137 scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets]; |
| 141 | 138 |
| 142 size_t task_count[kNumberOfTaskSets] = {0}; | 139 size_t task_count[kNumberOfTaskSets] = {0}; |
| 143 | 140 |
| 144 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 141 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
| 145 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( | 142 new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask( |
| 146 task_runner_.get(), | 143 task_runner_.get(), |
| 147 base::Bind(&GpuRasterWorkerPool::OnRasterFinished, | 144 base::Bind(&GpuTileTaskWorkerPool::OnTaskSetFinished, |
| 148 raster_finished_weak_ptr_factory_.GetWeakPtr(), | 145 task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set)); |
| 149 task_set)); | |
| 150 } | 146 } |
| 151 | 147 |
| 152 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | 148 for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); |
| 153 it != queue->items.end(); | 149 it != queue->items.end(); ++it) { |
| 154 ++it) { | 150 const TileTaskQueue::Item& item = *it; |
| 155 const RasterTaskQueue::Item& item = *it; | |
| 156 RasterTask* task = item.task; | 151 RasterTask* task = item.task; |
| 157 DCHECK(!task->HasCompleted()); | 152 DCHECK(!task->HasCompleted()); |
| 158 | 153 |
| 159 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 154 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
| 160 if (!item.task_sets[task_set]) | 155 if (!item.task_sets[task_set]) |
| 161 continue; | 156 continue; |
| 162 | 157 |
| 163 ++task_count[task_set]; | 158 ++task_count[task_set]; |
| 164 | 159 |
| 165 graph_.edges.push_back( | 160 graph_.edges.push_back( |
| 166 TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get())); | 161 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get())); |
| 167 } | 162 } |
| 168 | 163 |
| 169 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); | 164 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); |
| 170 } | 165 } |
| 171 | 166 |
| 172 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 167 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
| 173 InsertNodeForTask(&graph_, | 168 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(), |
| 174 new_raster_finished_tasks[task_set].get(), | 169 kTaskSetFinishedTaskPriority, task_count[task_set]); |
| 175 kRasterFinishedTaskPriority, | |
| 176 task_count[task_set]); | |
| 177 } | 170 } |
| 178 | 171 |
| 179 ScheduleTasksOnOriginThread(this, &graph_); | 172 ScheduleTasksOnOriginThread(this, &graph_); |
| 180 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); | 173 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); |
| 181 | 174 |
| 182 ScheduleRunTasksOnOriginThread(); | 175 ScheduleRunTasksOnOriginThread(); |
| 183 | 176 |
| 184 std::copy(new_raster_finished_tasks, | 177 std::copy(new_task_set_finished_tasks, |
| 185 new_raster_finished_tasks + kNumberOfTaskSets, | 178 new_task_set_finished_tasks + kNumberOfTaskSets, |
| 186 raster_finished_tasks_); | 179 task_set_finished_tasks_); |
| 187 } | 180 } |
| 188 | 181 |
| 189 void GpuRasterWorkerPool::CheckForCompletedTasks() { | 182 void GpuTileTaskWorkerPool::CheckForCompletedTasks() { |
| 190 TRACE_EVENT0("cc", "GpuRasterWorkerPool::CheckForCompletedTasks"); | 183 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks"); |
| 191 | 184 |
| 192 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 185 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
| 193 &completed_tasks_); | 186 &completed_tasks_); |
| 194 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 187 for (Task::Vector::const_iterator it = completed_tasks_.begin(); |
| 195 it != completed_tasks_.end(); | 188 it != completed_tasks_.end(); ++it) { |
| 196 ++it) { | 189 TileTask* task = static_cast<TileTask*>(it->get()); |
| 197 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); | |
| 198 | 190 |
| 199 task->WillComplete(); | 191 task->WillComplete(); |
| 200 task->CompleteOnOriginThread(this); | 192 task->CompleteOnOriginThread(this); |
| 201 task->DidComplete(); | 193 task->DidComplete(); |
| 202 | 194 |
| 203 task->RunReplyOnOriginThread(); | 195 task->RunReplyOnOriginThread(); |
| 204 } | 196 } |
| 205 completed_tasks_.clear(); | 197 completed_tasks_.clear(); |
| 206 } | 198 } |
| 207 | 199 |
| 208 scoped_ptr<RasterBuffer> GpuRasterWorkerPool::AcquireBufferForRaster( | 200 scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster( |
| 209 const Resource* resource) { | 201 const Resource* resource) { |
| 210 return make_scoped_ptr<RasterBuffer>( | 202 return make_scoped_ptr<RasterBuffer>( |
| 211 new RasterBufferImpl(resource_provider_, | 203 new RasterBufferImpl(resource_provider_, resource, &multi_picture_draw_, |
| 212 resource, | |
| 213 &multi_picture_draw_, | |
| 214 use_distance_field_text_)); | 204 use_distance_field_text_)); |
| 215 } | 205 } |
| 216 | 206 |
| 217 void GpuRasterWorkerPool::ReleaseBufferForRaster( | 207 void GpuTileTaskWorkerPool::ReleaseBufferForRaster( |
| 218 scoped_ptr<RasterBuffer> buffer) { | 208 scoped_ptr<RasterBuffer> buffer) { |
| 219 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 209 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
| 220 } | 210 } |
| 221 | 211 |
| 222 void GpuRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 212 void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { |
| 223 TRACE_EVENT1( | 213 TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set", |
| 224 "cc", "GpuRasterWorkerPool::OnRasterFinished", "task_set", task_set); | 214 task_set); |
| 225 | 215 |
| 226 DCHECK(raster_pending_[task_set]); | 216 DCHECK(tasks_pending_[task_set]); |
| 227 raster_pending_[task_set] = false; | 217 tasks_pending_[task_set] = false; |
| 228 client_->DidFinishRunningTasks(task_set); | 218 client_->DidFinishRunningTileTasks(task_set); |
| 229 } | 219 } |
| 230 | 220 |
| 231 void GpuRasterWorkerPool::ScheduleRunTasksOnOriginThread() { | 221 void GpuTileTaskWorkerPool::ScheduleRunTasksOnOriginThread() { |
| 232 if (run_tasks_on_origin_thread_pending_) | 222 if (run_tasks_on_origin_thread_pending_) |
| 233 return; | 223 return; |
| 234 | 224 |
| 235 task_runner_->PostTask( | 225 task_runner_->PostTask( |
| 236 FROM_HERE, | 226 FROM_HERE, base::Bind(&GpuTileTaskWorkerPool::RunTasksOnOriginThread, |
| 237 base::Bind(&GpuRasterWorkerPool::RunTasksOnOriginThread, | 227 weak_ptr_factory_.GetWeakPtr())); |
| 238 weak_ptr_factory_.GetWeakPtr())); | |
| 239 run_tasks_on_origin_thread_pending_ = true; | 228 run_tasks_on_origin_thread_pending_ = true; |
| 240 } | 229 } |
| 241 | 230 |
| 242 void GpuRasterWorkerPool::RunTasksOnOriginThread() { | 231 void GpuTileTaskWorkerPool::RunTasksOnOriginThread() { |
| 243 TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread"); | 232 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::RunTasksOnOriginThread"); |
| 244 | 233 |
| 245 DCHECK(run_tasks_on_origin_thread_pending_); | 234 DCHECK(run_tasks_on_origin_thread_pending_); |
| 246 run_tasks_on_origin_thread_pending_ = false; | 235 run_tasks_on_origin_thread_pending_ = false; |
| 247 | 236 |
| 248 ScopedGpuRaster gpu_raster(context_provider_); | 237 ScopedGpuRaster gpu_raster(context_provider_); |
| 249 task_graph_runner_->RunUntilIdle(); | 238 task_graph_runner_->RunUntilIdle(); |
| 250 | 239 |
| 251 // Draw each all of the pictures that were collected. This will also clear | 240 // Draw each all of the pictures that were collected. This will also clear |
| 252 // the pictures and canvases added to |multi_picture_draw_| | 241 // the pictures and canvases added to |multi_picture_draw_| |
| 253 multi_picture_draw_.draw(); | 242 multi_picture_draw_.draw(); |
| 254 } | 243 } |
| 255 | 244 |
| 256 } // namespace cc | 245 } // namespace cc |
| OLD | NEW |