|  | /* | 
|  | * Copyright 2011 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "Benchmark.h" | 
|  | #include "SkCanvas.h" | 
|  | #include "SkPaint.h" | 
|  | #include "SkRandom.h" | 
|  | #include "SkShader.h" | 
|  | #include "SkString.h" | 
|  |  | 
|  | enum VertFlags { | 
|  | kColors_VertFlag, | 
|  | kTexture_VertFlag, | 
|  | }; | 
|  |  | 
|  | class VertBench : public Benchmark { | 
|  | SkString fName; | 
|  | enum { | 
|  | W = 640, | 
|  | H = 480, | 
|  | ROW = 20, | 
|  | COL = 20, | 
|  | PTS = (ROW + 1) * (COL + 1), | 
|  | IDX = ROW * COL * 6, | 
|  | }; | 
|  |  | 
|  | SkPoint fPts[PTS]; | 
|  | SkColor fColors[PTS]; | 
|  | uint16_t fIdx[IDX]; | 
|  |  | 
|  | static void load_2_tris(uint16_t idx[], int x, int y, int rb) { | 
|  | int n = y * rb + x; | 
|  | idx[0] = n; idx[1] = n + 1; idx[2] = rb + n + 1; | 
|  | idx[3] = n; idx[4] = rb + n + 1; idx[5] = n + rb; | 
|  | } | 
|  |  | 
|  | public: | 
|  | VertBench() { | 
|  | const SkScalar dx = SkIntToScalar(W) / COL; | 
|  | const SkScalar dy = SkIntToScalar(H) / COL; | 
|  |  | 
|  | SkPoint* pts = fPts; | 
|  | uint16_t* idx = fIdx; | 
|  |  | 
|  | SkScalar yy = 0; | 
|  | for (int y = 0; y <= ROW; y++) { | 
|  | SkScalar xx = 0; | 
|  | for (int x = 0; x <= COL; ++x) { | 
|  | pts->set(xx, yy); | 
|  | pts += 1; | 
|  | xx += dx; | 
|  |  | 
|  | if (x < COL && y < ROW) { | 
|  | load_2_tris(idx, x, y, COL + 1); | 
|  | for (int i = 0; i < 6; i++) { | 
|  | SkASSERT(idx[i] < PTS); | 
|  | } | 
|  | idx += 6; | 
|  | } | 
|  | } | 
|  | yy += dy; | 
|  | } | 
|  | SkASSERT(PTS == pts - fPts); | 
|  | SkASSERT(IDX == idx - fIdx); | 
|  |  | 
|  | SkRandom rand; | 
|  | for (int i = 0; i < PTS; ++i) { | 
|  | fColors[i] = rand.nextU() | (0xFF << 24); | 
|  | } | 
|  |  | 
|  | fName.set("verts"); | 
|  | } | 
|  |  | 
|  | protected: | 
|  | virtual const char* onGetName() { return fName.c_str(); } | 
|  | virtual void onDraw(const int loops, SkCanvas* canvas) { | 
|  | SkPaint paint; | 
|  | this->setupPaint(&paint); | 
|  |  | 
|  | for (int i = 0; i < loops; i++) { | 
|  | canvas->drawVertices(SkCanvas::kTriangles_VertexMode, PTS, | 
|  | fPts, NULL, fColors, NULL, fIdx, IDX, paint); | 
|  | } | 
|  | } | 
|  | private: | 
|  | typedef Benchmark INHERITED; | 
|  | }; | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | DEF_BENCH( return SkNEW_ARGS(VertBench, ()); ) |