Chromium Code Reviews| Index: src/gpu/SkGr.cpp |
| diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp |
| index 53f640b6013f87c84d8f6286ec69beb7e96cb4dc..eeecbc98d1c282a65ed0e8288e1ea5102e2e904d 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,29 @@ GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, |
| return NULL; |
| } |
| + |
| +GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, |
| + const SkBitmap& bitmap, |
| + SkImageUsageType usage) { |
|
bsalomon
2015/08/13 20:08:29
Can we invert this and make the old function call
reed1
2015/08/13 20:14:36
TODO
|
| + // 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 |