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