blob: 8a65dca33e627c624996f808c7dfe170d1b953b2 [file]
/*
* 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