• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2023 Google LLC
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 #ifndef skgpu_graphite_RasterPathAtlas_DEFINED
9 #define skgpu_graphite_RasterPathAtlas_DEFINED
10 
11 #include "src/gpu/graphite/PathAtlas.h"
12 
13 namespace skgpu::graphite {
14 
15 /**
16  * PathAtlas class that rasterizes coverage masks on the CPU.
17  *
18  * When a new shape gets added, its path is rasterized in preparation for upload. These
19  * uploads are recorded by `recordUploads()` and subsequently added to an UploadTask.
20  *
21  * Shapes are cached for future frames to avoid the cost of raster pipeline rendering. Multiple
22  * textures (or Pages) are used to cache masks, so if the atlas is full we can reset a Page and
23  * start adding new shapes for a future atlas render.
24  */
25 class RasterPathAtlas : public PathAtlas {
26 public:
27     explicit RasterPathAtlas(Recorder* recorder);
~RasterPathAtlas()28     ~RasterPathAtlas() override {}
29     void recordUploads(DrawContext*);
30 
postFlush()31     void postFlush() {
32         fCachedAtlasMgr.postFlush(fRecorder);
33         fSmallPathAtlasMgr.postFlush(fRecorder);
34         fUncachedAtlasMgr.postFlush(fRecorder);
35     }
36 
37 protected:
38     const TextureProxy* onAddShape(const Shape&,
39                                    const Transform& transform,
40                                    const SkStrokeRec&,
41                                    skvx::half2 maskSize,
42                                    skvx::half2* outPos) override;
43 private:
44     class RasterAtlasMgr : public PathAtlas::DrawAtlasMgr {
45     public:
RasterAtlasMgr(size_t width,size_t height,size_t plotWidth,size_t plotHeight,const Caps * caps)46         RasterAtlasMgr(size_t width, size_t height,
47                        size_t plotWidth, size_t plotHeight,
48                        const Caps* caps)
49             : PathAtlas::DrawAtlasMgr(width, height, plotWidth, plotHeight,
50                                       DrawAtlas::UseStorageTextures::kNo,
51                                       /*label=*/"RasterPathAtlas", caps) {}
52 
53     protected:
54         bool onAddToAtlas(const Shape&,
55                           const Transform& transform,
56                           const SkStrokeRec&,
57                           SkIRect shapeBounds,
58                           const AtlasLocator&) override;
59     };
60 
61     RasterAtlasMgr fCachedAtlasMgr;
62     RasterAtlasMgr fSmallPathAtlasMgr;
63     RasterAtlasMgr fUncachedAtlasMgr;
64 };
65 
66 }  // namespace skgpu::graphite
67 
68 #endif  // skgpu_graphite_RasterPathAtlas_DEFINED
69