VertBench.cpp revision e0e7cfe44bb9d66d76120a79e5275c294bacaa22
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
805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com#include "SkBenchmark.h"
905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com#include "SkCanvas.h"
1005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com#include "SkPaint.h"
1105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com#include "SkRandom.h"
1205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com#include "SkString.h"
1305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com#include "SkShader.h"
1405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
1505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.comenum VertFlags {
1605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    kColors_VertFlag,
1705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    kTexture_VertFlag,
1805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com};
1905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
2005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.comclass VertBench : public SkBenchmark {
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        N = SkBENCHLOOP(10)
3005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    };
3105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
3205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    SkPoint fPts[PTS];
3305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    SkColor fColors[PTS];
3405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    uint16_t fIdx[IDX];
3505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
3605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    static void load_2_tris(uint16_t idx[], int x, int y, int rb) {
3705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        int n = y * rb + x;
3805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        idx[0] = n; idx[1] = n + 1; idx[2] = rb + n + 1;
3905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        idx[3] = n; idx[4] = rb + n + 1; idx[5] = n + rb;
4005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    }
41fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
4205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.compublic:
4305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    VertBench(void* param) : INHERITED(param) {
4405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        const SkScalar dx = SkIntToScalar(W) / COL;
4505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        const SkScalar dy = SkIntToScalar(H) / COL;
4605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
4705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        SkPoint* pts = fPts;
4805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        uint16_t* idx = fIdx;
4905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
5005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        SkScalar yy = 0;
5105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        for (int y = 0; y <= ROW; y++) {
5205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            SkScalar xx = 0;
5305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            for (int x = 0; x <= COL; ++x) {
5405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                pts->set(xx, yy);
5505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                pts += 1;
5605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                xx += dx;
57fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
5805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                if (x < COL && y < ROW) {
5905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                    load_2_tris(idx, x, y, COL + 1);
6005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                    for (int i = 0; i < 6; i++) {
6105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                        SkASSERT(idx[i] < PTS);
6205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                    }
6305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                    idx += 6;
6405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                }
6505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            }
6605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            yy += dy;
6705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        }
6805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        SkASSERT(PTS == pts - fPts);
6905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        SkASSERT(IDX == idx - fIdx);
7005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
71e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
7205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        for (int i = 0; i < PTS; ++i) {
7305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            fColors[i] = rand.nextU() | (0xFF << 24);
7405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        }
7505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
7605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        fName.set("verts");
7705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    }
7805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
7905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.comprotected:
8005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    virtual const char* onGetName() { return fName.c_str(); }
8105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    virtual void onDraw(SkCanvas* canvas) {
8205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        SkPaint paint;
8305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        this->setupPaint(&paint);
844a018bb20bf969a38ec11d9506843f06366dfa7cbsalomon@google.com
8505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        for (int i = 0; i < N; i++) {
8605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com            canvas->drawVertices(SkCanvas::kTriangles_VertexMode, PTS,
8705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com                                 fPts, NULL, fColors, NULL, fIdx, IDX, paint);
8805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com        }
8905d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    }
9005d63aef00402977d0c88f661a6ff65ebb989da7reed@google.comprivate:
9105d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com    typedef SkBenchmark INHERITED;
9205d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com};
9305d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
9405d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com///////////////////////////////////////////////////////////////////////////////
9505d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
9605d63aef00402977d0c88f661a6ff65ebb989da7reed@google.comstatic SkBenchmark* Fact(void* p) { return SkNEW_ARGS(VertBench, (p)); }
9705d63aef00402977d0c88f661a6ff65ebb989da7reed@google.com
9805d63aef00402977d0c88f661a6ff65ebb989da7reed@google.comstatic BenchRegistry gReg(Fact);
99