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; |