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