1aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com
2aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com/*
3aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com * Copyright 2013 Google Inc.
4aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com *
5aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
6aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com * found in the LICENSE file.
7aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com */
8aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com
9f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
10aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com#include "SkCanvas.h"
11aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com#include "SkPaint.h"
12aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com#include "SkRandom.h"
13aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com
14aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com/**
15aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com * Draws full screen opaque rectangles. It is designed to test any optimizations in the GPU backend
16aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com * to turn such draws into clears.
17aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com */
18f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass FSRectBench : public Benchmark {
19aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.compublic:
20410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    FSRectBench() : fInit(false) { }
21aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com
22aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.comprotected:
23aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com    virtual const char* onGetName() SK_OVERRIDE { return "fullscreen_rects"; }
24aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com
25aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com    virtual void onPreDraw() SK_OVERRIDE {
26aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com        if (!fInit) {
27e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org            SkRandom rand;
28aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com            static const SkScalar kMinOffset = 0;
29aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com            static const SkScalar kMaxOffset = 100 * SK_Scalar1;
30aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com            static const SkScalar kOffsetRange = kMaxOffset - kMinOffset;
31aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com            for (int i = 0; i < N; ++i) {
32aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com                fRects[i].fLeft = -kMinOffset - SkScalarMul(rand.nextUScalar1(), kOffsetRange);
33aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com                fRects[i].fTop = -kMinOffset - SkScalarMul(rand.nextUScalar1(), kOffsetRange);
34aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com                fRects[i].fRight = W + kMinOffset + SkScalarMul(rand.nextUScalar1(), kOffsetRange);
35aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com                fRects[i].fBottom = H + kMinOffset + SkScalarMul(rand.nextUScalar1(), kOffsetRange);
36aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com                fColors[i] = rand.nextU() | 0xFF000000;
37aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com            }
38aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com            fInit = true;
39aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com        }
40aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com    }
41aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com
423361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
43aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com        SkPaint paint;
443361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
45c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            paint.setColor(fColors[i % N]);
46c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            canvas->drawRect(fRects[i % N], paint);
47aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com        }
48aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com    }
49aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com
50aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.comprivate:
51aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com    enum {
52aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com        W = 640,
53aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com        H = 480,
54c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        N = 300,
55aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com    };
56aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com    SkRect  fRects[N];
57aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com    SkColor fColors[N];
58aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com    bool fInit;
59aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com
60f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
61aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com};
62aade2e1e19181eee0d950456cf50aa7cf6a239f8bsalomon@google.com
63410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(FSRectBench, ()); )
64