blob: 917b917ab68cf638171ef6aaa2d54869e6e612e8 [file] [log] [blame]
robertphillips@google.com6806bda2012-09-04 13:39:01 +00001
2/*
3 * Copyright 2012 The Android Open Source Project
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
tfarinaf168b862014-06-19 12:32:29 -07009#include "Benchmark.h"
robertphillips@google.com6806bda2012-09-04 13:39:01 +000010#include "SkCanvas.h"
11
12
13/**
14 * This bench mark tests the use case where the user writes the a canvas
15 * and then reads small chunks from it repeatedly. This can cause trouble
16 * for the GPU as readbacks are very expensive.
17 */
tfarinaf168b862014-06-19 12:32:29 -070018class ReadPixBench : public Benchmark {
robertphillips@google.com6806bda2012-09-04 13:39:01 +000019public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000020 ReadPixBench() {}
robertphillips@google.com6806bda2012-09-04 13:39:01 +000021
22protected:
mtklein36352bf2015-03-25 18:17:31 -070023 const char* onGetName() override {
robertphillips@google.com6806bda2012-09-04 13:39:01 +000024 return "readpix";
25 }
26
mtklein36352bf2015-03-25 18:17:31 -070027 void onDraw(const int loops, SkCanvas* canvas) override {
robertphillips@google.com6806bda2012-09-04 13:39:01 +000028 canvas->clear(SK_ColorBLACK);
29
30 SkISize size = canvas->getDeviceSize();
31
32 int offX = (size.width() - kWindowSize) / kNumStepsX;
33 int offY = (size.height() - kWindowSize) / kNumStepsY;
34
35 SkPaint paint;
36
37 paint.setColor(SK_ColorBLUE);
38
skia.committer@gmail.com73bb3be2012-09-05 02:01:29 +000039 canvas->drawCircle(SkIntToScalar(size.width()/2),
40 SkIntToScalar(size.height()/2),
robertphillips@google.com6806bda2012-09-04 13:39:01 +000041 SkIntToScalar(size.width()/2),
42 paint);
43
44 SkBitmap bitmap;
45
reed6c225732014-06-09 19:52:07 -070046 bitmap.setInfo(SkImageInfo::MakeN32Premul(kWindowSize, kWindowSize));
robertphillips@google.com6806bda2012-09-04 13:39:01 +000047
commit-bot@chromium.org33614712013-12-03 18:17:16 +000048 for (int i = 0; i < loops; i++) {
mtklein@google.comc2897432013-09-10 19:23:38 +000049 for (int x = 0; x < kNumStepsX; ++x) {
50 for (int y = 0; y < kNumStepsY; ++y) {
51 canvas->readPixels(&bitmap, x * offX, y * offY);
52 }
robertphillips@google.com6806bda2012-09-04 13:39:01 +000053 }
54 }
55 }
56
57private:
58 static const int kNumStepsX = 30;
59 static const int kNumStepsY = 30;
60 static const int kWindowSize = 5;
61
tfarinaf168b862014-06-19 12:32:29 -070062 typedef Benchmark INHERITED;
robertphillips@google.com6806bda2012-09-04 13:39:01 +000063};
64
65////////////////////////////////////////////////////////////////////////////////
66
mtklein@google.com410e6e82013-09-13 19:52:27 +000067DEF_BENCH( return new ReadPixBench(); )