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

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

Issue 562833004: cc: Move RasterBuffer implementations from ResourceProvider to RasterWorkerPool implementations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase and fix gpu raster issue 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/image_copy_raster_worker_pool.h ('k') | cc/resources/image_raster_worker_pool.h » ('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 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/image_copy_raster_worker_pool.h" 5 #include "cc/resources/image_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/resource_pool.h" 14 #include "cc/resources/resource_pool.h"
14 #include "cc/resources/scoped_resource.h" 15 #include "cc/resources/scoped_resource.h"
15 #include "gpu/command_buffer/client/gles2_interface.h" 16 #include "gpu/command_buffer/client/gles2_interface.h"
17 #include "third_party/skia/include/utils/SkNullCanvas.h"
16 18
17 namespace cc { 19 namespace cc {
20 namespace {
21
22 class RasterBufferImpl : public RasterBuffer {
23 public:
24 RasterBufferImpl(ResourceProvider* resource_provider,
25 ResourcePool* resource_pool,
26 const Resource* resource)
27 : resource_provider_(resource_provider),
28 resource_pool_(resource_pool),
29 resource_(resource),
30 raster_resource_(resource_pool->AcquireResource(resource->size())),
31 buffer_(NULL),
32 stride_(0) {
33 // Acquire and map image for raster resource.
34 resource_provider_->AcquireImage(raster_resource_->id());
35 buffer_ = resource_provider_->MapImage(raster_resource_->id(), &stride_);
36 }
37
38 virtual ~RasterBufferImpl() {
39 // First unmap image for raster resource.
40 resource_provider_->UnmapImage(raster_resource_->id());
41
42 // Copy contents of raster resource to |resource_|.
43 resource_provider_->CopyResource(raster_resource_->id(), resource_->id());
44
45 // This RasterBuffer implementation provides direct access to the memory
46 // used by the GPU. Read lock fences are required to ensure that we're not
47 // trying to map a resource that is currently in-use by the GPU.
48 resource_provider_->EnableReadLockFences(raster_resource_->id());
49
50 // Return raster resource to pool so it can be used by another RasterBuffer
51 // instance.
52 resource_pool_->ReleaseResource(raster_resource_.Pass());
53 }
54
55 // Overridden from RasterBuffer:
56 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE {
57 if (!buffer_)
58 return skia::AdoptRef(SkCreateNullCanvas());
59
60 RasterWorkerPool::AcquireBitmapForBuffer(
61 &bitmap_, buffer_, resource_->format(), resource_->size(), stride_);
62 return skia::AdoptRef(new SkCanvas(bitmap_));
63 }
64 virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE {
65 if (!buffer_)
66 return;
67
68 RasterWorkerPool::ReleaseBitmapForBuffer(
69 &bitmap_, buffer_, resource_->format());
70 }
71
72 private:
73 ResourceProvider* resource_provider_;
74 ResourcePool* resource_pool_;
75 const Resource* resource_;
76 scoped_ptr<ScopedResource> raster_resource_;
77 uint8_t* buffer_;
78 int stride_;
79 SkBitmap bitmap_;
80
81 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
82 };
83
84 } // namespace
18 85
19 // static 86 // static
20 scoped_ptr<RasterWorkerPool> ImageCopyRasterWorkerPool::Create( 87 scoped_ptr<RasterWorkerPool> ImageCopyRasterWorkerPool::Create(
21 base::SequencedTaskRunner* task_runner, 88 base::SequencedTaskRunner* task_runner,
22 TaskGraphRunner* task_graph_runner, 89 TaskGraphRunner* task_graph_runner,
23 ContextProvider* context_provider, 90 ContextProvider* context_provider,
24 ResourceProvider* resource_provider, 91 ResourceProvider* resource_provider,
25 ResourcePool* resource_pool) { 92 ResourcePool* resource_pool) {
26 return make_scoped_ptr<RasterWorkerPool>( 93 return make_scoped_ptr<RasterWorkerPool>(
27 new ImageCopyRasterWorkerPool(task_runner, 94 new ImageCopyRasterWorkerPool(task_runner,
28 task_graph_runner, 95 task_graph_runner,
29 context_provider, 96 context_provider,
30 resource_provider, 97 resource_provider,
31 resource_pool)); 98 resource_pool));
32 } 99 }
33 100
34 ImageCopyRasterWorkerPool::ImageCopyRasterWorkerPool( 101 ImageCopyRasterWorkerPool::ImageCopyRasterWorkerPool(
35 base::SequencedTaskRunner* task_runner, 102 base::SequencedTaskRunner* task_runner,
36 TaskGraphRunner* task_graph_runner, 103 TaskGraphRunner* task_graph_runner,
37 ContextProvider* context_provider, 104 ContextProvider* context_provider,
38 ResourceProvider* resource_provider, 105 ResourceProvider* resource_provider,
39 ResourcePool* resource_pool) 106 ResourcePool* resource_pool)
40 : task_runner_(task_runner), 107 : task_runner_(task_runner),
41 task_graph_runner_(task_graph_runner), 108 task_graph_runner_(task_graph_runner),
42 namespace_token_(task_graph_runner->GetNamespaceToken()), 109 namespace_token_(task_graph_runner->GetNamespaceToken()),
43 context_provider_(context_provider), 110 context_provider_(context_provider),
44 resource_provider_(resource_provider), 111 resource_provider_(resource_provider),
45 resource_pool_(resource_pool), 112 resource_pool_(resource_pool),
46 has_performed_copy_since_last_flush_(false),
47 raster_finished_weak_ptr_factory_(this) { 113 raster_finished_weak_ptr_factory_(this) {
48 DCHECK(context_provider_); 114 DCHECK(context_provider_);
49 } 115 }
50 116
51 ImageCopyRasterWorkerPool::~ImageCopyRasterWorkerPool() { 117 ImageCopyRasterWorkerPool::~ImageCopyRasterWorkerPool() {
52 DCHECK_EQ(0u, raster_task_states_.size());
53 } 118 }
54 119
55 Rasterizer* ImageCopyRasterWorkerPool::AsRasterizer() { return this; } 120 Rasterizer* ImageCopyRasterWorkerPool::AsRasterizer() { return this; }
56 121
57 void ImageCopyRasterWorkerPool::SetClient(RasterizerClient* client) { 122 void ImageCopyRasterWorkerPool::SetClient(RasterizerClient* client) {
58 client_ = client; 123 client_ = client;
59 } 124 }
60 125
61 void ImageCopyRasterWorkerPool::Shutdown() { 126 void ImageCopyRasterWorkerPool::Shutdown() {
62 TRACE_EVENT0("cc", "ImageCopyRasterWorkerPool::Shutdown"); 127 TRACE_EVENT0("cc", "ImageCopyRasterWorkerPool::Shutdown");
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); 212 RasterizerTask* task = static_cast<RasterizerTask*>(it->get());
148 213
149 task->WillComplete(); 214 task->WillComplete();
150 task->CompleteOnOriginThread(this); 215 task->CompleteOnOriginThread(this);
151 task->DidComplete(); 216 task->DidComplete();
152 217
153 task->RunReplyOnOriginThread(); 218 task->RunReplyOnOriginThread();
154 } 219 }
155 completed_tasks_.clear(); 220 completed_tasks_.clear();
156 221
157 FlushCopies(); 222 context_provider_->ContextGL()->ShallowFlushCHROMIUM();
158 } 223 }
159 224
160 RasterBuffer* ImageCopyRasterWorkerPool::AcquireBufferForRaster( 225 scoped_ptr<RasterBuffer> ImageCopyRasterWorkerPool::AcquireBufferForRaster(
161 RasterTask* task) { 226 const Resource* resource) {
162 DCHECK_EQ(task->resource()->format(), resource_pool_->resource_format()); 227 DCHECK_EQ(resource->format(), resource_pool_->resource_format());
163 scoped_ptr<ScopedResource> resource( 228 return make_scoped_ptr<RasterBuffer>(
164 resource_pool_->AcquireResource(task->resource()->size())); 229 new RasterBufferImpl(resource_provider_, resource_pool_, resource));
165 RasterBuffer* raster_buffer =
166 resource_provider_->AcquireImageRasterBuffer(resource->id());
167 DCHECK(std::find_if(raster_task_states_.begin(),
168 raster_task_states_.end(),
169 RasterTaskState::TaskComparator(task)) ==
170 raster_task_states_.end());
171 raster_task_states_.push_back(RasterTaskState(task, resource.release()));
172 return raster_buffer;
173 } 230 }
174 231
175 void ImageCopyRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) { 232 void ImageCopyRasterWorkerPool::ReleaseBufferForRaster(
176 RasterTaskState::Vector::iterator it = 233 scoped_ptr<RasterBuffer> buffer) {
177 std::find_if(raster_task_states_.begin(), 234 // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
178 raster_task_states_.end(),
179 RasterTaskState::TaskComparator(task));
180 DCHECK(it != raster_task_states_.end());
181 scoped_ptr<ScopedResource> resource(it->resource);
182 std::swap(*it, raster_task_states_.back());
183 raster_task_states_.pop_back();
184
185 bool content_has_changed =
186 resource_provider_->ReleaseImageRasterBuffer(resource->id());
187
188 // |content_has_changed| can be false as result of task being canceled or
189 // task implementation deciding not to modify bitmap (ie. analysis of raster
190 // commands detected content as a solid color).
191 if (content_has_changed) {
192 resource_provider_->CopyResource(resource->id(), task->resource()->id());
193 has_performed_copy_since_last_flush_ = true;
194 }
195
196 resource_pool_->ReleaseResource(resource.Pass());
197 } 235 }
198 236
199 void ImageCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) { 237 void ImageCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) {
200 TRACE_EVENT1("cc", 238 TRACE_EVENT1("cc",
201 "ImageCopyRasterWorkerPool::OnRasterFinished", 239 "ImageCopyRasterWorkerPool::OnRasterFinished",
202 "task_set", 240 "task_set",
203 task_set); 241 task_set);
204 242
205 DCHECK(raster_pending_[task_set]); 243 DCHECK(raster_pending_[task_set]);
206 raster_pending_[task_set] = false; 244 raster_pending_[task_set] = false;
207 if (raster_pending_.any()) { 245 if (raster_pending_.any()) {
208 TRACE_EVENT_ASYNC_STEP_INTO1( 246 TRACE_EVENT_ASYNC_STEP_INTO1(
209 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); 247 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
210 } else { 248 } else {
211 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); 249 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
212 } 250 }
213 client_->DidFinishRunningTasks(task_set); 251 client_->DidFinishRunningTasks(task_set);
214 } 252 }
215 253
216 void ImageCopyRasterWorkerPool::FlushCopies() {
217 if (!has_performed_copy_since_last_flush_)
218 return;
219
220 context_provider_->ContextGL()->ShallowFlushCHROMIUM();
221 has_performed_copy_since_last_flush_ = false;
222 }
223
224 scoped_refptr<base::debug::ConvertableToTraceFormat> 254 scoped_refptr<base::debug::ConvertableToTraceFormat>
225 ImageCopyRasterWorkerPool::StateAsValue() const { 255 ImageCopyRasterWorkerPool::StateAsValue() const {
226 scoped_refptr<base::debug::TracedValue> state = 256 scoped_refptr<base::debug::TracedValue> state =
227 new base::debug::TracedValue(); 257 new base::debug::TracedValue();
228 258
229 state->BeginArray("tasks_pending"); 259 state->BeginArray("tasks_pending");
230 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) 260 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set)
231 state->AppendBoolean(raster_pending_[task_set]); 261 state->AppendBoolean(raster_pending_[task_set]);
232 state->EndArray(); 262 state->EndArray();
233 state->BeginDictionary("staging_state"); 263 state->BeginDictionary("staging_state");
(...skipping 10 matching lines...) Expand all
244 resource_pool_->total_memory_usage_bytes()); 274 resource_pool_->total_memory_usage_bytes());
245 staging_state->SetInteger("pending_copy_count", 275 staging_state->SetInteger("pending_copy_count",
246 resource_pool_->total_resource_count() - 276 resource_pool_->total_resource_count() -
247 resource_pool_->acquired_resource_count()); 277 resource_pool_->acquired_resource_count());
248 staging_state->SetInteger("bytes_pending_copy", 278 staging_state->SetInteger("bytes_pending_copy",
249 resource_pool_->total_memory_usage_bytes() - 279 resource_pool_->total_memory_usage_bytes() -
250 resource_pool_->acquired_memory_usage_bytes()); 280 resource_pool_->acquired_memory_usage_bytes());
251 } 281 }
252 282
253 } // namespace cc 283 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/image_copy_raster_worker_pool.h ('k') | cc/resources/image_raster_worker_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698