RegionBench.cpp revision 26dc5b6362cf5defa4158b61e2338e12f9e752ca
18c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 28c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com/* 38c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com * Copyright 2011 Google Inc. 48c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com * 58c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com * Use of this source code is governed by a BSD-style license that can be 68c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com * found in the LICENSE file. 78c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com */ 88c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com#include "SkBenchmark.h" 98c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com#include "SkRandom.h" 108c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com#include "SkRegion.h" 118c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com#include "SkString.h" 128c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 138c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic bool union_proc(SkRegion& a, SkRegion& b) { 148c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com SkRegion result; 158c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com return result.op(a, b, SkRegion::kUnion_Op); 168c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com} 178c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 188c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic bool sect_proc(SkRegion& a, SkRegion& b) { 198c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com SkRegion result; 208c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com return result.op(a, b, SkRegion::kIntersect_Op); 218c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com} 228c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 238c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic bool diff_proc(SkRegion& a, SkRegion& b) { 248c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com SkRegion result; 258c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com return result.op(a, b, SkRegion::kDifference_Op); 268c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com} 278c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 2801049d5e21a266f307a25a6f884ffacdbbf256edreed@google.comstatic bool containsrect_proc(SkRegion& a, SkRegion& b) { 2950129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com SkIRect r = a.getBounds(); 308c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com r.inset(r.width()/4, r.height()/4); 3150129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com (void)a.contains(r); 3250129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com 3350129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com r = b.getBounds(); 3450129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com r.inset(r.width()/4, r.height()/4); 3571937d6618d7c80be3f5e79ab7090731c6f7495areed@google.com return b.contains(r); 368c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com} 378c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 384b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic bool sectsrgn_proc(SkRegion& a, SkRegion& b) { 398c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com return a.intersects(b); 408c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com} 418c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 424b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic bool sectsrect_proc(SkRegion& a, SkRegion& b) { 434b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com SkIRect r = a.getBounds(); 444b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com r.inset(r.width()/4, r.height()/4); 4526dc5b6362cf5defa4158b61e2338e12f9e752careed@google.com return a.intersects(r); 464b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com} 474b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com 4850129dbfaa3be4414933dec5d6c202ac0de71501reed@google.comstatic bool containsxy_proc(SkRegion& a, SkRegion& b) { 4950129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com const SkIRect& r = a.getBounds(); 5050129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com const int dx = r.width() / 8; 5150129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com const int dy = r.height() / 8; 5250129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com for (int y = r.fTop; y < r.fBottom; y += dy) { 5350129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com for (int x = r.fLeft; x < r.fRight; x += dx) { 5450129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com (void)a.contains(x, y); 5550129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com } 5650129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com } 5750129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com return true; 5850129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com} 5950129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com 608c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comclass RegionBench : public SkBenchmark { 618c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.compublic: 628c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com typedef bool (*Proc)(SkRegion& a, SkRegion& b); 638c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 648c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com SkRegion fA, fB; 658c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com Proc fProc; 668c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com SkString fName; 6746af7efbeecca4c0d9650378c8fe6add194f231ereed@google.com int fLoopMul; 688c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 698c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com enum { 708c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com W = 1024, 718c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com H = 768, 7250129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com N = SkBENCHLOOP(2000) 738c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com }; 748c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 758c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com SkIRect randrect(SkRandom& rand) { 768c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com int x = rand.nextU() % W; 778c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com int y = rand.nextU() % H; 788c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com int w = rand.nextU() % W; 798c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com int h = rand.nextU() % H; 808c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com return SkIRect::MakeXYWH(x, y, w >> 1, h >> 1); 818c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com } 828c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 8346af7efbeecca4c0d9650378c8fe6add194f231ereed@google.com RegionBench(void* param, int count, Proc proc, const char name[], int mul = 1) : INHERITED(param) { 848c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com fProc = proc; 85515d99840f566360ad8d6a4b7b0969ce179c1d50reed@google.com fName.printf("region_%s_%d", name, count); 8646af7efbeecca4c0d9650378c8fe6add194f231ereed@google.com fLoopMul = mul; 878c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 888c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com SkRandom rand; 8950129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com for (int i = 0; i < count; i++) { 9050129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com fA.op(randrect(rand), SkRegion::kXOR_Op); 9150129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com fB.op(randrect(rand), SkRegion::kXOR_Op); 928c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com } 938c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com } 948c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 958c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comprotected: 968c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com virtual const char* onGetName() { return fName.c_str(); } 978c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 988c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com virtual void onDraw(SkCanvas* canvas) { 998c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com Proc proc = fProc; 10046af7efbeecca4c0d9650378c8fe6add194f231ereed@google.com int n = fLoopMul * N; 10146af7efbeecca4c0d9650378c8fe6add194f231ereed@google.com for (int i = 0; i < n; ++i) { 1028c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com proc(fA, fB); 1038c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com } 1048c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com } 1058c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 1068c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comprivate: 1078c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com typedef SkBenchmark INHERITED; 1088c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com}; 1098c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 11050129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com#define SMALL 16 1118c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 1128c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic SkBenchmark* gF0(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, union_proc, "union")); } 1138c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic SkBenchmark* gF1(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, sect_proc, "intersect")); } 1148c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic SkBenchmark* gF2(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, diff_proc, "difference")); } 11546af7efbeecca4c0d9650378c8fe6add194f231ereed@google.comstatic SkBenchmark* gF3(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, containsrect_proc, "containsrect", 100)); } 1164b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic SkBenchmark* gF4(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, sectsrgn_proc, "intersectsrgn", 10)); } 1174b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic SkBenchmark* gF5(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, sectsrect_proc, "intersectsrect", 200)); } 1184b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic SkBenchmark* gF6(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, containsxy_proc, "containsxy")); } 1198c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 1208c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic BenchRegistry gR0(gF0); 1218c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic BenchRegistry gR1(gF1); 1228c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic BenchRegistry gR2(gF2); 1238c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic BenchRegistry gR3(gF3); 1248c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic BenchRegistry gR4(gF4); 12550129dbfaa3be4414933dec5d6c202ac0de71501reed@google.comstatic BenchRegistry gR5(gF5); 1264b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic BenchRegistry gR6(gF6); 127