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

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

Issue 408923002: Add auto purging for SkPicture-related Ganesh resources (esp. layers) (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Move MessageBus Inbox from GrContext to GrLayerCache Created 6 years, 5 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
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
11 #define USE_ATLAS 0 11 #define USE_ATLAS 0
12 12
13 #include "GrAllocPool.h" 13 #include "GrAllocPool.h"
14 #include "GrAtlas.h" 14 #include "GrAtlas.h"
15 #include "GrPictureUtils.h" 15 #include "GrPictureUtils.h"
16 #include "GrRect.h" 16 #include "GrRect.h"
17 #include "SkChecksum.h" 17 #include "SkChecksum.h"
18 #include "SkGpuDevice.h"
18 #include "SkTDynamicHash.h" 19 #include "SkTDynamicHash.h"
20 #include "SkMessageBus.h"
19 21
20 class SkPicture; 22 class SkPicture;
21 23
24 // The layer cache listens for these messages to purge picture-related resources .
25 struct GrPictureDeletedMessage {
26 uint32_t pictureID;
27 };
28
29 class GrPictureDeletionListener : public SkPicture::DeletionListener {
30 virtual void onDeletion(uint32_t pictureID) SK_OVERRIDE{
31 const GrPictureDeletedMessage message = { pictureID };
32 SkMessageBus<GrPictureDeletedMessage>::Post(message);
33 }
34 };
35
22 // GrPictureInfo stores the atlas plots used by a single picture. A single 36 // GrPictureInfo stores the atlas plots used by a single picture. A single
23 // plot may be used to store layers from multiple pictures. 37 // plot may be used to store layers from multiple pictures.
24 struct GrPictureInfo { 38 struct GrPictureInfo {
25 public: 39 public:
26 // for SkTDynamicHash - just use the pictureID as the hash key 40 // for SkTDynamicHash - just use the pictureID as the hash key
27 static const uint32_t& GetKey(const GrPictureInfo& pictInfo) { return pictIn fo.fPictureID; } 41 static const uint32_t& GetKey(const GrPictureInfo& pictInfo) { return pictIn fo.fPictureID; }
28 static uint32_t Hash(const uint32_t& key) { return SkChecksum::Mix(key); } 42 static uint32_t Hash(const uint32_t& key) { return SkChecksum::Mix(key); }
29 43
30 // GrPictureInfo proper 44 // GrPictureInfo proper
31 GrPictureInfo(uint32_t pictureID) : fPictureID(pictureID) { } 45 GrPictureInfo(uint32_t pictureID) : fPictureID(pictureID) { }
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 153
140 // Inform the cache that layer's cached image is now required. Return true 154 // Inform the cache that layer's cached image is now required. Return true
141 // if it was found in the ResourceCache and doesn't need to be regenerated. 155 // if it was found in the ResourceCache and doesn't need to be regenerated.
142 // If false is returned the caller should (re)render the layer into the 156 // If false is returned the caller should (re)render the layer into the
143 // newly acquired texture. 157 // newly acquired texture.
144 bool lock(GrCachedLayer* layer, const GrTextureDesc& desc); 158 bool lock(GrCachedLayer* layer, const GrTextureDesc& desc);
145 159
146 // Inform the cache that layer's cached image is not currently required 160 // Inform the cache that layer's cached image is not currently required
147 void unlock(GrCachedLayer* layer); 161 void unlock(GrCachedLayer* layer);
148 162
149 // Remove all the layers (and unlock any resources) associated with 'picture ' 163 // Cleanup after any SkPicture deletions
150 void purge(const SkPicture* picture); 164 void processDeletedPictures();
151 165
152 SkDEBUGCODE(void validate() const;) 166 SkDEBUGCODE(void validate() const;)
153 167
154 private: 168 private:
155 static const int kNumPlotsX = 2; 169 static const int kNumPlotsX = 2;
156 static const int kNumPlotsY = 2; 170 static const int kNumPlotsY = 2;
157 171
158 GrContext* fContext; // pointer back to owning context 172 GrContext* fContext; // pointer back to owning context
159 SkAutoTDelete<GrAtlas> fAtlas; // TODO: could lazily allocate 173 SkAutoTDelete<GrAtlas> fAtlas; // TODO: could lazily allocate
160 174
161 // We cache this information here (rather then, say, on the owning picture) 175 // We cache this information here (rather then, say, on the owning picture)
162 // because we want to be able to clean it up as needed (e.g., if a picture 176 // because we want to be able to clean it up as needed (e.g., if a picture
163 // is leaked and never cleans itself up we still want to be able to 177 // is leaked and never cleans itself up we still want to be able to
164 // remove the GrPictureInfo once its layers are purged from all the atlas 178 // remove the GrPictureInfo once its layers are purged from all the atlas
165 // plots). 179 // plots).
166 SkTDynamicHash<GrPictureInfo, uint32_t> fPictureHash; 180 SkTDynamicHash<GrPictureInfo, uint32_t> fPictureHash;
167 181
168 SkTDynamicHash<GrCachedLayer, GrCachedLayer::Key> fLayerHash; 182 SkTDynamicHash<GrCachedLayer, GrCachedLayer::Key> fLayerHash;
169 183
184 SkMessageBus<GrPictureDeletedMessage>::Inbox fPictDeletionInbox;
185
170 void initAtlas(); 186 void initAtlas();
171 GrCachedLayer* createLayer(const SkPicture* picture, int layerID); 187 GrCachedLayer* createLayer(const SkPicture* picture, int layerID);
172 188
189 // Remove all the layers (and unlock any resources) associated with 'picture ID'
190 void purge(uint32_t pictureID);
191
173 // for testing 192 // for testing
174 friend class GetNumLayers; 193 friend class TestingAccess;
175 int numLayers() const { return fLayerHash.count(); } 194 int numLayers() const { return fLayerHash.count(); }
176 }; 195 };
177 196
178 #endif 197 #endif
OLDNEW
« include/core/SkPicture.h ('K') | « src/core/SkPicture.cpp ('k') | src/gpu/GrLayerCache.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698