Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/gpu/GrLayerCache.h

Issue 640773004: Add clip to layer cache (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: clean up Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/gpu/GrLayerCache.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 // get a ref to the GrTexture in which they reside. In both cases 'fRect' 44 // get a ref to the GrTexture in which they reside. In both cases 'fRect'
45 // contains the layer's extent in its texture. 45 // contains the layer's extent in its texture.
46 // Atlased layers also get a pointer to the plot in which they reside. 46 // Atlased layers also get a pointer to the plot in which they reside.
47 // For non-atlased layers, the lock field just corresponds to locking in 47 // For non-atlased layers, the lock field just corresponds to locking in
48 // the resource cache. For atlased layers, it implements an additional level 48 // the resource cache. For atlased layers, it implements an additional level
49 // of locking to allow atlased layers to be reused multiple times. 49 // of locking to allow atlased layers to be reused multiple times.
50 struct GrCachedLayer { 50 struct GrCachedLayer {
51 public: 51 public:
52 // For SkTDynamicHash 52 // For SkTDynamicHash
53 struct Key { 53 struct Key {
54 // TODO: the key needs to include the clip 54 Key(uint32_t pictureID, int start, const SkIRect& bounds, const SkMatrix & ctm)
55 Key(uint32_t pictureID, int start, const SkMatrix& ctm)
56 : fPictureID(pictureID) 55 : fPictureID(pictureID)
57 , fStart(start) { 56 , fStart(start)
58 fCTM[0] = ctm.getScaleX(); 57 , fBounds(bounds)
59 fCTM[1] = ctm.getSkewX(); 58 , fCTM(ctm) {
60 fCTM[2] = ctm.getSkewY(); 59 fCTM.getType(); // force initialization of type so hashes match
61 fCTM[3] = ctm.getScaleY(); 60
62 // Key needs to be tightly packed. 61 // Key needs to be tightly packed.
63 GR_STATIC_ASSERT(sizeof(Key) == sizeof(uint32_t) + // picture I D 62 GR_STATIC_ASSERT(sizeof(Key) == sizeof(uint32_t) + // picture I D
64 sizeof(int) + // start ind ex 63 sizeof(int) + // start ind ex
65 4 * sizeof(SkScalar)); // 2x2 from CTM 64 4 * sizeof(uint32_t) + // bounds
65 9 * sizeof(SkScalar) + sizeof(uint32 _t)); // matrix
66 } 66 }
67 67
68 bool operator==(const Key& other) const { 68 bool operator==(const Key& other) const {
69 return fPictureID == other.fPictureID && 69 return fPictureID == other.fPictureID &&
70 fStart == other.fStart && 70 fStart == other.fStart &&
71 0 == memcmp(fCTM, other.fCTM, sizeof(fCTM)); 71 fBounds == other.fBounds &&
72 fCTM.cheapEqualTo(other.fCTM);
72 } 73 }
73 74
74 uint32_t pictureID() const { return fPictureID; } 75 uint32_t pictureID() const { return fPictureID; }
75 int start() const { return fStart; } 76 int start() const { return fStart; }
77 const SkIRect& bound() const { return fBounds; }
78 const SkMatrix& ctm() const { return fCTM; }
76 79
77 private: 80 private:
78 // ID of the picture of which this layer is a part 81 // ID of the picture of which this layer is a part
79 const uint32_t fPictureID; 82 const uint32_t fPictureID;
80 // The the index of the saveLayer command in the picture 83 // The the index of the saveLayer command in the picture
81 const int fStart; 84 const int fStart;
85 // The bounds of the layer. The TL corner is its offset.
86 const SkIRect fBounds;
82 // The 2x2 portion of the CTM applied to this layer in the picture 87 // The 2x2 portion of the CTM applied to this layer in the picture
83 SkScalar fCTM[4]; 88 SkMatrix fCTM;
84 }; 89 };
85 90
86 static const Key& GetKey(const GrCachedLayer& layer) { return layer.fKey; } 91 static const Key& GetKey(const GrCachedLayer& layer) { return layer.fKey; }
87 static uint32_t Hash(const Key& key) { 92 static uint32_t Hash(const Key& key) {
88 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(&key), size of(Key)); 93 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(&key), size of(Key));
89 } 94 }
90 95
91 // GrCachedLayer proper 96 // GrCachedLayer proper
92 GrCachedLayer(uint32_t pictureID, int start, int stop, 97 GrCachedLayer(uint32_t pictureID, int start, int stop,
93 const SkMatrix& ctm, const SkPaint* paint) 98 const SkIRect& bounds, const SkMatrix& ctm,
94 : fKey(pictureID, start, ctm) 99 const SkPaint* paint)
100 : fKey(pictureID, start, bounds, ctm)
95 , fStop(stop) 101 , fStop(stop)
96 , fPaint(paint ? SkNEW_ARGS(SkPaint, (*paint)) : NULL) 102 , fPaint(paint ? SkNEW_ARGS(SkPaint, (*paint)) : NULL)
97 , fTexture(NULL) 103 , fTexture(NULL)
98 , fRect(GrIRect16::MakeEmpty()) 104 , fRect(GrIRect16::MakeEmpty())
99 , fPlot(NULL) 105 , fPlot(NULL)
100 , fUses(0) 106 , fUses(0)
101 , fLocked(false) { 107 , fLocked(false) {
102 SkASSERT(SK_InvalidGenID != pictureID && start >= 0 && stop >= 0); 108 SkASSERT(SK_InvalidGenID != pictureID && start >= 0 && stop >= 0);
103 } 109 }
104 110
105 ~GrCachedLayer() { 111 ~GrCachedLayer() {
106 SkSafeUnref(fTexture); 112 SkSafeUnref(fTexture);
107 SkDELETE(fPaint); 113 SkDELETE(fPaint);
108 } 114 }
109 115
110 uint32_t pictureID() const { return fKey.pictureID(); } 116 uint32_t pictureID() const { return fKey.pictureID(); }
111 int start() const { return fKey.start(); } 117 int start() const { return fKey.start(); }
118 const SkIRect& bound() const { return fKey.bound(); }
112 119
113 int stop() const { return fStop; } 120 int stop() const { return fStop; }
114 void setTexture(GrTexture* texture, const GrIRect16& rect) { 121 void setTexture(GrTexture* texture, const GrIRect16& rect) {
115 SkRefCnt_SafeAssign(fTexture, texture); 122 SkRefCnt_SafeAssign(fTexture, texture);
116 fRect = rect; 123 fRect = rect;
117 } 124 }
118 GrTexture* texture() { return fTexture; } 125 GrTexture* texture() { return fTexture; }
119 const SkPaint* paint() const { return fPaint; } 126 const SkPaint* paint() const { return fPaint; }
120 const GrIRect16& rect() const { return fRect; } 127 const GrIRect16& rect() const { return fRect; }
121 128
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 // classes. 193 // classes.
187 class GrLayerCache { 194 class GrLayerCache {
188 public: 195 public:
189 GrLayerCache(GrContext*); 196 GrLayerCache(GrContext*);
190 ~GrLayerCache(); 197 ~GrLayerCache();
191 198
192 // As a cache, the GrLayerCache can be ordered to free up all its cached 199 // As a cache, the GrLayerCache can be ordered to free up all its cached
193 // elements by the GrContext 200 // elements by the GrContext
194 void freeAll(); 201 void freeAll();
195 202
196 GrCachedLayer* findLayer(uint32_t pictureID, int start, const SkMatrix& ctm) ; 203 GrCachedLayer* findLayer(uint32_t pictureID, int start,
204 const SkIRect& bounds, const SkMatrix& ctm);
197 GrCachedLayer* findLayerOrCreate(uint32_t pictureID, 205 GrCachedLayer* findLayerOrCreate(uint32_t pictureID,
198 int start, int stop, 206 int start, int stop,
207 const SkIRect& bounds,
199 const SkMatrix& ctm, 208 const SkMatrix& ctm,
200 const SkPaint* paint); 209 const SkPaint* paint);
201 210
202 // Inform the cache that layer's cached image is now required. 211 // Inform the cache that layer's cached image is now required.
203 // Return true if the layer must be re-rendered. Return false if the 212 // Return true if the layer must be re-rendered. Return false if the
204 // layer was found in the cache and can be reused. 213 // layer was found in the cache and can be reused.
205 bool lock(GrCachedLayer* layer, const GrTextureDesc& desc, bool dontAtlas); 214 bool lock(GrCachedLayer* layer, const GrTextureDesc& desc, bool dontAtlas);
206 215
207 // addUse is just here to keep the API symmetric 216 // addUse is just here to keep the API symmetric
208 void addUse(GrCachedLayer* layer) { layer->addUse(); } 217 void addUse(GrCachedLayer* layer) { layer->addUse(); }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 // count for that plot. Similarly, once a rendering is complete all the 267 // count for that plot. Similarly, once a rendering is complete all the
259 // layers used in it decrement the lock count for the used plots. 268 // layers used in it decrement the lock count for the used plots.
260 // Plots with a 0 lock count are open for recycling/purging. 269 // Plots with a 0 lock count are open for recycling/purging.
261 int fPlotLocks[kNumPlotsX * kNumPlotsY]; 270 int fPlotLocks[kNumPlotsX * kNumPlotsY];
262 271
263 // Inform the cache that layer's cached image is not currently required 272 // Inform the cache that layer's cached image is not currently required
264 void unlock(GrCachedLayer* layer); 273 void unlock(GrCachedLayer* layer);
265 274
266 void initAtlas(); 275 void initAtlas();
267 GrCachedLayer* createLayer(uint32_t pictureID, int start, int stop, 276 GrCachedLayer* createLayer(uint32_t pictureID, int start, int stop,
268 const SkMatrix& ctm, const SkPaint* paint); 277 const SkIRect& bounds, const SkMatrix& ctm,
278 const SkPaint* paint);
269 279
270 void purgeAll(); 280 void purgeAll();
271 281
272 // Remove all the layers (and unlock any resources) associated with 'picture ID' 282 // Remove all the layers (and unlock any resources) associated with 'picture ID'
273 void purge(uint32_t pictureID); 283 void purge(uint32_t pictureID);
274 284
275 static bool PlausiblyAtlasable(int width, int height) { 285 static bool PlausiblyAtlasable(int width, int height) {
276 return width <= kPlotWidth && height <= kPlotHeight; 286 return width <= kPlotWidth && height <= kPlotHeight;
277 } 287 }
278 288
279 void purgePlot(GrPlot* plot); 289 void purgePlot(GrPlot* plot);
280 290
281 // Try to find a purgeable plot and clear it out. Return true if a plot 291 // Try to find a purgeable plot and clear it out. Return true if a plot
282 // was purged; false otherwise. 292 // was purged; false otherwise.
283 bool purgePlot(); 293 bool purgePlot();
284 294
285 void incPlotLock(int plotIdx) { ++fPlotLocks[plotIdx]; } 295 void incPlotLock(int plotIdx) { ++fPlotLocks[plotIdx]; }
286 void decPlotLock(int plotIdx) { 296 void decPlotLock(int plotIdx) {
287 SkASSERT(fPlotLocks[plotIdx] > 0); 297 SkASSERT(fPlotLocks[plotIdx] > 0);
288 --fPlotLocks[plotIdx]; 298 --fPlotLocks[plotIdx];
289 } 299 }
290 300
291 // for testing 301 // for testing
292 friend class TestingAccess; 302 friend class TestingAccess;
293 int numLayers() const { return fLayerHash.count(); } 303 int numLayers() const { return fLayerHash.count(); }
294 }; 304 };
295 305
296 #endif 306 #endif
OLDNEW
« no previous file with comments | « no previous file | src/gpu/GrLayerCache.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698