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

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

Issue 63443003: cc: Combine analysis and raster (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/raster_worker_pool.h" 5 #include "cc/resources/raster_worker_pool.h"
6 6
7 #include "base/json/json_writer.h" 7 #include "base/json/json_writer.h"
8 #include "base/metrics/histogram.h" 8 #include "base/metrics/histogram.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 #include "cc/debug/devtools_instrumentation.h" 10 #include "cc/debug/devtools_instrumentation.h"
(...skipping 13 matching lines...) Expand all
24 public: 24 public:
25 explicit IdentityAllocator(void* buffer) : buffer_(buffer) {} 25 explicit IdentityAllocator(void* buffer) : buffer_(buffer) {}
26 virtual bool allocPixelRef(SkBitmap* dst, SkColorTable*) OVERRIDE { 26 virtual bool allocPixelRef(SkBitmap* dst, SkColorTable*) OVERRIDE {
27 dst->setPixels(buffer_); 27 dst->setPixels(buffer_);
28 return true; 28 return true;
29 } 29 }
30 private: 30 private:
31 void* buffer_; 31 void* buffer_;
32 }; 32 };
33 33
34 // Flag to indicate whether we should try and detect that
35 // a tile is of solid color.
36 const bool kUseColorEstimator = true;
enne (OOO) 2013/11/07 00:58:18 This no longer seemed useful, so I removed it.
37
38 class DisableLCDTextFilter : public SkDrawFilter { 34 class DisableLCDTextFilter : public SkDrawFilter {
39 public: 35 public:
40 // SkDrawFilter interface. 36 // SkDrawFilter interface.
41 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE { 37 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE {
42 if (type != SkDrawFilter::kText_Type) 38 if (type != SkDrawFilter::kText_Type)
43 return true; 39 return true;
44 40
45 paint->setLCDRenderText(false); 41 paint->setLCDRenderText(false);
46 return true; 42 return true;
47 } 43 }
(...skipping 18 matching lines...) Expand all
66 content_rect_(content_rect), 62 content_rect_(content_rect),
67 contents_scale_(contents_scale), 63 contents_scale_(contents_scale),
68 raster_mode_(raster_mode), 64 raster_mode_(raster_mode),
69 tile_resolution_(tile_resolution), 65 tile_resolution_(tile_resolution),
70 layer_id_(layer_id), 66 layer_id_(layer_id),
71 tile_id_(tile_id), 67 tile_id_(tile_id),
72 source_frame_number_(source_frame_number), 68 source_frame_number_(source_frame_number),
73 rendering_stats_(rendering_stats), 69 rendering_stats_(rendering_stats),
74 reply_(reply) {} 70 reply_(reply) {}
75 71
76 void RunAnalysisOnThread(unsigned thread_index) {
77 TRACE_EVENT1("cc",
78 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread",
79 "data",
80 TracedValue::FromValue(DataAsValue().release()));
81
82 DCHECK(picture_pile_.get());
83 DCHECK(rendering_stats_);
84
85 PicturePileImpl* picture_clone =
86 picture_pile_->GetCloneForDrawingOnThread(thread_index);
87
88 DCHECK(picture_clone);
89
90 picture_clone->AnalyzeInRect(content_rect_, contents_scale_, &analysis_);
91
92 // Record the solid color prediction.
93 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed",
94 analysis_.is_solid_color);
95
96 // Clear the flag if we're not using the estimator.
97 analysis_.is_solid_color &= kUseColorEstimator;
98 }
99
100 bool RunRasterOnThread(unsigned thread_index, 72 bool RunRasterOnThread(unsigned thread_index,
101 void* buffer, 73 void* buffer,
102 gfx::Size size, 74 gfx::Size size,
103 int stride) { 75 int stride) {
104 TRACE_EVENT2( 76 TRACE_EVENT2(
105 "cc", "RasterWorkerPoolTaskImpl::RunRasterOnThread", 77 "cc", "RasterWorkerPoolTaskImpl::RunRasterOnThread",
106 "data", 78 "data",
107 TracedValue::FromValue(DataAsValue().release()), 79 TracedValue::FromValue(DataAsValue().release()),
108 "raster_mode", 80 "raster_mode",
109 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release())); 81 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release()));
110 82
111 devtools_instrumentation::ScopedLayerTask raster_task( 83 devtools_instrumentation::ScopedLayerTask raster_task(
112 devtools_instrumentation::kRasterTask, layer_id_); 84 devtools_instrumentation::kRasterTask, layer_id_);
113 85
114 DCHECK(picture_pile_.get()); 86 DCHECK(picture_pile_.get());
115 DCHECK(buffer); 87 DCHECK(buffer);
116 88
117 if (analysis_.is_solid_color)
118 return false;
119
120 PicturePileImpl* picture_clone = 89 PicturePileImpl* picture_clone =
121 picture_pile_->GetCloneForDrawingOnThread(thread_index); 90 picture_pile_->GetCloneForDrawingOnThread(thread_index);
122 91
123 SkBitmap bitmap; 92 SkBitmap bitmap;
124 switch (resource()->format()) { 93 switch (resource()->format()) {
125 case RGBA_4444: 94 case RGBA_4444:
126 // Use the default stride if we will eventually convert this 95 // Use the default stride if we will eventually convert this
127 // bitmap to 4444. 96 // bitmap to 4444.
128 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 97 bitmap.setConfig(SkBitmap::kARGB_8888_Config,
129 size.width(), 98 size.width(),
130 size.height()); 99 size.height());
131 bitmap.allocPixels(); 100 bitmap.allocPixels();
132 break; 101 break;
133 case RGBA_8888: 102 case RGBA_8888:
134 case BGRA_8888: 103 case BGRA_8888:
135 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 104 bitmap.setConfig(SkBitmap::kARGB_8888_Config,
136 size.width(), 105 size.width(),
137 size.height(), 106 size.height(),
138 stride); 107 stride);
139 bitmap.setPixels(buffer); 108 bitmap.setPixels(buffer);
140 break; 109 break;
141 case LUMINANCE_8: 110 case LUMINANCE_8:
142 case RGB_565: 111 case RGB_565:
143 case ETC1: 112 case ETC1:
144 NOTREACHED(); 113 NOTREACHED();
145 break; 114 break;
146 } 115 }
147 116
148 SkBitmapDevice device(bitmap); 117 gfx::Rect analysis_rect(
149 SkCanvas canvas(&device); 118 picture_clone->AnalysisRectForRaster(content_rect_, contents_scale_));
119 skia::AnalysisDevice device(bitmap, analysis_rect);
120 skia::AnalysisCanvas canvas(&device);
121
150 skia::RefPtr<SkDrawFilter> draw_filter; 122 skia::RefPtr<SkDrawFilter> draw_filter;
151 switch (raster_mode_) { 123 switch (raster_mode_) {
152 case LOW_QUALITY_RASTER_MODE: 124 case LOW_QUALITY_RASTER_MODE:
153 draw_filter = skia::AdoptRef(new skia::PaintSimplifier); 125 draw_filter = skia::AdoptRef(new skia::PaintSimplifier);
154 break; 126 break;
155 case HIGH_QUALITY_NO_LCD_RASTER_MODE: 127 case HIGH_QUALITY_NO_LCD_RASTER_MODE:
156 draw_filter = skia::AdoptRef(new DisableLCDTextFilter); 128 draw_filter = skia::AdoptRef(new DisableLCDTextFilter);
157 break; 129 break;
158 case HIGH_QUALITY_RASTER_MODE: 130 case HIGH_QUALITY_RASTER_MODE:
159 break; 131 break;
(...skipping 25 matching lines...) Expand all
185 HISTOGRAM_CUSTOM_COUNTS( 157 HISTOGRAM_CUSTOM_COUNTS(
186 "Renderer4.PictureRasterTimeUS", 158 "Renderer4.PictureRasterTimeUS",
187 (current_rasterize_time - prev_rasterize_time).InMicroseconds(), 159 (current_rasterize_time - prev_rasterize_time).InMicroseconds(),
188 0, 160 0,
189 100000, 161 100000,
190 100); 162 100);
191 } 163 }
192 164
193 ChangeBitmapConfigIfNeeded(bitmap, buffer); 165 ChangeBitmapConfigIfNeeded(bitmap, buffer);
194 166
195 return true; 167 analysis_.is_solid_color = canvas.GetColorIfSolid(&analysis_.solid_color);
168 analysis_.has_text = canvas.HasText();
169
170 // Record the solid color prediction.
171 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed",
172 analysis_.is_solid_color);
173
174 return !analysis_.is_solid_color;
196 } 175 }
197 176
198 // Overridden from internal::RasterWorkerPoolTask: 177 // Overridden from internal::RasterWorkerPoolTask:
199 virtual bool RunOnWorkerThread(unsigned thread_index, 178 virtual bool RunOnWorkerThread(unsigned thread_index,
200 void* buffer, 179 void* buffer,
201 gfx::Size size, 180 gfx::Size size,
202 int stride) 181 int stride)
203 OVERRIDE { 182 OVERRIDE {
204 RunAnalysisOnThread(thread_index);
205 return RunRasterOnThread(thread_index, buffer, size, stride); 183 return RunRasterOnThread(thread_index, buffer, size, stride);
reveman 2013/11/07 15:36:31 A separate RunRasterOnThread function is not neces
enne (OOO) 2013/11/07 22:13:50 Done.
206 } 184 }
207 virtual void CompleteOnOriginThread() OVERRIDE { 185 virtual void CompleteOnOriginThread() OVERRIDE {
208 reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled()); 186 reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled());
209 } 187 }
210 188
211 protected: 189 protected:
212 virtual ~RasterWorkerPoolTaskImpl() {} 190 virtual ~RasterWorkerPoolTaskImpl() {}
213 191
214 private: 192 private:
215 scoped_ptr<base::Value> DataAsValue() const { 193 scoped_ptr<base::Value> DataAsValue() const {
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 564
587 internal::GraphNode* decode_node = CreateGraphNodeForTask( 565 internal::GraphNode* decode_node = CreateGraphNodeForTask(
588 decode_task, priority, graph); 566 decode_task, priority, graph);
589 decode_node->add_dependent(raster_node); 567 decode_node->add_dependent(raster_node);
590 } 568 }
591 569
592 return raster_node; 570 return raster_node;
593 } 571 }
594 572
595 } // namespace cc 573 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698