| OLD | NEW |
| 1 // Copyright 2013 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/zero_copy_raster_worker_pool.h" | 5 #include "cc/resources/bitmap_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" | |
| 16 | 15 |
| 17 namespace cc { | 16 namespace cc { |
| 18 namespace { | 17 namespace { |
| 19 | 18 |
| 20 class RasterBufferImpl : public RasterBuffer { | 19 class RasterBufferImpl : public RasterBuffer { |
| 21 public: | 20 public: |
| 22 RasterBufferImpl(ResourceProvider* resource_provider, | 21 RasterBufferImpl(ResourceProvider* resource_provider, |
| 23 const Resource* resource) | 22 const Resource* resource) |
| 24 : resource_provider_(resource_provider), | 23 : lock_(resource_provider, resource->id()) {} |
| 25 resource_(resource), | |
| 26 stride_(0), | |
| 27 buffer_(resource_provider->MapImage(resource->id(), &stride_)) {} | |
| 28 | |
| 29 virtual ~RasterBufferImpl() { | |
| 30 resource_provider_->UnmapImage(resource_->id()); | |
| 31 | |
| 32 // This RasterBuffer implementation provides direct access to the memory | |
| 33 // used by the GPU. Read lock fences are required to ensure that we're not | |
| 34 // trying to map a resource that is currently in-use by the GPU. | |
| 35 resource_provider_->EnableReadLockFences(resource_->id()); | |
| 36 } | |
| 37 | 24 |
| 38 // Overridden from RasterBuffer: | 25 // Overridden from RasterBuffer: |
| 39 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE { | 26 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE { |
| 40 if (!buffer_) | 27 return skia::SharePtr(lock_.sk_canvas()); |
| 41 return skia::AdoptRef(SkCreateNullCanvas()); | |
| 42 | |
| 43 RasterWorkerPool::AcquireBitmapForBuffer( | |
| 44 &bitmap_, buffer_, resource_->format(), resource_->size(), stride_); | |
| 45 return skia::AdoptRef(new SkCanvas(bitmap_)); | |
| 46 } | 28 } |
| 47 virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE { | 29 virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE {} |
| 48 if (!buffer_) | |
| 49 return; | |
| 50 | |
| 51 RasterWorkerPool::ReleaseBitmapForBuffer( | |
| 52 &bitmap_, buffer_, resource_->format()); | |
| 53 } | |
| 54 | 30 |
| 55 private: | 31 private: |
| 56 ResourceProvider* resource_provider_; | 32 ResourceProvider::ScopedWriteLockSoftware lock_; |
| 57 const Resource* resource_; | |
| 58 int stride_; | |
| 59 uint8_t* buffer_; | |
| 60 SkBitmap bitmap_; | |
| 61 | 33 |
| 62 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | 34 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
| 63 }; | 35 }; |
| 64 | 36 |
| 65 } // namespace | 37 } // namespace |
| 66 | 38 |
| 67 // static | 39 // static |
| 68 scoped_ptr<RasterWorkerPool> ZeroCopyRasterWorkerPool::Create( | 40 scoped_ptr<RasterWorkerPool> BitmapRasterWorkerPool::Create( |
| 69 base::SequencedTaskRunner* task_runner, | 41 base::SequencedTaskRunner* task_runner, |
| 70 TaskGraphRunner* task_graph_runner, | 42 TaskGraphRunner* task_graph_runner, |
| 71 ResourceProvider* resource_provider) { | 43 ResourceProvider* resource_provider) { |
| 72 return make_scoped_ptr<RasterWorkerPool>(new ZeroCopyRasterWorkerPool( | 44 return make_scoped_ptr<RasterWorkerPool>(new BitmapRasterWorkerPool( |
| 73 task_runner, task_graph_runner, resource_provider)); | 45 task_runner, task_graph_runner, resource_provider)); |
| 74 } | 46 } |
| 75 | 47 |
| 76 ZeroCopyRasterWorkerPool::ZeroCopyRasterWorkerPool( | 48 BitmapRasterWorkerPool::BitmapRasterWorkerPool( |
| 77 base::SequencedTaskRunner* task_runner, | 49 base::SequencedTaskRunner* task_runner, |
| 78 TaskGraphRunner* task_graph_runner, | 50 TaskGraphRunner* task_graph_runner, |
| 79 ResourceProvider* resource_provider) | 51 ResourceProvider* resource_provider) |
| 80 : task_runner_(task_runner), | 52 : task_runner_(task_runner), |
| 81 task_graph_runner_(task_graph_runner), | 53 task_graph_runner_(task_graph_runner), |
| 82 namespace_token_(task_graph_runner->GetNamespaceToken()), | 54 namespace_token_(task_graph_runner->GetNamespaceToken()), |
| 83 resource_provider_(resource_provider), | 55 resource_provider_(resource_provider), |
| 84 raster_finished_weak_ptr_factory_(this) { | 56 raster_finished_weak_ptr_factory_(this) { |
| 85 } | 57 } |
| 86 | 58 |
| 87 ZeroCopyRasterWorkerPool::~ZeroCopyRasterWorkerPool() { | 59 BitmapRasterWorkerPool::~BitmapRasterWorkerPool() { |
| 88 } | 60 } |
| 89 | 61 |
| 90 Rasterizer* ZeroCopyRasterWorkerPool::AsRasterizer() { | 62 Rasterizer* BitmapRasterWorkerPool::AsRasterizer() { |
| 91 return this; | 63 return this; |
| 92 } | 64 } |
| 93 | 65 |
| 94 void ZeroCopyRasterWorkerPool::SetClient(RasterizerClient* client) { | 66 void BitmapRasterWorkerPool::SetClient(RasterizerClient* client) { |
| 95 client_ = client; | 67 client_ = client; |
| 96 } | 68 } |
| 97 | 69 |
| 98 void ZeroCopyRasterWorkerPool::Shutdown() { | 70 void BitmapRasterWorkerPool::Shutdown() { |
| 99 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::Shutdown"); | 71 TRACE_EVENT0("cc", "BitmapRasterWorkerPool::Shutdown"); |
| 100 | 72 |
| 101 TaskGraph empty; | 73 TaskGraph empty; |
| 102 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); | 74 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
| 103 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); | 75 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
| 104 } | 76 } |
| 105 | 77 |
| 106 void ZeroCopyRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { | 78 void BitmapRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { |
| 107 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::ScheduleTasks"); | 79 TRACE_EVENT0("cc", "BitmapRasterWorkerPool::ScheduleTasks"); |
| 108 | 80 |
| 109 if (raster_pending_.none()) | 81 if (raster_pending_.none()) |
| 110 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); | 82 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); |
| 111 | 83 |
| 112 // Mark all task sets as pending. | 84 // Mark all task sets as pending. |
| 113 raster_pending_.set(); | 85 raster_pending_.set(); |
| 114 | 86 |
| 115 unsigned priority = kRasterTaskPriorityBase; | 87 unsigned priority = kRasterTaskPriorityBase; |
| 116 | 88 |
| 117 graph_.Reset(); | 89 graph_.Reset(); |
| 118 | 90 |
| 119 // Cancel existing OnRasterFinished callbacks. | 91 // Cancel existing OnRasterFinished callbacks. |
| 120 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 92 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 121 | 93 |
| 122 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; | 94 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; |
| 123 | 95 |
| 124 size_t task_count[kNumberOfTaskSets] = {0}; | 96 size_t task_count[kNumberOfTaskSets] = {0}; |
| 125 | 97 |
| 126 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 98 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
| 127 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( | 99 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( |
| 128 task_runner_.get(), | 100 task_runner_.get(), |
| 129 base::Bind(&ZeroCopyRasterWorkerPool::OnRasterFinished, | 101 base::Bind(&BitmapRasterWorkerPool::OnRasterFinished, |
| 130 raster_finished_weak_ptr_factory_.GetWeakPtr(), | 102 raster_finished_weak_ptr_factory_.GetWeakPtr(), |
| 131 task_set)); | 103 task_set)); |
| 132 } | 104 } |
| 133 | 105 |
| 134 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | 106 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); |
| 135 it != queue->items.end(); | 107 it != queue->items.end(); |
| 136 ++it) { | 108 ++it) { |
| 137 const RasterTaskQueue::Item& item = *it; | 109 const RasterTaskQueue::Item& item = *it; |
| 138 RasterTask* task = item.task; | 110 RasterTask* task = item.task; |
| 139 DCHECK(!task->HasCompleted()); | 111 DCHECK(!task->HasCompleted()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 162 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); | 134 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); |
| 163 | 135 |
| 164 std::copy(new_raster_finished_tasks, | 136 std::copy(new_raster_finished_tasks, |
| 165 new_raster_finished_tasks + kNumberOfTaskSets, | 137 new_raster_finished_tasks + kNumberOfTaskSets, |
| 166 raster_finished_tasks_); | 138 raster_finished_tasks_); |
| 167 | 139 |
| 168 TRACE_EVENT_ASYNC_STEP_INTO1( | 140 TRACE_EVENT_ASYNC_STEP_INTO1( |
| 169 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 141 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); |
| 170 } | 142 } |
| 171 | 143 |
| 172 void ZeroCopyRasterWorkerPool::CheckForCompletedTasks() { | 144 void BitmapRasterWorkerPool::CheckForCompletedTasks() { |
| 173 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::CheckForCompletedTasks"); | 145 TRACE_EVENT0("cc", "BitmapRasterWorkerPool::CheckForCompletedTasks"); |
| 174 | 146 |
| 175 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 147 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
| 176 &completed_tasks_); | 148 &completed_tasks_); |
| 177 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 149 for (Task::Vector::const_iterator it = completed_tasks_.begin(); |
| 178 it != completed_tasks_.end(); | 150 it != completed_tasks_.end(); |
| 179 ++it) { | 151 ++it) { |
| 180 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); | 152 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); |
| 181 | 153 |
| 182 task->WillComplete(); | 154 task->WillComplete(); |
| 183 task->CompleteOnOriginThread(this); | 155 task->CompleteOnOriginThread(this); |
| 184 task->DidComplete(); | 156 task->DidComplete(); |
| 185 | 157 |
| 186 task->RunReplyOnOriginThread(); | 158 task->RunReplyOnOriginThread(); |
| 187 } | 159 } |
| 188 completed_tasks_.clear(); | 160 completed_tasks_.clear(); |
| 189 } | 161 } |
| 190 | 162 |
| 191 scoped_ptr<RasterBuffer> ZeroCopyRasterWorkerPool::AcquireBufferForRaster( | 163 scoped_ptr<RasterBuffer> BitmapRasterWorkerPool::AcquireBufferForRaster( |
| 192 const Resource* resource) { | 164 const Resource* resource) { |
| 193 // RasterBuffer implementation depends on an image having been acquired for | |
| 194 // the resource. | |
| 195 resource_provider_->AcquireImage(resource->id()); | |
| 196 | |
| 197 return make_scoped_ptr<RasterBuffer>( | 165 return make_scoped_ptr<RasterBuffer>( |
| 198 new RasterBufferImpl(resource_provider_, resource)); | 166 new RasterBufferImpl(resource_provider_, resource)); |
| 199 } | 167 } |
| 200 | 168 |
| 201 void ZeroCopyRasterWorkerPool::ReleaseBufferForRaster( | 169 void BitmapRasterWorkerPool::ReleaseBufferForRaster( |
| 202 scoped_ptr<RasterBuffer> buffer) { | 170 scoped_ptr<RasterBuffer> buffer) { |
| 203 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 171 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
| 204 } | 172 } |
| 205 | 173 |
| 206 void ZeroCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 174 void BitmapRasterWorkerPool::OnRasterFinished(TaskSet task_set) { |
| 207 TRACE_EVENT1( | 175 TRACE_EVENT1( |
| 208 "cc", "ZeroCopyRasterWorkerPool::OnRasterFinished", "task_set", task_set); | 176 "cc", "BitmapRasterWorkerPool::OnRasterFinished", "task_set", task_set); |
| 209 | 177 |
| 210 DCHECK(raster_pending_[task_set]); | 178 DCHECK(raster_pending_[task_set]); |
| 211 raster_pending_[task_set] = false; | 179 raster_pending_[task_set] = false; |
| 212 if (raster_pending_.any()) { | 180 if (raster_pending_.any()) { |
| 213 TRACE_EVENT_ASYNC_STEP_INTO1( | 181 TRACE_EVENT_ASYNC_STEP_INTO1( |
| 214 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 182 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); |
| 215 } else { | 183 } else { |
| 216 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); | 184 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
| 217 } | 185 } |
| 218 client_->DidFinishRunningTasks(task_set); | 186 client_->DidFinishRunningTasks(task_set); |
| 219 } | 187 } |
| 220 | 188 |
| 221 scoped_refptr<base::debug::ConvertableToTraceFormat> | 189 scoped_refptr<base::debug::ConvertableToTraceFormat> |
| 222 ZeroCopyRasterWorkerPool::StateAsValue() const { | 190 BitmapRasterWorkerPool::StateAsValue() const { |
| 223 scoped_refptr<base::debug::TracedValue> state = | 191 scoped_refptr<base::debug::TracedValue> state = |
| 224 new base::debug::TracedValue(); | 192 new base::debug::TracedValue(); |
| 225 | 193 |
| 226 state->BeginArray("tasks_pending"); | 194 state->BeginArray("tasks_pending"); |
| 227 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) | 195 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) |
| 228 state->AppendBoolean(raster_pending_[task_set]); | 196 state->AppendBoolean(raster_pending_[task_set]); |
| 229 state->EndArray(); | 197 state->EndArray(); |
| 230 return state; | 198 return state; |
| 231 } | 199 } |
| 232 | 200 |
| 233 } // namespace cc | 201 } // namespace cc |
| OLD | NEW |