Loading libs/hwui/SkiaShader.cpp +7 −1 Original line number Diff line number Diff line Loading @@ -203,7 +203,13 @@ bool tryStoreBitmap(Caches& caches, const SkShader& shader, const Matrix4& model return false; } outData->bitmapTexture = caches.textureCache.get(&bitmap); /* * Bypass the AssetAtlas, since those textures: * 1) require UV mapping, which isn't implemented in matrix computation below * 2) can't handle REPEAT simply * 3) are safe to upload here (outside of sync stage), since they're static */ outData->bitmapTexture = caches.textureCache.getAndBypassAtlas(&bitmap); if (!outData->bitmapTexture) return false; outData->bitmapSampler = (*textureUnit)++; Loading libs/hwui/TextureCache.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -140,8 +140,8 @@ bool TextureCache::canMakeTextureFromBitmap(const SkBitmap* bitmap) { // Returns a prepared Texture* that either is already in the cache or can fit // in the cache (and is thus added to the cache) Texture* TextureCache::getCachedTexture(const SkBitmap* bitmap) { if (CC_LIKELY(mAssetAtlas)) { Texture* TextureCache::getCachedTexture(const SkBitmap* bitmap, AtlasUsageType atlasUsageType) { if (CC_LIKELY(mAssetAtlas != nullptr) && atlasUsageType == AtlasUsageType::Use) { AssetAtlas::Entry* entry = mAssetAtlas->getEntry(bitmap); if (CC_UNLIKELY(entry)) { return entry->texture; Loading Loading @@ -190,15 +190,15 @@ Texture* TextureCache::getCachedTexture(const SkBitmap* bitmap) { } bool TextureCache::prefetchAndMarkInUse(const SkBitmap* bitmap) { Texture* texture = getCachedTexture(bitmap); Texture* texture = getCachedTexture(bitmap, AtlasUsageType::Use); if (texture) { texture->isInUse = true; } return texture; } Texture* TextureCache::get(const SkBitmap* bitmap) { Texture* texture = getCachedTexture(bitmap); Texture* TextureCache::get(const SkBitmap* bitmap, AtlasUsageType atlasUsageType) { Texture* texture = getCachedTexture(bitmap, atlasUsageType); if (!texture) { if (!canMakeTextureFromBitmap(bitmap)) { Loading libs/hwui/TextureCache.h +19 −4 Original line number Diff line number Diff line Loading @@ -76,10 +76,20 @@ public: bool prefetchAndMarkInUse(const SkBitmap* bitmap); /** * Returns the texture associated with the specified bitmap. If the texture * cannot be found in the cache, a new texture is generated. * Returns the texture associated with the specified bitmap from either within the cache, or * the AssetAtlas. If the texture cannot be found in the cache, a new texture is generated. */ Texture* get(const SkBitmap* bitmap); Texture* get(const SkBitmap* bitmap) { return get(bitmap, AtlasUsageType::Use); } /** * Returns the texture associated with the specified bitmap. If the texture cannot be found in * the cache, a new texture is generated, even if it resides in the AssetAtlas. */ Texture* getAndBypassAtlas(const SkBitmap* bitmap) { return get(bitmap, AtlasUsageType::Bypass); } /** * Removes the texture associated with the specified pixelRef. This is meant Loading Loading @@ -123,10 +133,15 @@ public: void setAssetAtlas(AssetAtlas* assetAtlas); private: enum class AtlasUsageType { Use, Bypass, }; bool canMakeTextureFromBitmap(const SkBitmap* bitmap); Texture* getCachedTexture(const SkBitmap* bitmap); Texture* get(const SkBitmap* bitmap, AtlasUsageType atlasUsageType); Texture* getCachedTexture(const SkBitmap* bitmap, AtlasUsageType atlasUsageType); /** * Generates the texture from a bitmap into the specified texture structure. Loading Loading
libs/hwui/SkiaShader.cpp +7 −1 Original line number Diff line number Diff line Loading @@ -203,7 +203,13 @@ bool tryStoreBitmap(Caches& caches, const SkShader& shader, const Matrix4& model return false; } outData->bitmapTexture = caches.textureCache.get(&bitmap); /* * Bypass the AssetAtlas, since those textures: * 1) require UV mapping, which isn't implemented in matrix computation below * 2) can't handle REPEAT simply * 3) are safe to upload here (outside of sync stage), since they're static */ outData->bitmapTexture = caches.textureCache.getAndBypassAtlas(&bitmap); if (!outData->bitmapTexture) return false; outData->bitmapSampler = (*textureUnit)++; Loading
libs/hwui/TextureCache.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -140,8 +140,8 @@ bool TextureCache::canMakeTextureFromBitmap(const SkBitmap* bitmap) { // Returns a prepared Texture* that either is already in the cache or can fit // in the cache (and is thus added to the cache) Texture* TextureCache::getCachedTexture(const SkBitmap* bitmap) { if (CC_LIKELY(mAssetAtlas)) { Texture* TextureCache::getCachedTexture(const SkBitmap* bitmap, AtlasUsageType atlasUsageType) { if (CC_LIKELY(mAssetAtlas != nullptr) && atlasUsageType == AtlasUsageType::Use) { AssetAtlas::Entry* entry = mAssetAtlas->getEntry(bitmap); if (CC_UNLIKELY(entry)) { return entry->texture; Loading Loading @@ -190,15 +190,15 @@ Texture* TextureCache::getCachedTexture(const SkBitmap* bitmap) { } bool TextureCache::prefetchAndMarkInUse(const SkBitmap* bitmap) { Texture* texture = getCachedTexture(bitmap); Texture* texture = getCachedTexture(bitmap, AtlasUsageType::Use); if (texture) { texture->isInUse = true; } return texture; } Texture* TextureCache::get(const SkBitmap* bitmap) { Texture* texture = getCachedTexture(bitmap); Texture* TextureCache::get(const SkBitmap* bitmap, AtlasUsageType atlasUsageType) { Texture* texture = getCachedTexture(bitmap, atlasUsageType); if (!texture) { if (!canMakeTextureFromBitmap(bitmap)) { Loading
libs/hwui/TextureCache.h +19 −4 Original line number Diff line number Diff line Loading @@ -76,10 +76,20 @@ public: bool prefetchAndMarkInUse(const SkBitmap* bitmap); /** * Returns the texture associated with the specified bitmap. If the texture * cannot be found in the cache, a new texture is generated. * Returns the texture associated with the specified bitmap from either within the cache, or * the AssetAtlas. If the texture cannot be found in the cache, a new texture is generated. */ Texture* get(const SkBitmap* bitmap); Texture* get(const SkBitmap* bitmap) { return get(bitmap, AtlasUsageType::Use); } /** * Returns the texture associated with the specified bitmap. If the texture cannot be found in * the cache, a new texture is generated, even if it resides in the AssetAtlas. */ Texture* getAndBypassAtlas(const SkBitmap* bitmap) { return get(bitmap, AtlasUsageType::Bypass); } /** * Removes the texture associated with the specified pixelRef. This is meant Loading Loading @@ -123,10 +133,15 @@ public: void setAssetAtlas(AssetAtlas* assetAtlas); private: enum class AtlasUsageType { Use, Bypass, }; bool canMakeTextureFromBitmap(const SkBitmap* bitmap); Texture* getCachedTexture(const SkBitmap* bitmap); Texture* get(const SkBitmap* bitmap, AtlasUsageType atlasUsageType); Texture* getCachedTexture(const SkBitmap* bitmap, AtlasUsageType atlasUsageType); /** * Generates the texture from a bitmap into the specified texture structure. Loading