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 | GrDrawOpAtlas* atlas() { return fAtlas.get(); } |
40 | |
41 | GrSmallPathShapeData* findOrCreate(const GrStyledShape&, int desiredDimension); |
42 | GrSmallPathShapeData* findOrCreate(const GrStyledShape&, const SkMatrix& ctm); |
43 | |
44 | void setUseToken(GrSmallPathShapeData*, GrDeferredUploadToken); |
45 | |
46 | // GrOnFlushCallbackObject overrides |
47 | void preFlush(GrOnFlushResourceProvider* onFlushRP, |
48 | const uint32_t* /* opsTaskIDs */, |
49 | int /* numOpsTaskIDs */) override { |
50 | if (fAtlas) { |
51 | fAtlas->instantiate(onFlushRP); |
52 | } |
53 | } |
54 | |
55 | void postFlush(GrDeferredUploadToken startTokenForNextFlush, |
56 | const uint32_t* /* opsTaskIDs */, |
57 | int /* numOpsTaskIDs */) override { |
58 | if (fAtlas) { |
59 | fAtlas->compact(startTokenForNextFlush); |
60 | } |
61 | } |
62 | |
63 | // This object has the same lifetime as the GrContext so we want it to survive freeGpuResources |
64 | // calls |
65 | bool retainOnFreeGpuResources() override { return true; } |
66 | |
67 | const GrSurfaceProxyView* getViews(int* numActiveProxies) { |
68 | *numActiveProxies = fAtlas->numActivePages(); |
69 | return fAtlas->getViews(); |
70 | } |
71 | |
72 | void deleteCacheEntry(GrSmallPathShapeData*); |
73 | |
74 | private: |
75 | GrSmallPathShapeData* findOrCreate(const GrSmallPathShapeDataKey&); |
76 | |
77 | void evict(GrDrawOpAtlas::PlotLocator) override; |
78 | |
79 | using ShapeCache = SkTDynamicHash<GrSmallPathShapeData, GrSmallPathShapeDataKey>; |
80 | typedef SkTInternalLList<GrSmallPathShapeData> ShapeDataList; |
81 | |
82 | std::unique_ptr<GrDrawOpAtlas> fAtlas; |
83 | ShapeCache fShapeCache; |
84 | ShapeDataList fShapeList; |
85 | }; |
86 | |
87 | #endif // GrSmallPathAtlasMgr_DEFINED |
88 | |