OLD | NEW |
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_pile.h" | 5 #include "cc/resources/picture_pile.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "cc/base/region.h" | 11 #include "cc/base/region.h" |
12 #include "cc/resources/picture_pile_impl.h" | 12 #include "cc/resources/picture_pile_impl.h" |
13 #include "cc/resources/tile_task_worker_pool.h" | |
14 #include "skia/ext/analysis_canvas.h" | 13 #include "skia/ext/analysis_canvas.h" |
15 | 14 |
16 namespace { | 15 namespace { |
17 // Layout pixel buffer around the visible layer rect to record. Any base | 16 // Layout pixel buffer around the visible layer rect to record. Any base |
18 // picture that intersects the visible layer rect expanded by this distance | 17 // picture that intersects the visible layer rect expanded by this distance |
19 // will be recorded. | 18 // will be recorded. |
20 const int kPixelDistanceToRecord = 8000; | 19 const int kPixelDistanceToRecord = 8000; |
21 // We don't perform solid color analysis on images that have more than 10 skia | 20 // We don't perform solid color analysis on images that have more than 10 skia |
22 // operations. | 21 // operations. |
23 const int kOpCountThatIsOkToAnalyze = 10; | 22 const int kOpCountThatIsOkToAnalyze = 10; |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 #endif | 158 #endif |
160 | 159 |
161 } // namespace | 160 } // namespace |
162 | 161 |
163 namespace cc { | 162 namespace cc { |
164 | 163 |
165 PicturePile::PicturePile(float min_contents_scale, | 164 PicturePile::PicturePile(float min_contents_scale, |
166 const gfx::Size& tile_grid_size) | 165 const gfx::Size& tile_grid_size) |
167 : min_contents_scale_(0), | 166 : min_contents_scale_(0), |
168 slow_down_raster_scale_factor_for_debug_(0), | 167 slow_down_raster_scale_factor_for_debug_(0), |
| 168 gather_pixel_refs_(false), |
169 has_any_recordings_(false), | 169 has_any_recordings_(false), |
170 clear_canvas_with_debug_color_(kDefaultClearCanvasSetting), | 170 clear_canvas_with_debug_color_(kDefaultClearCanvasSetting), |
171 requires_clear_(true), | 171 requires_clear_(true), |
172 is_solid_color_(false), | 172 is_solid_color_(false), |
173 solid_color_(SK_ColorTRANSPARENT), | 173 solid_color_(SK_ColorTRANSPARENT), |
174 background_color_(SK_ColorTRANSPARENT), | 174 background_color_(SK_ColorTRANSPARENT), |
175 pixel_record_distance_(kPixelDistanceToRecord), | 175 pixel_record_distance_(kPixelDistanceToRecord), |
176 is_suitable_for_gpu_rasterization_(true) { | 176 is_suitable_for_gpu_rasterization_(true) { |
177 tiling_.SetMaxTextureSize(gfx::Size(kBasePictureSize, kBasePictureSize)); | 177 tiling_.SetMaxTextureSize(gfx::Size(kBasePictureSize, kBasePictureSize)); |
178 SetMinContentsScale(min_contents_scale); | 178 SetMinContentsScale(min_contents_scale); |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 | 532 |
533 void PicturePile::CreatePictures(ContentLayerClient* painter, | 533 void PicturePile::CreatePictures(ContentLayerClient* painter, |
534 RecordingSource::RecordingMode recording_mode, | 534 RecordingSource::RecordingMode recording_mode, |
535 const std::vector<gfx::Rect>& record_rects) { | 535 const std::vector<gfx::Rect>& record_rects) { |
536 for (const auto& record_rect : record_rects) { | 536 for (const auto& record_rect : record_rects) { |
537 gfx::Rect padded_record_rect = PadRect(record_rect); | 537 gfx::Rect padded_record_rect = PadRect(record_rect); |
538 | 538 |
539 int repeat_count = std::max(1, slow_down_raster_scale_factor_for_debug_); | 539 int repeat_count = std::max(1, slow_down_raster_scale_factor_for_debug_); |
540 scoped_refptr<Picture> picture; | 540 scoped_refptr<Picture> picture; |
541 | 541 |
542 // Note: Currently, gathering of pixel refs when using a single | |
543 // raster thread doesn't provide any benefit. This might change | |
544 // in the future but we avoid it for now to reduce the cost of | |
545 // Picture::Create. | |
546 bool gather_pixel_refs = TileTaskWorkerPool::GetNumWorkerThreads() > 1; | |
547 | |
548 for (int i = 0; i < repeat_count; i++) { | 542 for (int i = 0; i < repeat_count; i++) { |
549 picture = Picture::Create(padded_record_rect, painter, tile_grid_size_, | 543 picture = Picture::Create(padded_record_rect, painter, tile_grid_size_, |
550 gather_pixel_refs, recording_mode); | 544 gather_pixel_refs_, recording_mode); |
551 // Note the '&&' with previous is-suitable state. | 545 // Note the '&&' with previous is-suitable state. |
552 // This means that once a picture-pile becomes unsuitable for gpu | 546 // This means that once a picture-pile becomes unsuitable for gpu |
553 // rasterization due to some content, it will continue to be unsuitable | 547 // rasterization due to some content, it will continue to be unsuitable |
554 // even if that content is replaced by gpu-friendly content. | 548 // even if that content is replaced by gpu-friendly content. |
555 // This is an optimization to avoid iterating though all pictures in | 549 // This is an optimization to avoid iterating though all pictures in |
556 // the pile after each invalidation. | 550 // the pile after each invalidation. |
557 if (is_suitable_for_gpu_rasterization_) { | 551 if (is_suitable_for_gpu_rasterization_) { |
558 const char* reason = nullptr; | 552 const char* reason = nullptr; |
559 is_suitable_for_gpu_rasterization_ &= | 553 is_suitable_for_gpu_rasterization_ &= |
560 picture->IsSuitableForGpuRasterization(&reason); | 554 picture->IsSuitableForGpuRasterization(&reason); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 int buffer_pixels = static_cast<int>(ceil(1 / min_contents_scale) - 1); | 610 int buffer_pixels = static_cast<int>(ceil(1 / min_contents_scale) - 1); |
617 buffer_pixels = std::max(0, buffer_pixels); | 611 buffer_pixels = std::max(0, buffer_pixels); |
618 SetBufferPixels(buffer_pixels); | 612 SetBufferPixels(buffer_pixels); |
619 min_contents_scale_ = min_contents_scale; | 613 min_contents_scale_ = min_contents_scale; |
620 } | 614 } |
621 | 615 |
622 void PicturePile::SetSlowdownRasterScaleFactor(int factor) { | 616 void PicturePile::SetSlowdownRasterScaleFactor(int factor) { |
623 slow_down_raster_scale_factor_for_debug_ = factor; | 617 slow_down_raster_scale_factor_for_debug_ = factor; |
624 } | 618 } |
625 | 619 |
| 620 void PicturePile::SetGatherPixelRefs(bool gather_pixel_refs) { |
| 621 gather_pixel_refs_ = gather_pixel_refs; |
| 622 } |
| 623 |
626 void PicturePile::SetBackgroundColor(SkColor background_color) { | 624 void PicturePile::SetBackgroundColor(SkColor background_color) { |
627 background_color_ = background_color; | 625 background_color_ = background_color; |
628 } | 626 } |
629 | 627 |
630 void PicturePile::SetRequiresClear(bool requires_clear) { | 628 void PicturePile::SetRequiresClear(bool requires_clear) { |
631 requires_clear_ = requires_clear; | 629 requires_clear_ = requires_clear; |
632 } | 630 } |
633 | 631 |
634 bool PicturePile::IsSuitableForGpuRasterization() const { | 632 bool PicturePile::IsSuitableForGpuRasterization() const { |
635 return is_suitable_for_gpu_rasterization_; | 633 return is_suitable_for_gpu_rasterization_; |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 const Picture* PicturePile::PictureInfo::GetPicture() const { | 770 const Picture* PicturePile::PictureInfo::GetPicture() const { |
773 return picture_.get(); | 771 return picture_.get(); |
774 } | 772 } |
775 | 773 |
776 float PicturePile::PictureInfo::GetInvalidationFrequency() const { | 774 float PicturePile::PictureInfo::GetInvalidationFrequency() const { |
777 return invalidation_history_.count() / | 775 return invalidation_history_.count() / |
778 static_cast<float>(INVALIDATION_FRAMES_TRACKED); | 776 static_cast<float>(INVALIDATION_FRAMES_TRACKED); |
779 } | 777 } |
780 | 778 |
781 } // namespace cc | 779 } // namespace cc |
OLD | NEW |