blob: 06d72d0d38ea8236f764dbb4c81df6a17c3780a6 [file] [log] [blame]
sugoi@google.com5d71adf2013-04-24 19:36:44 +00001/*
2 * Copyright 2013 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 */
Mike Kleinc0bd9f92019-04-23 12:05:21 -05007#include "bench/Benchmark.h"
8#include "include/core/SkCanvas.h"
9#include "include/core/SkPoint3.h"
Michael Ludwig23003182019-08-05 11:25:23 -040010#include "include/effects/SkImageFilters.h"
sugoi@google.com5d71adf2013-04-24 19:36:44 +000011
12#define FILTER_WIDTH_SMALL SkIntToScalar(32)
13#define FILTER_HEIGHT_SMALL SkIntToScalar(32)
14#define FILTER_WIDTH_LARGE SkIntToScalar(256)
15#define FILTER_HEIGHT_LARGE SkIntToScalar(256)
16
tfarinaf168b862014-06-19 12:32:29 -070017class LightingBaseBench : public Benchmark {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000018public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000019 LightingBaseBench(bool small) : fIsSmall(small) { }
sugoi@google.com5d71adf2013-04-24 19:36:44 +000020
21protected:
robertphillips12fa47d2016-04-08 16:28:09 -070022 void draw(int loops, SkCanvas* canvas, sk_sp<SkImageFilter> imageFilter) const {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000023 SkRect r = fIsSmall ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) :
24 SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE);
25 SkPaint paint;
robertphillips12fa47d2016-04-08 16:28:09 -070026 paint.setImageFilter(std::move(imageFilter));
commit-bot@chromium.org33614712013-12-03 18:17:16 +000027 for (int i = 0; i < loops; i++) {
mtklein@google.comc2897432013-09-10 19:23:38 +000028 canvas->drawRect(r, paint);
29 }
sugoi@google.com5d71adf2013-04-24 19:36:44 +000030 }
31
robertphillips3d32d762015-07-13 13:16:44 -070032 static SkPoint3 GetPointLocation() {
33 static SkPoint3 pointLocation = SkPoint3::Make(0, 0, SkIntToScalar(10));
sugoi@google.com5d71adf2013-04-24 19:36:44 +000034 return pointLocation;
35 }
36
robertphillips3d32d762015-07-13 13:16:44 -070037 static SkPoint3 GetDistantDirection() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000038 static SkScalar azimuthRad = SkDegreesToRadians(SkIntToScalar(225));
39 static SkScalar elevationRad = SkDegreesToRadians(SkIntToScalar(5));
Mike Reeddf85c382017-02-14 10:59:19 -050040 static SkPoint3 distantDirection = SkPoint3::Make(
41 SkScalarCos(azimuthRad) * SkScalarCos(elevationRad),
42 SkScalarSin(azimuthRad) * SkScalarCos(elevationRad),
43 SkScalarSin(elevationRad));
sugoi@google.com5d71adf2013-04-24 19:36:44 +000044 return distantDirection;
45 }
46
robertphillips3d32d762015-07-13 13:16:44 -070047 static SkPoint3 GetSpotLocation() {
48 static SkPoint3 spotLocation = SkPoint3::Make(SkIntToScalar(-10),
49 SkIntToScalar(-10),
50 SkIntToScalar(20));
sugoi@google.com5d71adf2013-04-24 19:36:44 +000051 return spotLocation;
52 }
53
robertphillips3d32d762015-07-13 13:16:44 -070054 static SkPoint3 GetSpotTarget() {
55 static SkPoint3 spotTarget = SkPoint3::Make(SkIntToScalar(40), SkIntToScalar(40), 0);
sugoi@google.com5d71adf2013-04-24 19:36:44 +000056 return spotTarget;
57 }
58
robertphillips3d32d762015-07-13 13:16:44 -070059 static SkScalar GetSpotExponent() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000060 static SkScalar spotExponent = SK_Scalar1;
61 return spotExponent;
62 }
63
robertphillips3d32d762015-07-13 13:16:44 -070064 static SkScalar GetCutoffAngle() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000065 static SkScalar cutoffAngle = SkIntToScalar(15);
66 return cutoffAngle;
67 }
68
robertphillips3d32d762015-07-13 13:16:44 -070069 static SkScalar GetKd() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000070 static SkScalar kd = SkIntToScalar(2);
71 return kd;
72 }
73
robertphillips3d32d762015-07-13 13:16:44 -070074 static SkScalar GetKs() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000075 static SkScalar ks = SkIntToScalar(1);
76 return ks;
77 }
78
robertphillips3d32d762015-07-13 13:16:44 -070079 static SkScalar GetShininess() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000080 static SkScalar shininess = SkIntToScalar(8);
81 return shininess;
82 }
83
robertphillips3d32d762015-07-13 13:16:44 -070084 static SkScalar GetSurfaceScale() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000085 static SkScalar surfaceScale = SkIntToScalar(1);
86 return surfaceScale;
87 }
88
robertphillips3d32d762015-07-13 13:16:44 -070089 static SkColor GetWhite() {
sugoi@google.com5d71adf2013-04-24 19:36:44 +000090 static SkColor white(0xFFFFFFFF);
91 return white;
92 }
93
94 bool fIsSmall;
tfarinaf168b862014-06-19 12:32:29 -070095 typedef Benchmark INHERITED;
sugoi@google.com5d71adf2013-04-24 19:36:44 +000096};
97
98class LightingPointLitDiffuseBench : public LightingBaseBench {
99public:
robertphillips12fa47d2016-04-08 16:28:09 -0700100 LightingPointLitDiffuseBench(bool small) : INHERITED(small) { }
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000101
102protected:
mtklein36352bf2015-03-25 18:17:31 -0700103 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000104 return fIsSmall ? "lightingpointlitdiffuse_small" : "lightingpointlitdiffuse_large";
105 }
106
mtkleina1ebeb22015-10-01 09:43:39 -0700107 void onDraw(int loops, SkCanvas* canvas) override {
Michael Ludwig23003182019-08-05 11:25:23 -0400108 draw(loops, canvas, SkImageFilters::PointLitDiffuse(
109 GetPointLocation(), GetWhite(), GetSurfaceScale(), GetKd(), nullptr));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000110 }
111
112private:
113 typedef LightingBaseBench INHERITED;
114};
115
116class LightingDistantLitDiffuseBench : public LightingBaseBench {
117public:
robertphillips12fa47d2016-04-08 16:28:09 -0700118 LightingDistantLitDiffuseBench(bool small) : INHERITED(small) { }
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000119
120protected:
mtklein36352bf2015-03-25 18:17:31 -0700121 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000122 return fIsSmall ? "lightingdistantlitdiffuse_small" : "lightingdistantlitdiffuse_large";
123 }
124
mtkleina1ebeb22015-10-01 09:43:39 -0700125 void onDraw(int loops, SkCanvas* canvas) override {
Michael Ludwig23003182019-08-05 11:25:23 -0400126 draw(loops, canvas, SkImageFilters::DistantLitDiffuse(
127 GetDistantDirection(), GetWhite(), GetSurfaceScale(), GetKd(), nullptr));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000128 }
129
130private:
131 typedef LightingBaseBench INHERITED;
132};
133
134class LightingSpotLitDiffuseBench : public LightingBaseBench {
135public:
robertphillips12fa47d2016-04-08 16:28:09 -0700136 LightingSpotLitDiffuseBench(bool small) : INHERITED(small) { }
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000137
138protected:
mtklein36352bf2015-03-25 18:17:31 -0700139 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000140 return fIsSmall ? "lightingspotlitdiffuse_small" : "lightingspotlitdiffuse_large";
141 }
142
mtkleina1ebeb22015-10-01 09:43:39 -0700143 void onDraw(int loops, SkCanvas* canvas) override {
Michael Ludwig23003182019-08-05 11:25:23 -0400144 draw(loops, canvas, SkImageFilters::SpotLitDiffuse(
145 GetSpotLocation(), GetSpotTarget(), GetSpotExponent(), GetCutoffAngle(),
146 GetWhite(), GetSurfaceScale(), GetKd(), nullptr));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000147 }
148
149private:
150 typedef LightingBaseBench INHERITED;
151};
152
153class LightingPointLitSpecularBench : public LightingBaseBench {
154public:
robertphillips12fa47d2016-04-08 16:28:09 -0700155 LightingPointLitSpecularBench(bool small) : INHERITED(small) { }
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000156
157protected:
mtklein36352bf2015-03-25 18:17:31 -0700158 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000159 return fIsSmall ? "lightingpointlitspecular_small" : "lightingpointlitspecular_large";
160 }
161
mtkleina1ebeb22015-10-01 09:43:39 -0700162 void onDraw(int loops, SkCanvas* canvas) override {
Michael Ludwig23003182019-08-05 11:25:23 -0400163 draw(loops, canvas, SkImageFilters::PointLitSpecular(
164 GetPointLocation(), GetWhite(), GetSurfaceScale(), GetKs(), GetShininess(),
165 nullptr));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000166 }
167
168private:
169 typedef LightingBaseBench INHERITED;
170};
171
172class LightingDistantLitSpecularBench : public LightingBaseBench {
173public:
robertphillips12fa47d2016-04-08 16:28:09 -0700174 LightingDistantLitSpecularBench(bool small) : INHERITED(small) { }
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000175
176protected:
mtklein36352bf2015-03-25 18:17:31 -0700177 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000178 return fIsSmall ? "lightingdistantlitspecular_small" : "lightingdistantlitspecular_large";
179 }
180
mtkleina1ebeb22015-10-01 09:43:39 -0700181 void onDraw(int loops, SkCanvas* canvas) override {
Michael Ludwig23003182019-08-05 11:25:23 -0400182 draw(loops, canvas, SkImageFilters::DistantLitSpecular(
183 GetDistantDirection(), GetWhite(), GetSurfaceScale(), GetKs(), GetShininess(),
184 nullptr));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000185 }
186
187private:
188 typedef LightingBaseBench INHERITED;
189};
190
191class LightingSpotLitSpecularBench : public LightingBaseBench {
192public:
robertphillips12fa47d2016-04-08 16:28:09 -0700193 LightingSpotLitSpecularBench(bool small) : INHERITED(small) { }
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000194
195protected:
mtklein36352bf2015-03-25 18:17:31 -0700196 const char* onGetName() override {
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000197 return fIsSmall ? "lightingspotlitspecular_small" : "lightingspotlitspecular_large";
198 }
199
mtkleina1ebeb22015-10-01 09:43:39 -0700200 void onDraw(int loops, SkCanvas* canvas) override {
Michael Ludwig23003182019-08-05 11:25:23 -0400201 draw(loops, canvas, SkImageFilters::SpotLitSpecular(
202 GetSpotLocation(), GetSpotTarget(), GetSpotExponent(), GetCutoffAngle(),
203 GetWhite(), GetSurfaceScale(), GetKs(), GetShininess(), nullptr));
sugoi@google.com5d71adf2013-04-24 19:36:44 +0000204 }
205
206private:
207 typedef LightingBaseBench INHERITED;
208};
209
210///////////////////////////////////////////////////////////////////////////////
211
mtklein@google.com410e6e82013-09-13 19:52:27 +0000212DEF_BENCH( return new LightingPointLitDiffuseBench(true); )
213DEF_BENCH( return new LightingPointLitDiffuseBench(false); )
214DEF_BENCH( return new LightingDistantLitDiffuseBench(true); )
215DEF_BENCH( return new LightingDistantLitDiffuseBench(false); )
216DEF_BENCH( return new LightingSpotLitDiffuseBench(true); )
217DEF_BENCH( return new LightingSpotLitDiffuseBench(false); )
218DEF_BENCH( return new LightingPointLitSpecularBench(true); )
219DEF_BENCH( return new LightingPointLitSpecularBench(false); )
220DEF_BENCH( return new LightingDistantLitSpecularBench(true); )
221DEF_BENCH( return new LightingDistantLitSpecularBench(false); )
222DEF_BENCH( return new LightingSpotLitSpecularBench(true); )
223DEF_BENCH( return new LightingSpotLitSpecularBench(false); )