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

Side by Side Diff: tests/PictureTest.cpp

Issue 1974833003: SkPictureGpuAnalyzer (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: unneeded 'explicit' Created 4 years, 7 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
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkBBoxHierarchy.h" 8 #include "SkBBoxHierarchy.h"
9 #include "SkBlurImageFilter.h" 9 #include "SkBlurImageFilter.h"
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
11 #include "SkColorMatrixFilter.h" 11 #include "SkColorMatrixFilter.h"
12 #include "SkColorPriv.h" 12 #include "SkColorPriv.h"
13 #include "SkDashPathEffect.h" 13 #include "SkDashPathEffect.h"
14 #include "SkData.h" 14 #include "SkData.h"
15 #include "SkImageGenerator.h" 15 #include "SkImageGenerator.h"
16 #include "SkError.h" 16 #include "SkError.h"
17 #include "SkImageEncoder.h" 17 #include "SkImageEncoder.h"
18 #include "SkImageGenerator.h" 18 #include "SkImageGenerator.h"
19 #include "SkLayerInfo.h" 19 #include "SkLayerInfo.h"
20 #include "SkMD5.h" 20 #include "SkMD5.h"
21 #include "SkPaint.h" 21 #include "SkPaint.h"
22 #include "SkPicture.h" 22 #include "SkPicture.h"
23 #include "SkPictureAnalyzer.h"
23 #include "SkPictureRecorder.h" 24 #include "SkPictureRecorder.h"
24 #include "SkPictureUtils.h" 25 #include "SkPictureUtils.h"
25 #include "SkPixelRef.h" 26 #include "SkPixelRef.h"
26 #include "SkPixelSerializer.h" 27 #include "SkPixelSerializer.h"
27 #include "SkMiniRecorder.h" 28 #include "SkMiniRecorder.h"
28 #include "SkRRect.h" 29 #include "SkRRect.h"
29 #include "SkRandom.h" 30 #include "SkRandom.h"
30 #include "SkRecord.h" 31 #include "SkRecord.h"
31 #include "SkShader.h" 32 #include "SkShader.h"
32 #include "SkStream.h" 33 #include "SkStream.h"
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 paint.setPathEffect(dash); 152 paint.setPathEffect(dash);
152 153
153 for (int i = 0; i < 50; ++i) { 154 for (int i = 0; i < 50; ++i) {
154 canvas->drawPath(path, paint); 155 canvas->drawPath(path, paint);
155 } 156 }
156 } 157 }
157 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); 158 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
158 // path effects currently render an SkPicture undesireable for GPU rendering 159 // path effects currently render an SkPicture undesireable for GPU rendering
159 160
160 const char *reason = nullptr; 161 const char *reason = nullptr;
161 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr, &re ason)); 162 REPORTER_ASSERT(reporter,
163 !SkPictureGpuAnalyzer(picture).suitableForGpuRasterization(nullptr, &rea son));
162 REPORTER_ASSERT(reporter, reason); 164 REPORTER_ASSERT(reporter, reason);
163 165
164 canvas = recorder.beginRecording(100, 100); 166 canvas = recorder.beginRecording(100, 100);
165 { 167 {
166 SkPath path; 168 SkPath path;
167 169
168 path.moveTo(0, 0); 170 path.moveTo(0, 0);
169 path.lineTo(0, 50); 171 path.lineTo(0, 50);
170 path.lineTo(25, 25); 172 path.lineTo(25, 25);
171 path.lineTo(50, 50); 173 path.lineTo(50, 50);
172 path.lineTo(50, 0); 174 path.lineTo(50, 0);
173 path.close(); 175 path.close();
174 REPORTER_ASSERT(reporter, !path.isConvex()); 176 REPORTER_ASSERT(reporter, !path.isConvex());
175 177
176 SkPaint paint; 178 SkPaint paint;
177 paint.setAntiAlias(true); 179 paint.setAntiAlias(true);
178 for (int i = 0; i < 50; ++i) { 180 for (int i = 0; i < 50; ++i) {
179 canvas->drawPath(path, paint); 181 canvas->drawPath(path, paint);
180 } 182 }
181 } 183 }
182 picture = recorder.finishRecordingAsPicture(); 184 picture = recorder.finishRecordingAsPicture();
183 // A lot of small AA concave paths should be fine for GPU rendering 185 // A lot of small AA concave paths should be fine for GPU rendering
184 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr)); 186 REPORTER_ASSERT(reporter, SkPictureGpuAnalyzer(picture).suitableForGpuRaster ization(nullptr));
185 187
186 canvas = recorder.beginRecording(100, 100); 188 canvas = recorder.beginRecording(100, 100);
187 { 189 {
188 SkPath path; 190 SkPath path;
189 191
190 path.moveTo(0, 0); 192 path.moveTo(0, 0);
191 path.lineTo(0, 100); 193 path.lineTo(0, 100);
192 path.lineTo(50, 50); 194 path.lineTo(50, 50);
193 path.lineTo(100, 100); 195 path.lineTo(100, 100);
194 path.lineTo(100, 0); 196 path.lineTo(100, 0);
195 path.close(); 197 path.close();
196 REPORTER_ASSERT(reporter, !path.isConvex()); 198 REPORTER_ASSERT(reporter, !path.isConvex());
197 199
198 SkPaint paint; 200 SkPaint paint;
199 paint.setAntiAlias(true); 201 paint.setAntiAlias(true);
200 for (int i = 0; i < 50; ++i) { 202 for (int i = 0; i < 50; ++i) {
201 canvas->drawPath(path, paint); 203 canvas->drawPath(path, paint);
202 } 204 }
203 } 205 }
204 picture = recorder.finishRecordingAsPicture(); 206 picture = recorder.finishRecordingAsPicture();
205 // A lot of large AA concave paths currently render an SkPicture undesireabl e for GPU rendering 207 // A lot of large AA concave paths currently render an SkPicture undesireabl e for GPU rendering
206 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr)); 208 REPORTER_ASSERT(reporter, !SkPictureGpuAnalyzer(picture).suitableForGpuRaste rization(nullptr));
207 209
208 canvas = recorder.beginRecording(100, 100); 210 canvas = recorder.beginRecording(100, 100);
209 { 211 {
210 SkPath path; 212 SkPath path;
211 213
212 path.moveTo(0, 0); 214 path.moveTo(0, 0);
213 path.lineTo(0, 50); 215 path.lineTo(0, 50);
214 path.lineTo(25, 25); 216 path.lineTo(25, 25);
215 path.lineTo(50, 50); 217 path.lineTo(50, 50);
216 path.lineTo(50, 0); 218 path.lineTo(50, 0);
217 path.close(); 219 path.close();
218 REPORTER_ASSERT(reporter, !path.isConvex()); 220 REPORTER_ASSERT(reporter, !path.isConvex());
219 221
220 SkPaint paint; 222 SkPaint paint;
221 paint.setAntiAlias(true); 223 paint.setAntiAlias(true);
222 paint.setStyle(SkPaint::kStroke_Style); 224 paint.setStyle(SkPaint::kStroke_Style);
223 paint.setStrokeWidth(0); 225 paint.setStrokeWidth(0);
224 for (int i = 0; i < 50; ++i) { 226 for (int i = 0; i < 50; ++i) {
225 canvas->drawPath(path, paint); 227 canvas->drawPath(path, paint);
226 } 228 }
227 } 229 }
228 picture = recorder.finishRecordingAsPicture(); 230 picture = recorder.finishRecordingAsPicture();
229 // hairline stroked AA concave paths are fine for GPU rendering 231 // hairline stroked AA concave paths are fine for GPU rendering
230 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr)); 232 REPORTER_ASSERT(reporter, SkPictureGpuAnalyzer(picture).suitableForGpuRaster ization(nullptr));
231 233
232 canvas = recorder.beginRecording(100, 100); 234 canvas = recorder.beginRecording(100, 100);
233 { 235 {
234 SkPaint paint; 236 SkPaint paint;
235 SkScalar intervals [] = { 10, 20 }; 237 SkScalar intervals [] = { 10, 20 };
236 paint.setPathEffect(SkDashPathEffect::Make(intervals, 2, 25)); 238 paint.setPathEffect(SkDashPathEffect::Make(intervals, 2, 25));
237 239
238 SkPoint points [2] = { { 0, 0 }, { 100, 0 } }; 240 SkPoint points [2] = { { 0, 0 }, { 100, 0 } };
239 241
240 for (int i = 0; i < 50; ++i) { 242 for (int i = 0; i < 50; ++i) {
241 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, points, paint); 243 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, points, paint);
242 } 244 }
243 } 245 }
244 picture = recorder.finishRecordingAsPicture(); 246 picture = recorder.finishRecordingAsPicture();
245 // fast-path dashed effects are fine for GPU rendering ... 247 // fast-path dashed effects are fine for GPU rendering ...
246 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr)); 248 REPORTER_ASSERT(reporter, SkPictureGpuAnalyzer(picture).suitableForGpuRaster ization(nullptr));
247 249
248 canvas = recorder.beginRecording(100, 100); 250 canvas = recorder.beginRecording(100, 100);
249 { 251 {
250 SkPaint paint; 252 SkPaint paint;
251 SkScalar intervals [] = { 10, 20 }; 253 SkScalar intervals [] = { 10, 20 };
252 paint.setPathEffect(SkDashPathEffect::Make(intervals, 2, 25)); 254 paint.setPathEffect(SkDashPathEffect::Make(intervals, 2, 25));
253 255
254 for (int i = 0; i < 50; ++i) { 256 for (int i = 0; i < 50; ++i) {
255 canvas->drawRect(SkRect::MakeWH(10, 10), paint); 257 canvas->drawRect(SkRect::MakeWH(10, 10), paint);
256 } 258 }
257 } 259 }
258 picture = recorder.finishRecordingAsPicture(); 260 picture = recorder.finishRecordingAsPicture();
259 // ... but only when applied to drawPoint() calls 261 // ... but only when applied to drawPoint() calls
260 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr)); 262 REPORTER_ASSERT(reporter, !SkPictureGpuAnalyzer(picture).suitableForGpuRaste rization(nullptr));
261 263
262 // Nest the previous picture inside a new one. 264 // Nest the previous picture inside a new one.
263 canvas = recorder.beginRecording(100, 100); 265 canvas = recorder.beginRecording(100, 100);
264 { 266 {
265 canvas->drawPicture(picture.get()); 267 canvas->drawPicture(picture);
266 } 268 }
267 picture = recorder.finishRecordingAsPicture(); 269 picture = recorder.finishRecordingAsPicture();
268 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr)); 270 REPORTER_ASSERT(reporter, !SkPictureGpuAnalyzer(picture).suitableForGpuRaste rization(nullptr));
269 } 271 }
270 272
271 #endif 273 #endif
272 274
273 static void test_savelayer_extraction(skiatest::Reporter* reporter) { 275 static void test_savelayer_extraction(skiatest::Reporter* reporter) {
274 static const int kWidth = 100; 276 static const int kWidth = 100;
275 static const int kHeight = 100; 277 static const int kHeight = 100;
276 278
277 // Create complex paint that the bounding box computation code can't 279 // Create complex paint that the bounding box computation code can't
278 // optimize away 280 // optimize away
(...skipping 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after
1339 1341
1340 SkAutoTDelete<SkStream> rstream(wstream.detachAsStream()); 1342 SkAutoTDelete<SkStream> rstream(wstream.detachAsStream());
1341 sk_sp<SkPicture> deserializedPicture(SkPicture::MakeFromStream(rstream)); 1343 sk_sp<SkPicture> deserializedPicture(SkPicture::MakeFromStream(rstream));
1342 1344
1343 REPORTER_ASSERT(r, deserializedPicture != nullptr); 1345 REPORTER_ASSERT(r, deserializedPicture != nullptr);
1344 REPORTER_ASSERT(r, deserializedPicture->cullRect().left() == 1); 1346 REPORTER_ASSERT(r, deserializedPicture->cullRect().left() == 1);
1345 REPORTER_ASSERT(r, deserializedPicture->cullRect().top() == 2); 1347 REPORTER_ASSERT(r, deserializedPicture->cullRect().top() == 2);
1346 REPORTER_ASSERT(r, deserializedPicture->cullRect().right() == 3); 1348 REPORTER_ASSERT(r, deserializedPicture->cullRect().right() == 3);
1347 REPORTER_ASSERT(r, deserializedPicture->cullRect().bottom() == 4); 1349 REPORTER_ASSERT(r, deserializedPicture->cullRect().bottom() == 4);
1348 } 1350 }
1351
1352 DEF_TEST(PictureGpuAnalyzer, r) {
1353 SkPictureRecorder recorder;
1354
1355 {
1356 SkCanvas* canvas = recorder.beginRecording(10, 10);
1357 SkPaint paint;
1358 SkScalar intervals [] = { 10, 20 };
1359 paint.setPathEffect(SkDashPathEffect::Make(intervals, 2, 25));
1360
1361 for (int i = 0; i < 50; ++i) {
1362 canvas->drawRect(SkRect::MakeWH(10, 10), paint);
1363 }
1364 }
1365 sk_sp<SkPicture> vetoPicture(recorder.finishRecordingAsPicture());
1366
1367 SkPictureGpuAnalyzer analyzer;
1368 REPORTER_ASSERT(r, analyzer.suitableForGpuRasterization(nullptr));
1369
1370 analyzer.analyze(vetoPicture.get());
1371 REPORTER_ASSERT(r, !analyzer.suitableForGpuRasterization(nullptr));
1372
1373 analyzer.reset();
1374 REPORTER_ASSERT(r, analyzer.suitableForGpuRasterization(nullptr));
1375
1376 recorder.beginRecording(10, 10)->drawPicture(vetoPicture);
1377 sk_sp<SkPicture> nestedVetoPicture(recorder.finishRecordingAsPicture());
1378
1379 analyzer.analyze(nestedVetoPicture.get());
1380 REPORTER_ASSERT(r, !analyzer.suitableForGpuRasterization(nullptr));
1381 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698