Merge "Fix AssetAtlas usage in BitmapShaders" into mnc-dev
This commit is contained in:
@@ -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)++;
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user