update/add benches to look at colorspace as well as alphatype
Example run:
24/24 MB 14 332µs 338µs 337µs 341µs gl readpix_um_bgra_srgb
24/24 MB 9 568µs 581µs 581µs 595µs glsrgb readpix_um_bgra_srgb
29/29 MB 10 334µs 340µs 340µs 351µs gl readpix_um_bgra_null
28/29 MB 8 553µs 593µs 592µs 626µs glsrgb readpix_um_bgra_null
32/32 MB 15 334µs 338µs 344µs 388µs gl readpix_um_rgba_srgb
31/32 MB 9 546µs 574µs 571µs 595µs glsrgb readpix_um_rgba_srgb
32/32 MB 10 332µs 340µs 340µs 351µs gl readpix_um_rgba_null
31/32 MB 8 553µs 587µs 589µs 629µs glsrgb readpix_um_rgba_null
54/54 MB 14 364µs 369µs 370µs 383µs gl writepix_um_bgra_srgb
24/54 MB 19 278µs 290µs 288µs 294µs glsrgb writepix_um_bgra_srgb
58/58 MB 14 365µs 376µs 375µs 381µs gl writepix_um_bgra_null
27/58 MB 19 280µs 291µs 291µs 314µs glsrgb writepix_um_bgra_null
59/59 MB 14 368µs 374µs 375µs 382µs gl writepix_um_rgba_srgb
27/59 MB 19 280µs 298µs 295µs 324µs glsrgb writepix_um_rgba_srgb
62/62 MB 14 367µs 378µs 376µs 384µs gl writepix_um_rgba_null
30/62 MB 16 289µs 293µs 296µs 310µs glsrgb writepix_um_rgba_null
Bug: skia:
Change-Id: I36e4f68e60a39087c07cf5ff63045a29b56da8f7
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/202703
Reviewed-by: Brian Osman <brianosman@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/bench/ReadPixBench.cpp b/bench/ReadPixBench.cpp
index 1c1ce04..35e536d 100644
--- a/bench/ReadPixBench.cpp
+++ b/bench/ReadPixBench.cpp
@@ -8,61 +8,58 @@
#include "Benchmark.h"
#include "SkBitmap.h"
#include "SkCanvas.h"
+#include "SkColorSpace.h"
-
-/**
- * This bench mark tests the use case where the user writes the a canvas
- * and then reads small chunks from it repeatedly. This can cause trouble
- * for the GPU as readbacks are very expensive.
- */
+// Time variants of read-pixels
+// [ colortype ][ alphatype ][ colorspace ]
+// Different combinations can trigger fast or slow paths in the impls
+//
class ReadPixBench : public Benchmark {
public:
- ReadPixBench() {}
+ ReadPixBench(SkColorType ct, SkAlphaType at, sk_sp<SkColorSpace> cs)
+ : fCT(ct), fAT(at), fCS(cs)
+ {
+ fName.printf("readpix_%s_%s_%s",
+ at == kPremul_SkAlphaType ? "pm" : "um",
+ ct == kRGBA_8888_SkColorType ? "rgba" : "bgra",
+ cs ? "srgb" : "null");
+ }
protected:
const char* onGetName() override {
- return "readpix";
+ return fName.c_str();
}
void onDraw(int loops, SkCanvas* canvas) override {
- canvas->clear(SK_ColorBLACK);
+ canvas->clear(0x80000000);
SkISize size = canvas->getBaseLayerSize();
- int offX = (size.width() - kWindowSize) / kNumStepsX;
- int offY = (size.height() - kWindowSize) / kNumStepsY;
-
- SkPaint paint;
-
- paint.setColor(SK_ColorBLUE);
-
- canvas->drawCircle(SkIntToScalar(size.width()/2),
- SkIntToScalar(size.height()/2),
- SkIntToScalar(size.width()/2),
- paint);
-
+ auto info = SkImageInfo::Make(size.width(), size.height(), fCT, fAT, fCS);
SkBitmap bitmap;
-
- bitmap.allocPixels(SkImageInfo::MakeN32Premul(kWindowSize, kWindowSize));
+ bitmap.allocPixels(info);
for (int i = 0; i < loops; i++) {
- for (int x = 0; x < kNumStepsX; ++x) {
- for (int y = 0; y < kNumStepsY; ++y) {
- canvas->readPixels(bitmap.info(), bitmap.getPixels(), bitmap.rowBytes(),
- x * offX, y * offY);
- }
- }
+ canvas->readPixels(bitmap.info(), bitmap.getPixels(), bitmap.rowBytes(), 0, 0);
}
}
private:
- static const int kNumStepsX = 30;
- static const int kNumStepsY = 30;
- static const int kWindowSize = 5;
-
+ SkColorType fCT;
+ SkAlphaType fAT;
+ sk_sp<SkColorSpace> fCS;
+ SkString fName;
typedef Benchmark INHERITED;
};
-DEF_BENCH( return new ReadPixBench(); )
+DEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr); )
+DEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr); )
+DEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGB()); )
+DEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB()); )
+
+DEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kPremul_SkAlphaType, nullptr); )
+DEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr); )
+DEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGB()); )
+DEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB()); )
////////////////////////////////////////////////////////////////////////////////
#include "SkBitmap.h"
diff --git a/bench/WritePixelsBench.cpp b/bench/WritePixelsBench.cpp
index 4e2dbeb..39ceb1f 100644
--- a/bench/WritePixelsBench.cpp
+++ b/bench/WritePixelsBench.cpp
@@ -10,35 +10,21 @@
#include "SkCanvas.h"
#include "SkString.h"
+// Time variants of write-pixels
+// [ colortype ][ alphatype ][ colorspace ]
+// Different combinations can trigger fast or slow paths in the impls
+//
class WritePixelsBench : public Benchmark {
public:
- WritePixelsBench(SkColorType ct, SkAlphaType at)
+ WritePixelsBench(SkColorType ct, SkAlphaType at, sk_sp<SkColorSpace> cs)
: fColorType(ct)
, fAlphaType(at)
- , fName("writepix")
+ , fCS(cs)
{
- switch (ct) {
- case kRGBA_8888_SkColorType:
- fName.append("_RGBA");
- break;
- case kBGRA_8888_SkColorType:
- fName.append("_BGRA");
- break;
- default:
- SkASSERT(0);
- break;
- }
- switch (at) {
- case kPremul_SkAlphaType:
- fName.append("_PM");
- break;
- case kUnpremul_SkAlphaType:
- fName.append("_UPM");
- break;
- default:
- SkASSERT(0);
- break;
- }
+ fName.printf("writepix_%s_%s_%s",
+ at == kPremul_SkAlphaType ? "pm" : "um",
+ ct == kRGBA_8888_SkColorType ? "rgba" : "bgra",
+ cs ? "srgb" : "null");
}
protected:
@@ -49,13 +35,11 @@
void onDraw(int loops, SkCanvas* canvas) override {
SkISize size = canvas->getBaseLayerSize();
- canvas->clear(0xFFFF0000);
-
+ SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), fColorType, fAlphaType,
+ fCS);
SkBitmap bmp;
- bmp.allocN32Pixels(size.width(), size.height());
- canvas->readPixels(bmp, 0, 0);
-
- SkImageInfo info = SkImageInfo::Make(bmp.width(), bmp.height(), fColorType, fAlphaType);
+ bmp.allocPixels(info);
+ bmp.eraseColor(SK_ColorBLACK);
for (int loop = 0; loop < loops; ++loop) {
canvas->writePixels(info, bmp.getPixels(), bmp.rowBytes(), 0, 0);
@@ -65,6 +49,7 @@
private:
SkColorType fColorType;
SkAlphaType fAlphaType;
+ sk_sp<SkColorSpace> fCS;
SkString fName;
typedef Benchmark INHERITED;
@@ -72,5 +57,12 @@
//////////////////////////////////////////////////////////////////////////////
-DEF_BENCH(return new WritePixelsBench(kRGBA_8888_SkColorType, kPremul_SkAlphaType);)
-DEF_BENCH(return new WritePixelsBench(kRGBA_8888_SkColorType, kUnpremul_SkAlphaType);)
+DEF_BENCH(return new WritePixelsBench(kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr);)
+DEF_BENCH(return new WritePixelsBench(kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr);)
+DEF_BENCH(return new WritePixelsBench(kRGBA_8888_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGB());)
+DEF_BENCH(return new WritePixelsBench(kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB());)
+
+DEF_BENCH(return new WritePixelsBench(kBGRA_8888_SkColorType, kPremul_SkAlphaType, nullptr);)
+DEF_BENCH(return new WritePixelsBench(kBGRA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr);)
+DEF_BENCH(return new WritePixelsBench(kBGRA_8888_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGB());)
+DEF_BENCH(return new WritePixelsBench(kBGRA_8888_SkColorType, kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB());)