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,
int sampleCount) const {
// TODO: the heuristic used here needs to be refined
static const int kNumPaintWithPathEffectsUsesTol = 1;
static const int kNumAAConcavePathsTol = 5;
static const int kNumSlowPathsTol = 6;
int numNonDashedPathEffects = fNumPaintWithPathEffectUses -
fNumFastPathDashEffects;
bool suitableForDash = (0 == fNumPaintWithPathEffectUses) ||
(numNonDashedPathEffects < kNumPaintWithPathEffectsUsesTol
&& 0 == sampleCount);
int numSlowPathDashedPaths = fNumPaintWithPathEffectUses;
if (0 == sampleCount) {
// The fast dashing path only works when MSAA is disabled
numSlowPathDashedPaths -= fNumFastPathDashEffects;
}
bool ret = suitableForDash &&
(fNumAAConcavePaths - fNumAAHairlineConcavePaths - fNumAADFEligibleConcavePaths)
< kNumAAConcavePathsTol;
int numSlowPaths = fNumAAConcavePaths -
fNumAAHairlineConcavePaths -
fNumAADFEligibleConcavePaths;
bool ret = numSlowPathDashedPaths + numSlowPaths < kNumSlowPathsTol;
if (!ret && reason) {
if (!suitableForDash) {
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.";
*reason = "Too many slow paths (either concave or dashed).";
}
return ret;
}

View File

@ -140,7 +140,9 @@ static void test_gpu_veto(skiatest::Reporter* reporter) {
paint.setStyle(SkPaint::kStroke_Style);
paint.setPathEffect(dash);
canvas->drawPath(path, paint);
for (int i = 0; i < 50; ++i) {
canvas->drawPath(path, paint);
}
}
SkAutoTUnref<SkPicture> picture(recorder.endRecording());
// 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();
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());
// 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);
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());
// ... but only when applied to drawPoint() calls