Merge "Fix AssetAtlas usage in BitmapShaders" into mnc-dev

This commit is contained in:
Chris Craik
2015-07-17 23:59:14 +00:00
committed by Android (Google) Code Review
3 changed files with 31 additions and 10 deletions

View File

@@ -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)++;

View File

@@ -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;
@@ -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)) {

View File

@@ -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
@@ -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.