11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkBenchmark.h" 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkCanvas.h" 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPaint.h" 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkRandom.h" 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkString.h" 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkShader.h" 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerenum VertFlags { 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kColors_VertFlag, 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kTexture_VertFlag, 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass VertBench : public SkBenchmark { 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkString fName; 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger enum { 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger W = 640, 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger H = 480, 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger ROW = 20, 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger COL = 20, 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger PTS = (ROW + 1) * (COL + 1), 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger IDX = ROW * COL * 6, 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger N = SkBENCHLOOP(10) 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPoint fPts[PTS]; 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColor fColors[PTS]; 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPoint fTex[PTS]; 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger uint16_t fIdx[IDX]; 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static void load_2_tris(uint16_t idx[], int x, int y, int rb) { 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int n = y * rb + x; 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger idx[0] = n; idx[1] = n + 1; idx[2] = rb + n + 1; 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger idx[3] = n; idx[4] = rb + n + 1; idx[5] = n + rb; 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger VertBench(void* param) : INHERITED(param) { 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkScalar dx = SkIntToScalar(W) / COL; 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkScalar dy = SkIntToScalar(H) / COL; 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPoint* pts = fPts; 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger uint16_t* idx = fIdx; 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar yy = 0; 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int y = 0; y <= ROW; y++) { 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar xx = 0; 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int x = 0; x <= COL; ++x) { 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger pts->set(xx, yy); 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger pts += 1; 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger xx += dx; 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (x < COL && y < ROW) { 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger load_2_tris(idx, x, y, COL + 1); 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int i = 0; i < 6; i++) { 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkASSERT(idx[i] < PTS); 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger idx += 6; 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger yy += dy; 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkASSERT(PTS == pts - fPts); 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkASSERT(IDX == idx - fIdx); 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRandom rand; 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int i = 0; i < PTS; ++i) { 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fColors[i] = rand.nextU() | (0xFF << 24); 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fName.set("verts"); 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected: 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual const char* onGetName() { return fName.c_str(); } 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDraw(SkCanvas* canvas) { 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint paint; 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->setupPaint(&paint); 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int i = 0; i < N; i++) { 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawVertices(SkCanvas::kTriangles_VertexMode, PTS, 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fPts, NULL, fColors, NULL, fIdx, IDX, paint); 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger typedef SkBenchmark INHERITED; 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkBenchmark* Fact(void* p) { return SkNEW_ARGS(VertBench, (p)); } 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic BenchRegistry gReg(Fact); 100