GrCCFillGeometryBench.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * Copyright 2018 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "bench/Benchmark.h"
  8. #include "src/core/SkGeometry.h"
  9. #include "src/gpu/ccpr/GrCCFillGeometry.h"
  10. static int kNumBaseLoops = 50000;
  11. class GrCCGeometryBench : public Benchmark {
  12. public:
  13. GrCCGeometryBench(float x0, float y0, float x1, float y1,
  14. float x2, float y2, float x3, float y3, const char* extraName) {
  15. fPoints[0].set(x0, y0);
  16. fPoints[1].set(x1, y1);
  17. fPoints[2].set(x2, y2);
  18. fPoints[3].set(x3, y3);
  19. fPoints[4].set(x0, y0); // Flat closing edge.
  20. fName = "ccprgeometry";
  21. switch (SkClassifyCubic(fPoints)) {
  22. case SkCubicType::kSerpentine:
  23. fName.append("_serp");
  24. break;
  25. case SkCubicType::kLoop:
  26. fName.append("_loop");
  27. break;
  28. default:
  29. SK_ABORT("Unexpected cubic type");
  30. break;
  31. }
  32. fName.appendf("_%s", extraName);
  33. }
  34. bool isSuitableFor(Backend backend) override {
  35. return backend == kNonRendering_Backend;
  36. }
  37. const char* onGetName() override {
  38. return fName.c_str();
  39. }
  40. void onDraw(int loops, SkCanvas*) override {
  41. for (int j = 0; j < loops; ++j) {
  42. fGeometry.beginContour(fPoints[0]);
  43. for (int i = 0; i < kNumBaseLoops; ++i) {
  44. fGeometry.cubicTo(fPoints);
  45. fGeometry.lineTo(fPoints+3);
  46. }
  47. fGeometry.endContour();
  48. fGeometry.reset();
  49. }
  50. }
  51. private:
  52. SkPoint fPoints[5];
  53. SkString fName;
  54. GrCCFillGeometry fGeometry{4*100*kNumBaseLoops, 2*100*kNumBaseLoops};
  55. typedef Benchmark INHERITED;
  56. };
  57. // Loops.
  58. DEF_BENCH( return new GrCCGeometryBench(529.049988f, 637.050049f, 335.750000f, -135.950012f,
  59. 912.750000f, 560.949951f, 59.049988f, 295.950012f,
  60. "2_roots"); )
  61. DEF_BENCH( return new GrCCGeometryBench(182.050003f, 300.049988f, 490.750000f, 111.049988f,
  62. 482.750000f, 500.950012f, 451.049988f, 553.950012f,
  63. "1_root"); )
  64. DEF_BENCH( return new GrCCGeometryBench(498.049988f, 476.049988f, 330.750000f, 330.049988f,
  65. 222.750000f, 389.950012f, 169.049988f, 542.950012f,
  66. "0_roots"); )
  67. // Serpentines.
  68. DEF_BENCH( return new GrCCGeometryBench(529.049988f, 714.049988f, 315.750000f, 196.049988f,
  69. 484.750000f, 110.950012f, 349.049988f, 630.950012f,
  70. "2_roots"); )
  71. DEF_BENCH( return new GrCCGeometryBench(513.049988f, 245.049988f, 73.750000f, 137.049988f,
  72. 508.750000f, 657.950012f, 99.049988f, 601.950012f,
  73. "1_root"); )
  74. DEF_BENCH( return new GrCCGeometryBench(560.049988f, 364.049988f, 217.750000f, 314.049988f,
  75. 21.750000f, 364.950012f, 83.049988f, 624.950012f,
  76. "0_roots"); )