1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/* 2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Copyright 2012 Google Inc. 3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * found in the LICENSE file. 6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkBenchmark.h" 9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkMatrix44.h" 10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkRandom.h" 11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkString.h" 12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass Matrix44Bench : public SkBenchmark { 14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkString fName; 15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger enum { N = 10000 }; 16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: 17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger Matrix44Bench(void* param, const char name[]) : INHERITED(param) { 18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fName.printf("matrix44_%s", name); 19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fIsRendering = false; 20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void performTest() = 0; 23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected: 25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual int mulLoopCount() const { return 1; } 26363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual const char* onGetName() { 28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return fName.c_str(); 29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger virtual void onDraw(SkCanvas*) { 32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger int n = SkBENCHLOOP(N * this->mulLoopCount()); 33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < n; i++) { 34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger this->performTest(); 35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate: 39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger typedef SkBenchmark INHERITED; 40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass EqualsMatrix44Bench : public Matrix44Bench { 43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: 44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger EqualsMatrix44Bench(void* param) : INHERITED(param, "equals") { 45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM1.set(0, 0, 0); 46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM2.set(3, 3, 0); 47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected: 49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void performTest() { 50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 10; ++i) { 51d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger (void) (fM0 == fM1); 52d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger (void) (fM1 == fM2); 53d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger (void) (fM2 == fM0); 54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate: 57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkMatrix44 fM0, fM1, fM2; 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger typedef Matrix44Bench INHERITED; 59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass PreScaleMatrix44Bench : public Matrix44Bench { 62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: 63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger PreScaleMatrix44Bench(void* param) : INHERITED(param, "prescale") { 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fX = fY = fZ = SkDoubleToMScalar(1.5); 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected: 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void performTest() { 68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.reset(); 69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 10; ++i) { 70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.preScale(fX, fY, fZ); 71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate: 74363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkMatrix44 fM0; 75363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkMScalar fX, fY, fZ; 76363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger typedef Matrix44Bench INHERITED; 77363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 78363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 79363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass InvertMatrix44Bench : public Matrix44Bench { 80363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: 81363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger InvertMatrix44Bench(void* param) : INHERITED(param, "invert") { 82363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(0, 0, -1.1); 83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(0, 1, 2.1); 84363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(0, 2, -3.1); 85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(0, 3, 4.1); 86363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(1, 0, 5.1); 87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(1, 1, -6.1); 88363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(1, 2, 7.1); 89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(1, 3, 8.1); 90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(2, 0, -9.1); 91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(2, 1, 10.1); 92363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(2, 2, 11.1); 93363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(2, 3, -12.1); 94363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(3, 0, -13.1); 95363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(3, 1, 14.1); 96363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(3, 2, -15.1); 97363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.set(3, 3, 16.1); 98363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 99363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected: 100363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void performTest() { 101363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 10; ++i) { 102363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.invert(&fM1); 103363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 104363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 105363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate: 106363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkMatrix44 fM0, fM1; 107363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger typedef Matrix44Bench INHERITED; 108363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 109363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 110363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass PostScaleMatrix44Bench : public Matrix44Bench { 111363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: 112363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger PostScaleMatrix44Bench(void* param) : INHERITED(param, "postscale") { 113363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fX = fY = fZ = SkDoubleToMScalar(1.5); 114363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 115363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected: 116363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void performTest() { 117363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.reset(); 118363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 10; ++i) { 119363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.postScale(fX, fY, fZ); 120363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 121363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 122363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate: 123363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkMatrix44 fM0; 124363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkMScalar fX, fY, fZ; 125363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger typedef Matrix44Bench INHERITED; 126363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 127363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 128363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass SetConcatMatrix44Bench : public Matrix44Bench { 129363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: 130363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SetConcatMatrix44Bench(void* param) : INHERITED(param, "setconcat") { 131363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fX = fY = fZ = SkDoubleToMScalar(1.5); 132363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM1.setScale(fX, fY, fZ); 133363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM2.setTranslate(fX, fY, fZ); 134363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 135363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected: 136363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void performTest() { 137363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.reset(); // just to normalize this test with prescale/postscale 138363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 10; ++i) { 139363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fM0.setConcat(fM1, fM2); 140363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 141363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 142363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate: 143363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkMatrix44 fM0, fM1, fM2; 144363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkMScalar fX, fY, fZ; 145363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger typedef Matrix44Bench INHERITED; 146363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 147363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 148363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GetTypeMatrix44Bench : public Matrix44Bench { 149363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: 150363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GetTypeMatrix44Bench(void* param) : INHERITED(param, "gettype") {} 151363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected: 152363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // Putting random generation of the matrix inside performTest() 153363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // would help us avoid anomalous runs, but takes up 25% or 154363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // more of the function time. 155363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void performTest() { 156363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < 20; ++i) { 157363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fMatrix.set(1, 2, 1); // to invalidate the type-cache 158363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fMatrix.getType(); 159363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 160363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 161363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate: 162363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkMatrix44 fMatrix; 163363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger typedef Matrix44Bench INHERITED; 164363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 165363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 166363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new EqualsMatrix44Bench(p); ) 167363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new PreScaleMatrix44Bench(p); ) 168363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new PostScaleMatrix44Bench(p); ) 169363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new InvertMatrix44Bench(p); ) 170363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new SetConcatMatrix44Bench(p); ) 171363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerDEF_BENCH( return new GetTypeMatrix44Bench(p); ) 172