Index: src/gpu/GrLayerCache.h |
diff --git a/src/gpu/GrLayerCache.h b/src/gpu/GrLayerCache.h |
index 566a738279bc5f4d6e52cb6c9e270d01a16f8038..347fa232ab6d7be50363e8fc177802d57067da41 100644 |
--- a/src/gpu/GrLayerCache.h |
+++ b/src/gpu/GrLayerCache.h |
@@ -16,20 +16,29 @@ |
#include "GrPictureUtils.h" |
#include "GrRect.h" |
-class GrGpu; |
class SkPicture; |
+// GrPictureInfo stores the atlas plots used by a single picture. A single |
+// plot may be used to store layers from multiple pictures. |
+struct GrPictureInfo { |
+public: |
+ GrPictureInfo(uint32_t pictureID) : fPictureID(pictureID) { } |
+ |
+ uint32_t fPictureID; |
+ |
+ GrAtlas::ClientPlotUsage fPlotUsage; |
+}; |
+ |
// GrCachedLayer encapsulates the caching information for a single saveLayer. |
// |
// Atlased layers get a ref to the backing GrTexture while non-atlased layers |
// get a ref to the GrTexture in which they reside. In both cases 'fRect' |
// contains the layer's extent in its texture. |
-// |
-// TODO: can we easily reuse the empty space in the non-atlased GrTexture's? |
+// Atlased layers also get a pointer to the plot in which they reside. |
struct GrCachedLayer { |
public: |
GrCachedLayer(uint32_t pictureID, int layerID) |
- : fAtlased(false) { |
+ : fPlot(NULL) { |
fPictureID = pictureID; |
fLayerID = layerID; |
fTexture = NULL; |
@@ -51,10 +60,15 @@ public: |
GrTexture* texture() { return fTexture; } |
const GrIRect16& rect() const { return fRect; } |
- void setAtlased(bool atlased) { fAtlased = atlased; } |
- bool isAtlased() const { return fAtlased; } |
+ void setPlot(GrPlot* plot) { |
+ SkASSERT(NULL == fPlot); |
+ fPlot = plot; |
+ } |
+ GrPlot* plot() { return fPlot; } |
+ |
+ bool isAtlased() const { return NULL != fPlot; } |
- SkDEBUGCODE(void validate(GrTexture* backingTexture) const;) |
+ SkDEBUGCODE(void validate(const GrTexture* backingTexture) const;) |
private: |
// ID of the picture of which this layer is a part |
@@ -69,13 +83,14 @@ private: |
// non-NULL, that means that the texture is locked in the texture cache. |
GrTexture* fTexture; |
- // True if this layer is in an atlas; false otherwise. |
- 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 NULL. |
GrIRect16 fRect; |
+ |
+ // For atlased layers, fPlot stores the atlas plot in which the layer rests. |
+ // It is always NULL for non-atlased layers. |
+ GrPlot* fPlot; |
}; |
// The GrLayerCache caches pre-computed saveLayers for later rendering. |
@@ -112,9 +127,19 @@ public: |
SkDEBUGCODE(void validate() const;) |
private: |
+ static const int kNumPlotsX = 2; |
+ static const int kNumPlotsY = 2; |
+ |
GrContext* fContext; // pointer back to owning context |
SkAutoTDelete<GrAtlas> fAtlas; // TODO: could lazily allocate |
- GrAtlas::ClientPlotUsage fPlotUsage; |
+ |
+ // 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 |
+ // is leaked and never cleans itself up we still want to be able to |
+ // remove the GrPictureInfo once its layers are purged from all the atlas |
+ // plots). |
+ class PictureKey; |
+ GrTHashTable<GrPictureInfo, PictureKey, 7> fPictureHash; |
class PictureLayerKey; |
GrTHashTable<GrCachedLayer, PictureLayerKey, 7> fLayerHash; |