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