| /* |
| * Copyright 2024 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "src/gpu/graphite/ClipAtlasManager.h" |
| |
| #include "include/gpu/graphite/Recorder.h" |
| #include "src/gpu/graphite/AtlasProvider.h" |
| #include "src/gpu/graphite/RecorderPriv.h" |
| #include "src/gpu/graphite/TextureProxy.h" |
| |
| namespace skgpu::graphite { |
| |
| ClipAtlasManager::ClipAtlasManager(Recorder* recorder) : fRecorder(recorder) { |
| static constexpr SkColorType kColorType = kAlpha_8_SkColorType; |
| static constexpr int kWidth = 2048; |
| static constexpr int kHeight = 2048; |
| |
| const Caps* caps = recorder->priv().caps(); |
| fDrawAtlas = DrawAtlas::Make(kColorType, |
| SkColorTypeBytesPerPixel(kColorType), |
| kWidth, kHeight, |
| /*plotWidth=*/kWidth, /*plotHeight=*/kHeight, |
| /*generationCounter=*/this, |
| caps->allowMultipleAtlasTextures() ? |
| DrawAtlas::AllowMultitexturing::kYes : |
| DrawAtlas::AllowMultitexturing::kNo, |
| DrawAtlas::UseStorageTextures::kNo, |
| /*evictor=*/this, |
| "ClipAtlas"); |
| SkASSERT(fDrawAtlas); |
| fKeyLists.resize(fDrawAtlas->numPlots() * fDrawAtlas->maxPages()); |
| for (int i = 0; i < fKeyLists.size(); ++i) { |
| fKeyLists[i].reset(); |
| } |
| } |
| |
| std::tuple<const TextureProxy*, Rect> ClipAtlasManager::findClip(const UniqueKey&) { |
| // TODO |
| return {nullptr, {}}; |
| } |
| |
| std::tuple<const TextureProxy*, Rect> ClipAtlasManager::addClip(const UniqueKey&, Rect bounds, |
| const ClipStack::ElementList*) { |
| // TODO |
| return {nullptr, {}}; |
| } |
| |
| bool ClipAtlasManager::recordUploads(DrawContext* dc) { |
| return (fDrawAtlas && !fDrawAtlas->recordUploads(dc, fRecorder)); |
| } |
| |
| namespace { |
| uint32_t mask_key_list_index(const PlotLocator& locator, const DrawAtlas* drawAtlas) { |
| return locator.pageIndex() * drawAtlas->numPlots() + locator.plotIndex(); |
| } |
| } // namespace |
| |
| void ClipAtlasManager::evict(PlotLocator plotLocator) { |
| // Remove all entries for this Plot from the MaskCache |
| uint32_t index = mask_key_list_index(plotLocator, fDrawAtlas.get()); |
| MaskKeyList::Iter iter; |
| iter.init(fKeyLists[index], MaskKeyList::Iter::kHead_IterStart); |
| MaskKeyEntry* currEntry; |
| while ((currEntry = iter.get())) { |
| iter.next(); |
| fMaskCache.remove(currEntry->fKey); |
| fKeyLists[index].remove(currEntry); |
| delete currEntry; |
| } |
| } |
| |
| void ClipAtlasManager::evictAll() { |
| fDrawAtlas->evictAllPlots(); |
| SkASSERT(fMaskCache.empty()); |
| } |
| |
| void ClipAtlasManager::compact(bool forceCompact) { |
| auto tokenTracker = fRecorder->priv().tokenTracker(); |
| if (fDrawAtlas) { |
| fDrawAtlas->compact(tokenTracker->nextFlushToken(), forceCompact); |
| } |
| } |
| |
| } // namespace skgpu::graphite |