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