1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2014 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h" 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkVertices.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkPatchUtils.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker /** 17*c8dee2aaSAndroid Build Coastguard Worker * This bench measures the rendering time of the call SkCanvas::drawPatch with different types of 18*c8dee2aaSAndroid Build Coastguard Worker * input patches (regular case, with loops, a square, with a big difference between "parallel" 19*c8dee2aaSAndroid Build Coastguard Worker * sides). This bench also tests the different combination of optional parameters for the function 20*c8dee2aaSAndroid Build Coastguard Worker * (passing texture coordinates and colors, only textures coordinates, only colors or none). 21*c8dee2aaSAndroid Build Coastguard Worker * Finally, it applies a scale to test if the size affects the rendering time. 22*c8dee2aaSAndroid Build Coastguard Worker */ 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker class PatchBench : public Benchmark { 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker public: 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker enum VertexMode { 29*c8dee2aaSAndroid Build Coastguard Worker kNone_VertexMode, 30*c8dee2aaSAndroid Build Coastguard Worker kColors_VertexMode, 31*c8dee2aaSAndroid Build Coastguard Worker kTexCoords_VertexMode, 32*c8dee2aaSAndroid Build Coastguard Worker kBoth_VertexMode 33*c8dee2aaSAndroid Build Coastguard Worker }; 34*c8dee2aaSAndroid Build Coastguard Worker PatchBench(SkPoint scale,VertexMode vertexMode)35*c8dee2aaSAndroid Build Coastguard Worker PatchBench(SkPoint scale, VertexMode vertexMode) 36*c8dee2aaSAndroid Build Coastguard Worker : fScale(scale) 37*c8dee2aaSAndroid Build Coastguard Worker , fVertexMode(vertexMode) { } 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker // to add name of specific class override this method appendName(SkString * name)40*c8dee2aaSAndroid Build Coastguard Worker virtual void appendName(SkString* name) { 41*c8dee2aaSAndroid Build Coastguard Worker name->append("normal"); 42*c8dee2aaSAndroid Build Coastguard Worker } 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker // to make other type of patches override this method setCubics()45*c8dee2aaSAndroid Build Coastguard Worker virtual void setCubics() { 46*c8dee2aaSAndroid Build Coastguard Worker const SkPoint points[SkPatchUtils::kNumCtrlPts] = { 47*c8dee2aaSAndroid Build Coastguard Worker //top points 48*c8dee2aaSAndroid Build Coastguard Worker {100,100},{150,50},{250,150}, {300,100}, 49*c8dee2aaSAndroid Build Coastguard Worker //right points 50*c8dee2aaSAndroid Build Coastguard Worker {350, 150},{250,200}, 51*c8dee2aaSAndroid Build Coastguard Worker //bottom points 52*c8dee2aaSAndroid Build Coastguard Worker {300,300},{250,250},{150,350},{100,300}, 53*c8dee2aaSAndroid Build Coastguard Worker //left points 54*c8dee2aaSAndroid Build Coastguard Worker {50,250},{150,50} 55*c8dee2aaSAndroid Build Coastguard Worker }; 56*c8dee2aaSAndroid Build Coastguard Worker memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint)); 57*c8dee2aaSAndroid Build Coastguard Worker } 58*c8dee2aaSAndroid Build Coastguard Worker setColors()59*c8dee2aaSAndroid Build Coastguard Worker virtual void setColors() { 60*c8dee2aaSAndroid Build Coastguard Worker const SkColor colors[SkPatchUtils::kNumCorners] = { 61*c8dee2aaSAndroid Build Coastguard Worker SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN 62*c8dee2aaSAndroid Build Coastguard Worker }; 63*c8dee2aaSAndroid Build Coastguard Worker memcpy(fColors, colors, SkPatchUtils::kNumCorners * sizeof(SkColor)); 64*c8dee2aaSAndroid Build Coastguard Worker } 65*c8dee2aaSAndroid Build Coastguard Worker setTexCoords()66*c8dee2aaSAndroid Build Coastguard Worker virtual void setTexCoords() { 67*c8dee2aaSAndroid Build Coastguard Worker const SkPoint texCoords[SkPatchUtils::kNumCorners] = { 68*c8dee2aaSAndroid Build Coastguard Worker {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f,1.0f}, {0.0f, 1.0f} 69*c8dee2aaSAndroid Build Coastguard Worker }; 70*c8dee2aaSAndroid Build Coastguard Worker memcpy(fTexCoords, texCoords, SkPatchUtils::kNumCorners * sizeof(SkPoint)); 71*c8dee2aaSAndroid Build Coastguard Worker } 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker // override this method to change the shader createShader()74*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<SkShader> createShader() { 75*c8dee2aaSAndroid Build Coastguard Worker const SkColor colors[] = { 76*c8dee2aaSAndroid Build Coastguard Worker SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE, 77*c8dee2aaSAndroid Build Coastguard Worker SK_ColorMAGENTA, SK_ColorBLUE, SK_ColorYELLOW, 78*c8dee2aaSAndroid Build Coastguard Worker }; 79*c8dee2aaSAndroid Build Coastguard Worker const SkPoint pts[] = { { 200.f / 4.f, 0.f }, { 3.f * 200.f / 4, 200.f } }; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker return SkGradientShader::MakeLinear(pts, colors, nullptr, std::size(colors), 82*c8dee2aaSAndroid Build Coastguard Worker SkTileMode::kMirror); 83*c8dee2aaSAndroid Build Coastguard Worker } 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()86*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 87*c8dee2aaSAndroid Build Coastguard Worker SkString vertexMode; 88*c8dee2aaSAndroid Build Coastguard Worker switch (fVertexMode) { 89*c8dee2aaSAndroid Build Coastguard Worker case kNone_VertexMode: 90*c8dee2aaSAndroid Build Coastguard Worker vertexMode.set("meshlines"); 91*c8dee2aaSAndroid Build Coastguard Worker break; 92*c8dee2aaSAndroid Build Coastguard Worker case kColors_VertexMode: 93*c8dee2aaSAndroid Build Coastguard Worker vertexMode.set("colors"); 94*c8dee2aaSAndroid Build Coastguard Worker break; 95*c8dee2aaSAndroid Build Coastguard Worker case kTexCoords_VertexMode: 96*c8dee2aaSAndroid Build Coastguard Worker vertexMode.set("texs"); 97*c8dee2aaSAndroid Build Coastguard Worker break; 98*c8dee2aaSAndroid Build Coastguard Worker case kBoth_VertexMode: 99*c8dee2aaSAndroid Build Coastguard Worker vertexMode.set("colors_texs"); 100*c8dee2aaSAndroid Build Coastguard Worker break; 101*c8dee2aaSAndroid Build Coastguard Worker default: 102*c8dee2aaSAndroid Build Coastguard Worker break; 103*c8dee2aaSAndroid Build Coastguard Worker } 104*c8dee2aaSAndroid Build Coastguard Worker SkString type; 105*c8dee2aaSAndroid Build Coastguard Worker this->appendName(&type); 106*c8dee2aaSAndroid Build Coastguard Worker fName.printf("patch_%s_%s_%fx%f", type.c_str(), vertexMode.c_str(), 107*c8dee2aaSAndroid Build Coastguard Worker fScale.x(), fScale.y()); 108*c8dee2aaSAndroid Build Coastguard Worker return fName.c_str(); 109*c8dee2aaSAndroid Build Coastguard Worker } 110*c8dee2aaSAndroid Build Coastguard Worker onDelayedSetup()111*c8dee2aaSAndroid Build Coastguard Worker void onDelayedSetup() override { 112*c8dee2aaSAndroid Build Coastguard Worker this->setCubics(); 113*c8dee2aaSAndroid Build Coastguard Worker this->setColors(); 114*c8dee2aaSAndroid Build Coastguard Worker this->setTexCoords(); 115*c8dee2aaSAndroid Build Coastguard Worker this->setupPaint(&fPaint); 116*c8dee2aaSAndroid Build Coastguard Worker switch (fVertexMode) { 117*c8dee2aaSAndroid Build Coastguard Worker case kTexCoords_VertexMode: 118*c8dee2aaSAndroid Build Coastguard Worker case kBoth_VertexMode: 119*c8dee2aaSAndroid Build Coastguard Worker fPaint.setShader(this->createShader()); 120*c8dee2aaSAndroid Build Coastguard Worker break; 121*c8dee2aaSAndroid Build Coastguard Worker default: 122*c8dee2aaSAndroid Build Coastguard Worker fPaint.setShader(nullptr); 123*c8dee2aaSAndroid Build Coastguard Worker break; 124*c8dee2aaSAndroid Build Coastguard Worker } 125*c8dee2aaSAndroid Build Coastguard Worker } 126*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)127*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 128*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(fScale.x(), fScale.y()); 129*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; i++) { 130*c8dee2aaSAndroid Build Coastguard Worker switch (fVertexMode) { 131*c8dee2aaSAndroid Build Coastguard Worker case kNone_VertexMode: 132*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPatch(fCubics, nullptr, nullptr, SkBlendMode::kModulate, fPaint); 133*c8dee2aaSAndroid Build Coastguard Worker break; 134*c8dee2aaSAndroid Build Coastguard Worker case kColors_VertexMode: 135*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPatch(fCubics, fColors, nullptr, SkBlendMode::kModulate, fPaint); 136*c8dee2aaSAndroid Build Coastguard Worker break; 137*c8dee2aaSAndroid Build Coastguard Worker case kTexCoords_VertexMode: 138*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPatch(fCubics, nullptr, fTexCoords, SkBlendMode::kModulate, fPaint); 139*c8dee2aaSAndroid Build Coastguard Worker break; 140*c8dee2aaSAndroid Build Coastguard Worker case kBoth_VertexMode: 141*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPatch(fCubics, fColors, fTexCoords, SkBlendMode::kModulate, fPaint); 142*c8dee2aaSAndroid Build Coastguard Worker break; 143*c8dee2aaSAndroid Build Coastguard Worker default: 144*c8dee2aaSAndroid Build Coastguard Worker break; 145*c8dee2aaSAndroid Build Coastguard Worker } 146*c8dee2aaSAndroid Build Coastguard Worker } 147*c8dee2aaSAndroid Build Coastguard Worker } 148*c8dee2aaSAndroid Build Coastguard Worker 149*c8dee2aaSAndroid Build Coastguard Worker SkPaint fPaint; 150*c8dee2aaSAndroid Build Coastguard Worker SkString fName; 151*c8dee2aaSAndroid Build Coastguard Worker SkVector fScale; 152*c8dee2aaSAndroid Build Coastguard Worker SkPoint fCubics[12]; 153*c8dee2aaSAndroid Build Coastguard Worker SkPoint fTexCoords[4]; 154*c8dee2aaSAndroid Build Coastguard Worker SkColor fColors[4]; 155*c8dee2aaSAndroid Build Coastguard Worker VertexMode fVertexMode; 156*c8dee2aaSAndroid Build Coastguard Worker 157*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 158*c8dee2aaSAndroid Build Coastguard Worker }; 159*c8dee2aaSAndroid Build Coastguard Worker 160*c8dee2aaSAndroid Build Coastguard Worker class SquarePatchBench : public PatchBench { 161*c8dee2aaSAndroid Build Coastguard Worker public: SquarePatchBench(SkPoint scale,VertexMode vertexMode)162*c8dee2aaSAndroid Build Coastguard Worker SquarePatchBench(SkPoint scale, VertexMode vertexMode) 163*c8dee2aaSAndroid Build Coastguard Worker : INHERITED(scale, vertexMode) { } 164*c8dee2aaSAndroid Build Coastguard Worker appendName(SkString * name)165*c8dee2aaSAndroid Build Coastguard Worker void appendName(SkString* name) override { 166*c8dee2aaSAndroid Build Coastguard Worker name->append("square"); 167*c8dee2aaSAndroid Build Coastguard Worker } 168*c8dee2aaSAndroid Build Coastguard Worker setCubics()169*c8dee2aaSAndroid Build Coastguard Worker void setCubics() override { 170*c8dee2aaSAndroid Build Coastguard Worker const SkPoint points[SkPatchUtils::kNumCtrlPts] = { 171*c8dee2aaSAndroid Build Coastguard Worker //top points 172*c8dee2aaSAndroid Build Coastguard Worker {100,100},{150,100},{250,100}, {300,100}, 173*c8dee2aaSAndroid Build Coastguard Worker //right points 174*c8dee2aaSAndroid Build Coastguard Worker {300, 150},{300,250}, 175*c8dee2aaSAndroid Build Coastguard Worker //bottom points 176*c8dee2aaSAndroid Build Coastguard Worker {300,300},{250,300},{150,300},{100,300}, 177*c8dee2aaSAndroid Build Coastguard Worker //left points 178*c8dee2aaSAndroid Build Coastguard Worker {100,250},{100,150} 179*c8dee2aaSAndroid Build Coastguard Worker }; 180*c8dee2aaSAndroid Build Coastguard Worker memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint)); 181*c8dee2aaSAndroid Build Coastguard Worker } 182*c8dee2aaSAndroid Build Coastguard Worker private: 183*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = PatchBench; 184*c8dee2aaSAndroid Build Coastguard Worker }; 185*c8dee2aaSAndroid Build Coastguard Worker 186*c8dee2aaSAndroid Build Coastguard Worker class LODDiffPatchBench : public PatchBench { 187*c8dee2aaSAndroid Build Coastguard Worker public: LODDiffPatchBench(SkPoint scale,VertexMode vertexMode)188*c8dee2aaSAndroid Build Coastguard Worker LODDiffPatchBench(SkPoint scale, VertexMode vertexMode) 189*c8dee2aaSAndroid Build Coastguard Worker : INHERITED(scale, vertexMode) { } 190*c8dee2aaSAndroid Build Coastguard Worker appendName(SkString * name)191*c8dee2aaSAndroid Build Coastguard Worker void appendName(SkString* name) override { 192*c8dee2aaSAndroid Build Coastguard Worker name->append("LOD_Diff"); 193*c8dee2aaSAndroid Build Coastguard Worker } 194*c8dee2aaSAndroid Build Coastguard Worker setCubics()195*c8dee2aaSAndroid Build Coastguard Worker void setCubics() override { 196*c8dee2aaSAndroid Build Coastguard Worker const SkPoint points[SkPatchUtils::kNumCtrlPts] = { 197*c8dee2aaSAndroid Build Coastguard Worker //top points 198*c8dee2aaSAndroid Build Coastguard Worker {100,175},{150,100},{250,100}, {300,0}, 199*c8dee2aaSAndroid Build Coastguard Worker //right points 200*c8dee2aaSAndroid Build Coastguard Worker {300, 150},{300,250}, 201*c8dee2aaSAndroid Build Coastguard Worker //bottom points 202*c8dee2aaSAndroid Build Coastguard Worker {300,400},{250,300},{150,300},{100,225}, 203*c8dee2aaSAndroid Build Coastguard Worker //left points 204*c8dee2aaSAndroid Build Coastguard Worker {100,215},{100,185} 205*c8dee2aaSAndroid Build Coastguard Worker }; 206*c8dee2aaSAndroid Build Coastguard Worker memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint)); 207*c8dee2aaSAndroid Build Coastguard Worker } 208*c8dee2aaSAndroid Build Coastguard Worker private: 209*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = PatchBench; 210*c8dee2aaSAndroid Build Coastguard Worker }; 211*c8dee2aaSAndroid Build Coastguard Worker 212*c8dee2aaSAndroid Build Coastguard Worker class LoopPatchBench : public PatchBench { 213*c8dee2aaSAndroid Build Coastguard Worker public: LoopPatchBench(SkPoint scale,VertexMode vertexMode)214*c8dee2aaSAndroid Build Coastguard Worker LoopPatchBench(SkPoint scale, VertexMode vertexMode) 215*c8dee2aaSAndroid Build Coastguard Worker : INHERITED(scale, vertexMode) { } 216*c8dee2aaSAndroid Build Coastguard Worker appendName(SkString * name)217*c8dee2aaSAndroid Build Coastguard Worker void appendName(SkString* name) override { 218*c8dee2aaSAndroid Build Coastguard Worker name->append("loop"); 219*c8dee2aaSAndroid Build Coastguard Worker } 220*c8dee2aaSAndroid Build Coastguard Worker setCubics()221*c8dee2aaSAndroid Build Coastguard Worker void setCubics() override { 222*c8dee2aaSAndroid Build Coastguard Worker const SkPoint points[SkPatchUtils::kNumCtrlPts] = { 223*c8dee2aaSAndroid Build Coastguard Worker //top points 224*c8dee2aaSAndroid Build Coastguard Worker {100,100},{300,200},{100,200}, {300,100}, 225*c8dee2aaSAndroid Build Coastguard Worker //right points 226*c8dee2aaSAndroid Build Coastguard Worker {380, 400},{380,0}, 227*c8dee2aaSAndroid Build Coastguard Worker //bottom points 228*c8dee2aaSAndroid Build Coastguard Worker {300,300},{250,250},{30,200},{100,300}, 229*c8dee2aaSAndroid Build Coastguard Worker //left points 230*c8dee2aaSAndroid Build Coastguard Worker {140,325},{150,150} 231*c8dee2aaSAndroid Build Coastguard Worker }; 232*c8dee2aaSAndroid Build Coastguard Worker memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint)); 233*c8dee2aaSAndroid Build Coastguard Worker } 234*c8dee2aaSAndroid Build Coastguard Worker private: 235*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = PatchBench; 236*c8dee2aaSAndroid Build Coastguard Worker }; 237*c8dee2aaSAndroid Build Coastguard Worker 238*c8dee2aaSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 239*c8dee2aaSAndroid Build Coastguard Worker 240*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kNone_VertexMode); ) 241*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kColors_VertexMode); ) 242*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kTexCoords_VertexMode); ) 243*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kBoth_VertexMode); ) 244*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(1.f, 1.0f), PatchBench::kNone_VertexMode); ) 245*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kColors_VertexMode); ) 246*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kTexCoords_VertexMode); ) 247*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kBoth_VertexMode); ) 248*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kNone_VertexMode); ) 249*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kColors_VertexMode); ) 250*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kTexCoords_VertexMode); ) 251*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kBoth_VertexMode); ) 252*c8dee2aaSAndroid Build Coastguard Worker 253*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f), 254*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kNone_VertexMode); ) 255*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f), 256*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kColors_VertexMode); ) 257*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f), 258*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kTexCoords_VertexMode); ) 259*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f), 260*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kBoth_VertexMode); ) 261*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.f, 1.0f), 262*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kNone_VertexMode); ) 263*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f), 264*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kColors_VertexMode); ) 265*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f), 266*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kTexCoords_VertexMode); ) 267*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f), 268*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kBoth_VertexMode); ) 269*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f), 270*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kNone_VertexMode); ) 271*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f), 272*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kColors_VertexMode); ) 273*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f), 274*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kTexCoords_VertexMode); ) 275*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f), 276*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kBoth_VertexMode); ) 277*c8dee2aaSAndroid Build Coastguard Worker 278*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f), 279*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kNone_VertexMode); ) 280*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f), 281*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kColors_VertexMode); ) 282*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f), 283*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kTexCoords_VertexMode); ) 284*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f), 285*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kBoth_VertexMode); ) 286*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.f, 1.0f), 287*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kNone_VertexMode); ) 288*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f), 289*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kColors_VertexMode); ) 290*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f), 291*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kTexCoords_VertexMode); ) 292*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f), 293*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kBoth_VertexMode); ) 294*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f), 295*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kNone_VertexMode); ) 296*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f), 297*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kColors_VertexMode); ) 298*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f), 299*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kTexCoords_VertexMode); ) 300*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f), 301*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kBoth_VertexMode); ) 302*c8dee2aaSAndroid Build Coastguard Worker 303*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f), 304*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kNone_VertexMode); ) 305*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f), 306*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kColors_VertexMode); ) 307*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f), 308*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kTexCoords_VertexMode); ) 309*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f), 310*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kBoth_VertexMode); ) 311*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.f, 1.0f), 312*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kNone_VertexMode); ) 313*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f), 314*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kColors_VertexMode); ) 315*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f), 316*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kTexCoords_VertexMode); ) 317*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f), 318*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kBoth_VertexMode); ) 319*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f), 320*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kNone_VertexMode); ) 321*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f), 322*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kColors_VertexMode); ) 323*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f), 324*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kTexCoords_VertexMode); ) 325*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f), 326*c8dee2aaSAndroid Build Coastguard Worker PatchBench::kBoth_VertexMode); ) 327*c8dee2aaSAndroid Build Coastguard Worker 328*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////// 329*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkPatchUtils.h" 330*c8dee2aaSAndroid Build Coastguard Worker 331*c8dee2aaSAndroid Build Coastguard Worker class PatchUtilsBench : public Benchmark { 332*c8dee2aaSAndroid Build Coastguard Worker SkString fName; 333*c8dee2aaSAndroid Build Coastguard Worker const bool fLinearInterp; 334*c8dee2aaSAndroid Build Coastguard Worker public: PatchUtilsBench(bool linearInterp)335*c8dee2aaSAndroid Build Coastguard Worker PatchUtilsBench(bool linearInterp) : fLinearInterp(linearInterp) { 336*c8dee2aaSAndroid Build Coastguard Worker fName.printf("patchutils_%s", linearInterp ? "linear" : "legacy"); 337*c8dee2aaSAndroid Build Coastguard Worker } 338*c8dee2aaSAndroid Build Coastguard Worker onGetName()339*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { return fName.c_str(); } 340*c8dee2aaSAndroid Build Coastguard Worker isSuitableFor(Backend backend)341*c8dee2aaSAndroid Build Coastguard Worker bool isSuitableFor(Backend backend) override { 342*c8dee2aaSAndroid Build Coastguard Worker return backend == Backend::kNonRendering; 343*c8dee2aaSAndroid Build Coastguard Worker } 344*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas *)345*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas*) override { 346*c8dee2aaSAndroid Build Coastguard Worker const SkColor colors[] = { 0xFF000000, 0xFF00FF00, 0xFF0000FF, 0xFFFF0000 }; 347*c8dee2aaSAndroid Build Coastguard Worker const SkPoint pts[] = { 348*c8dee2aaSAndroid Build Coastguard Worker { 0, 0 }, { 10, 0 }, { 20, 0 }, { 30, 0 }, 349*c8dee2aaSAndroid Build Coastguard Worker { 30,10}, { 30,20 }, { 30,30 }, { 20,30 }, 350*c8dee2aaSAndroid Build Coastguard Worker { 10,30}, { 0, 30 }, { 0, 20 }, { 0, 10 }, 351*c8dee2aaSAndroid Build Coastguard Worker }; 352*c8dee2aaSAndroid Build Coastguard Worker const SkPoint tex[] = { 353*c8dee2aaSAndroid Build Coastguard Worker { 0, 0 }, { 10, 0 }, { 10, 10 }, { 0, 10 }, 354*c8dee2aaSAndroid Build Coastguard Worker }; 355*c8dee2aaSAndroid Build Coastguard Worker 356*c8dee2aaSAndroid Build Coastguard Worker auto cs = fLinearInterp ? SkColorSpace::MakeSRGBLinear() : nullptr; 357*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 100*loops; ++i) { 358*c8dee2aaSAndroid Build Coastguard Worker SkPatchUtils::MakeVertices(pts, colors, tex, 20, 20, cs.get()); 359*c8dee2aaSAndroid Build Coastguard Worker } 360*c8dee2aaSAndroid Build Coastguard Worker } 361*c8dee2aaSAndroid Build Coastguard Worker }; 362*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchUtilsBench(false); ) 363*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new PatchUtilsBench(true); ) 364