diff options
-rw-r--r-- | gm/blurcircles2.cpp | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/gm/blurcircles2.cpp b/gm/blurcircles2.cpp index 284c1ab24e..ad0c37dc4b 100644 --- a/gm/blurcircles2.cpp +++ b/gm/blurcircles2.cpp @@ -20,6 +20,9 @@ * * In Sample mode this draws a single circle and almost-circle with animating radius and blur * radius. + * + * Bench mode draws the same as GM mode but without the comparison almost-circle paths. It also + * slightly perturbs the blur and circle radii to stress caching of blurred profiles in GPU mode. */ class BlurCircles2GM : public skiagm::GM { public: @@ -32,6 +35,8 @@ public: } protected: + bool runAsBench() const override { return true; } + SkString onShortName() override { return SkString("blurcircles2"); } SkISize onISize() override { @@ -69,43 +74,58 @@ protected: canvas->drawPath(almostCircle, paint); canvas->restore(); } else { + bool benchMode = this->getMode() == kBench_Mode; canvas->save(); static constexpr SkScalar kPad = 5; static constexpr SkScalar kRadiusSteps = 5; static constexpr SkScalar kBlurRadiusSteps = 5; canvas->translate(kPad + kMinRadius + kMaxBlurRadius, kPad + kMinRadius + kMaxBlurRadius); + static constexpr SkScalar kDeltaRadius = (kMaxRadius - kMinRadius) / kRadiusSteps; + static constexpr SkScalar kDeltaBlurRadius = (kMaxBlurRadius - kMinBlurRadius) / + kBlurRadiusSteps; SkScalar lineWidth = 0; - for (int r = 0; r < kRadiusSteps - 1; ++r) { - const SkScalar radius = r * (kMaxRadius - kMinRadius) / kBlurRadiusSteps + - kMinRadius; - lineWidth += 2 * (radius + kMaxBlurRadius) + kPad; + if (!benchMode) { + for (int r = 0; r < kRadiusSteps - 1; ++r) { + const SkScalar radius = r * kDeltaRadius + kMinRadius; + lineWidth += 2 * (radius + kMaxBlurRadius) + kPad; + } } for (int br = 0; br < kBlurRadiusSteps; ++br) { - const SkScalar blurRadius = br * (kMaxBlurRadius - kMinBlurRadius) / - kBlurRadiusSteps + kMinBlurRadius; + SkScalar blurRadius = br * kDeltaBlurRadius + kMinBlurRadius; + if (benchMode) { + blurRadius += fRandom.nextSScalar1() * kDeltaBlurRadius; + } const SkScalar maxRowR = blurRadius + kMaxRadius; paint.setMaskFilter(blurMaker(blurRadius)); canvas->save(); for (int r = 0; r < kRadiusSteps; ++r) { - const SkScalar radius = r * (kMaxRadius - kMinRadius) / kBlurRadiusSteps + - kMinRadius; + SkScalar radius = r * kDeltaRadius + kMinRadius; + if (benchMode) { + radius += fRandom.nextSScalar1() * kDeltaRadius; + } SkPath almostCircle; - almostCircleMaker(radius, &almostCircle); + if (!benchMode) { + almostCircleMaker(radius, &almostCircle); + } canvas->save(); canvas->drawCircle(0, 0, radius, paint); canvas->translate(0, 2 * maxRowR + kPad); + if (!benchMode) { canvas->drawPath(almostCircle, paint); + } canvas->restore(); const SkScalar maxColR = radius + kMaxBlurRadius; canvas->translate(maxColR * 2 + kPad, 0); } canvas->restore(); - SkPaint blackPaint; - blackPaint.setColor(SK_ColorBLACK); - const SkScalar lineY = 3 * maxRowR + 1.5f * kPad; - if (br != kBlurRadiusSteps - 1) { - canvas->drawLine(0, lineY, lineWidth, lineY, blackPaint); + if (!benchMode) { + SkPaint blackPaint; + blackPaint.setColor(SK_ColorBLACK); + const SkScalar lineY = 3 * maxRowR + 1.5f * kPad; + if (br != kBlurRadiusSteps - 1) { + canvas->drawLine(0, lineY, lineWidth, lineY, blackPaint); + } } canvas->translate(0, maxRowR * 4 + 2 * kPad); } @@ -135,6 +155,8 @@ private: SkScalar fAnimRadius; SkScalar fAnimBlurRadius; + SkRandom fRandom; + typedef skiagm::GM INHERITED; }; |