105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com/*
205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com * Copyright 2011 Google Inc.
305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com *
405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com * Use of this source code is governed by a BSD-style license that can be
505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com * found in the LICENSE file.
605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com */
705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com#include "SkCanvas.h"
1005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com#include "SkPaint.h"
1105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com#include "SkRandom.h"
1205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com#include "SkShader.h"
13f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkString.h"
1405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
1505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.comenum VertFlags {
1605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    kColors_VertFlag,
1705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    kTexture_VertFlag,
1805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com};
1905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
20f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass VertBench : public Benchmark {
2105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    SkString fName;
2205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    enum {
2305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        W = 640,
2405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        H = 480,
2505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        ROW = 20,
2605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        COL = 20,
2705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        PTS = (ROW + 1) * (COL + 1),
2805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        IDX = ROW * COL * 6,
2905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    };
3005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
3105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    SkPoint fPts[PTS];
3205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    SkColor fColors[PTS];
3305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    uint16_t fIdx[IDX];
3405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
3505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    static void load_2_tris(uint16_t idx[], int x, int y, int rb) {
3605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        int n = y * rb + x;
3705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        idx[0] = n; idx[1] = n + 1; idx[2] = rb + n + 1;
3805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        idx[3] = n; idx[4] = rb + n + 1; idx[5] = n + rb;
3905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    }
40fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
4105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.compublic:
42410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    VertBench() {
4305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        const SkScalar dx = SkIntToScalar(W) / COL;
4405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        const SkScalar dy = SkIntToScalar(H) / COL;
4505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
4605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        SkPoint* pts = fPts;
4705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        uint16_t* idx = fIdx;
4805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
4905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        SkScalar yy = 0;
5005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        for (int y = 0; y <= ROW; y++) {
5105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            SkScalar xx = 0;
5205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            for (int x = 0; x <= COL; ++x) {
5305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                pts->set(xx, yy);
5405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                pts += 1;
5505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                xx += dx;
56fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
5705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                if (x < COL && y < ROW) {
5805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                    load_2_tris(idx, x, y, COL + 1);
5905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                    for (int i = 0; i < 6; i++) {
6005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                        SkASSERT(idx[i] < PTS);
6105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                    }
6205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                    idx += 6;
6305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                }
6405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            }
6505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            yy += dy;
6605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        }
6705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        SkASSERT(PTS == pts - fPts);
6805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        SkASSERT(IDX == idx - fIdx);
6905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
70e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
7105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        for (int i = 0; i < PTS; ++i) {
7205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            fColors[i] = rand.nextU() | (0xFF << 24);
7305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        }
7405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
7505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        fName.set("verts");
7605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    }
7705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
7805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.comprotected:
7905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    virtual const char* onGetName() { return fName.c_str(); }
803361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
8105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        SkPaint paint;
8205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        this->setupPaint(&paint);
834a018bb20bf969a38ec11d9506843f06366dfa7cbsalomon@google.com
843361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
8505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            canvas->drawVertices(SkCanvas::kTriangles_VertexMode, PTS,
8605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                                 fPts, NULL, fColors, NULL, fIdx, IDX, paint);
8705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        }
8805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    }
8905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.comprivate:
90f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
9105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com};
9205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
9305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com///////////////////////////////////////////////////////////////////////////////
9405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
95410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(VertBench, ()); )
96