| Index: src/gpu/GrBatchAtlas.cpp
|
| diff --git a/src/gpu/GrBatchAtlas.cpp b/src/gpu/GrBatchAtlas.cpp
|
| index 3374e00a9f7080f143057c792abdca4dfe992ef6..53ed177431651343533162a4ee5f2283af6f83c6 100644
|
| --- a/src/gpu/GrBatchAtlas.cpp
|
| +++ b/src/gpu/GrBatchAtlas.cpp
|
| @@ -11,12 +11,6 @@
|
| #include "GrRectanizer.h"
|
| #include "GrTracing.h"
|
|
|
| -// for testing
|
| -#define ATLAS_STATS 0
|
| -#if ATLAS_STATS
|
| -static int g_UploadCount = 0;
|
| -#endif
|
| -
|
| static inline void adjust_for_offset(SkIPoint16* loc, const SkIPoint16& offset) {
|
| loc->fX += offset.fX;
|
| loc->fY += offset.fY;
|
| @@ -73,10 +67,6 @@ public:
|
| adjust_for_offset(loc, fOffset);
|
| SkDEBUGCODE(fDirty = true;)
|
|
|
| -#if ATLAS_STATS
|
| - ++g_UploadCount;
|
| -#endif
|
| -
|
| return true;
|
| }
|
|
|
| @@ -86,9 +76,15 @@ public:
|
| // when we can evict a plot from the cache, ie if the last ref has already flushed through
|
| // the gpu then we can reuse the plot
|
| BatchToken lastUploadToken() const { return fLastUpload; }
|
| - BatchToken lastRefToken() const { return fLastRef; }
|
| - void setLastUploadToken(BatchToken batchToken) { fLastUpload = batchToken; }
|
| - void setLastRefToken(BatchToken batchToken) { fLastRef = batchToken; }
|
| + BatchToken lastUseToken() const { return fLastUse; }
|
| + void setLastUploadToken(BatchToken batchToken) {
|
| + SkASSERT(batchToken >= fLastUpload);
|
| + fLastUpload = batchToken;
|
| + }
|
| + void setLastUseToken(BatchToken batchToken) {
|
| + SkASSERT(batchToken >= fLastUse);
|
| + fLastUse = batchToken;
|
| + }
|
|
|
| void uploadToTexture(GrBatchTarget::TextureUploader uploader) {
|
| // We should only be issuing uploads if we are in fact dirty
|
| @@ -127,7 +123,7 @@ public:
|
| private:
|
| BatchPlot()
|
| : fLastUpload(0)
|
| - , fLastRef(0)
|
| + , fLastUse(0)
|
| , fIndex(-1)
|
| , fGenID(-1)
|
| , fID(0)
|
| @@ -177,7 +173,7 @@ private:
|
| }
|
|
|
| BatchToken fLastUpload;
|
| - BatchToken fLastRef;
|
| + BatchToken fLastUse;
|
|
|
| uint32_t fIndex;
|
| uint32_t fGenID;
|
| @@ -229,6 +225,7 @@ GrBatchAtlas::GrBatchAtlas(GrTexture* texture, int numPlotsX, int numPlotsY)
|
| , fPlotWidth(texture->width() / numPlotsX)
|
| , fPlotHeight(texture->height() / numPlotsY)
|
| , fAtlasGeneration(kInvalidAtlasGeneration + 1) {
|
| + SkASSERT(fNumPlotsX * fNumPlotsY <= BulkUseTokenUpdater::kMaxPlots);
|
| SkASSERT(fPlotWidth * fNumPlotsX == texture->width());
|
| SkASSERT(fPlotHeight * fNumPlotsY == texture->height());
|
|
|
| @@ -256,10 +253,6 @@ GrBatchAtlas::GrBatchAtlas(GrTexture* texture, int numPlotsX, int numPlotsY)
|
| GrBatchAtlas::~GrBatchAtlas() {
|
| SkSafeUnref(fTexture);
|
| SkDELETE_ARRAY(fPlotArray);
|
| -
|
| -#if ATLAS_STATS
|
| - SkDebugf("Num uploads: %d\n", g_UploadCount);
|
| -#endif
|
| }
|
|
|
| void GrBatchAtlas::processEviction(AtlasID id) {
|
| @@ -313,7 +306,7 @@ bool GrBatchAtlas::addToAtlas(AtlasID* id, GrBatchTarget* batchTarget,
|
| plotIter.init(fPlotList, GrBatchPlotList::Iter::kTail_IterStart);
|
| plot = plotIter.get();
|
| SkASSERT(plot);
|
| - if (batchTarget->isIssued(plot->lastRefToken())) {
|
| + if (batchTarget->isIssued(plot->lastUseToken())) {
|
| this->processEviction(plot->id());
|
| plot->resetRects();
|
| SkDEBUGCODE(bool verify = )plot->addSubImage(width, height, image, loc, fBPP * width);
|
| @@ -329,7 +322,7 @@ bool GrBatchAtlas::addToAtlas(AtlasID* id, GrBatchTarget* batchTarget,
|
| // off the plot(ie let the batch target manage it) and create a new plot in its place in our
|
| // array. If it is equal to the currentToken, then the caller has to flush draws to the batch
|
| // target so we can spin off the plot
|
| - if (plot->lastRefToken() == batchTarget->currentToken()) {
|
| + if (plot->lastUseToken() == batchTarget->currentToken()) {
|
| return false;
|
| }
|
|
|
| @@ -359,14 +352,23 @@ bool GrBatchAtlas::addToAtlas(AtlasID* id, GrBatchTarget* batchTarget,
|
| }
|
|
|
| bool GrBatchAtlas::hasID(AtlasID id) {
|
| - int index = this->getIndexFromID(id);
|
| + int index = GetIndexFromID(id);
|
| SkASSERT(index < fNumPlotsX * fNumPlotsY);
|
| - return fPlotArray[index]->genID() == this->getGenerationFromID(id);
|
| + return fPlotArray[index]->genID() == GetGenerationFromID(id);
|
| }
|
|
|
| -void GrBatchAtlas::setLastRefToken(AtlasID id, BatchToken batchToken) {
|
| +void GrBatchAtlas::setLastUseToken(AtlasID id, BatchToken batchToken) {
|
| SkASSERT(this->hasID(id));
|
| - int index = this->getIndexFromID(id);
|
| + int index = GetIndexFromID(id);
|
| + SkASSERT(index < fNumPlotsX * fNumPlotsY);
|
| this->makeMRU(fPlotArray[index]);
|
| - fPlotArray[index]->setLastRefToken(batchToken);
|
| + fPlotArray[index]->setLastUseToken(batchToken);
|
| +}
|
| +
|
| +void GrBatchAtlas::setLastUseTokenBulk(const BulkUseTokenUpdater& updater, BatchToken batchToken) {
|
| + for (int i = 0; i < updater.fCount; i++) {
|
| + BatchPlot* plot = fPlotArray[updater.fPlotsToUpdate[i]];
|
| + this->makeMRU(plot);
|
| + plot->setLastUseToken(batchToken);
|
| + }
|
| }
|
|
|