| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/image_raster_worker_pool.h" | 5 #include "cc/resources/zero_copy_raster_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 "base/debug/trace_event_argument.h" | 10 #include "base/debug/trace_event_argument.h" |
| 11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 12 #include "cc/debug/traced_value.h" | 12 #include "cc/debug/traced_value.h" |
| 13 #include "cc/resources/raster_buffer.h" | 13 #include "cc/resources/raster_buffer.h" |
| 14 #include "cc/resources/resource.h" | 14 #include "cc/resources/resource.h" |
| 15 #include "third_party/skia/include/utils/SkNullCanvas.h" | 15 #include "third_party/skia/include/utils/SkNullCanvas.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 int stride_; | 58 int stride_; |
| 59 uint8_t* buffer_; | 59 uint8_t* buffer_; |
| 60 SkBitmap bitmap_; | 60 SkBitmap bitmap_; |
| 61 | 61 |
| 62 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | 62 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
| 63 }; | 63 }; |
| 64 | 64 |
| 65 } // namespace | 65 } // namespace |
| 66 | 66 |
| 67 // static | 67 // static |
| 68 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create( | 68 scoped_ptr<RasterWorkerPool> ZeroCopyRasterWorkerPool::Create( |
| 69 base::SequencedTaskRunner* task_runner, | 69 base::SequencedTaskRunner* task_runner, |
| 70 TaskGraphRunner* task_graph_runner, | 70 TaskGraphRunner* task_graph_runner, |
| 71 ResourceProvider* resource_provider) { | 71 ResourceProvider* resource_provider) { |
| 72 return make_scoped_ptr<RasterWorkerPool>(new ImageRasterWorkerPool( | 72 return make_scoped_ptr<RasterWorkerPool>(new ZeroCopyRasterWorkerPool( |
| 73 task_runner, task_graph_runner, resource_provider)); | 73 task_runner, task_graph_runner, resource_provider)); |
| 74 } | 74 } |
| 75 | 75 |
| 76 ImageRasterWorkerPool::ImageRasterWorkerPool( | 76 ZeroCopyRasterWorkerPool::ZeroCopyRasterWorkerPool( |
| 77 base::SequencedTaskRunner* task_runner, | 77 base::SequencedTaskRunner* task_runner, |
| 78 TaskGraphRunner* task_graph_runner, | 78 TaskGraphRunner* task_graph_runner, |
| 79 ResourceProvider* resource_provider) | 79 ResourceProvider* resource_provider) |
| 80 : task_runner_(task_runner), | 80 : task_runner_(task_runner), |
| 81 task_graph_runner_(task_graph_runner), | 81 task_graph_runner_(task_graph_runner), |
| 82 namespace_token_(task_graph_runner->GetNamespaceToken()), | 82 namespace_token_(task_graph_runner->GetNamespaceToken()), |
| 83 resource_provider_(resource_provider), | 83 resource_provider_(resource_provider), |
| 84 raster_finished_weak_ptr_factory_(this) {} | 84 raster_finished_weak_ptr_factory_(this) { |
| 85 } |
| 85 | 86 |
| 86 ImageRasterWorkerPool::~ImageRasterWorkerPool() {} | 87 ZeroCopyRasterWorkerPool::~ZeroCopyRasterWorkerPool() { |
| 88 } |
| 87 | 89 |
| 88 Rasterizer* ImageRasterWorkerPool::AsRasterizer() { return this; } | 90 Rasterizer* ZeroCopyRasterWorkerPool::AsRasterizer() { |
| 91 return this; |
| 92 } |
| 89 | 93 |
| 90 void ImageRasterWorkerPool::SetClient(RasterizerClient* client) { | 94 void ZeroCopyRasterWorkerPool::SetClient(RasterizerClient* client) { |
| 91 client_ = client; | 95 client_ = client; |
| 92 } | 96 } |
| 93 | 97 |
| 94 void ImageRasterWorkerPool::Shutdown() { | 98 void ZeroCopyRasterWorkerPool::Shutdown() { |
| 95 TRACE_EVENT0("cc", "ImageRasterWorkerPool::Shutdown"); | 99 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::Shutdown"); |
| 96 | 100 |
| 97 TaskGraph empty; | 101 TaskGraph empty; |
| 98 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); | 102 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
| 99 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); | 103 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
| 100 } | 104 } |
| 101 | 105 |
| 102 void ImageRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { | 106 void ZeroCopyRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { |
| 103 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); | 107 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::ScheduleTasks"); |
| 104 | 108 |
| 105 if (raster_pending_.none()) | 109 if (raster_pending_.none()) |
| 106 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); | 110 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); |
| 107 | 111 |
| 108 // Mark all task sets as pending. | 112 // Mark all task sets as pending. |
| 109 raster_pending_.set(); | 113 raster_pending_.set(); |
| 110 | 114 |
| 111 unsigned priority = kRasterTaskPriorityBase; | 115 unsigned priority = kRasterTaskPriorityBase; |
| 112 | 116 |
| 113 graph_.Reset(); | 117 graph_.Reset(); |
| 114 | 118 |
| 115 // Cancel existing OnRasterFinished callbacks. | 119 // Cancel existing OnRasterFinished callbacks. |
| 116 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 120 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 117 | 121 |
| 118 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; | 122 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; |
| 119 | 123 |
| 120 size_t task_count[kNumberOfTaskSets] = {0}; | 124 size_t task_count[kNumberOfTaskSets] = {0}; |
| 121 | 125 |
| 122 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 126 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
| 123 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( | 127 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( |
| 124 task_runner_.get(), | 128 task_runner_.get(), |
| 125 base::Bind(&ImageRasterWorkerPool::OnRasterFinished, | 129 base::Bind(&ZeroCopyRasterWorkerPool::OnRasterFinished, |
| 126 raster_finished_weak_ptr_factory_.GetWeakPtr(), | 130 raster_finished_weak_ptr_factory_.GetWeakPtr(), |
| 127 task_set)); | 131 task_set)); |
| 128 } | 132 } |
| 129 | 133 |
| 130 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | 134 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); |
| 131 it != queue->items.end(); | 135 it != queue->items.end(); |
| 132 ++it) { | 136 ++it) { |
| 133 const RasterTaskQueue::Item& item = *it; | 137 const RasterTaskQueue::Item& item = *it; |
| 134 RasterTask* task = item.task; | 138 RasterTask* task = item.task; |
| 135 DCHECK(!task->HasCompleted()); | 139 DCHECK(!task->HasCompleted()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 158 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); | 162 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); |
| 159 | 163 |
| 160 std::copy(new_raster_finished_tasks, | 164 std::copy(new_raster_finished_tasks, |
| 161 new_raster_finished_tasks + kNumberOfTaskSets, | 165 new_raster_finished_tasks + kNumberOfTaskSets, |
| 162 raster_finished_tasks_); | 166 raster_finished_tasks_); |
| 163 | 167 |
| 164 TRACE_EVENT_ASYNC_STEP_INTO1( | 168 TRACE_EVENT_ASYNC_STEP_INTO1( |
| 165 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 169 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); |
| 166 } | 170 } |
| 167 | 171 |
| 168 void ImageRasterWorkerPool::CheckForCompletedTasks() { | 172 void ZeroCopyRasterWorkerPool::CheckForCompletedTasks() { |
| 169 TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks"); | 173 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::CheckForCompletedTasks"); |
| 170 | 174 |
| 171 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 175 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
| 172 &completed_tasks_); | 176 &completed_tasks_); |
| 173 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 177 for (Task::Vector::const_iterator it = completed_tasks_.begin(); |
| 174 it != completed_tasks_.end(); | 178 it != completed_tasks_.end(); |
| 175 ++it) { | 179 ++it) { |
| 176 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); | 180 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); |
| 177 | 181 |
| 178 task->WillComplete(); | 182 task->WillComplete(); |
| 179 task->CompleteOnOriginThread(this); | 183 task->CompleteOnOriginThread(this); |
| 180 task->DidComplete(); | 184 task->DidComplete(); |
| 181 | 185 |
| 182 task->RunReplyOnOriginThread(); | 186 task->RunReplyOnOriginThread(); |
| 183 } | 187 } |
| 184 completed_tasks_.clear(); | 188 completed_tasks_.clear(); |
| 185 } | 189 } |
| 186 | 190 |
| 187 scoped_ptr<RasterBuffer> ImageRasterWorkerPool::AcquireBufferForRaster( | 191 scoped_ptr<RasterBuffer> ZeroCopyRasterWorkerPool::AcquireBufferForRaster( |
| 188 const Resource* resource) { | 192 const Resource* resource) { |
| 189 // RasterBuffer implementation depends on an image having been acquired for | 193 // RasterBuffer implementation depends on an image having been acquired for |
| 190 // the resource. | 194 // the resource. |
| 191 resource_provider_->AcquireImage(resource->id()); | 195 resource_provider_->AcquireImage(resource->id()); |
| 192 | 196 |
| 193 return make_scoped_ptr<RasterBuffer>( | 197 return make_scoped_ptr<RasterBuffer>( |
| 194 new RasterBufferImpl(resource_provider_, resource)); | 198 new RasterBufferImpl(resource_provider_, resource)); |
| 195 } | 199 } |
| 196 | 200 |
| 197 void ImageRasterWorkerPool::ReleaseBufferForRaster( | 201 void ZeroCopyRasterWorkerPool::ReleaseBufferForRaster( |
| 198 scoped_ptr<RasterBuffer> buffer) { | 202 scoped_ptr<RasterBuffer> buffer) { |
| 199 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 203 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
| 200 } | 204 } |
| 201 | 205 |
| 202 void ImageRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 206 void ZeroCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) { |
| 203 TRACE_EVENT1( | 207 TRACE_EVENT1( |
| 204 "cc", "ImageRasterWorkerPool::OnRasterFinished", "task_set", task_set); | 208 "cc", "ZeroCopyRasterWorkerPool::OnRasterFinished", "task_set", task_set); |
| 205 | 209 |
| 206 DCHECK(raster_pending_[task_set]); | 210 DCHECK(raster_pending_[task_set]); |
| 207 raster_pending_[task_set] = false; | 211 raster_pending_[task_set] = false; |
| 208 if (raster_pending_.any()) { | 212 if (raster_pending_.any()) { |
| 209 TRACE_EVENT_ASYNC_STEP_INTO1( | 213 TRACE_EVENT_ASYNC_STEP_INTO1( |
| 210 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 214 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); |
| 211 } else { | 215 } else { |
| 212 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); | 216 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
| 213 } | 217 } |
| 214 client_->DidFinishRunningTasks(task_set); | 218 client_->DidFinishRunningTasks(task_set); |
| 215 } | 219 } |
| 216 | 220 |
| 217 scoped_refptr<base::debug::ConvertableToTraceFormat> | 221 scoped_refptr<base::debug::ConvertableToTraceFormat> |
| 218 ImageRasterWorkerPool::StateAsValue() const { | 222 ZeroCopyRasterWorkerPool::StateAsValue() const { |
| 219 scoped_refptr<base::debug::TracedValue> state = | 223 scoped_refptr<base::debug::TracedValue> state = |
| 220 new base::debug::TracedValue(); | 224 new base::debug::TracedValue(); |
| 221 | 225 |
| 222 state->BeginArray("tasks_pending"); | 226 state->BeginArray("tasks_pending"); |
| 223 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) | 227 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) |
| 224 state->AppendBoolean(raster_pending_[task_set]); | 228 state->AppendBoolean(raster_pending_[task_set]); |
| 225 state->EndArray(); | 229 state->EndArray(); |
| 226 return state; | 230 return state; |
| 227 } | 231 } |
| 228 | 232 |
| 229 } // namespace cc | 233 } // namespace cc |
| OLD | NEW |