use Sk2s for conics

BUG=skia:

Review URL: https://codereview.chromium.org/1025033002
diff --git a/bench/PathBench.cpp b/bench/PathBench.cpp
index b597f91..3a4eb63 100644
--- a/bench/PathBench.cpp
+++ b/bench/PathBench.cpp
@@ -832,29 +832,91 @@
 };
 
 class ConicBench_ChopHalf : public Benchmark {
-    SkConic fRQ;
+protected:
+    SkConic fRQ, fDst[2];
+    SkString fName;
+    const bool fUseV2;
 public:
-    ConicBench_ChopHalf()  {
+    ConicBench_ChopHalf(bool useV2) : fUseV2(useV2) {
         fRQ.fPts[0].set(0, 0);
         fRQ.fPts[1].set(100, 0);
         fRQ.fPts[2].set(100, 100);
         fRQ.fW = SkScalarCos(SK_ScalarPI/4);
+
+        fName.printf("conic-chop-half%d", useV2);
+    }
+
+    bool isSuitableFor(Backend backend) SK_OVERRIDE {
+        return backend == kNonRendering_Backend;
     }
 
 private:
-    const char* onGetName() SK_OVERRIDE {
-        return "ratquad-chop-half";
-    }
+    const char* onGetName() SK_OVERRIDE { return fName.c_str(); }
 
     void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
-        SkConic dst[2];
-        for (int i = 0; i < loops; ++i) {
-            fRQ.chop(dst);
+        if (fUseV2) {
+            for (int i = 0; i < loops; ++i) {
+                fRQ.chop2(fDst);
+            }
+        } else {
+            for (int i = 0; i < loops; ++i) {
+                fRQ.chop(fDst);
+            }
         }
     }
 
     typedef Benchmark INHERITED;
 };
+DEF_BENCH( return new ConicBench_ChopHalf(false); )
+DEF_BENCH( return new ConicBench_ChopHalf(true); )
+
+class ConicBench_EvalPos : public ConicBench_ChopHalf {
+public:
+    ConicBench_EvalPos(bool useV2) : ConicBench_ChopHalf(useV2) {
+        fName.printf("conic-eval-pos%d", useV2);
+    }
+    void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
+        if (fUseV2) {
+            for (int i = 0; i < loops; ++i) {
+                for (int j = 0; j < 1000; ++j) {
+                    fDst[0].fPts[0] = fRQ.evalAt(0.4f);
+                }
+            }
+        } else {
+            for (int i = 0; i < loops; ++i) {
+                for (int j = 0; j < 1000; ++j) {
+                    fRQ.evalAt(0.4f, &fDst[0].fPts[0], NULL);
+                }
+            }
+        }
+    }
+};
+DEF_BENCH( return new ConicBench_EvalPos(false); )
+DEF_BENCH( return new ConicBench_EvalPos(true); )
+
+class ConicBench_EvalTan : public ConicBench_ChopHalf {
+public:
+    ConicBench_EvalTan(bool useV2) : ConicBench_ChopHalf(useV2) {
+        fName.printf("conic-eval-tan%d", useV2);
+    }
+    void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
+        if (fUseV2) {
+            for (int i = 0; i < loops; ++i) {
+                for (int j = 0; j < 1000; ++j) {
+                    fDst[0].fPts[0] = fRQ.evalTangentAt(0.4f);
+                }
+            }
+        } else {
+            for (int i = 0; i < loops; ++i) {
+                for (int j = 0; j < 1000; ++j) {
+                    fRQ.evalAt(0.4f, NULL, &fDst[0].fPts[0]);
+                }
+            }
+        }
+    }
+};
+DEF_BENCH( return new ConicBench_EvalTan(false); )
+DEF_BENCH( return new ConicBench_EvalTan(true); )
 
 ///////////////////////////////////////////////////////////////////////////////
 
@@ -1012,10 +1074,10 @@
 DEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRoundRect_Type); )
 DEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kOval_Type); )
 
+
 // These seem to be optimized away, which is troublesome for timing.
 /*
 DEF_BENCH( return new ConicBench_Chop5() )
-DEF_BENCH( return new ConicBench_ChopHalf() )
 DEF_BENCH( return new ConicBench_ComputeError() )
 DEF_BENCH( return new ConicBench_asQuadTol() )
 DEF_BENCH( return new ConicBench_quadPow2() )