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

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

Issue 362073002: cc: Remove all traces of SkPicture cloning. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « cc/resources/picture.h ('k') | cc/resources/picture_layer_tiling.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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/picture.h" 5 #include "cc/resources/picture.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <set> 9 #include <set>
10 10
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 return false; 82 return false;
83 } 83 }
84 84
85 } // namespace 85 } // namespace
86 86
87 scoped_refptr<Picture> Picture::Create( 87 scoped_refptr<Picture> Picture::Create(
88 const gfx::Rect& layer_rect, 88 const gfx::Rect& layer_rect,
89 ContentLayerClient* client, 89 ContentLayerClient* client,
90 const SkTileGridFactory::TileGridInfo& tile_grid_info, 90 const SkTileGridFactory::TileGridInfo& tile_grid_info,
91 bool gather_pixel_refs, 91 bool gather_pixel_refs,
92 int num_raster_threads,
93 RecordingMode recording_mode) { 92 RecordingMode recording_mode) {
94 scoped_refptr<Picture> picture = make_scoped_refptr(new Picture(layer_rect)); 93 scoped_refptr<Picture> picture = make_scoped_refptr(new Picture(layer_rect));
95 94
96 picture->Record(client, tile_grid_info, recording_mode); 95 picture->Record(client, tile_grid_info, recording_mode);
97 if (gather_pixel_refs) 96 if (gather_pixel_refs)
98 picture->GatherPixelRefs(tile_grid_info); 97 picture->GatherPixelRefs(tile_grid_info);
99 picture->CloneForDrawing(num_raster_threads);
100 98
101 return picture; 99 return picture;
102 } 100 }
103 101
104 Picture::Picture(const gfx::Rect& layer_rect) 102 Picture::Picture(const gfx::Rect& layer_rect)
105 : layer_rect_(layer_rect), 103 : layer_rect_(layer_rect),
106 cell_size_(layer_rect.size()) { 104 cell_size_(layer_rect.size()) {
107 // Instead of recording a trace event for object creation here, we wait for 105 // Instead of recording a trace event for object creation here, we wait for
108 // the picture to be recorded in Picture::Record. 106 // the picture to be recorded in Picture::Record.
109 } 107 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 picture_(picture), 183 picture_(picture),
186 pixel_refs_(pixel_refs), 184 pixel_refs_(pixel_refs),
187 cell_size_(layer_rect.size()) { 185 cell_size_(layer_rect.size()) {
188 } 186 }
189 187
190 Picture::~Picture() { 188 Picture::~Picture() {
191 TRACE_EVENT_OBJECT_DELETED_WITH_ID( 189 TRACE_EVENT_OBJECT_DELETED_WITH_ID(
192 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::Picture", this); 190 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::Picture", this);
193 } 191 }
194 192
195 Picture* Picture::GetCloneForDrawingOnThread(unsigned thread_index) {
196 // We don't need clones to draw from multiple threads with SkRecord.
197 if (playback_) {
198 return this;
199 }
200
201 // SkPicture is not thread-safe to rasterize with, this returns a clone
202 // to rasterize with on a specific thread.
203 CHECK_GE(clones_.size(), thread_index);
204 return thread_index == clones_.size() ? this : clones_[thread_index].get();
205 }
206
207 bool Picture::IsSuitableForGpuRasterization() const { 193 bool Picture::IsSuitableForGpuRasterization() const {
208 DCHECK(picture_); 194 DCHECK(picture_);
209 195
210 // TODO(alokp): SkPicture::suitableForGpuRasterization needs a GrContext. 196 // TODO(alokp): SkPicture::suitableForGpuRasterization needs a GrContext.
211 // Ideally this GrContext should be the same as that for rasterizing this 197 // Ideally this GrContext should be the same as that for rasterizing this
212 // picture. But we are on the main thread while the rasterization context 198 // picture. But we are on the main thread while the rasterization context
213 // may be on the compositor or raster thread. 199 // may be on the compositor or raster thread.
214 // SkPicture::suitableForGpuRasterization is not implemented yet. 200 // SkPicture::suitableForGpuRasterization is not implemented yet.
215 // Pass a NULL context for now and discuss with skia folks if the context 201 // Pass a NULL context for now and discuss with skia folks if the context
216 // is really needed. 202 // is really needed.
217 return picture_->suitableForGpuRasterization(NULL); 203 return picture_->suitableForGpuRasterization(NULL);
218 } 204 }
219 205
220 bool Picture::HasText() const { 206 bool Picture::HasText() const {
221 DCHECK(picture_); 207 DCHECK(picture_);
222 return picture_->hasText(); 208 return picture_->hasText();
223 } 209 }
224 210
225 void Picture::CloneForDrawing(int num_threads) {
226 TRACE_EVENT1("cc", "Picture::CloneForDrawing", "num_threads", num_threads);
227
228 // We don't need clones to draw from multiple threads with SkRecord.
229 if (playback_) {
230 return;
231 }
232
233 DCHECK(picture_);
234 DCHECK(clones_.empty());
235
236 // We can re-use this picture for one raster worker thread.
237 raster_thread_checker_.DetachFromThread();
238
239 if (num_threads > 1) {
240 for (int i = 0; i < num_threads - 1; i++) {
241 scoped_refptr<Picture> clone =
242 new Picture(skia::AdoptRef(picture_->clone()),
243 layer_rect_,
244 opaque_rect_,
245 pixel_refs_);
246 clones_.push_back(clone);
247
248 clone->EmitTraceSnapshotAlias(this);
249 clone->raster_thread_checker_.DetachFromThread();
250 }
251 }
252 }
253
254 void Picture::Record(ContentLayerClient* painter, 211 void Picture::Record(ContentLayerClient* painter,
255 const SkTileGridFactory::TileGridInfo& tile_grid_info, 212 const SkTileGridFactory::TileGridInfo& tile_grid_info,
256 RecordingMode recording_mode) { 213 RecordingMode recording_mode) {
257 TRACE_EVENT2("cc", 214 TRACE_EVENT2("cc",
258 "Picture::Record", 215 "Picture::Record",
259 "data", 216 "data",
260 AsTraceableRecordData(), 217 AsTraceableRecordData(),
261 "recording_mode", 218 "recording_mode",
262 recording_mode); 219 recording_mode);
263 220
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 min_x = std::min(min_x, min.x()); 336 min_x = std::min(min_x, min.x());
380 min_y = std::min(min_y, min.y()); 337 min_y = std::min(min_y, min.y());
381 max_x = std::max(max_x, max.x()); 338 max_x = std::max(max_x, max.x());
382 max_y = std::max(max_y, max.y()); 339 max_y = std::max(max_y, max.y());
383 } 340 }
384 341
385 min_pixel_cell_ = gfx::Point(min_x, min_y); 342 min_pixel_cell_ = gfx::Point(min_x, min_y);
386 max_pixel_cell_ = gfx::Point(max_x, max_y); 343 max_pixel_cell_ = gfx::Point(max_x, max_y);
387 } 344 }
388 345
389 int Picture::Raster( 346 int Picture::Raster(SkCanvas* canvas,
390 SkCanvas* canvas, 347 SkDrawPictureCallback* callback,
391 SkDrawPictureCallback* callback, 348 const Region& negated_content_region,
392 const Region& negated_content_region, 349 float contents_scale) const {
393 float contents_scale) {
394 if (!playback_)
395 DCHECK(raster_thread_checker_.CalledOnValidThread());
396 TRACE_EVENT_BEGIN1( 350 TRACE_EVENT_BEGIN1(
397 "cc", 351 "cc",
398 "Picture::Raster", 352 "Picture::Raster",
399 "data", 353 "data",
400 AsTraceableRasterData(contents_scale)); 354 AsTraceableRasterData(contents_scale));
401 355
402 DCHECK(picture_); 356 DCHECK(picture_);
403 357
404 canvas->save(); 358 canvas->save();
405 359
(...skipping 10 matching lines...) Expand all
416 SkIRect bounds; 370 SkIRect bounds;
417 canvas->getClipDeviceBounds(&bounds); 371 canvas->getClipDeviceBounds(&bounds);
418 canvas->restore(); 372 canvas->restore();
419 TRACE_EVENT_END1( 373 TRACE_EVENT_END1(
420 "cc", "Picture::Raster", 374 "cc", "Picture::Raster",
421 "num_pixels_rasterized", bounds.width() * bounds.height()); 375 "num_pixels_rasterized", bounds.width() * bounds.height());
422 return bounds.width() * bounds.height(); 376 return bounds.width() * bounds.height();
423 } 377 }
424 378
425 void Picture::Replay(SkCanvas* canvas) { 379 void Picture::Replay(SkCanvas* canvas) {
426 if (!playback_)
427 DCHECK(raster_thread_checker_.CalledOnValidThread());
428 TRACE_EVENT_BEGIN0("cc", "Picture::Replay"); 380 TRACE_EVENT_BEGIN0("cc", "Picture::Replay");
429 DCHECK(picture_); 381 DCHECK(picture_);
430 382
431 if (playback_) { 383 if (playback_) {
432 playback_->draw(canvas); 384 playback_->draw(canvas);
433 } else { 385 } else {
434 picture_->draw(canvas); 386 picture_->draw(canvas);
435 } 387 }
436 SkIRect bounds; 388 SkIRect bounds;
437 canvas->getClipDeviceBounds(&bounds); 389 canvas->getClipDeviceBounds(&bounds);
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 scoped_refptr<base::debug::TracedValue> record_data = 556 scoped_refptr<base::debug::TracedValue> record_data =
605 new base::debug::TracedValue(); 557 new base::debug::TracedValue();
606 TracedValue::SetIDRef(this, record_data.get(), "picture_id"); 558 TracedValue::SetIDRef(this, record_data.get(), "picture_id");
607 record_data->BeginArray("layer_rect"); 559 record_data->BeginArray("layer_rect");
608 MathUtil::AddToTracedValue(layer_rect_, record_data.get()); 560 MathUtil::AddToTracedValue(layer_rect_, record_data.get());
609 record_data->EndArray(); 561 record_data->EndArray();
610 return record_data; 562 return record_data;
611 } 563 }
612 564
613 } // namespace cc 565 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/picture.h ('k') | cc/resources/picture_layer_tiling.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698