Home | History | Annotate | Download | only in bench
      1 /*
      2  * Copyright 2012 The Android Open Source Project
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "Benchmark.h"
      9 #include "SkBitmap.h"
     10 #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  */
     18 class ReadPixBench : public Benchmark {
     19 public:
     20     ReadPixBench() {}
     21 
     22 protected:
     23     const char* onGetName() override {
     24         return "readpix";
     25     }
     26 
     27     void onDraw(int loops, SkCanvas* canvas) override {
     28         canvas->clear(SK_ColorBLACK);
     29 
     30         SkISize size = canvas->getBaseLayerSize();
     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 
     39         canvas->drawCircle(SkIntToScalar(size.width()/2),
     40                            SkIntToScalar(size.height()/2),
     41                            SkIntToScalar(size.width()/2),
     42                            paint);
     43 
     44         SkBitmap bitmap;
     45 
     46         bitmap.allocPixels(SkImageInfo::MakeN32Premul(kWindowSize, kWindowSize));
     47 
     48         for (int i = 0; i < loops; i++) {
     49             for (int x = 0; x < kNumStepsX; ++x) {
     50                 for (int y = 0; y < kNumStepsY; ++y) {
     51                     canvas->readPixels(bitmap.info(), bitmap.getPixels(), bitmap.rowBytes(),
     52                                        x * offX, y * offY);
     53                 }
     54             }
     55         }
     56     }
     57 
     58 private:
     59     static const int kNumStepsX = 30;
     60     static const int kNumStepsY = 30;
     61     static const int kWindowSize = 5;
     62 
     63     typedef Benchmark INHERITED;
     64 };
     65 DEF_BENCH( return new ReadPixBench(); )
     66 
     67 ////////////////////////////////////////////////////////////////////////////////
     68 #include "SkBitmap.h"
     69 #include "SkPixmapPriv.h"
     70 
     71 class PixmapOrientBench : public Benchmark {
     72 public:
     73     PixmapOrientBench() {}
     74 
     75 protected:
     76     void onDelayedSetup() override {
     77         const SkImageInfo info = SkImageInfo::MakeN32Premul(2048, 1024);
     78         fSrc.allocPixels(info);
     79         fSrc.eraseColor(SK_ColorBLACK);
     80         fDst.allocPixels(info.makeWH(info.height(), info.width()));
     81     }
     82 
     83     const char* onGetName() override {
     84         return "orient_pixmap";
     85     }
     86 
     87     bool isSuitableFor(Backend backend) override {
     88         return backend == kNonRendering_Backend;
     89     }
     90 
     91     void onDraw(int loops, SkCanvas*) override {
     92         const SkPixmapPriv::OrientFlags flags = SkPixmapPriv::kSwapXY;
     93 
     94         SkPixmap src, dst;
     95         fSrc.peekPixels(&src);
     96         fDst.peekPixels(&dst);
     97         for (int i = 0; i < loops; ++i) {
     98             SkPixmapPriv::Orient(dst, src, flags);
     99         }
    100     }
    101 
    102 private:
    103     SkBitmap fSrc, fDst;
    104 
    105     typedef Benchmark INHERITED;
    106 };
    107 DEF_BENCH( return new PixmapOrientBench(); )
    108