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 "SkCanvas.h" 10 11 12 /** 13 * This bench mark tests the use case where the user writes the a canvas 14 * and then reads small chunks from it repeatedly. This can cause trouble 15 * for the GPU as readbacks are very expensive. 16 */ 17 class ReadPixBench : public Benchmark { 18 public: ReadPixBench()19 ReadPixBench() {} 20 21 protected: onGetName()22 const char* onGetName() override { 23 return "readpix"; 24 } 25 onDraw(int loops,SkCanvas * canvas)26 void onDraw(int loops, SkCanvas* canvas) override { 27 canvas->clear(SK_ColorBLACK); 28 29 SkISize size = canvas->getBaseLayerSize(); 30 31 int offX = (size.width() - kWindowSize) / kNumStepsX; 32 int offY = (size.height() - kWindowSize) / kNumStepsY; 33 34 SkPaint paint; 35 36 paint.setColor(SK_ColorBLUE); 37 38 canvas->drawCircle(SkIntToScalar(size.width()/2), 39 SkIntToScalar(size.height()/2), 40 SkIntToScalar(size.width()/2), 41 paint); 42 43 SkBitmap bitmap; 44 45 bitmap.setInfo(SkImageInfo::MakeN32Premul(kWindowSize, kWindowSize)); 46 47 for (int i = 0; i < loops; i++) { 48 for (int x = 0; x < kNumStepsX; ++x) { 49 for (int y = 0; y < kNumStepsY; ++y) { 50 canvas->readPixels(&bitmap, x * offX, y * offY); 51 } 52 } 53 } 54 } 55 56 private: 57 static const int kNumStepsX = 30; 58 static const int kNumStepsY = 30; 59 static const int kWindowSize = 5; 60 61 typedef Benchmark INHERITED; 62 }; 63 64 //////////////////////////////////////////////////////////////////////////////// 65 66 DEF_BENCH( return new ReadPixBench(); ) 67