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