Index: src/gpu/SkGr.cpp |
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp |
index 7fe8fe188bbbf17adf6ca7388835e34644c14c82..a726939788ba8db4b7b23183a7d65df38f7ff7aa 100644 |
--- a/src/gpu/SkGr.cpp |
+++ b/src/gpu/SkGr.cpp |
@@ -37,6 +37,33 @@ |
# include "etc1.h" |
#endif |
+bool GrTextureUsageSupported(const GrCaps& caps, int width, int height, SkImageUsageType usage) { |
+ if (caps.npotTextureTileSupport()) { |
+ return true; |
+ } |
robertphillips
2015/09/30 19:25:56
isPow2 ?
|
+ const bool is_pow2 = SkIsPow2(width) && SkIsPow2(height); |
+ return is_pow2 || kUntiled_SkImageUsageType == usage; |
+} |
+ |
+GrTextureParams GrImageUsageToTextureParams(SkImageUsageType usage) { |
bsalomon
2015/09/30 19:21:12
Maybe it's time to go the other way rather than ex
|
+ // Just need a params that will trigger the correct cache key / etc, since the usage doesn't |
+ // tell us the specifics about filter level or specific tiling. |
+ |
robertphillips
2015/09/30 19:25:56
Do we need some assert r.e. the number of image us
|
+ const SkShader::TileMode tiles[] = { |
+ SkShader::kClamp_TileMode, // kUntiled_SkImageUsageType |
+ SkShader::kRepeat_TileMode, // kTiled_Unfiltered_SkImageUsageType |
+ SkShader::kRepeat_TileMode, // kTiled_Filtered_SkImageUsageType |
+ }; |
+ |
+ const GrTextureParams::FilterMode filters[] = { |
+ GrTextureParams::kNone_FilterMode, // kUntiled_SkImageUsageType |
+ GrTextureParams::kNone_FilterMode, // kTiled_Unfiltered_SkImageUsageType |
+ GrTextureParams::kBilerp_FilterMode, // kTiled_Filtered_SkImageUsageType |
+ }; |
+ |
+ return GrTextureParams(tiles[usage], filters[usage]); |
+} |
+ |
/* Fill out buffer with the compressed format Ganesh expects from a colortable |
based bitmap. [palette (colortable) + indices]. |
@@ -133,8 +160,8 @@ static void get_stretch(const GrContext* ctx, int width, int height, |
} |
} |
-static bool make_stretched_key(const GrUniqueKey& origKey, const SkGrStretch& stretch, |
- GrUniqueKey* stretchedKey) { |
+bool GrMakeStretchedKey(const GrUniqueKey& origKey, const SkGrStretch& stretch, |
+ GrUniqueKey* stretchedKey) { |
if (origKey.isValid() && SkGrStretch::kNone_Type != stretch.fType) { |
uint32_t width = SkToU16(stretch.fWidth); |
uint32_t height = SkToU16(stretch.fHeight); |
@@ -169,12 +196,7 @@ void GrMakeKeyFromImageID(GrUniqueKey* key, uint32_t imageID, const SkIRect& sub |
SkGrStretch::kBilerp_Type, // kTiled_Filtered_SkImageUsageType |
}; |
- const bool isPow2 = SkIsPow2(subset.width()) && SkIsPow2(subset.height()); |
- const bool needToStretch = !isPow2 && |
- usage != kUntiled_SkImageUsageType && |
- !caps.npotTextureTileSupport(); |
- |
- if (needToStretch) { |
+ if (!GrTextureUsageSupported(caps, subset.width(), subset.height(), usage)) { |
GrUniqueKey tmpKey; |
make_unstretched_key(&tmpKey, imageID, subset); |
@@ -182,7 +204,7 @@ void GrMakeKeyFromImageID(GrUniqueKey* key, uint32_t imageID, const SkIRect& sub |
stretch.fType = stretches[usage]; |
stretch.fWidth = SkNextPow2(subset.width()); |
stretch.fHeight = SkNextPow2(subset.height()); |
- if (!make_stretched_key(tmpKey, stretch, key)) { |
+ if (!GrMakeStretchedKey(tmpKey, stretch, key)) { |
goto UNSTRETCHED; |
} |
} else { |
@@ -195,7 +217,7 @@ static void make_image_keys(uint32_t imageID, const SkIRect& subset, const SkGrS |
GrUniqueKey* key, GrUniqueKey* stretchedKey) { |
make_unstretched_key(key, imageID, subset); |
if (SkGrStretch::kNone_Type != stretch.fType) { |
- make_stretched_key(*key, stretch, stretchedKey); |
+ GrMakeStretchedKey(*key, stretch, stretchedKey); |
} |
} |
@@ -510,7 +532,7 @@ bool GrIsImageInCache(const GrContext* ctx, uint32_t imageID, const SkIRect& sub |
return false; |
} |
GrUniqueKey stretchedKey; |
- make_stretched_key(key, stretch, &stretchedKey); |
+ GrMakeStretchedKey(key, stretch, &stretchedKey); |
return ctx->textureProvider()->existsTextureWithUniqueKey(stretchedKey); |
} |
@@ -551,7 +573,7 @@ protected: |
GrUniqueKey unstretchedKey; |
make_unstretched_key(&unstretchedKey, fBitmap.getGenerationID(), fBitmap.getSubset()); |
- return make_stretched_key(unstretchedKey, stretch, stretchedKey); |
+ return GrMakeStretchedKey(unstretchedKey, stretch, stretchedKey); |
} |
void onNotifyStretchCached(const GrUniqueKey& stretchedKey) override { |
@@ -579,22 +601,7 @@ GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, const SkBitmap& bitmap, |
GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, |
const SkBitmap& bitmap, |
SkImageUsageType usage) { |
- // Just need a params that will trigger the correct cache key / etc, since the usage doesn't |
- // tell us the specifics about filter level or specific tiling. |
- |
- const SkShader::TileMode tiles[] = { |
- SkShader::kClamp_TileMode, // kUntiled_SkImageUsageType |
- SkShader::kRepeat_TileMode, // kTiled_Unfiltered_SkImageUsageType |
- SkShader::kRepeat_TileMode, // kTiled_Filtered_SkImageUsageType |
- }; |
- |
- const GrTextureParams::FilterMode filters[] = { |
- GrTextureParams::kNone_FilterMode, // kUntiled_SkImageUsageType |
- GrTextureParams::kNone_FilterMode, // kTiled_Unfiltered_SkImageUsageType |
- GrTextureParams::kBilerp_FilterMode, // kTiled_Filtered_SkImageUsageType |
- }; |
- |
- GrTextureParams params(tiles[usage], filters[usage]); |
+ GrTextureParams params = GrImageUsageToTextureParams(usage); |
return GrRefCachedBitmapTexture(ctx, bitmap, ¶ms); |
} |
@@ -908,6 +915,11 @@ GrTextureParams::FilterMode GrSkFilterQualityToGrFilterMode(SkFilterQuality pain |
//////////////////////////////////////////////////////////////////////////////////////////////// |
+GrTexture* GrTextureMaker::refCachedTexture(GrContext* ctx, SkImageUsageType usage) { |
+ GrTextureParams params = GrImageUsageToTextureParams(usage); |
+ return this->refCachedTexture(ctx, ¶ms); |
+} |
+ |
GrTexture* GrTextureMaker::refCachedTexture(GrContext* ctx, const GrTextureParams* params) { |
SkGrStretch stretch; |
get_stretch(ctx, this->width(), this->height(), params, &stretch); |