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 "bench/Benchmark.h" 9 #include "include/codec/SkPixmapUtils.h" 10 #include "include/core/SkBitmap.h" 11 #include "include/core/SkCanvas.h" 12 #include "include/core/SkColorSpace.h" 13 14 // Time variants of read-pixels 15 // [ colortype ][ alphatype ][ colorspace ] 16 // Different combinations can trigger fast or slow paths in the impls 17 // 18 class ReadPixBench : public Benchmark { 19 public: ReadPixBench(SkColorType ct,SkAlphaType at,sk_sp<SkColorSpace> cs)20 ReadPixBench(SkColorType ct, SkAlphaType at, sk_sp<SkColorSpace> cs) 21 : fCT(ct), fAT(at), fCS(cs) 22 { 23 fName.printf("readpix_%s_%s_%s", 24 at == kPremul_SkAlphaType ? "pm" : "um", 25 ct == kRGBA_8888_SkColorType ? "rgba" : "bgra", 26 cs ? "srgb" : "null"); 27 } 28 29 protected: onGetName()30 const char* onGetName() override { 31 return fName.c_str(); 32 } 33 onDraw(int loops,SkCanvas * canvas)34 void onDraw(int loops, SkCanvas* canvas) override { 35 canvas->clear(0x80000000); 36 37 SkISize size = canvas->getBaseLayerSize(); 38 39 auto info = SkImageInfo::Make(size, fCT, fAT, fCS); 40 SkBitmap bitmap; 41 bitmap.allocPixels(info); 42 43 for (int i = 0; i < loops; i++) { 44 canvas->readPixels(bitmap.info(), bitmap.getPixels(), bitmap.rowBytes(), 0, 0); 45 } 46 } 47 48 private: 49 SkColorType fCT; 50 SkAlphaType fAT; 51 sk_sp<SkColorSpace> fCS; 52 SkString fName; 53 using INHERITED = Benchmark; 54 }; 55 DEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr); ) 56 DEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr); ) 57 DEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGB()); ) 58 DEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB()); ) 59 60 DEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kPremul_SkAlphaType, nullptr); ) 61 DEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr); ) 62 DEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGB()); ) 63 DEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB()); ) 64 65 //////////////////////////////////////////////////////////////////////////////// 66 67 class PixmapOrientBench : public Benchmark { 68 public: PixmapOrientBench()69 PixmapOrientBench() {} 70 71 protected: onDelayedSetup()72 void onDelayedSetup() override { 73 const SkImageInfo info = SkImageInfo::MakeN32Premul(2048, 1024); 74 fSrc.allocPixels(info); 75 fSrc.eraseColor(SK_ColorBLACK); 76 fDst.allocPixels(info.makeDimensions(info.dimensions())); 77 } 78 onGetName()79 const char* onGetName() override { 80 return "orient_pixmap"; 81 } 82 isSuitableFor(Backend backend)83 bool isSuitableFor(Backend backend) override { 84 return backend == Backend::kNonRendering; 85 } 86 onDraw(int loops,SkCanvas *)87 void onDraw(int loops, SkCanvas*) override { 88 SkPixmap src, dst; 89 fSrc.peekPixels(&src); 90 fDst.peekPixels(&dst); 91 for (int i = 0; i < loops; ++i) { 92 SkPixmapUtils::Orient(dst, src, kTopRight_SkEncodedOrigin); 93 } 94 } 95 96 private: 97 SkBitmap fSrc, fDst; 98 99 using INHERITED = Benchmark; 100 }; 101 DEF_BENCH( return new PixmapOrientBench(); ) 102 103 104 class GetAlphafBench : public Benchmark { 105 SkString fName; 106 SkColorType fCT; 107 public: GetAlphafBench(SkColorType ct,const char label[])108 GetAlphafBench(SkColorType ct, const char label[]) : fCT(ct) { 109 fName.printf("getalphaf_%s", label); 110 } 111 112 protected: onDelayedSetup()113 void onDelayedSetup() override { 114 fBM.allocPixels(SkImageInfo::Make(1024, 1024, fCT, kPremul_SkAlphaType)); 115 fBM.eraseColor(0x88112233); 116 } 117 onGetName()118 const char* onGetName() override { 119 return fName.c_str(); 120 } 121 isSuitableFor(Backend backend)122 bool isSuitableFor(Backend backend) override { 123 return backend == Backend::kNonRendering; 124 } 125 onDraw(int loops,SkCanvas *)126 void onDraw(int loops, SkCanvas*) override { 127 for (int i = 0; i < loops; ++i) { 128 for (int y = 0; y < fBM.height(); ++y) { 129 for (int x = 0; x < fBM.width(); ++x) { 130 fBM.getAlphaf(x, y); 131 } 132 } 133 } 134 } 135 136 private: 137 SkBitmap fBM; 138 139 using INHERITED = Benchmark; 140 }; 141 DEF_BENCH( return new GetAlphafBench(kN32_SkColorType, "rgba"); ) 142 DEF_BENCH( return new GetAlphafBench(kRGB_888x_SkColorType, "rgbx"); ) 143 DEF_BENCH( return new GetAlphafBench(kRGBA_F16_SkColorType, "f16"); ) 144 DEF_BENCH( return new GetAlphafBench(kRGBA_F32_SkColorType, "f32"); ) 145 146