aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrLayerCache.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/GrLayerCache.h')
-rw-r--r--src/gpu/GrLayerCache.h38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/gpu/GrLayerCache.h b/src/gpu/GrLayerCache.h
index 914d0d5a58..a606681896 100644
--- a/src/gpu/GrLayerCache.h
+++ b/src/gpu/GrLayerCache.h
@@ -165,6 +165,7 @@ public:
, fPaint(paint ? new SkPaint(*paint) : nullptr)
, fFilter(nullptr)
, fTexture(nullptr)
+ , fAtlased(false)
, fRect(SkIRect::MakeEmpty())
, fPlot(nullptr)
, fUses(0)
@@ -180,7 +181,9 @@ public:
}
~GrCachedLayer() {
- SkSafeUnref(fTexture);
+ if (!fAtlased) {
+ SkSafeUnref(fTexture);
+ }
SkSafeUnref(fFilter);
delete fPaint;
}
@@ -195,8 +198,15 @@ public:
const SkIRect& srcIR() const { return fSrcIR; }
const SkIRect& dstIR() const { return fDstIR; }
int stop() const { return fStop; }
- void setTexture(GrTexture* texture, const SkIRect& rect) {
- SkRefCnt_SafeAssign(fTexture, texture);
+ void setTexture(GrTexture* texture, const SkIRect& rect, bool atlased) {
+ if (texture && !atlased) {
+ texture->ref(); // non-atlased textures carry a ref
+ }
+ if (fTexture && !fAtlased) {
+ fTexture->unref(); // non-atlased textures carry a ref
+ }
+ fTexture = texture;
+ fAtlased = atlased;
fRect = rect;
if (!fTexture) {
fLocked = false;
@@ -216,7 +226,7 @@ public:
}
GrLayerAtlas::Plot* plot() { return fPlot; }
- bool isAtlased() const { return SkToBool(fPlot); }
+ bool isAtlased() const { SkASSERT(fAtlased == SkToBool(fPlot)); return fAtlased; }
void setLocked(bool locked) { fLocked = locked; }
bool locked() const { return fLocked; }
@@ -252,6 +262,10 @@ private:
// ref on a GrTexture for non-atlased textures.
GrTexture* fTexture;
+ // true if this layer is in the atlas (and 'fTexture' doesn't carry a ref)
+ // and false if the layer is a free floater (and carries a ref).
+ bool fAtlased;
+
// For both atlased and non-atlased layers 'fRect' contains the bound of
// the layer in whichever texture it resides. It is empty when 'fTexture'
// is nullptr.
@@ -285,10 +299,9 @@ private:
// The GrLayerCache caches pre-computed saveLayers for later rendering.
// Non-atlased layers are stored in their own GrTexture while the atlased
// layers share a single GrTexture.
-// Unlike the GrFontCache, the GrTexture atlas only has one GrAtlas (for 8888)
-// and one GrPlot (for the entire atlas). As such, the GrLayerCache
-// roughly combines the functionality of the GrFontCache and GrTextStrike
-// classes.
+// Unlike the GrFontCache, the GrLayerCache only has one atlas (for 8888).
+// As such, the GrLayerCache roughly combines the functionality of the
+// GrFontCache and GrTextStrike classes.
class GrLayerCache {
public:
GrLayerCache(GrContext*);
@@ -346,6 +359,9 @@ public:
return width <= kPlotWidth && height <= kPlotHeight;
}
+ void begin();
+ void end();
+
#if !GR_CACHE_HOISTED_LAYERS
void purgeAll();
#endif
@@ -361,7 +377,7 @@ private:
static const int kPlotHeight = kAtlasTextureHeight / kNumPlotsY;
GrContext* fContext; // pointer back to owning context
- SkAutoTDelete<GrLayerAtlas> fAtlas; // TODO: could lazily allocate
+ SkAutoTDelete<GrLayerAtlas> fAtlas; // lazily allocated
// We cache this information here (rather then, say, on the owning picture)
// because we want to be able to clean it up as needed (e.g., if a picture
@@ -397,9 +413,9 @@ private:
void purgePlot(GrLayerAtlas::Plot* plot);
- // Try to find a purgeable plot and clear it out. Return true if a plot
+ // Either purge all un-locked plots or just one. Return true if >= 1 plot
// was purged; false otherwise.
- bool purgePlot();
+ bool purgePlots(bool justOne);
void incPlotLock(int plotIdx) { ++fPlotLocks[plotIdx]; }
void decPlotLock(int plotIdx) {