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