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