/* * Copyright 2020 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SmallPathAtlasMgr_DEFINED #define SmallPathAtlasMgr_DEFINED #include "include/core/SkTypes.h" #if !defined(SK_ENABLE_OPTIMIZE_SIZE) #include "src/base/SkTInternalLList.h" #include "src/core/SkTDynamicHash.h" #include "src/gpu/AtlasTypes.h" #include "src/gpu/ganesh/GrDrawOpAtlas.h" #include "src/gpu/ganesh/GrOnFlushResourceProvider.h" #include "src/gpu/ganesh/ops/SmallPathShapeData.h" #include class GrCaps; class GrDeferredUploadTarget; class GrProxyProvider; class GrResourceProvider; class GrStyledShape; class GrSurfaceProxyView; class SkMatrix; namespace skgpu::ganesh { /** * This class manages the small path renderer's atlas. It solely operates at flush time. Thus * the small path renderer will generate ops at record time but the location of the ops' source * data and even the number of proxies to be used will not be determined until the recorded * DAGs/DDLs are (re)played. * * TODO: investigate fusing this class and the GrAtlasManager. */ class SmallPathAtlasMgr final : public GrOnFlushCallbackObject, public skgpu::PlotEvictionCallback, public skgpu::AtlasGenerationCounter { public: SmallPathAtlasMgr(); ~SmallPathAtlasMgr() override; void reset(); bool initAtlas(GrProxyProvider*, const GrCaps*); SmallPathShapeData* findOrCreate(const GrStyledShape&, int desiredDimension); SmallPathShapeData* findOrCreate(const GrStyledShape&, const SkMatrix& ctm); GrDrawOpAtlas::ErrorCode addToAtlas(GrResourceProvider*, GrDeferredUploadTarget*, int width, int height, const void* image, skgpu::AtlasLocator*); void setUseToken(SmallPathShapeData*, skgpu::AtlasToken); // GrOnFlushCallbackObject overrides bool preFlush(GrOnFlushResourceProvider* onFlushRP) override { #if defined(GPU_TEST_UTILS) if (onFlushRP->failFlushTimeCallbacks()) { return false; } #endif if (fAtlas) { fAtlas->instantiate(onFlushRP); } return true; } void postFlush(skgpu::AtlasToken startTokenForNextFlush) override { if (fAtlas) { fAtlas->compact(startTokenForNextFlush); } } // This object has the same lifetime as the GrContext so we want it to survive freeGpuResources // calls bool retainOnFreeGpuResources() override { return true; } const GrSurfaceProxyView* getViews(int* numActiveProxies) { *numActiveProxies = fAtlas->numActivePages(); return fAtlas->getViews(); } void deleteCacheEntry(SmallPathShapeData*); private: SmallPathShapeData* findOrCreate(const SmallPathShapeDataKey&); void evict(skgpu::PlotLocator) override; using ShapeCache = SkTDynamicHash; typedef SkTInternalLList ShapeDataList; std::unique_ptr fAtlas; ShapeCache fShapeCache; ShapeDataList fShapeList; }; } // namespace skgpu::ganesh #endif // SK_ENABLE_OPTIMIZE_SIZE #endif // SmallPathAtlasMgr_DEFINED