Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: cc/resources/bitmap_raster_worker_pool.cc

Issue 602493003: cc: Add BitmapRasterWorkerPool. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@reduce-transfer-buffer-limit-use
Patch Set: fix unit test Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/resources/bitmap_raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_perftest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « cc/resources/bitmap_raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698