ReadPixBench.cpp 4.5 KB

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