Fix thrashing issue with multitextured atlas.
To try to reduce memory usage, the atlas will look for space in the earliest created pages and then invalidate plots in the latest page to try to move those plots into an earlier one. The problem was that the available space was not being evicted, so we kept loading data back into the latest page. Bug: skia: Change-Id: Ic8668f6f66bf1153dbcb5edae7622fa9edfa71dd Reviewed-on: https://skia-review.googlesource.com/98801 Commit-Queue: Jim Van Verth <jvanverth@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
This commit is contained in:
parent
dfc0e910df
commit
cad0acf4db
@ -130,7 +130,7 @@ private:
|
||||
|
||||
class ChineseZoomView : public SampleView {
|
||||
public:
|
||||
ChineseZoomView() : fBlobs(kNumBlobs), fScale(1.0f) {}
|
||||
ChineseZoomView() : fBlobs(kNumBlobs), fScale(15.0f), fTranslate(0.0f) {}
|
||||
|
||||
protected:
|
||||
bool onQuery(SkEvent* evt) override {
|
||||
@ -153,6 +153,7 @@ protected:
|
||||
}
|
||||
|
||||
void onDrawContent(SkCanvas* canvas) override {
|
||||
bool afterFirstFrame = fInitialized;
|
||||
if (!fInitialized) {
|
||||
this->init();
|
||||
fInitialized = true;
|
||||
@ -167,26 +168,30 @@ protected:
|
||||
paint.setTextSize(11);
|
||||
paint.setTextEncoding(SkPaint::kUTF32_TextEncoding);
|
||||
|
||||
if (afterFirstFrame) {
|
||||
#if SK_SUPPORT_GPU
|
||||
GrContext* grContext = canvas->getGrContext();
|
||||
if (grContext) {
|
||||
sk_sp<SkImage> image =
|
||||
grContext->getFontAtlasImage_ForTesting(GrMaskFormat::kA8_GrMaskFormat, 0);
|
||||
canvas->drawImageRect(image,
|
||||
SkRect::MakeXYWH(512.0f, 10.0f, 512.0f, 512.0), &paint);
|
||||
image = grContext->getFontAtlasImage_ForTesting(GrMaskFormat::kA8_GrMaskFormat, 1);
|
||||
canvas->drawImageRect(image,
|
||||
SkRect::MakeXYWH(1024.0f, 10.0f, 512.f, 512.0f), &paint);
|
||||
image = grContext->getFontAtlasImage_ForTesting(GrMaskFormat::kA8_GrMaskFormat, 2);
|
||||
canvas->drawImageRect(image,
|
||||
SkRect::MakeXYWH(512.0f, 522.0f, 512.0f, 512.0f), &paint);
|
||||
image = grContext->getFontAtlasImage_ForTesting(GrMaskFormat::kA8_GrMaskFormat, 3);
|
||||
canvas->drawImageRect(image,
|
||||
SkRect::MakeXYWH(1024.0f, 522.0f, 512.0f, 512.0f), &paint);
|
||||
}
|
||||
GrContext* grContext = canvas->getGrContext();
|
||||
if (grContext) {
|
||||
sk_sp<SkImage> image =
|
||||
grContext->getFontAtlasImage_ForTesting(GrMaskFormat::kA8_GrMaskFormat, 0);
|
||||
canvas->drawImageRect(image,
|
||||
SkRect::MakeXYWH(10.0f, 10.0f, 512.0f, 512.0), &paint);
|
||||
image = grContext->getFontAtlasImage_ForTesting(GrMaskFormat::kA8_GrMaskFormat, 1);
|
||||
canvas->drawImageRect(image,
|
||||
SkRect::MakeXYWH(522.0f, 10.0f, 512.f, 512.0f), &paint);
|
||||
image = grContext->getFontAtlasImage_ForTesting(GrMaskFormat::kA8_GrMaskFormat, 2);
|
||||
canvas->drawImageRect(image,
|
||||
SkRect::MakeXYWH(10.0f, 522.0f, 512.0f, 512.0f), &paint);
|
||||
image = grContext->getFontAtlasImage_ForTesting(GrMaskFormat::kA8_GrMaskFormat, 3);
|
||||
canvas->drawImageRect(image,
|
||||
SkRect::MakeXYWH(522.0f, 522.0f, 512.0f, 512.0f), &paint);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
canvas->scale(fScale, fScale);
|
||||
canvas->translate(0, fTranslate);
|
||||
fTranslate -= 0.5f;
|
||||
|
||||
// draw a consistent run of the 'words' - one word per line
|
||||
SkScalar y = 0;
|
||||
@ -247,6 +252,7 @@ private:
|
||||
SkTArray<sk_sp<SkTextBlob>> fBlobs;
|
||||
SkRandom fRand;
|
||||
SkScalar fScale;
|
||||
SkScalar fTranslate;
|
||||
int fIndex;
|
||||
|
||||
typedef SkView INHERITED;
|
||||
|
@ -371,7 +371,7 @@ void GrDrawOpAtlas::compact(GrDeferredUploadToken startTokenForNextFlush) {
|
||||
// a blinking cursor is drawn.
|
||||
// TODO: consider if we should also do this if it's been a long time since the last atlas use
|
||||
if (atlasUsedThisFlush) {
|
||||
int availablePlots = 0;
|
||||
SkTArray<Plot*> availablePlots;
|
||||
uint32_t lastPageIndex = fNumPages - 1;
|
||||
|
||||
// For all plots but the last one, update number of flushes since used, and check to see
|
||||
@ -400,7 +400,7 @@ void GrDrawOpAtlas::compact(GrDeferredUploadToken startTokenForNextFlush) {
|
||||
// Count plots we can potentially upload to in all pages except the last one
|
||||
// (the potential compactee).
|
||||
if (plot->flushesSinceLastUsed() > kRecentlyUsedCount) {
|
||||
++availablePlots;
|
||||
availablePlots.push_back() = plot;
|
||||
}
|
||||
|
||||
plotIter.next();
|
||||
@ -439,9 +439,10 @@ void GrDrawOpAtlas::compact(GrDeferredUploadToken startTokenForNextFlush) {
|
||||
// see if there's room in an earlier page and if so evict.
|
||||
// We need to be somewhat harsh here so that one plot that is consistently in use
|
||||
// doesn't end up locking the page in memory.
|
||||
if (availablePlots) {
|
||||
if (availablePlots.count() > 0) {
|
||||
this->processEvictionAndResetRects(plot);
|
||||
--availablePlots;
|
||||
this->processEvictionAndResetRects(availablePlots.back());
|
||||
availablePlots.pop_back();
|
||||
}
|
||||
} else if (plot->lastUseToken() != GrDeferredUploadToken::AlreadyFlushedToken()) {
|
||||
// otherwise if aged out just evict it.
|
||||
|
Loading…
Reference in New Issue
Block a user