1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SmallPathAtlasMgr_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SmallPathAtlasMgr_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE) 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTInternalLList.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTDynamicHash.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/AtlasTypes.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDrawOpAtlas.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrOnFlushResourceProvider.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/SmallPathShapeData.h" 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker class GrCaps; 25*c8dee2aaSAndroid Build Coastguard Worker class GrDeferredUploadTarget; 26*c8dee2aaSAndroid Build Coastguard Worker class GrProxyProvider; 27*c8dee2aaSAndroid Build Coastguard Worker class GrResourceProvider; 28*c8dee2aaSAndroid Build Coastguard Worker class GrStyledShape; 29*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxyView; 30*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker /** 35*c8dee2aaSAndroid Build Coastguard Worker * This class manages the small path renderer's atlas. It solely operates at flush time. Thus 36*c8dee2aaSAndroid Build Coastguard Worker * the small path renderer will generate ops at record time but the location of the ops' source 37*c8dee2aaSAndroid Build Coastguard Worker * data and even the number of proxies to be used will not be determined until the recorded 38*c8dee2aaSAndroid Build Coastguard Worker * DAGs/DDLs are (re)played. 39*c8dee2aaSAndroid Build Coastguard Worker * 40*c8dee2aaSAndroid Build Coastguard Worker * TODO: investigate fusing this class and the GrAtlasManager. 41*c8dee2aaSAndroid Build Coastguard Worker */ 42*c8dee2aaSAndroid Build Coastguard Worker class SmallPathAtlasMgr final : public GrOnFlushCallbackObject, 43*c8dee2aaSAndroid Build Coastguard Worker public skgpu::PlotEvictionCallback, 44*c8dee2aaSAndroid Build Coastguard Worker public skgpu::AtlasGenerationCounter { 45*c8dee2aaSAndroid Build Coastguard Worker public: 46*c8dee2aaSAndroid Build Coastguard Worker SmallPathAtlasMgr(); 47*c8dee2aaSAndroid Build Coastguard Worker ~SmallPathAtlasMgr() override; 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker void reset(); 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker bool initAtlas(GrProxyProvider*, const GrCaps*); 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker SmallPathShapeData* findOrCreate(const GrStyledShape&, int desiredDimension); 54*c8dee2aaSAndroid Build Coastguard Worker SmallPathShapeData* findOrCreate(const GrStyledShape&, const SkMatrix& ctm); 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker GrDrawOpAtlas::ErrorCode addToAtlas(GrResourceProvider*, 57*c8dee2aaSAndroid Build Coastguard Worker GrDeferredUploadTarget*, 58*c8dee2aaSAndroid Build Coastguard Worker int width, int height, const void* image, 59*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasLocator*); 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker void setUseToken(SmallPathShapeData*, skgpu::AtlasToken); 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker // GrOnFlushCallbackObject overrides preFlush(GrOnFlushResourceProvider * onFlushRP)64*c8dee2aaSAndroid Build Coastguard Worker bool preFlush(GrOnFlushResourceProvider* onFlushRP) override { 65*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) 66*c8dee2aaSAndroid Build Coastguard Worker if (onFlushRP->failFlushTimeCallbacks()) { 67*c8dee2aaSAndroid Build Coastguard Worker return false; 68*c8dee2aaSAndroid Build Coastguard Worker } 69*c8dee2aaSAndroid Build Coastguard Worker #endif 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker if (fAtlas) { 72*c8dee2aaSAndroid Build Coastguard Worker fAtlas->instantiate(onFlushRP); 73*c8dee2aaSAndroid Build Coastguard Worker } 74*c8dee2aaSAndroid Build Coastguard Worker return true; 75*c8dee2aaSAndroid Build Coastguard Worker } 76*c8dee2aaSAndroid Build Coastguard Worker postFlush(skgpu::AtlasToken startTokenForNextFlush)77*c8dee2aaSAndroid Build Coastguard Worker void postFlush(skgpu::AtlasToken startTokenForNextFlush) override { 78*c8dee2aaSAndroid Build Coastguard Worker if (fAtlas) { 79*c8dee2aaSAndroid Build Coastguard Worker fAtlas->compact(startTokenForNextFlush); 80*c8dee2aaSAndroid Build Coastguard Worker } 81*c8dee2aaSAndroid Build Coastguard Worker } 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker // This object has the same lifetime as the GrContext so we want it to survive freeGpuResources 84*c8dee2aaSAndroid Build Coastguard Worker // calls retainOnFreeGpuResources()85*c8dee2aaSAndroid Build Coastguard Worker bool retainOnFreeGpuResources() override { return true; } 86*c8dee2aaSAndroid Build Coastguard Worker getViews(int * numActiveProxies)87*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxyView* getViews(int* numActiveProxies) { 88*c8dee2aaSAndroid Build Coastguard Worker *numActiveProxies = fAtlas->numActivePages(); 89*c8dee2aaSAndroid Build Coastguard Worker return fAtlas->getViews(); 90*c8dee2aaSAndroid Build Coastguard Worker } 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker void deleteCacheEntry(SmallPathShapeData*); 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker private: 95*c8dee2aaSAndroid Build Coastguard Worker SmallPathShapeData* findOrCreate(const SmallPathShapeDataKey&); 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker void evict(skgpu::PlotLocator) override; 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker using ShapeCache = SkTDynamicHash<SmallPathShapeData, SmallPathShapeDataKey>; 100*c8dee2aaSAndroid Build Coastguard Worker typedef SkTInternalLList<SmallPathShapeData> ShapeDataList; 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrDrawOpAtlas> fAtlas; 103*c8dee2aaSAndroid Build Coastguard Worker ShapeCache fShapeCache; 104*c8dee2aaSAndroid Build Coastguard Worker ShapeDataList fShapeList; 105*c8dee2aaSAndroid Build Coastguard Worker }; 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::ganesh 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_ENABLE_OPTIMIZE_SIZE 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker #endif // SmallPathAtlasMgr_DEFINED 112