| Index: src/gpu/SkGpuDevice.cpp | 
| diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp | 
| index ad01a363f0d95122af9450c513cd41e98c71aa6b..6f4d1a6f99ea6b83fc5ac1ae99a78704678e8228 100644 | 
| --- a/src/gpu/SkGpuDevice.cpp | 
| +++ b/src/gpu/SkGpuDevice.cpp | 
| @@ -77,50 +77,37 @@ enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 }; | 
|  | 
| /////////////////////////////////////////////////////////////////////////////// | 
|  | 
| - | 
| -class SkGpuDevice::SkAutoCachedTexture : public ::SkNoncopyable { | 
| +// Helper for turning a bitmap into a texture. If the bitmap is GrTexture backed this | 
| +// just accesses the backing GrTexture. Otherwise, it creates a cached texture | 
| +// representation and releases it in the destructor. | 
| +class AutoBitmapTexture : public SkNoncopyable { | 
| public: | 
| -    SkAutoCachedTexture() | 
| -        : fDevice(NULL) | 
| -        , fTexture(NULL) { | 
| -    } | 
| +    AutoBitmapTexture() {} | 
|  | 
| -    SkAutoCachedTexture(SkGpuDevice* device, | 
| -                        const SkBitmap& bitmap, | 
| -                        const GrTextureParams* params, | 
| -                        GrTexture** texture) | 
| -        : fDevice(NULL) | 
| -        , fTexture(NULL) { | 
| +    AutoBitmapTexture(GrContext* context, | 
| +                      const SkBitmap& bitmap, | 
| +                      const GrTextureParams* params, | 
| +                      GrTexture** texture) { | 
| SkASSERT(texture); | 
| -        *texture = this->set(device, bitmap, params); | 
| +        *texture = this->set(context, bitmap, params); | 
| } | 
|  | 
| -    ~SkAutoCachedTexture() { | 
| -        if (fTexture) { | 
| -            GrUnlockAndUnrefCachedBitmapTexture(fTexture); | 
| -        } | 
| -    } | 
| - | 
| -    GrTexture* set(SkGpuDevice* device, | 
| +    GrTexture* set(GrContext* context, | 
| const SkBitmap& bitmap, | 
| const GrTextureParams* params) { | 
| -        if (fTexture) { | 
| -            GrUnlockAndUnrefCachedBitmapTexture(fTexture); | 
| -            fTexture = NULL; | 
| -        } | 
| -        fDevice = device; | 
| -        GrTexture* result = (GrTexture*)bitmap.getTexture(); | 
| -        if (NULL == result) { | 
| -            // Cannot return the native texture so look it up in our cache | 
| -            fTexture = GrLockAndRefCachedBitmapTexture(device->context(), bitmap, params); | 
| -            result = fTexture; | 
| +        // Either get the texture directly from the bitmap, or else use the cache and | 
| +        // remember to unref it. | 
| +        if (GrTexture* bmpTexture = bitmap.getTexture()) { | 
| +            fTexture.reset(NULL); | 
| +            return bmpTexture; | 
| +        } else { | 
| +            fTexture.reset(GrRefCachedBitmapTexture(context, bitmap, params)); | 
| +            return fTexture.get(); | 
| } | 
| -        return result; | 
| } | 
|  | 
| private: | 
| -    SkGpuDevice* fDevice; | 
| -    GrTexture*   fTexture; | 
| +    SkAutoTUnref<GrTexture> fTexture; | 
| }; | 
|  | 
| /////////////////////////////////////////////////////////////////////////////// | 
| @@ -153,8 +140,7 @@ SkGpuDevice::SkGpuDevice(GrSurface* surface, const SkSurfaceProps& props, unsign | 
| fRenderTarget = SkRef(surface->asRenderTarget()); | 
|  | 
| SkImageInfo info = surface->surfacePriv().info(); | 
| -    SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, | 
| -                                (info, surface, SkToBool(flags & kCached_Flag))); | 
| +    SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (info, surface)); | 
| fLegacyBitmap.setInfo(info); | 
| fLegacyBitmap.setPixelRef(pr)->unref(); | 
|  | 
| @@ -1299,7 +1285,7 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap, | 
| bitmap.height() <= fContext->getMaxTextureSize()); | 
|  | 
| GrTexture* texture; | 
| -    SkAutoCachedTexture act(this, bitmap, ¶ms, &texture); | 
| +    AutoBitmapTexture abt(fContext, bitmap, ¶ms, &texture); | 
| if (NULL == texture) { | 
| return; | 
| } | 
| @@ -1394,7 +1380,7 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, | 
|  | 
| GrTexture* texture; | 
| // draw sprite uses the default texture params | 
| -    SkAutoCachedTexture act(this, bitmap, NULL, &texture); | 
| +    AutoBitmapTexture abt(fContext, bitmap, NULL, &texture); | 
|  | 
| SkImageFilter* filter = paint.getImageFilter(); | 
| // This bitmap will own the filtered result as a texture. | 
| @@ -1571,7 +1557,7 @@ bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src, | 
| GrTexture* texture; | 
| // We assume here that the filter will not attempt to tile the src. Otherwise, this cache lookup | 
| // must be pushed upstack. | 
| -    SkAutoCachedTexture act(this, src, NULL, &texture); | 
| +    AutoBitmapTexture abt(fContext, src, NULL, &texture); | 
|  | 
| return filter_texture(this, fContext, texture, filter, src.width(), src.height(), ctx, | 
| result, offset); | 
| @@ -1802,7 +1788,6 @@ SkBaseDevice* SkGpuDevice::onCreateDevice(const SkImageInfo& info, Usage usage) | 
| #if CACHE_COMPATIBLE_DEVICE_TEXTURES | 
| // layers are never draw in repeat modes, so we can request an approx | 
| // match and ignore any padding. | 
| -    flags |= kCached_Flag; | 
| const GrContext::ScratchTexMatch match = (kSaveLayer_Usage == usage) ? | 
| GrContext::kApprox_ScratchTexMatch : | 
| GrContext::kExact_ScratchTexMatch; | 
|  |