1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkBenchmark.h" 9 #include "SkCanvas.h" 10 #include "SkPaint.h" 11 #include "SkRandom.h" 12 #include "SkString.h" 13 #include "SkShader.h" 14 15 enum VertFlags { 16 kColors_VertFlag, 17 kTexture_VertFlag, 18 }; 19 20 class VertBench : public SkBenchmark { 21 SkString fName; 22 enum { 23 W = 640, 24 H = 480, 25 ROW = 20, 26 COL = 20, 27 PTS = (ROW + 1) * (COL + 1), 28 IDX = ROW * COL * 6, 29 N = SkBENCHLOOP(10) 30 }; 31 32 SkPoint fPts[PTS]; 33 SkColor fColors[PTS]; 34 SkPoint fTex[PTS]; 35 uint16_t fIdx[IDX]; 36 37 static void load_2_tris(uint16_t idx[], int x, int y, int rb) { 38 int n = y * rb + x; 39 idx[0] = n; idx[1] = n + 1; idx[2] = rb + n + 1; 40 idx[3] = n; idx[4] = rb + n + 1; idx[5] = n + rb; 41 } 42 43 public: 44 VertBench(void* param) : INHERITED(param) { 45 const SkScalar dx = SkIntToScalar(W) / COL; 46 const SkScalar dy = SkIntToScalar(H) / COL; 47 48 SkPoint* pts = fPts; 49 uint16_t* idx = fIdx; 50 51 SkScalar yy = 0; 52 for (int y = 0; y <= ROW; y++) { 53 SkScalar xx = 0; 54 for (int x = 0; x <= COL; ++x) { 55 pts->set(xx, yy); 56 pts += 1; 57 xx += dx; 58 59 if (x < COL && y < ROW) { 60 load_2_tris(idx, x, y, COL + 1); 61 for (int i = 0; i < 6; i++) { 62 SkASSERT(idx[i] < PTS); 63 } 64 idx += 6; 65 } 66 } 67 yy += dy; 68 } 69 SkASSERT(PTS == pts - fPts); 70 SkASSERT(IDX == idx - fIdx); 71 72 SkRandom rand; 73 for (int i = 0; i < PTS; ++i) { 74 fColors[i] = rand.nextU() | (0xFF << 24); 75 } 76 77 fName.set("verts"); 78 } 79 80 protected: 81 virtual const char* onGetName() { return fName.c_str(); } 82 virtual void onDraw(SkCanvas* canvas) { 83 SkPaint paint; 84 this->setupPaint(&paint); 85 86 for (int i = 0; i < N; i++) { 87 canvas->drawVertices(SkCanvas::kTriangles_VertexMode, PTS, 88 fPts, NULL, fColors, NULL, fIdx, IDX, paint); 89 } 90 } 91 private: 92 typedef SkBenchmark INHERITED; 93 }; 94 95 /////////////////////////////////////////////////////////////////////////////// 96 97 static SkBenchmark* Fact(void* p) { return SkNEW_ARGS(VertBench, (p)); } 98 99 static BenchRegistry gReg(Fact); 100