/* * 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 ClipAtlasManager::findClip(const UniqueKey&) { // TODO return {nullptr, {}}; } std::tuple 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