| Index: src/gpu/SkGr.cpp
|
| diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
|
| index 53f640b6013f87c84d8f6286ec69beb7e96cb4dc..6c1ec4bed00157c46bc554ccf0017efbd874f5bd 100644
|
| --- a/src/gpu/SkGr.cpp
|
| +++ b/src/gpu/SkGr.cpp
|
| @@ -143,7 +143,7 @@ static bool make_stretched_key(const GrUniqueKey& origKey, const Stretch& stretc
|
| uint32_t width = SkToU16(stretch.fWidth);
|
| uint32_t height = SkToU16(stretch.fHeight);
|
| static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
|
| - GrUniqueKey::Builder builder(stretchedKey, origKey, kDomain, 3);
|
| + GrUniqueKey::Builder builder(stretchedKey, origKey, kDomain, 2);
|
| builder[0] = stretch.fType;
|
| builder[1] = width | (height << 16);
|
| builder.finish();
|
| @@ -153,22 +153,55 @@ static bool make_stretched_key(const GrUniqueKey& origKey, const Stretch& stretc
|
| return false;
|
| }
|
|
|
| -static void make_unstretched_key(const SkBitmap& bitmap, GrUniqueKey* key) {
|
| - // Our id includes the offset, width, and height so that bitmaps created by extractSubset()
|
| - // are unique.
|
| - uint32_t genID = bitmap.getGenerationID();
|
| - SkIPoint origin = bitmap.pixelRefOrigin();
|
| - uint32_t width = SkToU16(bitmap.width());
|
| - uint32_t height = SkToU16(bitmap.height());
|
| +static void make_unstretched_key(GrUniqueKey* key, uint32_t imageID,
|
| + U16CPU width, U16CPU height, SkIPoint origin) {
|
| + SkASSERT((uint16_t)width == width);
|
| + SkASSERT((uint16_t)height == height);
|
|
|
| static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
|
| GrUniqueKey::Builder builder(key, kDomain, 4);
|
| - builder[0] = genID;
|
| + builder[0] = imageID;
|
| builder[1] = origin.fX;
|
| builder[2] = origin.fY;
|
| builder[3] = width | (height << 16);
|
| }
|
|
|
| +void GrMakeKeyFromImageID(GrUniqueKey* key, uint32_t imageID,
|
| + U16CPU width, U16CPU height, SkIPoint origin,
|
| + const GrCaps& caps, SkImageUsageType usage) {
|
| + const Stretch::Type stretches[] = {
|
| + Stretch::kNone_Type, // kUntiled_SkImageUsageType
|
| + Stretch::kNearest_Type, // kTiled_Unfiltered_SkImageUsageType
|
| + Stretch::kBilerp_Type, // kTiled_Filtered_SkImageUsageType
|
| + };
|
| +
|
| + const bool isPow2 = SkIsPow2(width) && SkIsPow2(height);
|
| + const bool needToStretch = !isPow2 &&
|
| + usage != kUntiled_SkImageUsageType &&
|
| + !caps.npotTextureTileSupport();
|
| +
|
| + if (needToStretch) {
|
| + GrUniqueKey tmpKey;
|
| + make_unstretched_key(&tmpKey, imageID, width, height, origin);
|
| +
|
| + Stretch stretch;
|
| + stretch.fType = stretches[usage];
|
| + stretch.fWidth = SkNextPow2(width);
|
| + stretch.fHeight = SkNextPow2(height);
|
| + if (!make_stretched_key(tmpKey, stretch, key)) {
|
| + goto UNSTRETCHED;
|
| + }
|
| + } else {
|
| + UNSTRETCHED:
|
| + make_unstretched_key(key, imageID, width, height, origin);
|
| + }
|
| +}
|
| +
|
| +static void make_unstretched_key(const SkBitmap& bitmap, GrUniqueKey* key) {
|
| + make_unstretched_key(key, bitmap.getGenerationID(), bitmap.width(), bitmap.height(),
|
| + bitmap.pixelRefOrigin());
|
| +}
|
| +
|
| static void make_bitmap_keys(const SkBitmap& bitmap,
|
| const Stretch& stretch,
|
| GrUniqueKey* key,
|
| @@ -649,6 +682,31 @@ GrTexture* GrRefCachedBitmapTexture(GrContext* ctx,
|
|
|
| return NULL;
|
| }
|
| +
|
| +// TODO: make this be the canonical signature, and turn the version that takes GrTextureParams*
|
| +// into a wrapper that contains the inverse of these tables.
|
| +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]);
|
| + return GrRefCachedBitmapTexture(ctx, bitmap, ¶ms);
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| // alphatype is ignore for now, but if GrPixelConfig is expanded to encompass
|
|
|