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
16class GrSmallPathShapeData;
17class GrSmallPathShapeDataKey;
18class 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 */
28class GrSmallPathAtlasMgr : public GrOnFlushCallbackObject,
29 public GrDrawOpAtlas::EvictionCallback,
30 public GrDrawOpAtlas::GenerationCounter {
31public:
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
74private:
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