1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 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/SkRect.h" 9cb93a386Sopenharmony_ci#include "include/core/SkString.h" 10cb93a386Sopenharmony_ci#include "include/private/SkFloatBits.h" 11cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ciclass ScalarBench : public Benchmark { 14cb93a386Sopenharmony_ci SkString fName; 15cb93a386Sopenharmony_cipublic: 16cb93a386Sopenharmony_ci ScalarBench(const char name[]) { 17cb93a386Sopenharmony_ci fName.printf("scalar_%s", name); 18cb93a386Sopenharmony_ci } 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { 21cb93a386Sopenharmony_ci return backend == kNonRendering_Backend; 22cb93a386Sopenharmony_ci } 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci virtual void performTest() = 0; 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ciprotected: 27cb93a386Sopenharmony_ci virtual int mulLoopCount() const { return 1; } 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci const char* onGetName() override { 30cb93a386Sopenharmony_ci return fName.c_str(); 31cb93a386Sopenharmony_ci } 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas* canvas) override { 34cb93a386Sopenharmony_ci for (int i = 0; i < loops; i++) { 35cb93a386Sopenharmony_ci this->performTest(); 36cb93a386Sopenharmony_ci } 37cb93a386Sopenharmony_ci } 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ciprivate: 40cb93a386Sopenharmony_ci using INHERITED = Benchmark; 41cb93a386Sopenharmony_ci}; 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci// having unknown values in our arrays can throw off the timing a lot, perhaps 44cb93a386Sopenharmony_ci// handling NaN values is a lot slower. Anyway, this is just meant to put 45cb93a386Sopenharmony_ci// reasonable values in our arrays. 46cb93a386Sopenharmony_citemplate <typename T> void init9(T array[9]) { 47cb93a386Sopenharmony_ci SkRandom rand; 48cb93a386Sopenharmony_ci for (int i = 0; i < 9; i++) { 49cb93a386Sopenharmony_ci array[i] = rand.nextSScalar1(); 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci} 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ciclass FloatComparisonBench : public ScalarBench { 54cb93a386Sopenharmony_cipublic: 55cb93a386Sopenharmony_ci FloatComparisonBench() : INHERITED("compare_float") { 56cb93a386Sopenharmony_ci init9(fArray); 57cb93a386Sopenharmony_ci } 58cb93a386Sopenharmony_ciprotected: 59cb93a386Sopenharmony_ci int mulLoopCount() const override { return 4; } 60cb93a386Sopenharmony_ci void performTest() override { 61cb93a386Sopenharmony_ci // xoring into a volatile prevents the compiler from optimizing these checks away. 62cb93a386Sopenharmony_ci SK_MAYBE_UNUSED volatile bool junk = false; 63cb93a386Sopenharmony_ci junk ^= (fArray[6] != 0.0f || fArray[7] != 0.0f || fArray[8] != 1.0f); 64cb93a386Sopenharmony_ci junk ^= (fArray[2] != 0.0f || fArray[5] != 0.0f); 65cb93a386Sopenharmony_ci } 66cb93a386Sopenharmony_ciprivate: 67cb93a386Sopenharmony_ci float fArray[9]; 68cb93a386Sopenharmony_ci using INHERITED = ScalarBench; 69cb93a386Sopenharmony_ci}; 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ciclass ForcedIntComparisonBench : public ScalarBench { 72cb93a386Sopenharmony_cipublic: 73cb93a386Sopenharmony_ci ForcedIntComparisonBench() 74cb93a386Sopenharmony_ci : INHERITED("compare_forced_int") { 75cb93a386Sopenharmony_ci init9(fArray); 76cb93a386Sopenharmony_ci } 77cb93a386Sopenharmony_ciprotected: 78cb93a386Sopenharmony_ci int mulLoopCount() const override { return 4; } 79cb93a386Sopenharmony_ci void performTest() override { 80cb93a386Sopenharmony_ci // xoring into a volatile prevents the compiler from optimizing these checks away. 81cb93a386Sopenharmony_ci SK_MAYBE_UNUSED volatile int32_t junk = 0; 82cb93a386Sopenharmony_ci junk ^= (SkScalarAs2sCompliment(fArray[6]) | 83cb93a386Sopenharmony_ci SkScalarAs2sCompliment(fArray[7]) | 84cb93a386Sopenharmony_ci (SkScalarAs2sCompliment(fArray[8]) - kPersp1Int)); 85cb93a386Sopenharmony_ci junk ^= (SkScalarAs2sCompliment(fArray[2]) | 86cb93a386Sopenharmony_ci SkScalarAs2sCompliment(fArray[5])); 87cb93a386Sopenharmony_ci } 88cb93a386Sopenharmony_ciprivate: 89cb93a386Sopenharmony_ci static const int32_t kPersp1Int = 0x3f800000; 90cb93a386Sopenharmony_ci SkScalar fArray[9]; 91cb93a386Sopenharmony_ci using INHERITED = ScalarBench; 92cb93a386Sopenharmony_ci}; 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ciclass IsFiniteScalarBench : public ScalarBench { 95cb93a386Sopenharmony_cipublic: 96cb93a386Sopenharmony_ci IsFiniteScalarBench() : INHERITED("isfinite") { 97cb93a386Sopenharmony_ci SkRandom rand; 98cb93a386Sopenharmony_ci for (size_t i = 0; i < ARRAY_N; ++i) { 99cb93a386Sopenharmony_ci fArray[i] = rand.nextSScalar1(); 100cb93a386Sopenharmony_ci } 101cb93a386Sopenharmony_ci } 102cb93a386Sopenharmony_ciprotected: 103cb93a386Sopenharmony_ci int mulLoopCount() const override { return 1; } 104cb93a386Sopenharmony_ci void performTest() override { 105cb93a386Sopenharmony_ci int sum = 0; 106cb93a386Sopenharmony_ci for (size_t i = 0; i < ARRAY_N; ++i) { 107cb93a386Sopenharmony_ci // We pass -fArray[i], so the compiler can't cheat and treat the 108cb93a386Sopenharmony_ci // value as an int (even though we tell it that it is a float) 109cb93a386Sopenharmony_ci sum += SkScalarIsFinite(-fArray[i]); 110cb93a386Sopenharmony_ci } 111cb93a386Sopenharmony_ci // we do this so the compiler won't optimize our loop away... 112cb93a386Sopenharmony_ci this->doSomething(fArray, sum); 113cb93a386Sopenharmony_ci } 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_ci virtual void doSomething(SkScalar array[], int sum) {} 116cb93a386Sopenharmony_ciprivate: 117cb93a386Sopenharmony_ci enum { 118cb93a386Sopenharmony_ci ARRAY_N = 64 119cb93a386Sopenharmony_ci }; 120cb93a386Sopenharmony_ci SkScalar fArray[ARRAY_N]; 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_ci using INHERITED = ScalarBench; 123cb93a386Sopenharmony_ci}; 124cb93a386Sopenharmony_ci 125cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 126cb93a386Sopenharmony_ci 127cb93a386Sopenharmony_ciclass RectBoundsBench : public Benchmark { 128cb93a386Sopenharmony_ci enum { 129cb93a386Sopenharmony_ci PTS = 100, 130cb93a386Sopenharmony_ci }; 131cb93a386Sopenharmony_ci SkPoint fPts[PTS]; 132cb93a386Sopenharmony_ci 133cb93a386Sopenharmony_cipublic: 134cb93a386Sopenharmony_ci RectBoundsBench() { 135cb93a386Sopenharmony_ci SkRandom rand; 136cb93a386Sopenharmony_ci for (int i = 0; i < PTS; ++i) { 137cb93a386Sopenharmony_ci fPts[i].fX = rand.nextSScalar1(); 138cb93a386Sopenharmony_ci fPts[i].fY = rand.nextSScalar1(); 139cb93a386Sopenharmony_ci } 140cb93a386Sopenharmony_ci } 141cb93a386Sopenharmony_ci 142cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { 143cb93a386Sopenharmony_ci return backend == kNonRendering_Backend; 144cb93a386Sopenharmony_ci } 145cb93a386Sopenharmony_ci 146cb93a386Sopenharmony_ciprotected: 147cb93a386Sopenharmony_ci const char* onGetName() override { 148cb93a386Sopenharmony_ci return "rect_bounds"; 149cb93a386Sopenharmony_ci } 150cb93a386Sopenharmony_ci 151cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas* canvas) override { 152cb93a386Sopenharmony_ci SkRect r; 153cb93a386Sopenharmony_ci for (int loop = 0; loop < loops; ++loop) { 154cb93a386Sopenharmony_ci for (int i = 0; i < 1000; ++i) { 155cb93a386Sopenharmony_ci r.setBounds(fPts, PTS); 156cb93a386Sopenharmony_ci } 157cb93a386Sopenharmony_ci } 158cb93a386Sopenharmony_ci } 159cb93a386Sopenharmony_ci 160cb93a386Sopenharmony_ciprivate: 161cb93a386Sopenharmony_ci using INHERITED = Benchmark; 162cb93a386Sopenharmony_ci}; 163cb93a386Sopenharmony_ci 164cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 165cb93a386Sopenharmony_ci 166cb93a386Sopenharmony_ciDEF_BENCH( return new FloatComparisonBench(); ) 167cb93a386Sopenharmony_ciDEF_BENCH( return new ForcedIntComparisonBench(); ) 168cb93a386Sopenharmony_ciDEF_BENCH( return new RectBoundsBench(); ) 169cb93a386Sopenharmony_ciDEF_BENCH( return new IsFiniteScalarBench(); ) 170