OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2016 Google Inc. |
| 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 <memory> |
| 9 #include "SkColor.h" |
| 10 #include "SkLinearBitmapPipeline.h" |
| 11 #include "Benchmark.h" |
| 12 #include "SkShader.h" |
| 13 #include "SkImage.h" |
| 14 |
| 15 struct CommonBitmapFPBenchmark : public Benchmark { |
| 16 CommonBitmapFPBenchmark( |
| 17 SkISize srcSize, |
| 18 SkColorProfileType colorProfile, |
| 19 SkMatrix m, |
| 20 bool useBilerp, |
| 21 SkShader::TileMode xTile, |
| 22 SkShader::TileMode yTile) |
| 23 : fColorProfile(colorProfile) |
| 24 , fM{m} |
| 25 , fUseBilerp{useBilerp} |
| 26 , fXTile{xTile} |
| 27 , fYTile{yTile} { |
| 28 fSrcSize = srcSize; |
| 29 } |
| 30 |
| 31 static SkString tileName(const char* pre, SkShader::TileMode mode) { |
| 32 SkString name{pre}; |
| 33 switch (mode) { |
| 34 case SkShader::kClamp_TileMode: |
| 35 name.append("Clamp"); |
| 36 return name; |
| 37 case SkShader::kRepeat_TileMode: |
| 38 name.append("Repeat"); |
| 39 return name; |
| 40 case SkShader::kMirror_TileMode: |
| 41 name.append("Mirror"); |
| 42 return name; |
| 43 } |
| 44 } |
| 45 |
| 46 const char* onGetName() override { |
| 47 SkString name {"SkBitmapFP"}; |
| 48 if (fM.getType() & SkMatrix::kPerspective_Mask) { |
| 49 name.append("Perspective"); |
| 50 } else if (fM.getType() & SkMatrix::kAffine_Mask) { |
| 51 name.append("Affine"); |
| 52 } else if (fM.getType() & SkMatrix::kScale_Mask) { |
| 53 name.append("Scale"); |
| 54 } else if (fM.getType() & SkMatrix::kTranslate_Mask) { |
| 55 name.append("Translate"); |
| 56 } else { |
| 57 name.append("Identity"); |
| 58 } |
| 59 |
| 60 name.append(tileName("X", fXTile)); |
| 61 name.append(tileName("Y", fYTile)); |
| 62 |
| 63 if (fUseBilerp) { |
| 64 name.append("Filter"); |
| 65 } else { |
| 66 name.append("Nearest"); |
| 67 } |
| 68 |
| 69 name.appendf("%s", BaseName().c_str()); |
| 70 |
| 71 return name.c_str(); |
| 72 } |
| 73 |
| 74 void onPreDraw(SkCanvas*) override { |
| 75 int width = fSrcSize.fWidth; |
| 76 int height = fSrcSize.fHeight; |
| 77 fBitmap.reset(new uint32_t[width * height]); |
| 78 for (int y = 0; y < height; y++) { |
| 79 for (int x = 0; x < width; x++) { |
| 80 fBitmap[y * width + x] = (y << 8) + x + (128<<24); |
| 81 } |
| 82 } |
| 83 |
| 84 (void)fM.invert(&fInvert); |
| 85 |
| 86 fInfo = SkImageInfo::MakeN32Premul(width, height, fColorProfile); |
| 87 } |
| 88 |
| 89 bool isSuitableFor(Backend backend) override { |
| 90 return backend == kNonRendering_Backend; |
| 91 } |
| 92 |
| 93 virtual SkString BaseName() = 0; |
| 94 |
| 95 SkISize fSrcSize; |
| 96 SkColorProfileType fColorProfile; |
| 97 SkMatrix fM; |
| 98 SkMatrix fInvert; |
| 99 bool fUseBilerp; |
| 100 SkShader::TileMode fXTile; |
| 101 SkShader::TileMode fYTile; |
| 102 SkImageInfo fInfo; |
| 103 std::unique_ptr<uint32_t[]> fBitmap; |
| 104 }; |
| 105 |
| 106 struct SkBitmapFPGeneral final : public CommonBitmapFPBenchmark { |
| 107 using CommonBitmapFPBenchmark::CommonBitmapFPBenchmark; |
| 108 SkString BaseName() override { |
| 109 SkString name; |
| 110 if (fInfo.isSRGB()) { |
| 111 name.set("sRGB"); |
| 112 } else { |
| 113 name.set("Linr"); |
| 114 } |
| 115 return name; |
| 116 } |
| 117 |
| 118 void onPreDraw(SkCanvas* c) override { |
| 119 CommonBitmapFPBenchmark::onPreDraw(c); |
| 120 |
| 121 fPipeline.reset( |
| 122 new SkLinearBitmapPipeline{fInvert, fXTile, fYTile, fInfo, fBitmap.g
et(), }); |
| 123 } |
| 124 |
| 125 void onDraw(int loops, SkCanvas*) override { |
| 126 int width = fSrcSize.fWidth; |
| 127 int height = fSrcSize.fHeight; |
| 128 |
| 129 SkPM4f FPbuffer[width * height]; |
| 130 |
| 131 int count = 100; |
| 132 |
| 133 for (int n = 0; n < 1000*loops; n++) { |
| 134 fPipeline->shadeSpan4f(3, 6, FPbuffer, count); |
| 135 } |
| 136 |
| 137 } |
| 138 |
| 139 std::unique_ptr<SkLinearBitmapPipeline> fPipeline; |
| 140 }; |
| 141 |
| 142 struct SkBitmapFPOrigShader : public CommonBitmapFPBenchmark { |
| 143 using CommonBitmapFPBenchmark::CommonBitmapFPBenchmark; |
| 144 SkString BaseName() override { |
| 145 SkString name{"Orig"}; |
| 146 return name; |
| 147 } |
| 148 |
| 149 void onPreDraw(SkCanvas* c) override { |
| 150 CommonBitmapFPBenchmark::onPreDraw(c); |
| 151 |
| 152 SkImage* image = SkImage::NewRasterCopy( |
| 153 fInfo, fBitmap.get(), sizeof(SkPMColor) * fSrcSize.fWidth); |
| 154 fImage.reset(image); |
| 155 SkShader* shader = fImage->newShader(fXTile, fYTile); |
| 156 if (fUseBilerp) { |
| 157 fPaint.setFilterQuality(SkFilterQuality::kLow_SkFilterQuality); |
| 158 } else { |
| 159 fPaint.setFilterQuality(SkFilterQuality::kNone_SkFilterQuality); |
| 160 } |
| 161 fPaint.setShader(shader)->unref(); |
| 162 SkASSERT(fPaint.getShader()->contextSize() <= sizeof(fStorage)); |
| 163 fCtx = fPaint.getShader()->createContext( |
| 164 {fPaint, fM, nullptr}, |
| 165 fStorage); |
| 166 } |
| 167 |
| 168 void onPostDraw(SkCanvas*) override { |
| 169 fCtx->~Context(); |
| 170 } |
| 171 |
| 172 void onDraw(int loops, SkCanvas*) override { |
| 173 int width = fSrcSize.fWidth; |
| 174 int height = fSrcSize.fHeight; |
| 175 SkPMColor buffer4b[width * height]; |
| 176 |
| 177 |
| 178 int count = 100; |
| 179 |
| 180 for (int n = 0; n < 1000*loops; n++) { |
| 181 fCtx->shadeSpan(3, 6, buffer4b, count); |
| 182 } |
| 183 } |
| 184 SkPaint fPaint; |
| 185 uint32_t fStorage[200]; |
| 186 SkShader::Context* fCtx; |
| 187 SkAutoTUnref<SkImage> fImage; |
| 188 }; |
| 189 |
| 190 static SkISize srcSize = SkISize::Make(120, 100); |
| 191 static SkMatrix mI = SkMatrix::I(); |
| 192 DEF_BENCH(return new SkBitmapFPGeneral( |
| 193 srcSize, kSRGB_SkColorProfileType, mI, false, |
| 194 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 195 |
| 196 DEF_BENCH(return new SkBitmapFPGeneral( |
| 197 srcSize, kLinear_SkColorProfileType, mI, false, |
| 198 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 199 |
| 200 DEF_BENCH(return new SkBitmapFPOrigShader( |
| 201 srcSize, kLinear_SkColorProfileType, mI, false, |
| 202 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 203 |
| 204 DEF_BENCH(return new SkBitmapFPGeneral( |
| 205 srcSize, kSRGB_SkColorProfileType, mI, true, |
| 206 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 207 |
| 208 DEF_BENCH(return new SkBitmapFPGeneral( |
| 209 srcSize, kLinear_SkColorProfileType, mI, true, |
| 210 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 211 |
| 212 DEF_BENCH(return new SkBitmapFPOrigShader( |
| 213 srcSize, kLinear_SkColorProfileType, mI, true, |
| 214 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 215 |
| 216 static SkMatrix mS = SkMatrix::MakeScale(2.7f, 2.7f); |
| 217 DEF_BENCH(return new SkBitmapFPGeneral( |
| 218 srcSize, kSRGB_SkColorProfileType, mS, false, |
| 219 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 220 |
| 221 DEF_BENCH(return new SkBitmapFPGeneral( |
| 222 srcSize, kLinear_SkColorProfileType, mS, false, |
| 223 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 224 |
| 225 DEF_BENCH(return new SkBitmapFPOrigShader( |
| 226 srcSize, kLinear_SkColorProfileType, mS, false, |
| 227 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 228 |
| 229 DEF_BENCH(return new SkBitmapFPGeneral( |
| 230 srcSize, kSRGB_SkColorProfileType, mS, true, |
| 231 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 232 |
| 233 DEF_BENCH(return new SkBitmapFPGeneral( |
| 234 srcSize, kLinear_SkColorProfileType, mS, true, |
| 235 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 236 |
| 237 DEF_BENCH(return new SkBitmapFPOrigShader( |
| 238 srcSize, kLinear_SkColorProfileType, mS, true, |
| 239 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 240 |
| 241 static SkMatrix rotate(SkScalar r) { |
| 242 SkMatrix m; |
| 243 m.setRotate(30); |
| 244 return m; |
| 245 } |
| 246 |
| 247 static SkMatrix mR = rotate(30); |
| 248 DEF_BENCH(return new SkBitmapFPGeneral( |
| 249 srcSize, kSRGB_SkColorProfileType, mR, false, |
| 250 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 251 |
| 252 DEF_BENCH(return new SkBitmapFPGeneral( |
| 253 srcSize, kLinear_SkColorProfileType, mR, false, |
| 254 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 255 |
| 256 DEF_BENCH(return new SkBitmapFPOrigShader( |
| 257 srcSize, kLinear_SkColorProfileType, mR, false, |
| 258 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 259 |
| 260 DEF_BENCH(return new SkBitmapFPGeneral( |
| 261 srcSize, kSRGB_SkColorProfileType, mR, true, |
| 262 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 263 |
| 264 DEF_BENCH(return new SkBitmapFPGeneral( |
| 265 srcSize, kLinear_SkColorProfileType, mR, true, |
| 266 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 267 |
| 268 DEF_BENCH(return new SkBitmapFPOrigShader( |
| 269 srcSize, kLinear_SkColorProfileType, mR, true, |
| 270 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);) |
| 271 |
OLD | NEW |