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