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