1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 93fb5187647397e056843c1f41a508992be22175dreed@google.com#include "SkMatrix.h" 105b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org#include "SkMatrixUtils.h" 117b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com#include "SkRandom.h" 123fb5187647397e056843c1f41a508992be22175dreed@google.com#include "SkString.h" 133fb5187647397e056843c1f41a508992be22175dreed@google.com 14f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass MatrixBench : public Benchmark { 153fb5187647397e056843c1f41a508992be22175dreed@google.com SkString fName; 163fb5187647397e056843c1f41a508992be22175dreed@google.compublic: 17410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com MatrixBench(const char name[]) { 183fb5187647397e056843c1f41a508992be22175dreed@google.com fName.printf("matrix_%s", name); 19644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 20644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 2136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 22644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 233fb5187647397e056843c1f41a508992be22175dreed@google.com } 243fb5187647397e056843c1f41a508992be22175dreed@google.com 253fb5187647397e056843c1f41a508992be22175dreed@google.com virtual void performTest() = 0; 263fb5187647397e056843c1f41a508992be22175dreed@google.com 273fb5187647397e056843c1f41a508992be22175dreed@google.comprotected: 28cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com virtual int mulLoopCount() const { return 1; } 29cbefd7d842945a8a7cc21770b19f41e0f3f3b205reed@google.com 303fb5187647397e056843c1f41a508992be22175dreed@google.com virtual const char* onGetName() { 313fb5187647397e056843c1f41a508992be22175dreed@google.com return fName.c_str(); 323fb5187647397e056843c1f41a508992be22175dreed@google.com } 333fb5187647397e056843c1f41a508992be22175dreed@google.com 343361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) { 353361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; i++) { 363fb5187647397e056843c1f41a508992be22175dreed@google.com this->performTest(); 373fb5187647397e056843c1f41a508992be22175dreed@google.com } 383fb5187647397e056843c1f41a508992be22175dreed@google.com } 393fb5187647397e056843c1f41a508992be22175dreed@google.com 403fb5187647397e056843c1f41a508992be22175dreed@google.comprivate: 41f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 423fb5187647397e056843c1f41a508992be22175dreed@google.com}; 433fb5187647397e056843c1f41a508992be22175dreed@google.com 443fb5187647397e056843c1f41a508992be22175dreed@google.com 453fb5187647397e056843c1f41a508992be22175dreed@google.comclass EqualsMatrixBench : public MatrixBench { 463fb5187647397e056843c1f41a508992be22175dreed@google.compublic: 47410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com EqualsMatrixBench() : INHERITED("equals") {} 483fb5187647397e056843c1f41a508992be22175dreed@google.comprotected: 493fb5187647397e056843c1f41a508992be22175dreed@google.com virtual void performTest() { 503fb5187647397e056843c1f41a508992be22175dreed@google.com SkMatrix m0, m1, m2; 517b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com 523fb5187647397e056843c1f41a508992be22175dreed@google.com m0.reset(); 533fb5187647397e056843c1f41a508992be22175dreed@google.com m1.reset(); 543fb5187647397e056843c1f41a508992be22175dreed@google.com m2.reset(); 55cf44feb0e192f255d598fa9a3f81b70968c98305mtklein 56cf44feb0e192f255d598fa9a3f81b70968c98305mtklein // xor into a volatile prevents these comparisons from being optimized away. 57cf44feb0e192f255d598fa9a3f81b70968c98305mtklein volatile bool junk = false; 58cf44feb0e192f255d598fa9a3f81b70968c98305mtklein junk ^= (m0 == m1); 59cf44feb0e192f255d598fa9a3f81b70968c98305mtklein junk ^= (m1 == m2); 60cf44feb0e192f255d598fa9a3f81b70968c98305mtklein junk ^= (m2 == m0); 613fb5187647397e056843c1f41a508992be22175dreed@google.com } 623fb5187647397e056843c1f41a508992be22175dreed@google.comprivate: 633fb5187647397e056843c1f41a508992be22175dreed@google.com typedef MatrixBench INHERITED; 643fb5187647397e056843c1f41a508992be22175dreed@google.com}; 653fb5187647397e056843c1f41a508992be22175dreed@google.com 663fb5187647397e056843c1f41a508992be22175dreed@google.comclass ScaleMatrixBench : public MatrixBench { 673fb5187647397e056843c1f41a508992be22175dreed@google.compublic: 68410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ScaleMatrixBench() : INHERITED("scale") { 694b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fSX = fSY = 1.5f; 703fb5187647397e056843c1f41a508992be22175dreed@google.com fM0.reset(); 713fb5187647397e056843c1f41a508992be22175dreed@google.com fM1.setScale(fSX, fSY); 723fb5187647397e056843c1f41a508992be22175dreed@google.com fM2.setTranslate(fSX, fSY); 733fb5187647397e056843c1f41a508992be22175dreed@google.com } 743fb5187647397e056843c1f41a508992be22175dreed@google.comprotected: 753fb5187647397e056843c1f41a508992be22175dreed@google.com virtual void performTest() { 763fb5187647397e056843c1f41a508992be22175dreed@google.com SkMatrix m; 773fb5187647397e056843c1f41a508992be22175dreed@google.com m = fM0; m.preScale(fSX, fSY); 783fb5187647397e056843c1f41a508992be22175dreed@google.com m = fM1; m.preScale(fSX, fSY); 793fb5187647397e056843c1f41a508992be22175dreed@google.com m = fM2; m.preScale(fSX, fSY); 803fb5187647397e056843c1f41a508992be22175dreed@google.com } 813fb5187647397e056843c1f41a508992be22175dreed@google.comprivate: 823fb5187647397e056843c1f41a508992be22175dreed@google.com SkMatrix fM0, fM1, fM2; 833fb5187647397e056843c1f41a508992be22175dreed@google.com SkScalar fSX, fSY; 843fb5187647397e056843c1f41a508992be22175dreed@google.com typedef MatrixBench INHERITED; 853fb5187647397e056843c1f41a508992be22175dreed@google.com}; 863fb5187647397e056843c1f41a508992be22175dreed@google.com 87e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com// having unknown values in our arrays can throw off the timing a lot, perhaps 88e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com// handling NaN values is a lot slower. Anyway, this guy is just meant to put 89e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com// reasonable values in our arrays. 90e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.comtemplate <typename T> void init9(T array[9]) { 91e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 92e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com for (int i = 0; i < 9; i++) { 93e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com array[i] = rand.nextSScalar1(); 94e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com } 95e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com} 96e0dcde73991a13be48f2aed9829d5e744d7fe508reed@google.com 97317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.comclass GetTypeMatrixBench : public MatrixBench { 98317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.compublic: 99410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com GetTypeMatrixBench() 100410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com : INHERITED("gettype") { 101820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com fArray[0] = (float) fRnd.nextS(); 102820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com fArray[1] = (float) fRnd.nextS(); 103820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com fArray[2] = (float) fRnd.nextS(); 104820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com fArray[3] = (float) fRnd.nextS(); 105820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com fArray[4] = (float) fRnd.nextS(); 106820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com fArray[5] = (float) fRnd.nextS(); 107820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com fArray[6] = (float) fRnd.nextS(); 108820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com fArray[7] = (float) fRnd.nextS(); 109820e80ad6390e120d4991a5280d0452ec87beaebbsalomon@google.com fArray[8] = (float) fRnd.nextS(); 110317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com } 111317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.comprotected: 112317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com // Putting random generation of the matrix inside performTest() 113317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com // would help us avoid anomalous runs, but takes up 25% or 114317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com // more of the function time. 115317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com virtual void performTest() { 116317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com fMatrix.setAll(fArray[0], fArray[1], fArray[2], 117317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com fArray[3], fArray[4], fArray[5], 118317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com fArray[6], fArray[7], fArray[8]); 119cf44feb0e192f255d598fa9a3f81b70968c98305mtklein // xoring into a volatile prevents the compiler from optimizing these away 120cf44feb0e192f255d598fa9a3f81b70968c98305mtklein volatile int junk = 0; 121cf44feb0e192f255d598fa9a3f81b70968c98305mtklein junk ^= (fMatrix.getType()); 122317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com fMatrix.dirtyMatrixTypeCache(); 123cf44feb0e192f255d598fa9a3f81b70968c98305mtklein junk ^= (fMatrix.getType()); 124317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com fMatrix.dirtyMatrixTypeCache(); 125cf44feb0e192f255d598fa9a3f81b70968c98305mtklein junk ^= (fMatrix.getType()); 126317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com fMatrix.dirtyMatrixTypeCache(); 127cf44feb0e192f255d598fa9a3f81b70968c98305mtklein junk ^= (fMatrix.getType()); 128317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com fMatrix.dirtyMatrixTypeCache(); 129cf44feb0e192f255d598fa9a3f81b70968c98305mtklein junk ^= (fMatrix.getType()); 130317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com fMatrix.dirtyMatrixTypeCache(); 131cf44feb0e192f255d598fa9a3f81b70968c98305mtklein junk ^= (fMatrix.getType()); 132317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com fMatrix.dirtyMatrixTypeCache(); 133cf44feb0e192f255d598fa9a3f81b70968c98305mtklein junk ^= (fMatrix.getType()); 134317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com fMatrix.dirtyMatrixTypeCache(); 135cf44feb0e192f255d598fa9a3f81b70968c98305mtklein junk ^= (fMatrix.getType()); 136317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com } 137317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.comprivate: 138317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com SkMatrix fMatrix; 139317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com float fArray[9]; 140e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom fRnd; 141317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com typedef MatrixBench INHERITED; 142317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com}; 143317d540409bc1d246a272b7f61ffba0097c4bd29tomhudson@google.com 1445b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgclass DecomposeMatrixBench : public MatrixBench { 1455b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgpublic: 146410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com DecomposeMatrixBench() : INHERITED("decompose") {} 1475b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org 1485b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgprotected: 1495b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org virtual void onPreDraw() { 1505b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org for (int i = 0; i < 10; ++i) { 1515b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org SkScalar rot0 = (fRandom.nextBool()) ? fRandom.nextRangeF(-180, 180) : 0.0f; 1525b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org SkScalar sx = fRandom.nextRangeF(-3000.f, 3000.f); 1535b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org SkScalar sy = (fRandom.nextBool()) ? fRandom.nextRangeF(-3000.f, 3000.f) : sx; 1545b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org SkScalar rot1 = fRandom.nextRangeF(-180, 180); 1555b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org fMatrix[i].setRotate(rot0); 1565b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org fMatrix[i].postScale(sx, sy); 1575b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org fMatrix[i].postRotate(rot1); 1585b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org } 1595b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org } 1605b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org virtual void performTest() { 1615b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org SkPoint rotation1, scale, rotation2; 1625b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org for (int i = 0; i < 10; ++i) { 1635b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org (void) SkDecomposeUpper2x2(fMatrix[i], &rotation1, &scale, &rotation2); 1645b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org } 1655b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org } 1665b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.orgprivate: 1675b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org SkMatrix fMatrix[10]; 168e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom fRandom; 1695b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org typedef MatrixBench INHERITED; 1705b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org}; 1715b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org 1726fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgclass InvertMapRectMatrixBench : public MatrixBench { 1736fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgpublic: 174410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com InvertMapRectMatrixBench(const char* name, int flags) 175410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com : INHERITED(name) 1766fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org , fFlags(flags) { 1776fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org fMatrix.reset(); 1786fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org fIteration = 0; 1796fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org if (flags & kScale_Flag) { 1804b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fMatrix.postScale(1.5f, 2.5f); 1816fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org } 1826fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org if (flags & kTranslate_Flag) { 1834b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fMatrix.postTranslate(1.5f, 2.5f); 1846fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org } 1856fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org if (flags & kRotate_Flag) { 1864b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fMatrix.postRotate(45.0f); 1876fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org } 1886fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org if (flags & kPerspective_Flag) { 1894b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fMatrix.setPerspX(1.5f); 1904b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fMatrix.setPerspY(2.5f); 1916fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org } 1926fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org if (0 == (flags & kUncachedTypeMask_Flag)) { 1936fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org fMatrix.getType(); 1946fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org } 1956fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org } 1966fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org enum Flag { 1976fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org kScale_Flag = 0x01, 1986fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org kTranslate_Flag = 0x02, 1996fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org kRotate_Flag = 0x04, 2006fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org kPerspective_Flag = 0x08, 2016fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org kUncachedTypeMask_Flag = 0x10, 2026fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org }; 2036fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgprotected: 2046fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org virtual void performTest() { 2056fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org if (fFlags & kUncachedTypeMask_Flag) { 2066fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org // This will invalidate the typemask without 2076fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org // changing the matrix. 2086fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org fMatrix.setPerspX(fMatrix.getPerspX()); 2096fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org } 2106fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org SkMatrix inv; 21131f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com bool invertible = fMatrix.invert(&inv); 2126fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org SkASSERT(invertible); 2136fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org SkRect transformedRect; 21431f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com // an arbitrary, small, non-zero rect to transform 21531f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com SkRect srcRect = SkRect::MakeWH(SkIntToScalar(10), SkIntToScalar(10)); 2166fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org if (invertible) { 21731f8f73e83fad2241b1350d8d253c170e96e46ffrobertphillips@google.com inv.mapRect(&transformedRect, srcRect); 2186fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org } 2196fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org } 2206fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.orgprivate: 2216fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org SkMatrix fMatrix; 2226fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org int fFlags; 2236fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org unsigned fIteration; 2246fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org typedef MatrixBench INHERITED; 2256fc5699e777c27c4eea9587a131aecf6e92a677ajunov@chromium.org}; 226288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com 22782bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com/////////////////////////////////////////////////////////////////////////////// 228288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com 229410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new EqualsMatrixBench(); ) 230410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ScaleMatrixBench(); ) 231410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new GetTypeMatrixBench(); ) 232410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DecomposeMatrixBench(); ) 2335b2e2640ed345c4670b99b349f62eb6f9446ec1ecommit-bot@chromium.org 234410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench("invert_maprect_identity", 0); ) 235288ff33d06776d6b105f8056af30191510ca0e3ftomhudson@google.com 236410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new InvertMapRectMatrixBench( 23790533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com "invert_maprect_rectstaysrect", 23890533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com InvertMapRectMatrixBench::kScale_Flag | 23990533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com InvertMapRectMatrixBench::kTranslate_Flag); ) 24090533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com 241410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new InvertMapRectMatrixBench( 24290533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com "invert_maprect_translate", 24390533be035236c9ff0fc3a9944eae2ec160bc60dreed@google.com InvertMapRectMatrixBench::kTranslate_Flag); ) 2447b4e1073226e07d279d6f28883f8aa4b27ade183tomhudson@google.com 245410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new InvertMapRectMatrixBench( 24682bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com "invert_maprect_nonpersp", 24782bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com InvertMapRectMatrixBench::kScale_Flag | 24882bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com InvertMapRectMatrixBench::kRotate_Flag | 24982bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com InvertMapRectMatrixBench::kTranslate_Flag); ) 25082bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com 251410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench( 25282bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com "invert_maprect_persp", 25382bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com InvertMapRectMatrixBench::kPerspective_Flag); ) 25482bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com 255410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench( 25682bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com "invert_maprect_typemask_rectstaysrect", 25782bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com InvertMapRectMatrixBench::kUncachedTypeMask_Flag | 25882bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com InvertMapRectMatrixBench::kScale_Flag | 25982bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com InvertMapRectMatrixBench::kTranslate_Flag); ) 26082bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com 261410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new InvertMapRectMatrixBench( 26282bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com "invert_maprect_typemask_nonpersp", 26382bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com InvertMapRectMatrixBench::kUncachedTypeMask_Flag | 26482bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com InvertMapRectMatrixBench::kScale_Flag | 26582bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com InvertMapRectMatrixBench::kRotate_Flag | 26682bf8bbcbcd27ca35c24f0eae9f68183619af26freed@google.com InvertMapRectMatrixBench::kTranslate_Flag); ) 2673fb5187647397e056843c1f41a508992be22175dreed@google.com 2688010632f2408ce9d840c1dcd26a8be0e4967233ereed/////////////////////////////////////////////////////////////////////////////// 2698010632f2408ce9d840c1dcd26a8be0e4967233ereed 270d8b34c26c2a2f8e37e0cc9a7910306aecacadd92reedstatic SkMatrix make_trans() { return SkMatrix::MakeTrans(2, 3); } 2718010632f2408ce9d840c1dcd26a8be0e4967233ereedstatic SkMatrix make_scale() { SkMatrix m(make_trans()); m.postScale(1.5f, 0.5f); return m; } 2728010632f2408ce9d840c1dcd26a8be0e4967233ereedstatic SkMatrix make_afine() { SkMatrix m(make_trans()); m.postRotate(15); return m; } 2738010632f2408ce9d840c1dcd26a8be0e4967233ereed 2748010632f2408ce9d840c1dcd26a8be0e4967233ereedclass MapPointsMatrixBench : public MatrixBench { 2758010632f2408ce9d840c1dcd26a8be0e4967233ereedprotected: 2768010632f2408ce9d840c1dcd26a8be0e4967233ereed SkMatrix fM; 2778010632f2408ce9d840c1dcd26a8be0e4967233ereed enum { 2788010632f2408ce9d840c1dcd26a8be0e4967233ereed N = 32 2798010632f2408ce9d840c1dcd26a8be0e4967233ereed }; 2808010632f2408ce9d840c1dcd26a8be0e4967233ereed SkPoint fSrc[N], fDst[N]; 2818010632f2408ce9d840c1dcd26a8be0e4967233ereedpublic: 2827da19014fda527a52381d85cc50b951031fa4754reed MapPointsMatrixBench(const char name[], const SkMatrix& m) 2837da19014fda527a52381d85cc50b951031fa4754reed : MatrixBench(name), fM(m) 2848010632f2408ce9d840c1dcd26a8be0e4967233ereed { 2858010632f2408ce9d840c1dcd26a8be0e4967233ereed SkRandom rand; 2868010632f2408ce9d840c1dcd26a8be0e4967233ereed for (int i = 0; i < N; ++i) { 2878010632f2408ce9d840c1dcd26a8be0e4967233ereed fSrc[i].set(rand.nextSScalar1(), rand.nextSScalar1()); 2888010632f2408ce9d840c1dcd26a8be0e4967233ereed } 2898010632f2408ce9d840c1dcd26a8be0e4967233ereed } 2908010632f2408ce9d840c1dcd26a8be0e4967233ereed 29136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void performTest() override { 2927da19014fda527a52381d85cc50b951031fa4754reed for (int i = 0; i < 1000000; ++i) { 2937da19014fda527a52381d85cc50b951031fa4754reed fM.mapPoints(fDst, fSrc, N); 2948010632f2408ce9d840c1dcd26a8be0e4967233ereed } 2958010632f2408ce9d840c1dcd26a8be0e4967233ereed } 2968010632f2408ce9d840c1dcd26a8be0e4967233ereed}; 2977da19014fda527a52381d85cc50b951031fa4754reedDEF_BENCH( return new MapPointsMatrixBench("mappoints_identity", SkMatrix::I()); ) 2987da19014fda527a52381d85cc50b951031fa4754reedDEF_BENCH( return new MapPointsMatrixBench("mappoints_trans", make_trans()); ) 2997da19014fda527a52381d85cc50b951031fa4754reedDEF_BENCH( return new MapPointsMatrixBench("mappoints_scale", make_scale()); ) 3007da19014fda527a52381d85cc50b951031fa4754reedDEF_BENCH( return new MapPointsMatrixBench("mappoints_affine", make_afine()); ) 3018010632f2408ce9d840c1dcd26a8be0e4967233ereed 302