Index: src/gpu/SkGr.cpp |
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp |
index 9cafbf69c0d030a281f4629c503cb52bcc61e0b1..18c54ef3c251175ba7a9769035b32259c65d770c 100644 |
--- a/src/gpu/SkGr.cpp |
+++ b/src/gpu/SkGr.cpp |
@@ -7,6 +7,9 @@ |
#include "SkGr.h" |
#include "SkConfig8888.h" |
+#include "SkMessageBus.h" |
+#include "SkPixelRef.h" |
+#include "GrResourceCache.h" |
/* Fill out buffer with the compressed format Ganesh expects from a colortable |
based bitmap. [palette (colortable) + indices]. |
@@ -86,6 +89,28 @@ static void generate_bitmap_texture_desc(const SkBitmap& bitmap, GrTextureDesc* |
desc->fSampleCnt = 0; |
} |
+namespace { |
+ |
+// When the SkPixelRef genID changes, invalidate a corresponding GrResource described by key. |
+class GrResourceInvalidator : public SkPixelRef::GenIDChangeListener { |
+public: |
+ explicit GrResourceInvalidator(GrResourceKey key) : fKey(key) {} |
+private: |
+ GrResourceKey fKey; |
+ |
+ virtual void onChange() SK_OVERRIDE { |
+ const GrResourceInvalidatedMessage message = { fKey }; |
+ SkMessageBus<GrResourceInvalidatedMessage>::Post(message); |
+ } |
+}; |
+ |
+} // namespace |
+ |
+static void add_genID_listener(GrResourceKey key, SkPixelRef* pixelRef) { |
+ SkASSERT(NULL != pixelRef); |
+ pixelRef->addGenIDChangeListener(SkNEW_ARGS(GrResourceInvalidator, (key))); |
+} |
+ |
static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx, |
bool cache, |
const GrTextureParams* params, |
@@ -112,7 +137,12 @@ static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx, |
if (cache) { |
GrCacheID cacheID; |
generate_bitmap_cache_id(origBitmap, &cacheID); |
- return ctx->createTexture(params, desc, cacheID, storage.get(), bitmap->width()); |
+ |
+ GrResourceKey key; |
+ GrTexture* result = ctx->createTexture(params, desc, cacheID, |
+ storage.get(), bitmap->width(), &key); |
+ add_genID_listener(key, origBitmap.pixelRef()); |
+ return result; |
} else { |
GrTexture* result = ctx->lockAndRefScratchTexture(desc, |
GrContext::kExact_ScratchTexMatch); |
@@ -137,8 +167,13 @@ static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx, |
// This texture is likely to be used again so leave it in the cache |
GrCacheID cacheID; |
generate_bitmap_cache_id(origBitmap, &cacheID); |
- return ctx->createTexture(params, desc, cacheID, bitmap->getPixels(), bitmap->rowBytes()); |
- } else { |
+ |
+ GrResourceKey key; |
+ GrTexture* result = ctx->createTexture(params, desc, cacheID, |
+ bitmap->getPixels(), bitmap->rowBytes(), &key); |
+ add_genID_listener(key, origBitmap.pixelRef()); |
+ return result; |
+ } else { |
// This texture is unlikely to be used again (in its present form) so |
// just use a scratch texture. This will remove the texture from the |
// cache so no one else can find it. Additionally, once unlocked, the |