Chromium Code Reviews| Index: src/core/SkImageCacherator.cpp |
| diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp |
| index a65e8fccbdc3b28ebbbe6f704d64c57323ffa0c3..24d28139093fb98f301a1ad7e11302c627019165 100644 |
| --- a/src/core/SkImageCacherator.cpp |
| +++ b/src/core/SkImageCacherator.cpp |
| @@ -51,13 +51,16 @@ SkImageCacherator* SkImageCacherator::NewFromGenerator(SkImageGenerator* gen, |
| SkImageCacherator::SkImageCacherator(SkImageGenerator* gen, const SkImageInfo& info, |
| const SkIPoint& origin, uint32_t uniqueID) |
| - : fGenerator(gen) |
| + : fNotThreadSafeGenerator(gen) |
| , fInfo(info) |
| , fOrigin(origin) |
| , fUniqueID(uniqueID) |
| {} |
| -SkImageCacherator::~SkImageCacherator() { delete fGenerator; } |
| +SkData* SkImageCacherator::refEncoded() { |
| + ScopedGenerator generator(this); |
| + return generator->refEncodedData(); |
| +} |
| static bool check_output_bitmap(const SkBitmap& bitmap, uint32_t expectedID) { |
| SkASSERT(bitmap.getGenerationID() == expectedID); |
| @@ -66,17 +69,17 @@ static bool check_output_bitmap(const SkBitmap& bitmap, uint32_t expectedID) { |
| return true; |
| } |
| -static bool generate_bitmap(SkBitmap* bitmap, const SkImageInfo& info, const SkIPoint& origin, |
| - SkImageGenerator* generator) { |
| - const size_t rowBytes = info.minRowBytes(); |
| - if (!bitmap->tryAllocPixels(info, rowBytes)) { |
| +bool SkImageCacherator::generateBitmap(SkBitmap* bitmap) { |
| + const size_t rowBytes = fInfo.minRowBytes(); |
| + if (!bitmap->tryAllocPixels(fInfo, rowBytes)) { |
| return false; |
| } |
| SkASSERT(bitmap->rowBytes() == rowBytes); |
| + ScopedGenerator generator(this); |
| const SkImageInfo& genInfo = generator->getInfo(); |
| - if (info.dimensions() == genInfo.dimensions()) { |
| - SkASSERT(origin.x() == 0 && origin.y() == 0); |
| + if (fInfo.dimensions() == genInfo.dimensions()) { |
| + SkASSERT(fOrigin.x() == 0 && fOrigin.y() == 0); |
| // fast-case, no copy needed |
| if (!generator->getPixels(bitmap->info(), bitmap->getPixels(), rowBytes)) { |
| bitmap->reset(); |
| @@ -93,7 +96,7 @@ static bool generate_bitmap(SkBitmap* bitmap, const SkImageInfo& info, const SkI |
| return false; |
| } |
| full.readPixels(bitmap->info(), bitmap->getPixels(), bitmap->rowBytes(), |
| - origin.x(), origin.y()); |
| + fOrigin.x(), fOrigin.y()); |
| } |
| return true; |
| } |
| @@ -104,7 +107,8 @@ bool SkImageCacherator::tryLockAsBitmap(SkBitmap* bitmap) { |
| if (SkBitmapCache::Find(fUniqueID, bitmap)) { |
| return check_output_bitmap(*bitmap, fUniqueID); |
| } |
| - if (!generate_bitmap(bitmap, fInfo, fOrigin, fGenerator)) { |
| + |
| + if (!this->generateBitmap(bitmap)) { |
| return false; |
| } |
| @@ -120,10 +124,13 @@ bool SkImageCacherator::lockAsBitmap(SkBitmap* bitmap) { |
| #if SK_SUPPORT_GPU |
| // Try to get a texture and read it back to raster (and then cache that with our ID) |
| + SkAutoTUnref<GrTexture> tex; |
| - SkIRect subset = SkIRect::MakeXYWH(fOrigin.x(), fOrigin.y(), fInfo.width(), fInfo.height()); |
| - SkAutoTUnref<GrTexture> tex(fGenerator->generateTexture(nullptr, kUntiled_SkImageUsageType, |
| - &subset)); |
| + { |
| + ScopedGenerator generator(this); |
| + SkIRect subset = SkIRect::MakeXYWH(fOrigin.x(), fOrigin.y(), fInfo.width(), fInfo.height()); |
| + tex.reset(generator->generateTexture(nullptr, kUntiled_SkImageUsageType, &subset)); |
| + } |
| if (!tex) { |
| bitmap->reset(); |
| return false; |
| @@ -151,40 +158,50 @@ bool SkImageCacherator::lockAsBitmap(SkBitmap* bitmap) { |
| ////////////////////////////////////////////////////////////////////////////////////////////////// |
| -GrTexture* SkImageCacherator::tryLockAsTexture(GrContext* ctx, SkImageUsageType usage) { |
| +/* |
| + * We have a 5 ways to try to return a texture (in sorted order) |
| + * |
| + * 1. Check the cache for a pre-existing one |
| + * 2. Ask the genreator to natively create one |
| + * 3. Ask the generator to return a compressed form that the GPU might support |
| + * 4. Ask the generator to return YUV planes, which the GPU can convert |
| + * 5. Ask the generator to return RGB(A) data, which the GPU can convert |
| + */ |
| +GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, SkImageUsageType usage) { |
| #if SK_SUPPORT_GPU |
| + if (!ctx) { |
| + return nullptr; |
| + } |
| + |
| GrUniqueKey key; |
| GrMakeKeyFromImageID(&key, fUniqueID, fInfo.width(), fInfo.height(), SkIPoint::Make(0, 0), |
| *ctx->caps(), usage); |
| - GrTexture* tex = ctx->textureProvider()->findAndRefTextureByUniqueKey(key); |
| - if (tex) { |
| - return tex; // we got a cache hit! |
| - } |
| - SkIRect subset = SkIRect::MakeXYWH(fOrigin.x(), fOrigin.y(), fInfo.width(), fInfo.height()); |
| - tex = fGenerator->generateTexture(ctx, usage, &subset); |
| - if (tex) { |
| - tex->resourcePriv().setUniqueKey(key); |
| + // 1. Check the cache for a pre-existing one |
| + if (GrTexture* tex = ctx->textureProvider()->findAndRefTextureByUniqueKey(key)) { |
| + return tex; |
| } |
| - return tex; |
| -#else |
| - return nullptr; |
| -#endif |
| -} |
| -GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, SkImageUsageType usage) { |
| -#if SK_SUPPORT_GPU |
| - if (!ctx) { |
| - return nullptr; |
| - } |
| - if (GrTexture* tex = this->tryLockAsTexture(ctx, usage)) { |
| - return tex; |
| + // 2. Ask the genreator to natively create one |
|
mtklein
2015/08/26 21:20:57
Out of curiosity, will each of these 2-5 lock then
|
| + { |
| + ScopedGenerator generator(this); |
| + SkIRect subset = SkIRect::MakeXYWH(fOrigin.x(), fOrigin.y(), fInfo.width(), fInfo.height()); |
| + if (GrTexture* tex = generator->generateTexture(ctx, usage, &subset)) { |
| + tex->resourcePriv().setUniqueKey(key); |
| + return tex; |
| + } |
| } |
| - // Try to get a bitmap and then upload/cache it as a texture |
| + // 3. Ask the generator to return a compressed form that the GPU might support |
| + // TODO |
| + |
| + // 4. Ask the generator to return YUV planes, which the GPU can convert |
| + // TODO |
| + |
| + // 5. Ask the generator to return RGB(A) data, which the GPU can convert |
| SkBitmap bitmap; |
| - if (!generate_bitmap(&bitmap, fInfo, fOrigin, fGenerator)) { |
| + if (!this->generateBitmap(&bitmap)) { |
| return nullptr; |
| } |
| return GrRefCachedBitmapTexture(ctx, bitmap, usage); |