blob: 5b0a4e835a4994aa2519868f6e40e3944f654c31 [file] [log] [blame]
reed@google.com05d63ae2011-10-28 18:57:32 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "bench/Benchmark.h"
9#include "include/core/SkCanvas.h"
10#include "include/core/SkPaint.h"
11#include "include/core/SkShader.h"
12#include "include/core/SkString.h"
13#include "include/core/SkVertices.h"
14#include "include/utils/SkRandom.h"
Mike Reed147b6642019-08-21 10:31:02 -040015#include "tools/Resources.h"
reed@google.com05d63ae2011-10-28 18:57:32 +000016
Mike Reed8845c372019-12-19 13:22:08 -050017// Just want to trigger perspective handling, not dramatically change size
18static void tiny_persp_effect(SkCanvas* canvas) {
19 SkMatrix m;
20 m.reset();
21 m[7] = 0.000001f;
22 canvas->concat(m);
23}
24
reed@google.com05d63ae2011-10-28 18:57:32 +000025enum VertFlags {
Mike Reed147b6642019-08-21 10:31:02 -040026 kColors_VertFlag = 1 << 0,
27 kTexture_VertFlag = 1 << 1,
Mike Reed8845c372019-12-19 13:22:08 -050028 kPersp_VertFlag = 1 << 2,
reed@google.com05d63ae2011-10-28 18:57:32 +000029};
30
tfarinaf168b862014-06-19 12:32:29 -070031class VertBench : public Benchmark {
reed@google.com05d63ae2011-10-28 18:57:32 +000032 SkString fName;
33 enum {
Mike Reed147b6642019-08-21 10:31:02 -040034 W = 64*2,
35 H = 48*2,
reed@google.com05d63ae2011-10-28 18:57:32 +000036 ROW = 20,
37 COL = 20,
38 PTS = (ROW + 1) * (COL + 1),
39 IDX = ROW * COL * 6,
reed@google.com05d63ae2011-10-28 18:57:32 +000040 };
41
Mike Reed147b6642019-08-21 10:31:02 -040042 sk_sp<SkShader> fShader;
reed@google.com05d63ae2011-10-28 18:57:32 +000043 SkPoint fPts[PTS];
44 SkColor fColors[PTS];
reed@google.com05d63ae2011-10-28 18:57:32 +000045 uint16_t fIdx[IDX];
Mike Reed147b6642019-08-21 10:31:02 -040046 unsigned fFlags;
reed@google.com05d63ae2011-10-28 18:57:32 +000047
48 static void load_2_tris(uint16_t idx[], int x, int y, int rb) {
49 int n = y * rb + x;
50 idx[0] = n; idx[1] = n + 1; idx[2] = rb + n + 1;
51 idx[3] = n; idx[4] = rb + n + 1; idx[5] = n + rb;
52 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000053
Mike Reed147b6642019-08-21 10:31:02 -040054 void onDelayedSetup() override {
55 auto img = GetResourceAsImage("images/mandrill_256.png");
56 if (img) {
57 fShader = img->makeShader();
58 }
59 }
60
reed@google.com05d63ae2011-10-28 18:57:32 +000061public:
Mike Reed147b6642019-08-21 10:31:02 -040062 VertBench(unsigned flags) : fFlags(flags) {
reed@google.com05d63ae2011-10-28 18:57:32 +000063 const SkScalar dx = SkIntToScalar(W) / COL;
64 const SkScalar dy = SkIntToScalar(H) / COL;
65
66 SkPoint* pts = fPts;
67 uint16_t* idx = fIdx;
68
69 SkScalar yy = 0;
70 for (int y = 0; y <= ROW; y++) {
71 SkScalar xx = 0;
72 for (int x = 0; x <= COL; ++x) {
73 pts->set(xx, yy);
74 pts += 1;
75 xx += dx;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000076
reed@google.com05d63ae2011-10-28 18:57:32 +000077 if (x < COL && y < ROW) {
78 load_2_tris(idx, x, y, COL + 1);
79 for (int i = 0; i < 6; i++) {
80 SkASSERT(idx[i] < PTS);
81 }
82 idx += 6;
83 }
84 }
85 yy += dy;
86 }
87 SkASSERT(PTS == pts - fPts);
88 SkASSERT(IDX == idx - fIdx);
89
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000090 SkRandom rand;
reed@google.com05d63ae2011-10-28 18:57:32 +000091 for (int i = 0; i < PTS; ++i) {
92 fColors[i] = rand.nextU() | (0xFF << 24);
93 }
94
95 fName.set("verts");
Mike Reed147b6642019-08-21 10:31:02 -040096 if (fFlags & kTexture_VertFlag) {
97 fName.append("_textures");
98 }
99 if (fFlags & kColors_VertFlag) {
100 fName.append("_colors");
101 }
Mike Reed8845c372019-12-19 13:22:08 -0500102 if (fFlags & kPersp_VertFlag) {
103 fName.append("_persp");
104 }
reed@google.com05d63ae2011-10-28 18:57:32 +0000105 }
106
107protected:
Mike Reed887cdf12017-04-03 11:11:09 -0400108 const char* onGetName() override { return fName.c_str(); }
109 void onDraw(int loops, SkCanvas* canvas) override {
reed@google.com05d63ae2011-10-28 18:57:32 +0000110 SkPaint paint;
111 this->setupPaint(&paint);
Mike Reed147b6642019-08-21 10:31:02 -0400112 paint.setShader(fShader);
bsalomon@google.com4a018bb2011-10-28 19:50:21 +0000113
Mike Reed8845c372019-12-19 13:22:08 -0500114 if (fFlags & kPersp_VertFlag) {
115 tiny_persp_effect(canvas);
116 }
117
Mike Reed147b6642019-08-21 10:31:02 -0400118 const SkPoint* texs = (fFlags & kTexture_VertFlag) ? fPts : nullptr;
119 const SkColor* cols = (fFlags & kColors_VertFlag) ? fColors : nullptr;
Mike Reed887cdf12017-04-03 11:11:09 -0400120 auto verts = SkVertices::MakeCopy(SkVertices::kTriangles_VertexMode, PTS,
Mike Reed147b6642019-08-21 10:31:02 -0400121 fPts, texs, cols, IDX, fIdx);
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000122 for (int i = 0; i < loops; i++) {
Mike Reed887cdf12017-04-03 11:11:09 -0400123 canvas->drawVertices(verts, SkBlendMode::kModulate, paint);
reed@google.com05d63ae2011-10-28 18:57:32 +0000124 }
reed@google.com05d63ae2011-10-28 18:57:32 +0000125 }
126private:
John Stiles7571f9e2020-09-02 22:42:33 -0400127 using INHERITED = Benchmark;
reed@google.com05d63ae2011-10-28 18:57:32 +0000128};
Mike Reed8845c372019-12-19 13:22:08 -0500129DEF_BENCH(return new VertBench(kTexture_VertFlag | kPersp_VertFlag);)
130DEF_BENCH(return new VertBench(kColors_VertFlag | kPersp_VertFlag);)
Mike Reed147b6642019-08-21 10:31:02 -0400131DEF_BENCH(return new VertBench(kTexture_VertFlag);)
132DEF_BENCH(return new VertBench(kColors_VertFlag);)
133DEF_BENCH(return new VertBench(kColors_VertFlag | kTexture_VertFlag);)
Mike Reed1d0e68b2019-03-22 15:57:45 -0400134
135/////////////////////////////////////////////////////////////////////////////////////////////////
136
Mike Kleinc0bd9f92019-04-23 12:05:21 -0500137#include "include/core/SkRSXform.h"
138#include "include/utils/SkRandom.h"
139#include "tools/Resources.h"
Mike Reed1d0e68b2019-03-22 15:57:45 -0400140
141enum AtlasFlags {
142 kColors_Flag = 1 << 0,
Mike Reedc2da70f2019-08-12 08:49:36 -0400143 kRotate_Flag = 1 << 1,
Mike Reed8845c372019-12-19 13:22:08 -0500144 kPersp_Flag = 1 << 2,
Mike Reed1d0e68b2019-03-22 15:57:45 -0400145};
146
147class AtlasBench : public Benchmark {
148 unsigned fFlags;
149 SkString fName;
150 enum {
151 W = 640,
152 H = 480,
153 N = 10*1000,
154 };
155
156 sk_sp<SkImage> fAtlas;
157 SkRSXform fXforms[N];
158 SkRect fRects[N];
159 SkColor fColors[N];
160
161public:
162 AtlasBench(unsigned flags) : fFlags(flags) {
Mike Reedc2da70f2019-08-12 08:49:36 -0400163 fName.printf("drawAtlas");
164 if (flags & kColors_Flag) {
165 fName.append("_colors");
166 }
167 if (flags & kRotate_Flag) {
168 fName.append("_rotated");
169 }
Mike Reed8845c372019-12-19 13:22:08 -0500170 if (flags & kPersp_Flag) {
171 fName.append("_persp");
172 }
Mike Reed1d0e68b2019-03-22 15:57:45 -0400173 }
174 ~AtlasBench() override {}
175
176protected:
177 const char* onGetName() override { return fName.c_str(); }
178 void onDelayedSetup() override {
179 fAtlas = GetResourceAsImage("images/mandrill_256.png");
180 if (fAtlas) {
181 fAtlas = fAtlas->makeRasterImage();
182 }
183
184 const SkScalar imageW = fAtlas->width();
185 const SkScalar imageH = fAtlas->height();
Mike Reedc2da70f2019-08-12 08:49:36 -0400186 SkScalar scos = 1;
187 SkScalar ssin = 0;
188 if (fFlags & kRotate_Flag) {
189 scos = 0.866025403784439f; // sqrt(3)/2
190 ssin = 0.5f;
191 }
Mike Reed1d0e68b2019-03-22 15:57:45 -0400192
193 SkRandom rand;
194 for (int i = 0; i < N; ++i) {
195 fRects[i] = SkRect::MakeXYWH(rand.nextF() * (imageW - 8),
196 rand.nextF() * (imageH - 8), 8, 8);
Mike Reed560e9172019-08-05 13:04:18 -0400197 fColors[i] = rand.nextU() | 0xFF000000;
Mike Reedc2da70f2019-08-12 08:49:36 -0400198 fXforms[i] = SkRSXform::Make(scos, ssin, rand.nextF() * W, rand.nextF() * H);
Mike Reed1d0e68b2019-03-22 15:57:45 -0400199 }
200 }
201 void onDraw(int loops, SkCanvas* canvas) override {
202 const SkRect* cullRect = nullptr;
203 const SkPaint* paintPtr = nullptr;
204 const SkColor* colors = nullptr;
Mike Reed1d0e68b2019-03-22 15:57:45 -0400205 if (fFlags & kColors_Flag) {
206 colors = fColors;
207 }
Mike Reed8845c372019-12-19 13:22:08 -0500208 if (fFlags & kPersp_Flag) {
209 tiny_persp_effect(canvas);
210 }
Mike Reed1d0e68b2019-03-22 15:57:45 -0400211 for (int i = 0; i < loops; i++) {
Mike Reedc2da70f2019-08-12 08:49:36 -0400212 canvas->drawAtlas(fAtlas, fXforms, fRects, colors, N, SkBlendMode::kModulate,
Mike Reed1d0e68b2019-03-22 15:57:45 -0400213 cullRect, paintPtr);
214 }
215 }
216private:
John Stiles7571f9e2020-09-02 22:42:33 -0400217 using INHERITED = Benchmark;
Mike Reed1d0e68b2019-03-22 15:57:45 -0400218};
219//DEF_BENCH(return new AtlasBench(0);)
220//DEF_BENCH(return new AtlasBench(kColors_Flag);)
Mike Reedc2da70f2019-08-12 08:49:36 -0400221DEF_BENCH(return new AtlasBench(0);)
222DEF_BENCH(return new AtlasBench(kRotate_Flag);)
Mike Reed8845c372019-12-19 13:22:08 -0500223DEF_BENCH(return new AtlasBench(kPersp_Flag);)
Mike Reedc2da70f2019-08-12 08:49:36 -0400224DEF_BENCH(return new AtlasBench(kColors_Flag);)
225DEF_BENCH(return new AtlasBench(kColors_Flag | kRotate_Flag);)
Mike Reed1d0e68b2019-03-22 15:57:45 -0400226