| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef GrLayerCache_DEFINED | 8 #ifndef GrLayerCache_DEFINED |
| 9 #define GrLayerCache_DEFINED | 9 #define GrLayerCache_DEFINED |
| 10 | 10 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 SkMatrix fCTM; | 91 SkMatrix fCTM; |
| 92 }; | 92 }; |
| 93 | 93 |
| 94 static const Key& GetKey(const GrCachedLayer& layer) { return layer.fKey; } | 94 static const Key& GetKey(const GrCachedLayer& layer) { return layer.fKey; } |
| 95 static uint32_t Hash(const Key& key) { | 95 static uint32_t Hash(const Key& key) { |
| 96 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(&key), size
of(Key)); | 96 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(&key), size
of(Key)); |
| 97 } | 97 } |
| 98 | 98 |
| 99 // GrCachedLayer proper | 99 // GrCachedLayer proper |
| 100 GrCachedLayer(uint32_t pictureID, int start, int stop, | 100 GrCachedLayer(uint32_t pictureID, int start, int stop, |
| 101 const SkIPoint& offset, const SkMatrix& ctm) | 101 const SkIPoint& offset, const SkMatrix& ctm, |
| 102 const SkPaint* paint) |
| 102 : fKey(pictureID, start, stop, offset, ctm) | 103 : fKey(pictureID, start, stop, offset, ctm) |
| 104 , fPaint(paint) |
| 103 , fTexture(NULL) | 105 , fTexture(NULL) |
| 104 , fRect(GrIRect16::MakeEmpty()) | 106 , fRect(GrIRect16::MakeEmpty()) |
| 105 , fPlot(NULL) | 107 , fPlot(NULL) |
| 106 , fLocked(false) { | 108 , fLocked(false) { |
| 107 SkASSERT(SK_InvalidGenID != pictureID && start >= 0 && stop >= 0); | 109 SkASSERT(SK_InvalidGenID != pictureID && start >= 0 && stop >= 0); |
| 108 } | 110 } |
| 109 | 111 |
| 110 ~GrCachedLayer() { | 112 ~GrCachedLayer() { |
| 111 SkSafeUnref(fTexture); | 113 SkSafeUnref(fTexture); |
| 112 } | 114 } |
| 113 | 115 |
| 114 uint32_t pictureID() const { return fKey.pictureID(); } | 116 uint32_t pictureID() const { return fKey.pictureID(); } |
| 115 int start() const { return fKey.start(); } | 117 int start() const { return fKey.start(); } |
| 116 int stop() const { return fKey.stop(); } | 118 int stop() const { return fKey.stop(); } |
| 117 const SkIPoint& offset() const { return fKey.offset(); } | 119 const SkIPoint& offset() const { return fKey.offset(); } |
| 118 const SkMatrix& ctm() const { return fKey.ctm(); } | 120 const SkMatrix& ctm() const { return fKey.ctm(); } |
| 119 | 121 |
| 120 void setTexture(GrTexture* texture, const GrIRect16& rect) { | 122 void setTexture(GrTexture* texture, const GrIRect16& rect) { |
| 121 SkRefCnt_SafeAssign(fTexture, texture); | 123 SkRefCnt_SafeAssign(fTexture, texture); |
| 122 fRect = rect; | 124 fRect = rect; |
| 123 } | 125 } |
| 124 GrTexture* texture() { return fTexture; } | 126 GrTexture* texture() { return fTexture; } |
| 127 const SkPaint* paint() const { return fPaint; } |
| 125 const GrIRect16& rect() const { return fRect; } | 128 const GrIRect16& rect() const { return fRect; } |
| 126 | 129 |
| 127 void setPlot(GrPlot* plot) { | 130 void setPlot(GrPlot* plot) { |
| 128 SkASSERT(NULL == plot || NULL == fPlot); | 131 SkASSERT(NULL == plot || NULL == fPlot); |
| 129 fPlot = plot; | 132 fPlot = plot; |
| 130 } | 133 } |
| 131 GrPlot* plot() { return fPlot; } | 134 GrPlot* plot() { return fPlot; } |
| 132 | 135 |
| 133 bool isAtlased() const { return SkToBool(fPlot); } | 136 bool isAtlased() const { return SkToBool(fPlot); } |
| 134 | 137 |
| 135 void setLocked(bool locked) { fLocked = locked; } | 138 void setLocked(bool locked) { fLocked = locked; } |
| 136 bool locked() const { return fLocked; } | 139 bool locked() const { return fLocked; } |
| 137 | 140 |
| 138 SkDEBUGCODE(const GrPlot* plot() const { return fPlot; }) | 141 SkDEBUGCODE(const GrPlot* plot() const { return fPlot; }) |
| 139 SkDEBUGCODE(void validate(const GrTexture* backingTexture) const;) | 142 SkDEBUGCODE(void validate(const GrTexture* backingTexture) const;) |
| 140 | 143 |
| 141 private: | 144 private: |
| 142 const Key fKey; | 145 const Key fKey; |
| 143 | 146 |
| 147 // The paint used when dropping the layer down into the owning canvas. |
| 148 // Can be NULL. |
| 149 const SkPaint* fPaint; |
| 150 |
| 144 // fTexture is a ref on the atlasing texture for atlased layers and a | 151 // fTexture is a ref on the atlasing texture for atlased layers and a |
| 145 // ref on a GrTexture for non-atlased textures. | 152 // ref on a GrTexture for non-atlased textures. |
| 146 GrTexture* fTexture; | 153 GrTexture* fTexture; |
| 147 | 154 |
| 148 // For both atlased and non-atlased layers 'fRect' contains the bound of | 155 // For both atlased and non-atlased layers 'fRect' contains the bound of |
| 149 // the layer in whichever texture it resides. It is empty when 'fTexture' | 156 // the layer in whichever texture it resides. It is empty when 'fTexture' |
| 150 // is NULL. | 157 // is NULL. |
| 151 GrIRect16 fRect; | 158 GrIRect16 fRect; |
| 152 | 159 |
| 153 // For atlased layers, fPlot stores the atlas plot in which the layer rests. | 160 // For atlased layers, fPlot stores the atlas plot in which the layer rests. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 177 | 184 |
| 178 // As a cache, the GrLayerCache can be ordered to free up all its cached | 185 // As a cache, the GrLayerCache can be ordered to free up all its cached |
| 179 // elements by the GrContext | 186 // elements by the GrContext |
| 180 void freeAll(); | 187 void freeAll(); |
| 181 | 188 |
| 182 GrCachedLayer* findLayer(uint32_t pictureID, int start, int stop, | 189 GrCachedLayer* findLayer(uint32_t pictureID, int start, int stop, |
| 183 const SkIPoint& offset, const SkMatrix& ctm); | 190 const SkIPoint& offset, const SkMatrix& ctm); |
| 184 GrCachedLayer* findLayerOrCreate(uint32_t pictureID, | 191 GrCachedLayer* findLayerOrCreate(uint32_t pictureID, |
| 185 int start, int stop, | 192 int start, int stop, |
| 186 const SkIPoint& offset, | 193 const SkIPoint& offset, |
| 187 const SkMatrix& ctm); | 194 const SkMatrix& ctm, |
| 195 const SkPaint* paint); |
| 188 | 196 |
| 189 // Inform the cache that layer's cached image is now required. | 197 // Inform the cache that layer's cached image is now required. |
| 190 // Return true if the layer must be re-rendered. Return false if the | 198 // Return true if the layer must be re-rendered. Return false if the |
| 191 // layer was found in the cache and can be reused. | 199 // layer was found in the cache and can be reused. |
| 192 bool lock(GrCachedLayer* layer, const GrTextureDesc& desc, bool dontAtlas); | 200 bool lock(GrCachedLayer* layer, const GrTextureDesc& desc, bool dontAtlas); |
| 193 | 201 |
| 194 // Inform the cache that layer's cached image is not currently required | 202 // Inform the cache that layer's cached image is not currently required |
| 195 void unlock(GrCachedLayer* layer); | 203 void unlock(GrCachedLayer* layer); |
| 196 | 204 |
| 197 // Setup to be notified when 'picture' is deleted | 205 // Setup to be notified when 'picture' is deleted |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 // This implements a plot-centric locking mechanism (since the atlas | 239 // This implements a plot-centric locking mechanism (since the atlas |
| 232 // backing texture is always locked). Each layer that is locked (i.e., | 240 // backing texture is always locked). Each layer that is locked (i.e., |
| 233 // needed for the current rendering) in a plot increments the plot lock | 241 // needed for the current rendering) in a plot increments the plot lock |
| 234 // count for that plot. Similarly, once a rendering is complete all the | 242 // count for that plot. Similarly, once a rendering is complete all the |
| 235 // layers used in it decrement the lock count for the used plots. | 243 // layers used in it decrement the lock count for the used plots. |
| 236 // Plots with a 0 lock count are open for recycling/purging. | 244 // Plots with a 0 lock count are open for recycling/purging. |
| 237 int fPlotLocks[kNumPlotsX * kNumPlotsY]; | 245 int fPlotLocks[kNumPlotsX * kNumPlotsY]; |
| 238 | 246 |
| 239 void initAtlas(); | 247 void initAtlas(); |
| 240 GrCachedLayer* createLayer(uint32_t pictureID, int start, int stop, | 248 GrCachedLayer* createLayer(uint32_t pictureID, int start, int stop, |
| 241 const SkIPoint& offset, const SkMatrix& ctm); | 249 const SkIPoint& offset, const SkMatrix& ctm, |
| 250 const SkPaint* paint); |
| 242 | 251 |
| 243 void purgeAll(); | 252 void purgeAll(); |
| 244 | 253 |
| 245 // Remove all the layers (and unlock any resources) associated with 'picture
ID' | 254 // Remove all the layers (and unlock any resources) associated with 'picture
ID' |
| 246 void purge(uint32_t pictureID); | 255 void purge(uint32_t pictureID); |
| 247 | 256 |
| 248 static bool PlausiblyAtlasable(int width, int height) { | 257 static bool PlausiblyAtlasable(int width, int height) { |
| 249 return width <= kPlotWidth && height <= kPlotHeight; | 258 return width <= kPlotWidth && height <= kPlotHeight; |
| 250 } | 259 } |
| 251 | 260 |
| 252 void purgePlot(GrPlot* plot); | 261 void purgePlot(GrPlot* plot); |
| 253 | 262 |
| 254 // Try to find a purgeable plot and clear it out. Return true if a plot | 263 // Try to find a purgeable plot and clear it out. Return true if a plot |
| 255 // was purged; false otherwise. | 264 // was purged; false otherwise. |
| 256 bool purgePlot(); | 265 bool purgePlot(); |
| 257 | 266 |
| 258 // for testing | 267 // for testing |
| 259 friend class TestingAccess; | 268 friend class TestingAccess; |
| 260 int numLayers() const { return fLayerHash.count(); } | 269 int numLayers() const { return fLayerHash.count(); } |
| 261 }; | 270 }; |
| 262 | 271 |
| 263 #endif | 272 #endif |
| OLD | NEW |