aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar joshualitt <joshualitt@google.com>2015-04-07 10:21:27 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-04-07 10:21:27 -0700
commit3cf9863bb658d637416c4edbf278b0311dba7478 (patch)
tree32326eb6636e2326baf8ce910bd454798426fce1 /src
parent7281c61e7bc689d484dcbda49be3cef4ce4f11c2 (diff)
Revert of Adding bulk plot reffer to cached textblobs (patchset #7 id:110001 of https://codereview.chromium.org/1050113004/)
Reason for revert: Breaks linux builder Original issue's description: > Adding bulk plot reffer to cached textblobs > > This change will prevent the atlas from evicting glyphs the TextBlob > needs. > > BUG=skia: > > Committed: https://skia.googlesource.com/skia/+/7281c61e7bc689d484dcbda49be3cef4ce4f11c2 TBR=bsalomon@google.com,jvanverth@google.com,robertphillips@google.com,joshualitt@chromium.org NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=skia: Review URL: https://codereview.chromium.org/1061713003
Diffstat (limited to 'src')
-rwxr-xr-xsrc/gpu/GrAADistanceFieldPathRenderer.cpp2
-rw-r--r--src/gpu/GrAtlasTextContext.cpp11
-rw-r--r--src/gpu/GrAtlasTextContext.h2
-rw-r--r--src/gpu/GrBatchAtlas.cpp55
-rw-r--r--src/gpu/GrBatchAtlas.h51
-rw-r--r--src/gpu/GrBatchFontCache.cpp14
-rw-r--r--src/gpu/GrBatchFontCache.h11
7 files changed, 37 insertions, 109 deletions
diff --git a/src/gpu/GrAADistanceFieldPathRenderer.cpp b/src/gpu/GrAADistanceFieldPathRenderer.cpp
index cbb08248b7..789406bdbc 100755
--- a/src/gpu/GrAADistanceFieldPathRenderer.cpp
+++ b/src/gpu/GrAADistanceFieldPathRenderer.cpp
@@ -275,7 +275,7 @@ public:
}
}
- atlas->setLastUseToken(args.fPathData->fID, batchTarget->currentToken());
+ atlas->setLastRefToken(args.fPathData->fID, batchTarget->currentToken());
// Now set vertices
intptr_t offset = reinterpret_cast<intptr_t>(vertices);
diff --git a/src/gpu/GrAtlasTextContext.cpp b/src/gpu/GrAtlasTextContext.cpp
index 38edc8e558..08e6a9a25e 100644
--- a/src/gpu/GrAtlasTextContext.cpp
+++ b/src/gpu/GrAtlasTextContext.cpp
@@ -821,7 +821,6 @@ public:
GrBatchTextStrike* strike = NULL;
bool brokenRun = false;
if (regenerateTextureCoords) {
- info.fBulkUseToken.reset();
desc = run.fDescriptor.getDesc();
cache = SkGlyphCache::DetachCache(run.fTypeface, desc);
scaler = GrTextContext::GetGrFontScaler(cache);
@@ -847,8 +846,8 @@ public:
scaler);
SkASSERT(success);
}
- fFontCache->addGlyphToBulkAndSetUseToken(&info.fBulkUseToken, glyph,
- batchTarget->currentToken());
+
+ fFontCache->setGlyphRefToken(glyph, batchTarget->currentToken());
// Texture coords are the last vertex attribute so we get a pointer to the
// first one and then map with stride in regenerateTextureCoords
@@ -877,12 +876,6 @@ public:
}
} else {
instancesToFlush += glyphCount;
-
- // set use tokens for all of the glyphs in our subrun. This is only valid if we
- // have a valid atlas generation
- fFontCache->setUseTokenBulk(info.fBulkUseToken,
- batchTarget->currentToken(),
- fMaskFormat);
}
// now copy all vertices
diff --git a/src/gpu/GrAtlasTextContext.h b/src/gpu/GrAtlasTextContext.h
index a75eb0e469..de07d1f474 100644
--- a/src/gpu/GrAtlasTextContext.h
+++ b/src/gpu/GrAtlasTextContext.h
@@ -10,7 +10,6 @@
#include "GrTextContext.h"
-#include "GrBatchAtlas.h"
#include "GrGeometryProcessor.h"
#include "SkDescriptor.h"
#include "SkTextBlob.h"
@@ -104,7 +103,6 @@ private:
uint32_t fGlyphEndIndex;
size_t fVertexStartIndex;
size_t fVertexEndIndex;
- GrBatchAtlas::BulkUseTokenUpdater fBulkUseToken;
};
SkSTArray<1, SubRunInfo, true> fSubRunInfo;
SkAutoDescriptor fDescriptor;
diff --git a/src/gpu/GrBatchAtlas.cpp b/src/gpu/GrBatchAtlas.cpp
index 113025eac7..3374e00a9f 100644
--- a/src/gpu/GrBatchAtlas.cpp
+++ b/src/gpu/GrBatchAtlas.cpp
@@ -11,6 +11,12 @@
#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;
@@ -67,6 +73,10 @@ public:
adjust_for_offset(loc, fOffset);
SkDEBUGCODE(fDirty = true;)
+#if ATLAS_STATS
+ ++g_UploadCount;
+#endif
+
return true;
}
@@ -76,15 +86,9 @@ 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 lastUseToken() const { return fLastUse; }
- void setLastUploadToken(BatchToken batchToken) {
- SkASSERT(batchToken >= fLastUpload);
- fLastUpload = batchToken;
- }
- void setLastUseToken(BatchToken batchToken) {
- SkASSERT(batchToken >= fLastUse);
- fLastUse = batchToken;
- }
+ BatchToken lastRefToken() const { return fLastRef; }
+ void setLastUploadToken(BatchToken batchToken) { fLastUpload = batchToken; }
+ void setLastRefToken(BatchToken batchToken) { fLastRef = batchToken; }
void uploadToTexture(GrBatchTarget::TextureUploader uploader) {
// We should only be issuing uploads if we are in fact dirty
@@ -123,7 +127,7 @@ public:
private:
BatchPlot()
: fLastUpload(0)
- , fLastUse(0)
+ , fLastRef(0)
, fIndex(-1)
, fGenID(-1)
, fID(0)
@@ -173,7 +177,7 @@ private:
}
BatchToken fLastUpload;
- BatchToken fLastUse;
+ BatchToken fLastRef;
uint32_t fIndex;
uint32_t fGenID;
@@ -225,7 +229,6 @@ 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());
@@ -253,6 +256,10 @@ 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) {
@@ -306,7 +313,7 @@ bool GrBatchAtlas::addToAtlas(AtlasID* id, GrBatchTarget* batchTarget,
plotIter.init(fPlotList, GrBatchPlotList::Iter::kTail_IterStart);
plot = plotIter.get();
SkASSERT(plot);
- if (batchTarget->isIssued(plot->lastUseToken())) {
+ if (batchTarget->isIssued(plot->lastRefToken())) {
this->processEviction(plot->id());
plot->resetRects();
SkDEBUGCODE(bool verify = )plot->addSubImage(width, height, image, loc, fBPP * width);
@@ -322,7 +329,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->lastUseToken() == batchTarget->currentToken()) {
+ if (plot->lastRefToken() == batchTarget->currentToken()) {
return false;
}
@@ -352,24 +359,14 @@ bool GrBatchAtlas::addToAtlas(AtlasID* id, GrBatchTarget* batchTarget,
}
bool GrBatchAtlas::hasID(AtlasID id) {
- int index = GetIndexFromID(id);
+ int index = this->getIndexFromID(id);
SkASSERT(index < fNumPlotsX * fNumPlotsY);
- return fPlotArray[index]->genID() == GetGenerationFromID(id);
+ return fPlotArray[index]->genID() == this->getGenerationFromID(id);
}
-void GrBatchAtlas::setLastUseToken(AtlasID id, BatchToken batchToken) {
+void GrBatchAtlas::setLastRefToken(AtlasID id, BatchToken batchToken) {
SkASSERT(this->hasID(id));
- int index = GetIndexFromID(id);
- SkASSERT(index < fNumPlotsX * fNumPlotsY);
+ int index = this->getIndexFromID(id);
this->makeMRU(fPlotArray[index]);
- fPlotArray[index]->setLastUseToken(batchToken);
-}
-
-void GrBatchAtlas::setLastUseTokenBulk(const BulkUseTokenUpdater& updater, BatchToken batchToken) {
- int plotsToUpdateCount = updater.fPlotsToUpdate.count();
- for (int i = 0; i < plotsToUpdateCount; i++) {
- BatchPlot* plot = fPlotArray[updater.fPlotsToUpdate[i]];
- this->makeMRU(plot);
- plot->setLastUseToken(batchToken);
- }
+ fPlotArray[index]->setLastRefToken(batchToken);
}
diff --git a/src/gpu/GrBatchAtlas.h b/src/gpu/GrBatchAtlas.h
index ddafcaeea7..cd8123f140 100644
--- a/src/gpu/GrBatchAtlas.h
+++ b/src/gpu/GrBatchAtlas.h
@@ -40,9 +40,6 @@ public:
// the containing GrPlot and absolute location in the backing texture.
// NULL is returned if the subimage cannot fit in the atlas.
// If provided, the image data will be written to the CPU-side backing bitmap.
- // NOTE: If the client intends to refer to the atlas, they should immediately call 'setUseToken'
- // with the currentToken from the batch target, otherwise the next call to addToAtlas might
- // cause an eviction
bool addToAtlas(AtlasID*, GrBatchTarget*, int width, int height, const void* image,
SkIPoint16* loc);
@@ -50,61 +47,19 @@ public:
uint64_t atlasGeneration() const { return fAtlasGeneration; }
bool hasID(AtlasID id);
-
- // To ensure the atlas does not evict a given entry, the client must set the last use token
- void setLastUseToken(AtlasID id, BatchToken batchToken);
+ void setLastRefToken(AtlasID id, BatchToken batchToken);
void registerEvictionCallback(EvictionFunc func, void* userData) {
EvictionData* data = fEvictionCallbacks.append();
data->fFunc = func;
data->fData = userData;
}
- /*
- * A class which can be handed back to GrBatchAtlas for updating in bulk last use tokens. The
- * current max number of plots the GrBatchAtlas can handle is 32, if in the future this is
- * insufficient then we can move to a 64 bit int
- */
- class BulkUseTokenUpdater {
- public:
- BulkUseTokenUpdater() : fPlotAlreadyUpdated(0) {}
- void add(AtlasID id) {
- int index = GrBatchAtlas::GetIndexFromID(id);
- if (!this->find(index)) {
- this->set(index);
- }
- }
-
- void reset() {
- fPlotsToUpdate.reset();
- fPlotAlreadyUpdated = 0;
- }
-
- private:
- bool find(int index) const {
- SkASSERT(index < kMaxPlots);
- return (fPlotAlreadyUpdated >> index) & 1;
- }
- void set(int index) {
- SkASSERT(!this->find(index));
- fPlotAlreadyUpdated = fPlotAlreadyUpdated | (1 << index);
- fPlotsToUpdate.push_back(index);
- }
-
- static const int kMaxPlots = 32;
- uint32_t fPlotAlreadyUpdated;
- SkSTArray<4, int, true> fPlotsToUpdate;
-
- friend class GrBatchAtlas;
- };
-
- void setLastUseTokenBulk(const BulkUseTokenUpdater& reffer, BatchToken);
-
private:
- static int GetIndexFromID(AtlasID id) {
+ int getIndexFromID(AtlasID id) {
return id & 0xffff;
}
- static int GetGenerationFromID(AtlasID id) {
+ int getGenerationFromID(AtlasID id) {
return (id >> 16) & 0xffff;
}
diff --git a/src/gpu/GrBatchFontCache.cpp b/src/gpu/GrBatchFontCache.cpp
index 3cd7a64a73..c429d539b8 100644
--- a/src/gpu/GrBatchFontCache.cpp
+++ b/src/gpu/GrBatchFontCache.cpp
@@ -128,18 +128,10 @@ bool GrBatchFontCache::hasGlyph(GrGlyph* glyph) {
return this->getAtlas(glyph->fMaskFormat)->hasID(glyph->fID);
}
-void GrBatchFontCache::addGlyphToBulkAndSetUseToken(GrBatchAtlas::BulkUseTokenUpdater* updater,
- GrGlyph* glyph,
- GrBatchAtlas::BatchToken token) {
+void GrBatchFontCache::setGlyphRefToken(GrGlyph* glyph, GrBatchAtlas::BatchToken batchToken) {
SkASSERT(glyph);
- updater->add(glyph->fID);
- this->getAtlas(glyph->fMaskFormat)->setLastUseToken(glyph->fID, token);
-}
-
-void GrBatchFontCache::setUseTokenBulk(const GrBatchAtlas::BulkUseTokenUpdater& updater,
- GrBatchAtlas::BatchToken token,
- GrMaskFormat format) {
- this->getAtlas(format)->setLastUseTokenBulk(updater, token);
+ SkASSERT(this->getAtlas(glyph->fMaskFormat)->hasID(glyph->fID));
+ this->getAtlas(glyph->fMaskFormat)->setLastRefToken(glyph->fID, batchToken);
}
bool GrBatchFontCache::addToAtlas(GrBatchTextStrike* strike, GrBatchAtlas::AtlasID* id,
diff --git a/src/gpu/GrBatchFontCache.h b/src/gpu/GrBatchFontCache.h
index d9352323a5..6300fbe212 100644
--- a/src/gpu/GrBatchFontCache.h
+++ b/src/gpu/GrBatchFontCache.h
@@ -97,15 +97,8 @@ public:
bool hasGlyph(GrGlyph* glyph);
// To ensure the GrBatchAtlas does not evict the Glyph Mask from its texture backing store,
- // the client must pass in the currentToken from the GrBatchTarget along with the GrGlyph.
- // A BulkUseTokenUpdater is used to manage bulk last use token updating in the Atlas.
- // For convenience, this function will also set the use token for the current glyph if required
- // NOTE: the bulk uploader is only valid if the subrun has a valid atlasGeneration
- void addGlyphToBulkAndSetUseToken(GrBatchAtlas::BulkUseTokenUpdater*, GrGlyph*,
- GrBatchAtlas::BatchToken);
-
- void setUseTokenBulk(const GrBatchAtlas::BulkUseTokenUpdater&, GrBatchAtlas::BatchToken,
- GrMaskFormat);
+ // the client must pass in the currentToken from the GrBatchTarget along with the GrGlyph
+ void setGlyphRefToken(GrGlyph*, GrBatchAtlas::BatchToken);
// add to texture atlas that matches this format
bool addToAtlas(GrBatchTextStrike*, GrBatchAtlas::AtlasID*, GrBatchTarget*,