Alter gpu veto

This CL unifies the treatment of the dashed and concave paths.

Before:
TP 28 FP 15 TN 8 FN 3 IND 3

After:
TP 28 FP 18 TN 7 FN 2 IND 2

One of the TrueNegatives that became a FalsePositive was the motivation use case (the Chromium busy spinner).

Committed: https://skia.googlesource.com/skia/+/87a6a8e18c7d5bbc94f478b44c53dc0e0549f927

Review URL: https://codereview.chromium.org/875913002
This commit is contained in:
robertphillips 2015-01-26 11:29:36 -08:00 committed by Commit bot
parent 1d9e80f02b
commit 98b0315ad6
2 changed files with 22 additions and 24 deletions

View File

@ -239,31 +239,22 @@ SkPicture::Analysis::Analysis(const SkRecord& record) {
bool SkPicture::Analysis::suitableForGpuRasterization(const char** reason, bool SkPicture::Analysis::suitableForGpuRasterization(const char** reason,
int sampleCount) const { int sampleCount) const {
// TODO: the heuristic used here needs to be refined // TODO: the heuristic used here needs to be refined
static const int kNumPaintWithPathEffectsUsesTol = 1; static const int kNumSlowPathsTol = 6;
static const int kNumAAConcavePathsTol = 5;
int numNonDashedPathEffects = fNumPaintWithPathEffectUses - int numSlowPathDashedPaths = fNumPaintWithPathEffectUses;
fNumFastPathDashEffects; if (0 == sampleCount) {
bool suitableForDash = (0 == fNumPaintWithPathEffectUses) || // The fast dashing path only works when MSAA is disabled
(numNonDashedPathEffects < kNumPaintWithPathEffectsUsesTol numSlowPathDashedPaths -= fNumFastPathDashEffects;
&& 0 == sampleCount); }
bool ret = suitableForDash && int numSlowPaths = fNumAAConcavePaths -
(fNumAAConcavePaths - fNumAAHairlineConcavePaths - fNumAADFEligibleConcavePaths) fNumAAHairlineConcavePaths -
< kNumAAConcavePathsTol; fNumAADFEligibleConcavePaths;
bool ret = numSlowPathDashedPaths + numSlowPaths < kNumSlowPathsTol;
if (!ret && reason) { if (!ret && reason) {
if (!suitableForDash) { *reason = "Too many slow paths (either concave or dashed).";
if (0 != sampleCount) {
*reason = "Can't use multisample on dash effect.";
} else {
*reason = "Too many non dashed path effects.";
}
} else if ((fNumAAConcavePaths - fNumAAHairlineConcavePaths - fNumAADFEligibleConcavePaths)
>= kNumAAConcavePathsTol)
*reason = "Too many anti-aliased concave paths.";
else
*reason = "Unknown reason for GPU unsuitability.";
} }
return ret; return ret;
} }

View File

@ -140,7 +140,9 @@ static void test_gpu_veto(skiatest::Reporter* reporter) {
paint.setStyle(SkPaint::kStroke_Style); paint.setStyle(SkPaint::kStroke_Style);
paint.setPathEffect(dash); paint.setPathEffect(dash);
canvas->drawPath(path, paint); for (int i = 0; i < 50; ++i) {
canvas->drawPath(path, paint);
}
} }
SkAutoTUnref<SkPicture> picture(recorder.endRecording()); SkAutoTUnref<SkPicture> picture(recorder.endRecording());
// path effects currently render an SkPicture undesireable for GPU rendering // path effects currently render an SkPicture undesireable for GPU rendering
@ -225,7 +227,10 @@ static void test_gpu_veto(skiatest::Reporter* reporter) {
paint.setPathEffect(pe)->unref(); paint.setPathEffect(pe)->unref();
SkPoint points [2] = { { 0, 0 }, { 100, 0 } }; SkPoint points [2] = { { 0, 0 }, { 100, 0 } };
canvas->drawPoints(SkCanvas::kLines_PointMode, 2, points, paint);
for (int i = 0; i < 50; ++i) {
canvas->drawPoints(SkCanvas::kLines_PointMode, 2, points, paint);
}
} }
picture.reset(recorder.endRecording()); picture.reset(recorder.endRecording());
// fast-path dashed effects are fine for GPU rendering ... // fast-path dashed effects are fine for GPU rendering ...
@ -238,7 +243,9 @@ static void test_gpu_veto(skiatest::Reporter* reporter) {
SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25); SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25);
paint.setPathEffect(pe)->unref(); paint.setPathEffect(pe)->unref();
canvas->drawRect(SkRect::MakeWH(10, 10), paint); for (int i = 0; i < 50; ++i) {
canvas->drawRect(SkRect::MakeWH(10, 10), paint);
}
} }
picture.reset(recorder.endRecording()); picture.reset(recorder.endRecording());
// ... but only when applied to drawPoint() calls // ... but only when applied to drawPoint() calls