• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020 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 "bench/Benchmark.h"
9 #include "include/core/SkFont.h"
10 #include "include/core/SkTypeface.h"
11 #include "include/gpu/GrDirectContext.h"
12 #include "include/gpu/GrRecordingContext.h"
13 #include "src/core/SkStrikeCache.h"
14 #include "src/core/SkUtils.h"
15 #include "src/gpu/GrRecordingContextPriv.h"
16 #include "src/gpu/SkGr.h"
17 #include "src/gpu/text/GrStrikeCache.h"
18 #include "src/gpu/text/GrTextBlob.h"
19 #include "src/utils/SkUTF.h"
20 
21 // From Project Guttenberg. This is UTF-8 text.
22 static const char* gText =
23         "Call me Ishmael.  Some years ago--never mind how long precisely";
24 
25 class DirectMaskGlyphVertexFillBenchmark : public Benchmark {
isSuitableFor(Backend backend)26     bool isSuitableFor(Backend backend) override {
27         return backend == kGPU_Backend;
28     }
29 
onGetName()30     const char* onGetName() override {
31         return "DirectMaskGlyphVertexFillBenchmark";
32     }
33 
onPerCanvasPreDraw(SkCanvas * canvas)34     void onPerCanvasPreDraw(SkCanvas* canvas) override {
35         auto typeface = SkTypeface::MakeFromName("monospace", SkFontStyle());
36         SkFont font(typeface);
37 
38         SkMatrix view = SkMatrix::I();
39         size_t len = strlen(gText);
40         SkGlyphRunBuilder builder;
41         SkPaint paint;
42         auto glyphRunList = builder.textToGlyphRunList(font, paint, gText, len, {100, 100});
43         SkASSERT(!glyphRunList.empty());
44         SkSurfaceProps props;
45         if (canvas) { canvas->getProps(&props); }
46 
47         auto colorSpace = SkColorSpace::MakeSRGB();
48         SkGlyphRunListPainter painter{props, kUnknown_SkColorType,
49                                       colorSpace.get(), SkStrikeCache::GlobalStrikeCache()};
50         SkMatrix drawMatrix = view;
51         const SkPoint drawOrigin = glyphRunList.origin();
52         drawMatrix.preTranslate(drawOrigin.x(), drawOrigin.y());
53         GrSDFTControl control{false, props.isUseDeviceIndependentFonts(), 256, 256};
54         fBlob = GrTextBlob::Make(glyphRunList, paint, drawMatrix, control, &painter);
55 
56         SkASSERT(!fBlob->subRunList().isEmpty());
57         GrAtlasSubRun* subRun = fBlob->subRunList().front().testingOnly_atlasSubRun();
58         SkASSERT(subRun);
59         subRun->testingOnly_packedGlyphIDToGrGlyph(&fCache);
60         fVertices.reset(new char[subRun->vertexStride(drawMatrix) * subRun->glyphCount() * 4]);
61     }
62 
onDraw(int loops,SkCanvas * canvas)63     void onDraw(int loops, SkCanvas* canvas) override {
64         GrAtlasSubRun* subRun = fBlob->subRunList().front().testingOnly_atlasSubRun();
65         SkASSERT(subRun);
66 
67         SkIRect clip = SkIRect::MakeEmpty();
68         SkPaint paint;
69         GrColor grColor = SkColorToPremulGrColor(paint.getColor());
70         SkMatrix positionMatrix = SkMatrix::Translate(100, 100);
71 
72         for (int loop = 0; loop < loops; loop++) {
73             subRun->fillVertexData(fVertices.get(), 0, subRun->glyphCount(),
74                                    grColor, positionMatrix, clip);
75         }
76     }
77 
78 private:
79     sk_sp<GrTextBlob> fBlob;
80     GrStrikeCache fCache;
81     std::unique_ptr<char[]> fVertices;
82 };
83 
84 DEF_BENCH(return new DirectMaskGlyphVertexFillBenchmark{});
85