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