• 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 
compact(bool forceCompact)31     void compact(bool forceCompact) {
32         fCachedAtlasMgr.compact(fRecorder, forceCompact);
33         fSmallPathAtlasMgr.compact(fRecorder, forceCompact);
34         fUncachedAtlasMgr.compact(fRecorder, forceCompact);
35     }
36 
evictAtlases()37     void evictAtlases() {
38         fCachedAtlasMgr.evictAll();
39         fSmallPathAtlasMgr.evictAll();
40         fUncachedAtlasMgr.evictAll();
41     }
42 
43 protected:
44     const TextureProxy* onAddShape(const Shape&,
45                                    const Transform& transform,
46                                    const SkStrokeRec&,
47                                    skvx::half2 maskOrigin,
48                                    skvx::half2 maskSize,
49                                    skvx::half2* outPos) override;
50 private:
51     class RasterAtlasMgr : public PathAtlas::DrawAtlasMgr {
52     public:
RasterAtlasMgr(size_t width,size_t height,size_t plotWidth,size_t plotHeight,const Caps * caps)53         RasterAtlasMgr(size_t width, size_t height,
54                        size_t plotWidth, size_t plotHeight,
55                        const Caps* caps)
56             : PathAtlas::DrawAtlasMgr(width, height, plotWidth, plotHeight,
57                                       DrawAtlas::UseStorageTextures::kNo,
58                                       /*label=*/"RasterPathAtlas", caps) {}
59 
60     protected:
61         bool onAddToAtlas(const Shape&,
62                           const Transform& transform,
63                           const SkStrokeRec&,
64                           SkIRect shapeBounds,
65                           const AtlasLocator&) override;
66     };
67 
68     RasterAtlasMgr fCachedAtlasMgr;
69     RasterAtlasMgr fSmallPathAtlasMgr;
70     RasterAtlasMgr fUncachedAtlasMgr;
71 };
72 
73 }  // namespace skgpu::graphite
74 
75 #endif  // skgpu_graphite_RasterPathAtlas_DEFINED
76