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 SkPixmap src, dst; 93 fSrc.peekPixels(&src); 94 fDst.peekPixels(&dst); 95 for (int i = 0; i < loops; ++i) { 96 SkPixmapPriv::Orient(dst, src, kTopRight_SkEncodedOrigin); 97 } 98 } 99 100 private: 101 SkBitmap fSrc, fDst; 102 103 typedef Benchmark INHERITED; 104 }; 105 DEF_BENCH( return new PixmapOrientBench(); ) 106 107 108 class GetAlphafBench : public Benchmark { 109 SkString fName; 110 SkColorType fCT; 111 public: 112 GetAlphafBench(SkColorType ct, const char label[]) : fCT(ct) { 113 fName.printf("getalphaf_%s", label); 114 } 115 116 protected: 117 void onDelayedSetup() override { 118 fBM.allocPixels(SkImageInfo::Make(1024, 1024, fCT, kPremul_SkAlphaType)); 119 fBM.eraseColor(0x88112233); 120 } 121 122 const char* onGetName() override { 123 return fName.c_str(); 124 } 125 126 bool isSuitableFor(Backend backend) override { 127 return backend == kNonRendering_Backend; 128 } 129 130 void onDraw(int loops, SkCanvas*) override { 131 for (int i = 0; i < loops; ++i) { 132 for (int y = 0; y < fBM.height(); ++y) { 133 for (int x = 0; x < fBM.width(); ++x) { 134 fBM.getAlphaf(x, y); 135 } 136 } 137 } 138 } 139 140 private: 141 SkBitmap fBM; 142 143 typedef Benchmark INHERITED; 144 }; 145 DEF_BENCH( return new GetAlphafBench(kN32_SkColorType, "rgba"); ) 146 DEF_BENCH( return new GetAlphafBench(kRGB_888x_SkColorType, "rgbx"); ) 147 DEF_BENCH( return new GetAlphafBench(kRGBA_F16_SkColorType, "f16"); ) 148 DEF_BENCH( return new GetAlphafBench(kRGBA_F32_SkColorType, "f32"); ) 149 150