Chromium Code Reviews| Index: src/gpu/SkGr.cpp |
| diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp |
| index f1fd40759969ebb646e5e2292f21ea55b75fafdb..73773b00d144c532b802af8b99d1e91f991d70d2 100644 |
| --- a/src/gpu/SkGr.cpp |
| +++ b/src/gpu/SkGr.cpp |
| @@ -135,8 +135,40 @@ static void add_genID_listener(GrResourceKey key, SkPixelRef* pixelRef) { |
| pixelRef->addGenIDChangeListener(SkNEW_ARGS(GrResourceInvalidator, (key))); |
| } |
| +static GrTexture* sk_gr_allocate_texture(GrContext* ctx, |
| + bool cache, |
| + const GrTextureParams* params, |
| + const SkBitmap& bm, |
|
robertphillips
2014/09/10 14:18:12
const GrTextureDesc&
|
| + GrTextureDesc desc, |
| + const void* pixels, |
| + size_t rowBytes) { |
| + GrTexture* result; |
| + if (cache) { |
| + // This texture is likely to be used again so leave it in the cache |
| + GrCacheID cacheID; |
| + generate_bitmap_cache_id(bm, &cacheID); |
| + |
| + GrResourceKey key; |
| + result = ctx->createTexture(params, desc, cacheID, pixels, rowBytes, &key); |
| + if (result) { |
| + add_genID_listener(key, bm.pixelRef()); |
| + } |
| + } else { |
| + // This texture is unlikely to be used again (in its present form) so |
| + // just use a scratch texture. This will remove the texture from the |
| + // cache so no one else can find it. Additionally, once unlocked, the |
| + // scratch texture will go to the end of the list for purging so will |
| + // likely be available for this volatile bitmap the next time around. |
| + result = ctx->lockAndRefScratchTexture(desc, GrContext::kExact_ScratchTexMatch); |
| + if (pixels) { |
| + result->writePixels(0, 0, bm.width(), bm.height(), desc.fConfig, pixels, rowBytes); |
| + } |
| + } |
| + return result; |
| +} |
| + |
| #ifndef SK_IGNORE_ETC1_SUPPORT |
| -static GrTexture *load_etc1_texture(GrContext* ctx, |
| +static GrTexture *load_etc1_texture(GrContext* ctx, bool cache, |
| const GrTextureParams* params, |
| const SkBitmap &bm, GrTextureDesc desc) { |
| SkAutoTUnref<SkData> data(bm.pixelRef()->refEncodedData()); |
| @@ -182,23 +214,12 @@ static GrTexture *load_etc1_texture(GrContext* ctx, |
| return NULL; |
| } |
| - // This texture is likely to be used again so leave it in the cache |
| - GrCacheID cacheID; |
| - generate_bitmap_cache_id(bm, &cacheID); |
| - |
| - GrResourceKey key; |
| - GrTexture* result = ctx->createTexture(params, desc, cacheID, bytes, 0, &key); |
| - if (result) { |
| - add_genID_listener(key, bm.pixelRef()); |
| - } |
| - return result; |
| + return sk_gr_allocate_texture(ctx, cache, params, bm, desc, bytes, 0); |
| } |
| #endif // SK_IGNORE_ETC1_SUPPORT |
| -static GrTexture *load_yuv_texture(GrContext* ctx, const GrTextureParams* params, |
| +static GrTexture *load_yuv_texture(GrContext* ctx, bool cache, const GrTextureParams* params, |
| const SkBitmap& bm, const GrTextureDesc& desc) { |
| - GrTexture* result = NULL; |
| - |
| SkPixelRef* pixelRef = bm.pixelRef(); |
| SkISize yuvSizes[3]; |
| if ((NULL == pixelRef) || !pixelRef->getYUV8Planes(yuvSizes, NULL, NULL)) { |
| @@ -243,15 +264,10 @@ static GrTexture *load_yuv_texture(GrContext* ctx, const GrTextureParams* params |
| kRenderTarget_GrTextureFlagBit | |
| kNoStencil_GrTextureFlagBit; |
| - // This texture is likely to be used again so leave it in the cache |
| - GrCacheID cacheID; |
| - generate_bitmap_cache_id(bm, &cacheID); |
| + GrTexture* result = sk_gr_allocate_texture(ctx, cache, params, bm, rtDesc, NULL, 0); |
| - GrResourceKey key; |
| - result = ctx->createTexture(params, rtDesc, cacheID, NULL, 0, &key); |
| GrRenderTarget* renderTarget = result ? result->asRenderTarget() : NULL; |
| if (renderTarget) { |
| - add_genID_listener(key, bm.pixelRef()); |
| SkAutoTUnref<GrEffect> yuvToRgbEffect(GrYUVtoRGBEffect::Create( |
| yuvTextures[0].texture(), yuvTextures[1].texture(), yuvTextures[2].texture())); |
| GrPaint paint; |
| @@ -293,26 +309,8 @@ static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx, |
| // our compressed data will be trimmed, so pass width() for its |
| // "rowBytes", since they are the same now. |
| - |
| - if (cache) { |
| - GrCacheID cacheID; |
| - generate_bitmap_cache_id(origBitmap, &cacheID); |
| - |
| - GrResourceKey key; |
| - GrTexture* result = ctx->createTexture(params, desc, cacheID, |
| - storage.get(), bitmap->width(), &key); |
| - if (result) { |
| - add_genID_listener(key, origBitmap.pixelRef()); |
| - } |
| - return result; |
| - } else { |
| - GrTexture* result = ctx->lockAndRefScratchTexture(desc, |
| - GrContext::kExact_ScratchTexMatch); |
| - result->writePixels(0, 0, bitmap->width(), |
| - bitmap->height(), desc.fConfig, |
| - storage.get()); |
| - return result; |
| - } |
| + return sk_gr_allocate_texture(ctx, cache, params, origBitmap, |
| + desc, storage.get(), bitmap->width()); |
| } else { |
| origBitmap.copyTo(&tmpBitmap, kN32_SkColorType); |
| // now bitmap points to our temp, which has been promoted to 32bits |
| @@ -335,7 +333,7 @@ static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx, |
| // the bitmap has available pixels, then they might not be what the decompressed |
| // data is. |
| && !(bitmap->readyToDraw())) { |
| - GrTexture *texture = load_etc1_texture(ctx, params, *bitmap, desc); |
| + GrTexture *texture = load_etc1_texture(ctx, cache, params, *bitmap, desc); |
| if (texture) { |
| return texture; |
| } |
| @@ -343,7 +341,7 @@ static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx, |
| #endif // SK_IGNORE_ETC1_SUPPORT |
| else { |
| - GrTexture *texture = load_yuv_texture(ctx, params, *bitmap, desc); |
| + GrTexture *texture = load_yuv_texture(ctx, cache, params, *bitmap, desc); |
| if (texture) { |
| return texture; |
| } |
| @@ -352,32 +350,9 @@ static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx, |
| if (!bitmap->readyToDraw()) { |
| return NULL; |
| } |
| - if (cache) { |
| - // This texture is likely to be used again so leave it in the cache |
| - GrCacheID cacheID; |
| - generate_bitmap_cache_id(origBitmap, &cacheID); |
| - GrResourceKey key; |
| - GrTexture* result = ctx->createTexture(params, desc, cacheID, |
| - bitmap->getPixels(), bitmap->rowBytes(), &key); |
| - if (result) { |
| - add_genID_listener(key, origBitmap.pixelRef()); |
| - } |
| - return result; |
| - } else { |
| - // This texture is unlikely to be used again (in its present form) so |
| - // just use a scratch texture. This will remove the texture from the |
| - // cache so no one else can find it. Additionally, once unlocked, the |
| - // scratch texture will go to the end of the list for purging so will |
| - // likely be available for this volatile bitmap the next time around. |
| - GrTexture* result = ctx->lockAndRefScratchTexture(desc, GrContext::kExact_ScratchTexMatch); |
| - result->writePixels(0, 0, |
| - bitmap->width(), bitmap->height(), |
| - desc.fConfig, |
| - bitmap->getPixels(), |
| - bitmap->rowBytes()); |
| - return result; |
| - } |
| + return sk_gr_allocate_texture(ctx, cache, params, origBitmap, desc, |
| + bitmap->getPixels(), bitmap->rowBytes()); |
| } |
| bool GrIsBitmapInCache(const GrContext* ctx, |