• 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 #ifndef GrSmallPathAtlasMgr_DEFINED
9 #define GrSmallPathAtlasMgr_DEFINED
10 
11 #include "src/core/SkTDynamicHash.h"
12 #include "src/core/SkTInternalLList.h"
13 #include "src/gpu/GrDrawOpAtlas.h"
14 #include "src/gpu/GrOnFlushResourceProvider.h"
15 
16 class GrSmallPathShapeData;
17 class GrSmallPathShapeDataKey;
18 class GrStyledShape;
19 
20 /**
21  * This class manages the small path renderer's atlas. It solely operates at flush time. Thus
22  * the small path renderer will generate ops at record time but the location of the ops' source
23  * data and even the number of proxies to be used will not be determined until the recorded
24  * DAGs/DDLs are (re)played.
25  *
26  * TODO: investigate fusing this class and the GrAtlasManager.
27  */
28 class GrSmallPathAtlasMgr : public GrOnFlushCallbackObject,
29                             public GrDrawOpAtlas::EvictionCallback,
30                             public GrDrawOpAtlas::GenerationCounter {
31 public:
32     GrSmallPathAtlasMgr();
33     ~GrSmallPathAtlasMgr() override;
34 
35     void reset();
36 
37     bool initAtlas(GrProxyProvider*, const GrCaps*);
38 
39     GrSmallPathShapeData* findOrCreate(const GrStyledShape&, int desiredDimension);
40     GrSmallPathShapeData* findOrCreate(const GrStyledShape&, const SkMatrix& ctm);
41 
42     GrDrawOpAtlas::ErrorCode addToAtlas(GrResourceProvider*,
43                                         GrDeferredUploadTarget*,
44                                         int width, int height, const void* image,
45                                         GrDrawOpAtlas::AtlasLocator*);
46 
47     void setUseToken(GrSmallPathShapeData*, GrDeferredUploadToken);
48 
49     // GrOnFlushCallbackObject overrides
preFlush(GrOnFlushResourceProvider * onFlushRP,SkSpan<const uint32_t>)50     void preFlush(GrOnFlushResourceProvider* onFlushRP,
51                   SkSpan<const uint32_t> /* taskIDs */) override {
52         if (fAtlas) {
53             fAtlas->instantiate(onFlushRP);
54         }
55     }
56 
postFlush(GrDeferredUploadToken startTokenForNextFlush,SkSpan<const uint32_t>)57     void postFlush(GrDeferredUploadToken startTokenForNextFlush,
58                    SkSpan<const uint32_t> /* taskIDs */) override {
59         if (fAtlas) {
60             fAtlas->compact(startTokenForNextFlush);
61         }
62     }
63 
64     // This object has the same lifetime as the GrContext so we want it to survive freeGpuResources
65     // calls
retainOnFreeGpuResources()66     bool retainOnFreeGpuResources() override { return true; }
67 
getViews(int * numActiveProxies)68     const GrSurfaceProxyView* getViews(int* numActiveProxies) {
69         *numActiveProxies = fAtlas->numActivePages();
70         return fAtlas->getViews();
71     }
72 
73     void deleteCacheEntry(GrSmallPathShapeData*);
74 
75 private:
76     GrSmallPathShapeData* findOrCreate(const GrSmallPathShapeDataKey&);
77 
78     void evict(GrDrawOpAtlas::PlotLocator) override;
79 
80     using ShapeCache = SkTDynamicHash<GrSmallPathShapeData, GrSmallPathShapeDataKey>;
81     typedef SkTInternalLList<GrSmallPathShapeData> ShapeDataList;
82 
83     std::unique_ptr<GrDrawOpAtlas> fAtlas;
84     ShapeCache                     fShapeCache;
85     ShapeDataList                  fShapeList;
86 };
87 
88 #endif // GrSmallPathAtlasMgr_DEFINED
89