blob: 86fec24a882838a5cde6731f8acd225aff79b5db [file] [log] [blame]
Robert Phillips46a324a2020-08-10 13:08:12 -04001/*
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;
Robert Phillips109ff202020-08-10 16:39:31 -040018class GrStyledShape;
Robert Phillips46a324a2020-08-10 13:08:12 -040019
20/**
Robert Phillips079455c2020-08-11 15:18:46 -040021 * 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.
Robert Phillips46a324a2020-08-10 13:08:12 -040027 */
28class GrSmallPathAtlasMgr : public GrOnFlushCallbackObject,
29 public GrDrawOpAtlas::EvictionCallback,
Robert Phillipsa4bb0642020-08-11 09:55:17 -040030 public GrDrawOpAtlas::GenerationCounter {
Robert Phillips46a324a2020-08-10 13:08:12 -040031public:
32 GrSmallPathAtlasMgr();
33 ~GrSmallPathAtlasMgr() override;
34
Robert Phillipsa4bb0642020-08-11 09:55:17 -040035 void reset();
36
Robert Phillips46a324a2020-08-10 13:08:12 -040037 bool initAtlas(GrProxyProvider*, const GrCaps*);
38
Robert Phillips109ff202020-08-10 16:39:31 -040039 GrSmallPathShapeData* findOrCreate(const GrStyledShape&, int desiredDimension);
40 GrSmallPathShapeData* findOrCreate(const GrStyledShape&, const SkMatrix& ctm);
41
Robert Phillips6704bc82020-08-14 12:45:07 -040042 GrDrawOpAtlas::ErrorCode addToAtlas(GrResourceProvider*,
43 GrDeferredUploadTarget*,
44 int width, int height, const void* image,
45 GrDrawOpAtlas::AtlasLocator*);
46
Robert Phillips46a324a2020-08-10 13:08:12 -040047 void setUseToken(GrSmallPathShapeData*, GrDeferredUploadToken);
48
49 // GrOnFlushCallbackObject overrides
Robert Phillips46a324a2020-08-10 13:08:12 -040050 void preFlush(GrOnFlushResourceProvider* onFlushRP,
Robert Phillips109ff202020-08-10 16:39:31 -040051 const uint32_t* /* opsTaskIDs */,
52 int /* numOpsTaskIDs */) override {
Robert Phillips46a324a2020-08-10 13:08:12 -040053 if (fAtlas) {
54 fAtlas->instantiate(onFlushRP);
55 }
56 }
57
58 void postFlush(GrDeferredUploadToken startTokenForNextFlush,
Robert Phillips109ff202020-08-10 16:39:31 -040059 const uint32_t* /* opsTaskIDs */,
60 int /* numOpsTaskIDs */) override {
Robert Phillips46a324a2020-08-10 13:08:12 -040061 if (fAtlas) {
62 fAtlas->compact(startTokenForNextFlush);
63 }
64 }
65
Robert Phillips079455c2020-08-11 15:18:46 -040066 // This object has the same lifetime as the GrContext so we want it to survive freeGpuResources
67 // calls
68 bool retainOnFreeGpuResources() override { return true; }
69
Robert Phillipsa4bb0642020-08-11 09:55:17 -040070 const GrSurfaceProxyView* getViews(int* numActiveProxies) {
71 *numActiveProxies = fAtlas->numActivePages();
72 return fAtlas->getViews();
73 }
74
Robert Phillips46a324a2020-08-10 13:08:12 -040075 void deleteCacheEntry(GrSmallPathShapeData*);
76
77private:
Robert Phillips109ff202020-08-10 16:39:31 -040078 GrSmallPathShapeData* findOrCreate(const GrSmallPathShapeDataKey&);
79
80 void evict(GrDrawOpAtlas::PlotLocator) override;
81
Robert Phillips46a324a2020-08-10 13:08:12 -040082 using ShapeCache = SkTDynamicHash<GrSmallPathShapeData, GrSmallPathShapeDataKey>;
83 typedef SkTInternalLList<GrSmallPathShapeData> ShapeDataList;
84
Robert Phillips46a324a2020-08-10 13:08:12 -040085 std::unique_ptr<GrDrawOpAtlas> fAtlas;
86 ShapeCache fShapeCache;
87 ShapeDataList fShapeList;
88};
89
90#endif // GrSmallPathAtlasMgr_DEFINED