diff options
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/hwui/Texture.h | 4 | ||||
| -rw-r--r-- | libs/hwui/TextureCache.cpp | 15 | ||||
| -rw-r--r-- | libs/hwui/TextureCache.h | 2 |
3 files changed, 15 insertions, 6 deletions
diff --git a/libs/hwui/Texture.h b/libs/hwui/Texture.h index b3b17ca..6802c59 100644 --- a/libs/hwui/Texture.h +++ b/libs/hwui/Texture.h @@ -31,6 +31,10 @@ struct Texture { */ GLuint id; /** + * Generation of the backing bitmap, + */ + uint32_t generation; + /** * Indicates whether the texture requires blending. */ bool blend; diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp index fd12a3c..c3b1463 100644 --- a/libs/hwui/TextureCache.cpp +++ b/libs/hwui/TextureCache.cpp @@ -43,6 +43,8 @@ Texture* TextureCache::get(SkBitmap* bitmap) { texture = new Texture; generateTexture(bitmap, texture); mCache.put(bitmap, texture); + } else if (bitmap->getGenerationID() != texture->generation) { + generateTexture(bitmap, texture, true); } return texture; } @@ -55,11 +57,14 @@ void TextureCache::clear() { mCache.clear(); } -void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture) { - texture->width = bitmap->width(); - texture->height = bitmap->height(); +void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture, bool regenerate) { + if (!regenerate) { + texture->width = bitmap->width(); + texture->height = bitmap->height(); + + glGenTextures(1, &texture->id); + } - glGenTextures(1, &texture->id); glBindTexture(GL_TEXTURE_2D, texture->id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); @@ -80,7 +85,7 @@ void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture) { break; } - return texture; + glBindTexture(GL_TEXTURE_2D, 0); } }; // namespace uirenderer diff --git a/libs/hwui/TextureCache.h b/libs/hwui/TextureCache.h index 7f95366..bf68061 100644 --- a/libs/hwui/TextureCache.h +++ b/libs/hwui/TextureCache.h @@ -37,7 +37,7 @@ public: void clear(); private: - void generateTexture(SkBitmap* bitmap, Texture* texture); + void generateTexture(SkBitmap* bitmap, Texture* texture, bool regenerate = false); GenerationCache<SkBitmap, Texture> mCache; }; // class TextureCache |
