1 /* 2 * Copyright 2023 Google LLC 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 skgpu_graphite_RasterPathAtlas_DEFINED 9 #define skgpu_graphite_RasterPathAtlas_DEFINED 10 11 #include "src/gpu/graphite/PathAtlas.h" 12 13 namespace skgpu::graphite { 14 15 /** 16 * PathAtlas class that rasterizes coverage masks on the CPU. 17 * 18 * When a new shape gets added, its path is rasterized in preparation for upload. These 19 * uploads are recorded by `recordUploads()` and subsequently added to an UploadTask. 20 * 21 * Shapes are cached for future frames to avoid the cost of raster pipeline rendering. Multiple 22 * textures (or Pages) are used to cache masks, so if the atlas is full we can reset a Page and 23 * start adding new shapes for a future atlas render. 24 */ 25 class RasterPathAtlas : public PathAtlas { 26 public: 27 explicit RasterPathAtlas(Recorder* recorder); ~RasterPathAtlas()28 ~RasterPathAtlas() override {} 29 void recordUploads(DrawContext*); 30 compact()31 void compact() { 32 fCachedAtlasMgr.compact(fRecorder); 33 fSmallPathAtlasMgr.compact(fRecorder); 34 fUncachedAtlasMgr.compact(fRecorder); 35 } 36 freeGpuResources()37 void freeGpuResources() { 38 fCachedAtlasMgr.freeGpuResources(fRecorder); 39 fSmallPathAtlasMgr.freeGpuResources(fRecorder); 40 fUncachedAtlasMgr.freeGpuResources(fRecorder); 41 } 42 evictAtlases()43 void evictAtlases() { 44 fCachedAtlasMgr.evictAll(); 45 fSmallPathAtlasMgr.evictAll(); 46 fUncachedAtlasMgr.evictAll(); 47 } 48 49 protected: 50 const TextureProxy* onAddShape(const Shape&, 51 const Transform& localToDevice, 52 const SkStrokeRec&, 53 skvx::half2 maskOrigin, 54 skvx::half2 maskSize, 55 SkIVector transformedMaskOffset, 56 skvx::half2* outPos) override; 57 private: 58 class RasterAtlasMgr : public PathAtlas::DrawAtlasMgr { 59 public: RasterAtlasMgr(size_t width,size_t height,size_t plotWidth,size_t plotHeight,const Caps * caps)60 RasterAtlasMgr(size_t width, size_t height, 61 size_t plotWidth, size_t plotHeight, 62 const Caps* caps) 63 : PathAtlas::DrawAtlasMgr(width, height, plotWidth, plotHeight, 64 DrawAtlas::UseStorageTextures::kNo, 65 /*label=*/"RasterPathAtlas", caps) {} 66 67 protected: 68 bool onAddToAtlas(const Shape&, 69 const Transform& localToDevice, 70 const SkStrokeRec&, 71 SkIRect shapeBounds, 72 SkIVector transformedMaskOffset, 73 const AtlasLocator&) override; 74 }; 75 76 RasterAtlasMgr fCachedAtlasMgr; 77 RasterAtlasMgr fSmallPathAtlasMgr; 78 RasterAtlasMgr fUncachedAtlasMgr; 79 }; 80 81 } // namespace skgpu::graphite 82 83 #endif // skgpu_graphite_RasterPathAtlas_DEFINED 84