Home | History | Annotate | Download | only in bench
      1 /*
      2  * Copyright 2014 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 
      8 #include "Benchmark.h"
      9 #include "SkCanvas.h"
     10 #include "SkGradientShader.h"
     11 #include "SkPaint.h"
     12 #include "SkPatchGrid.h"
     13 #include "SkString.h"
     14 
     15  /**
     16  * This bench measures the rendering time of a gridof patches.
     17  * This bench also tests the different combination of optional parameters for the function
     18  * (passing texture coordinates and colors, only textures coordinates, only colors or none).
     19  * Finally, it also has 3 possible sizes small, medium and big to test if the size of the patches
     20  * in the grid affects time.
     21  */
     22 
     23 class PatchGridBench : public Benchmark {
     24 
     25 public:
     26 
     27     enum Size {
     28         kSmall_Size,
     29         kMedium_Size,
     30         kBig_Size
     31     };
     32 
     33     enum VertexMode {
     34         kNone_VertexMode,
     35         kColors_VertexMode,
     36         kTexCoords_VertexMode,
     37         kBoth_VertexMode
     38     };
     39 
     40     PatchGridBench(Size size, VertexMode vertexMode)
     41     : fVertexMode(vertexMode)
     42     , fSize(size) { }
     43 
     44     void setScale(SkCanvas* canvas){
     45         switch (fSize) {
     46             case kSmall_Size:
     47                 canvas->scale(0.1f, 0.1f);
     48                 break;
     49             case kMedium_Size:
     50                 canvas->scale(1.0f, 1.0f);
     51                 break;
     52             case kBig_Size:
     53                 canvas->scale(3.0f, 3.0f);
     54                 break;
     55         }
     56     }
     57 
     58     void setGrid() {
     59         SkPoint vertices[4][5] = {
     60             {{50,50}, {150,50}, {250,50},{350,50},{450,50}},
     61             {{50,150}, {120,120}, {250,150},{350,150},{450,150}},
     62             {{50,250}, {150,250}, {250,250},{350,250},{450,250}},
     63             {{100,300}, {150,350}, {250,350},{350,350},{450,350}}
     64         };
     65 
     66         SkColor cornerColors[4][5] = {
     67             {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE},
     68             {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED},
     69             {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE},
     70             {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED},
     71         };
     72 
     73         SkPoint texCoords[4][5] = {
     74             {{0.0f,0.0f}, {1.0f,0.0f}, {2.0f,0.0f}, {3.0f,0.0f}, {4.0f,0.0f}},
     75             {{0.0f,1.0f}, {1.0f,1.0f}, {2.0f,1.0f}, {3.0f,1.0f}, {4.0f,1.0f}},
     76             {{0.0f,2.0f}, {1.0f,2.0f}, {2.0f,2.0f}, {3.0f,2.0f}, {4.0f,2.0f}},
     77             {{0.0f,3.0f}, {1.0f,3.0f}, {2.0f,3.0f}, {3.0f,3.0f}, {4.0f,3.0f}},
     78         };
     79 
     80         SkPoint hrzCtrl[4][8] = {
     81             {{75,30},{125,45},{175,70},{225,20},{275,50},{325,50},{375,5},{425,90}},
     82             {{75,150},{125,150},{175,150},{225,150},{275,150},{325,150},{375,150},{425,150}},
     83             {{75,250},{125,250},{175,250},{225,250},{275,200},{325,150},{375,250},{425,250}},
     84             {{75,350},{125,350},{175,350},{225,350},{275,350},{325,350},{375,350},{425,350}}
     85         };
     86 
     87         SkPoint vrtCtrl[6][5] = {
     88             {{50,75},{150,75},{250,75},{350,75},{450,75}},
     89             {{50,125},{150,125},{250,125},{350,125},{450,125}},
     90             {{50,175},{150,175},{220,225},{350,175},{470,225}},
     91             {{50,225},{150,225},{220,175},{350,225},{470,155}},
     92             {{50,275},{150,275},{250,275},{350,275},{400,305}},
     93             {{50,325},{150,325},{250,325},{350,325},{450,325}}
     94         };
     95 
     96         static const int kRows = 3;
     97         static const int kCols = 4;
     98 
     99         fGrid.reset(kRows, kCols, SkPatchGrid::kColors_VertexType, nullptr);
    100         for (int i = 0; i < kRows; i++) {
    101             for (int j = 0; j < kCols; j++) {
    102                 SkPoint points[12];
    103 
    104                 //set corners
    105                 points[SkPatchUtils::kTopP0_CubicCtrlPts] = vertices[i][j];
    106                 points[SkPatchUtils::kTopP3_CubicCtrlPts] = vertices[i][j + 1];
    107                 points[SkPatchUtils::kBottomP0_CubicCtrlPts] = vertices[i + 1][j];
    108                 points[SkPatchUtils::kBottomP3_CubicCtrlPts] = vertices[i + 1][j + 1];
    109 
    110                 points[SkPatchUtils::kTopP1_CubicCtrlPts] = hrzCtrl[i][j * 2];
    111                 points[SkPatchUtils::kTopP2_CubicCtrlPts] = hrzCtrl[i][j * 2 + 1];
    112                 points[SkPatchUtils::kBottomP1_CubicCtrlPts] = hrzCtrl[i + 1][j * 2];
    113                 points[SkPatchUtils::kBottomP2_CubicCtrlPts] = hrzCtrl[i + 1][j * 2 + 1];
    114 
    115                 points[SkPatchUtils::kLeftP1_CubicCtrlPts] = vrtCtrl[i * 2][j];
    116                 points[SkPatchUtils::kLeftP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1][j];
    117                 points[SkPatchUtils::kRightP1_CubicCtrlPts] = vrtCtrl[i * 2][j + 1];
    118                 points[SkPatchUtils::kRightP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1][j + 1];
    119 
    120                 SkColor colors[4];
    121                 colors[0] = cornerColors[i][j];
    122                 colors[1] = cornerColors[i][j + 1];
    123                 colors[3] = cornerColors[i + 1][j];
    124                 colors[2] = cornerColors[i + 1][j + 1];
    125 
    126                 SkPoint texs[4];
    127                 texs[0] = texCoords[i][j];
    128                 texs[1] = texCoords[i][j + 1];
    129                 texs[3] = texCoords[i + 1][j];
    130                 texs[2] = texCoords[i + 1][j + 1];
    131 
    132                 switch (fVertexMode) {
    133                     case kNone_VertexMode:
    134                         fGrid.setPatch(j, i, points, nullptr, nullptr);
    135                         break;
    136                     case kColors_VertexMode:
    137                         fGrid.setPatch(j, i, points, colors, nullptr);
    138                         break;
    139                     case kTexCoords_VertexMode:
    140                         fGrid.setPatch(j, i, points, nullptr, texs);
    141                         break;
    142                     case kBoth_VertexMode:
    143                         fGrid.setPatch(j, i, points, colors, texs);
    144                         break;
    145                     default:
    146                         break;
    147                 }
    148             }
    149         }
    150     }
    151 
    152     // override this method to change the shader
    153     SkShader* createShader() {
    154         const SkColor colors[] = {
    155             SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE,
    156             SK_ColorMAGENTA, SK_ColorBLUE, SK_ColorYELLOW,
    157         };
    158         const SkPoint pts[] = { { 200.f / 4.f, 0.f }, { 3.f * 200.f / 4, 200.f } };
    159 
    160         return SkGradientShader::CreateLinear(pts, colors, nullptr,
    161                                               SK_ARRAY_COUNT(colors),
    162                                               SkShader::kMirror_TileMode);
    163     }
    164 
    165 protected:
    166     const char* onGetName() override {
    167         SkString vertexMode;
    168         switch (fVertexMode) {
    169             case kNone_VertexMode:
    170                 vertexMode.set("meshlines");
    171                 break;
    172             case kColors_VertexMode:
    173                 vertexMode.set("colors");
    174                 break;
    175             case kTexCoords_VertexMode:
    176                 vertexMode.set("texs");
    177                 break;
    178             case kBoth_VertexMode:
    179                 vertexMode.set("colors_texs");
    180                 break;
    181             default:
    182                 break;
    183         }
    184 
    185         SkString size;
    186         switch (fSize) {
    187             case kSmall_Size:
    188                 size.set("small");
    189                 break;
    190             case kMedium_Size:
    191                 size.set("medium");
    192                 break;
    193             case kBig_Size:
    194                 size.set("big");
    195                 break;
    196             default:
    197                 break;
    198         }
    199         fName.printf("patch_grid_%s_%s", vertexMode.c_str(), size.c_str());
    200         return fName.c_str();
    201     }
    202 
    203     void onDelayedSetup() override {
    204         this->setGrid();
    205         switch (fVertexMode) {
    206             case kTexCoords_VertexMode:
    207             case kBoth_VertexMode:
    208                 fPaint.setShader(createShader())->unref();
    209                 break;
    210             default:
    211                 fPaint.setShader(nullptr);
    212                 break;
    213         }
    214         this->setupPaint(&fPaint);
    215     }
    216 
    217     void onDraw(int loops, SkCanvas* canvas) override {
    218         this->setScale(canvas);
    219         for (int i = 0; i < loops; i++) {
    220             fGrid.draw(canvas, fPaint);
    221         }
    222     }
    223 
    224     SkPaint     fPaint;
    225     SkString    fName;
    226     SkPatchGrid fGrid;
    227     VertexMode  fVertexMode;
    228     Size        fSize;
    229 
    230     typedef Benchmark INHERITED;
    231 };
    232 
    233 
    234 ///////////////////////////////////////////////////////////////////////////////
    235 
    236 DEF_BENCH( return new PatchGridBench(PatchGridBench::kSmall_Size,
    237                                      PatchGridBench::kNone_VertexMode); )
    238 DEF_BENCH( return new PatchGridBench(PatchGridBench::kSmall_Size,
    239                                      PatchGridBench::kColors_VertexMode); )
    240 DEF_BENCH( return new PatchGridBench(PatchGridBench::kSmall_Size,
    241                                      PatchGridBench::kTexCoords_VertexMode); )
    242 DEF_BENCH( return new PatchGridBench(PatchGridBench::kSmall_Size,
    243                                      PatchGridBench::kBoth_VertexMode); )
    244 DEF_BENCH( return new PatchGridBench(PatchGridBench::kMedium_Size,
    245                                      PatchGridBench::kNone_VertexMode); )
    246 DEF_BENCH( return new PatchGridBench(PatchGridBench::kMedium_Size,
    247                                      PatchGridBench::kColors_VertexMode); )
    248 DEF_BENCH( return new PatchGridBench(PatchGridBench::kMedium_Size,
    249                                      PatchGridBench::kTexCoords_VertexMode); )
    250 DEF_BENCH( return new PatchGridBench(PatchGridBench::kMedium_Size,
    251                                      PatchGridBench::kBoth_VertexMode); )
    252 DEF_BENCH( return new PatchGridBench(PatchGridBench::kBig_Size,
    253                                      PatchGridBench::kNone_VertexMode); )
    254 DEF_BENCH( return new PatchGridBench(PatchGridBench::kBig_Size,
    255                                      PatchGridBench::kColors_VertexMode); )
    256 DEF_BENCH( return new PatchGridBench(PatchGridBench::kBig_Size,
    257                                      PatchGridBench::kTexCoords_VertexMode); )
    258 DEF_BENCH( return new PatchGridBench(PatchGridBench::kBig_Size,
    259                                      PatchGridBench::kBoth_VertexMode); )
    260