1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h" 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint3.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkImageFilters.h" 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker #define FILTER_WIDTH_SMALL SkIntToScalar(32) 13*c8dee2aaSAndroid Build Coastguard Worker #define FILTER_HEIGHT_SMALL SkIntToScalar(32) 14*c8dee2aaSAndroid Build Coastguard Worker #define FILTER_WIDTH_LARGE SkIntToScalar(256) 15*c8dee2aaSAndroid Build Coastguard Worker #define FILTER_HEIGHT_LARGE SkIntToScalar(256) 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class LightingBaseBench : public Benchmark { 18*c8dee2aaSAndroid Build Coastguard Worker public: LightingBaseBench(bool small)19*c8dee2aaSAndroid Build Coastguard Worker LightingBaseBench(bool small) : fIsSmall(small) { } 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker protected: draw(int loops,SkCanvas * canvas,sk_sp<SkImageFilter> imageFilter) const22*c8dee2aaSAndroid Build Coastguard Worker void draw(int loops, SkCanvas* canvas, sk_sp<SkImageFilter> imageFilter) const { 23*c8dee2aaSAndroid Build Coastguard Worker SkRect r = fIsSmall ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) : 24*c8dee2aaSAndroid Build Coastguard Worker SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE); 25*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 26*c8dee2aaSAndroid Build Coastguard Worker paint.setImageFilter(std::move(imageFilter)); 27*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; i++) { 28*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(r, paint); 29*c8dee2aaSAndroid Build Coastguard Worker } 30*c8dee2aaSAndroid Build Coastguard Worker } 31*c8dee2aaSAndroid Build Coastguard Worker GetPointLocation()32*c8dee2aaSAndroid Build Coastguard Worker static SkPoint3 GetPointLocation() { 33*c8dee2aaSAndroid Build Coastguard Worker static SkPoint3 pointLocation = SkPoint3::Make(0, 0, SkIntToScalar(10)); 34*c8dee2aaSAndroid Build Coastguard Worker return pointLocation; 35*c8dee2aaSAndroid Build Coastguard Worker } 36*c8dee2aaSAndroid Build Coastguard Worker GetDistantDirection()37*c8dee2aaSAndroid Build Coastguard Worker static SkPoint3 GetDistantDirection() { 38*c8dee2aaSAndroid Build Coastguard Worker static SkScalar azimuthRad = SkDegreesToRadians(SkIntToScalar(225)); 39*c8dee2aaSAndroid Build Coastguard Worker static SkScalar elevationRad = SkDegreesToRadians(SkIntToScalar(5)); 40*c8dee2aaSAndroid Build Coastguard Worker static SkPoint3 distantDirection = SkPoint3::Make( 41*c8dee2aaSAndroid Build Coastguard Worker SkScalarCos(azimuthRad) * SkScalarCos(elevationRad), 42*c8dee2aaSAndroid Build Coastguard Worker SkScalarSin(azimuthRad) * SkScalarCos(elevationRad), 43*c8dee2aaSAndroid Build Coastguard Worker SkScalarSin(elevationRad)); 44*c8dee2aaSAndroid Build Coastguard Worker return distantDirection; 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker GetSpotLocation()47*c8dee2aaSAndroid Build Coastguard Worker static SkPoint3 GetSpotLocation() { 48*c8dee2aaSAndroid Build Coastguard Worker static SkPoint3 spotLocation = SkPoint3::Make(SkIntToScalar(-10), 49*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar(-10), 50*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar(20)); 51*c8dee2aaSAndroid Build Coastguard Worker return spotLocation; 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker GetSpotTarget()54*c8dee2aaSAndroid Build Coastguard Worker static SkPoint3 GetSpotTarget() { 55*c8dee2aaSAndroid Build Coastguard Worker static SkPoint3 spotTarget = SkPoint3::Make(SkIntToScalar(40), SkIntToScalar(40), 0); 56*c8dee2aaSAndroid Build Coastguard Worker return spotTarget; 57*c8dee2aaSAndroid Build Coastguard Worker } 58*c8dee2aaSAndroid Build Coastguard Worker GetSpotExponent()59*c8dee2aaSAndroid Build Coastguard Worker static SkScalar GetSpotExponent() { 60*c8dee2aaSAndroid Build Coastguard Worker static SkScalar spotExponent = SK_Scalar1; 61*c8dee2aaSAndroid Build Coastguard Worker return spotExponent; 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker GetCutoffAngle()64*c8dee2aaSAndroid Build Coastguard Worker static SkScalar GetCutoffAngle() { 65*c8dee2aaSAndroid Build Coastguard Worker static SkScalar cutoffAngle = SkIntToScalar(15); 66*c8dee2aaSAndroid Build Coastguard Worker return cutoffAngle; 67*c8dee2aaSAndroid Build Coastguard Worker } 68*c8dee2aaSAndroid Build Coastguard Worker GetKd()69*c8dee2aaSAndroid Build Coastguard Worker static SkScalar GetKd() { 70*c8dee2aaSAndroid Build Coastguard Worker static SkScalar kd = SkIntToScalar(2); 71*c8dee2aaSAndroid Build Coastguard Worker return kd; 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker GetKs()74*c8dee2aaSAndroid Build Coastguard Worker static SkScalar GetKs() { 75*c8dee2aaSAndroid Build Coastguard Worker static SkScalar ks = SkIntToScalar(1); 76*c8dee2aaSAndroid Build Coastguard Worker return ks; 77*c8dee2aaSAndroid Build Coastguard Worker } 78*c8dee2aaSAndroid Build Coastguard Worker GetShininess()79*c8dee2aaSAndroid Build Coastguard Worker static SkScalar GetShininess() { 80*c8dee2aaSAndroid Build Coastguard Worker static SkScalar shininess = SkIntToScalar(8); 81*c8dee2aaSAndroid Build Coastguard Worker return shininess; 82*c8dee2aaSAndroid Build Coastguard Worker } 83*c8dee2aaSAndroid Build Coastguard Worker GetSurfaceScale()84*c8dee2aaSAndroid Build Coastguard Worker static SkScalar GetSurfaceScale() { 85*c8dee2aaSAndroid Build Coastguard Worker static SkScalar surfaceScale = SkIntToScalar(1); 86*c8dee2aaSAndroid Build Coastguard Worker return surfaceScale; 87*c8dee2aaSAndroid Build Coastguard Worker } 88*c8dee2aaSAndroid Build Coastguard Worker GetWhite()89*c8dee2aaSAndroid Build Coastguard Worker static SkColor GetWhite() { 90*c8dee2aaSAndroid Build Coastguard Worker static SkColor white(0xFFFFFFFF); 91*c8dee2aaSAndroid Build Coastguard Worker return white; 92*c8dee2aaSAndroid Build Coastguard Worker } 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker bool fIsSmall; 95*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 96*c8dee2aaSAndroid Build Coastguard Worker }; 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker class LightingPointLitDiffuseBench : public LightingBaseBench { 99*c8dee2aaSAndroid Build Coastguard Worker public: LightingPointLitDiffuseBench(bool small)100*c8dee2aaSAndroid Build Coastguard Worker LightingPointLitDiffuseBench(bool small) : INHERITED(small) { } 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()103*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 104*c8dee2aaSAndroid Build Coastguard Worker return fIsSmall ? "lightingpointlitdiffuse_small" : "lightingpointlitdiffuse_large"; 105*c8dee2aaSAndroid Build Coastguard Worker } 106*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)107*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 108*c8dee2aaSAndroid Build Coastguard Worker draw(loops, canvas, SkImageFilters::PointLitDiffuse( 109*c8dee2aaSAndroid Build Coastguard Worker GetPointLocation(), GetWhite(), GetSurfaceScale(), GetKd(), nullptr)); 110*c8dee2aaSAndroid Build Coastguard Worker } 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker private: 113*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = LightingBaseBench; 114*c8dee2aaSAndroid Build Coastguard Worker }; 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard Worker class LightingDistantLitDiffuseBench : public LightingBaseBench { 117*c8dee2aaSAndroid Build Coastguard Worker public: LightingDistantLitDiffuseBench(bool small)118*c8dee2aaSAndroid Build Coastguard Worker LightingDistantLitDiffuseBench(bool small) : INHERITED(small) { } 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()121*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 122*c8dee2aaSAndroid Build Coastguard Worker return fIsSmall ? "lightingdistantlitdiffuse_small" : "lightingdistantlitdiffuse_large"; 123*c8dee2aaSAndroid Build Coastguard Worker } 124*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)125*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 126*c8dee2aaSAndroid Build Coastguard Worker draw(loops, canvas, SkImageFilters::DistantLitDiffuse( 127*c8dee2aaSAndroid Build Coastguard Worker GetDistantDirection(), GetWhite(), GetSurfaceScale(), GetKd(), nullptr)); 128*c8dee2aaSAndroid Build Coastguard Worker } 129*c8dee2aaSAndroid Build Coastguard Worker 130*c8dee2aaSAndroid Build Coastguard Worker private: 131*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = LightingBaseBench; 132*c8dee2aaSAndroid Build Coastguard Worker }; 133*c8dee2aaSAndroid Build Coastguard Worker 134*c8dee2aaSAndroid Build Coastguard Worker class LightingSpotLitDiffuseBench : public LightingBaseBench { 135*c8dee2aaSAndroid Build Coastguard Worker public: LightingSpotLitDiffuseBench(bool small)136*c8dee2aaSAndroid Build Coastguard Worker LightingSpotLitDiffuseBench(bool small) : INHERITED(small) { } 137*c8dee2aaSAndroid Build Coastguard Worker 138*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()139*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 140*c8dee2aaSAndroid Build Coastguard Worker return fIsSmall ? "lightingspotlitdiffuse_small" : "lightingspotlitdiffuse_large"; 141*c8dee2aaSAndroid Build Coastguard Worker } 142*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)143*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 144*c8dee2aaSAndroid Build Coastguard Worker draw(loops, canvas, SkImageFilters::SpotLitDiffuse( 145*c8dee2aaSAndroid Build Coastguard Worker GetSpotLocation(), GetSpotTarget(), GetSpotExponent(), GetCutoffAngle(), 146*c8dee2aaSAndroid Build Coastguard Worker GetWhite(), GetSurfaceScale(), GetKd(), nullptr)); 147*c8dee2aaSAndroid Build Coastguard Worker } 148*c8dee2aaSAndroid Build Coastguard Worker 149*c8dee2aaSAndroid Build Coastguard Worker private: 150*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = LightingBaseBench; 151*c8dee2aaSAndroid Build Coastguard Worker }; 152*c8dee2aaSAndroid Build Coastguard Worker 153*c8dee2aaSAndroid Build Coastguard Worker class LightingPointLitSpecularBench : public LightingBaseBench { 154*c8dee2aaSAndroid Build Coastguard Worker public: LightingPointLitSpecularBench(bool small)155*c8dee2aaSAndroid Build Coastguard Worker LightingPointLitSpecularBench(bool small) : INHERITED(small) { } 156*c8dee2aaSAndroid Build Coastguard Worker 157*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()158*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 159*c8dee2aaSAndroid Build Coastguard Worker return fIsSmall ? "lightingpointlitspecular_small" : "lightingpointlitspecular_large"; 160*c8dee2aaSAndroid Build Coastguard Worker } 161*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)162*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 163*c8dee2aaSAndroid Build Coastguard Worker draw(loops, canvas, SkImageFilters::PointLitSpecular( 164*c8dee2aaSAndroid Build Coastguard Worker GetPointLocation(), GetWhite(), GetSurfaceScale(), GetKs(), GetShininess(), 165*c8dee2aaSAndroid Build Coastguard Worker nullptr)); 166*c8dee2aaSAndroid Build Coastguard Worker } 167*c8dee2aaSAndroid Build Coastguard Worker 168*c8dee2aaSAndroid Build Coastguard Worker private: 169*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = LightingBaseBench; 170*c8dee2aaSAndroid Build Coastguard Worker }; 171*c8dee2aaSAndroid Build Coastguard Worker 172*c8dee2aaSAndroid Build Coastguard Worker class LightingDistantLitSpecularBench : public LightingBaseBench { 173*c8dee2aaSAndroid Build Coastguard Worker public: LightingDistantLitSpecularBench(bool small)174*c8dee2aaSAndroid Build Coastguard Worker LightingDistantLitSpecularBench(bool small) : INHERITED(small) { } 175*c8dee2aaSAndroid Build Coastguard Worker 176*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()177*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 178*c8dee2aaSAndroid Build Coastguard Worker return fIsSmall ? "lightingdistantlitspecular_small" : "lightingdistantlitspecular_large"; 179*c8dee2aaSAndroid Build Coastguard Worker } 180*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)181*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 182*c8dee2aaSAndroid Build Coastguard Worker draw(loops, canvas, SkImageFilters::DistantLitSpecular( 183*c8dee2aaSAndroid Build Coastguard Worker GetDistantDirection(), GetWhite(), GetSurfaceScale(), GetKs(), GetShininess(), 184*c8dee2aaSAndroid Build Coastguard Worker nullptr)); 185*c8dee2aaSAndroid Build Coastguard Worker } 186*c8dee2aaSAndroid Build Coastguard Worker 187*c8dee2aaSAndroid Build Coastguard Worker private: 188*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = LightingBaseBench; 189*c8dee2aaSAndroid Build Coastguard Worker }; 190*c8dee2aaSAndroid Build Coastguard Worker 191*c8dee2aaSAndroid Build Coastguard Worker class LightingSpotLitSpecularBench : public LightingBaseBench { 192*c8dee2aaSAndroid Build Coastguard Worker public: LightingSpotLitSpecularBench(bool small)193*c8dee2aaSAndroid Build Coastguard Worker LightingSpotLitSpecularBench(bool small) : INHERITED(small) { } 194*c8dee2aaSAndroid Build Coastguard Worker 195*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()196*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 197*c8dee2aaSAndroid Build Coastguard Worker return fIsSmall ? "lightingspotlitspecular_small" : "lightingspotlitspecular_large"; 198*c8dee2aaSAndroid Build Coastguard Worker } 199*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)200*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 201*c8dee2aaSAndroid Build Coastguard Worker draw(loops, canvas, SkImageFilters::SpotLitSpecular( 202*c8dee2aaSAndroid Build Coastguard Worker GetSpotLocation(), GetSpotTarget(), GetSpotExponent(), GetCutoffAngle(), 203*c8dee2aaSAndroid Build Coastguard Worker GetWhite(), GetSurfaceScale(), GetKs(), GetShininess(), nullptr)); 204*c8dee2aaSAndroid Build Coastguard Worker } 205*c8dee2aaSAndroid Build Coastguard Worker 206*c8dee2aaSAndroid Build Coastguard Worker private: 207*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = LightingBaseBench; 208*c8dee2aaSAndroid Build Coastguard Worker }; 209*c8dee2aaSAndroid Build Coastguard Worker 210*c8dee2aaSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 211*c8dee2aaSAndroid Build Coastguard Worker 212*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingPointLitDiffuseBench(true); ) 213*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingPointLitDiffuseBench(false); ) 214*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingDistantLitDiffuseBench(true); ) 215*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingDistantLitDiffuseBench(false); ) 216*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingSpotLitDiffuseBench(true); ) 217*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingSpotLitDiffuseBench(false); ) 218*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingPointLitSpecularBench(true); ) 219*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingPointLitSpecularBench(false); ) 220*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingDistantLitSpecularBench(true); ) 221*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingDistantLitSpecularBench(false); ) 222*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingSpotLitSpecularBench(true); ) 223*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new LightingSpotLitSpecularBench(false); ) 224