diff options
author | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-08-28 15:07:11 +0000 |
---|---|---|
committer | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-08-28 15:07:11 +0000 |
commit | 8090e651fc1055e0a36f5f17c851faafda949b2c (patch) | |
tree | ed5a34024ae5a260f174e7891be3a0b8963e14a8 | |
parent | 5ee3f67ce35f19f6e5ef44b67db62e964f77d69d (diff) |
Make the SkGrPixelRef be responsible for unlocking device's scratch texture in the cache
Review URL: https://codereview.appspot.com/6498046/
git-svn-id: http://skia.googlecode.com/svn/trunk@5313 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | include/gpu/SkGpuDevice.h | 4 | ||||
-rw-r--r-- | include/gpu/SkGrPixelRef.h | 9 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 20 | ||||
-rw-r--r-- | src/gpu/SkGrPixelRef.cpp | 11 |
4 files changed, 26 insertions, 18 deletions
diff --git a/include/gpu/SkGpuDevice.h b/include/gpu/SkGpuDevice.h index f04be622f1..49eea26573 100644 --- a/include/gpu/SkGpuDevice.h +++ b/include/gpu/SkGpuDevice.h @@ -132,14 +132,12 @@ private: GrClipData fClipData; // state for our offscreen render-target - // TODO: remove 'fCached' and automatically return to the cache - bool fCached; // is fRenderTarget->asTexture() in the cache GrRenderTarget* fRenderTarget; bool fNeedClear; bool fNeedPrepareRenderTarget; // called from rt and tex cons - void initFromRenderTarget(GrContext*, GrRenderTarget*); + void initFromRenderTarget(GrContext*, GrRenderTarget*, bool cached); // used by createCompatibleDevice SkGpuDevice(GrContext*, GrTexture* texture, bool needClear); diff --git a/include/gpu/SkGrPixelRef.h b/include/gpu/SkGrPixelRef.h index b7eaf0d11a..4476a84a6f 100644 --- a/include/gpu/SkGrPixelRef.h +++ b/include/gpu/SkGrPixelRef.h @@ -42,7 +42,12 @@ private: */ class SK_API SkGrPixelRef : public SkROLockPixelsPixelRef { public: - SkGrPixelRef(GrSurface* surface); + /** + * Constructs a pixel ref around a GrSurface. If the caller has locked the GrSurface in the + * cache and would like the pixel ref to unlock it in its destructor then transferCacheLock + * should be set to true. + */ + SkGrPixelRef(GrSurface* surface, bool transferCacheLock = false); virtual ~SkGrPixelRef(); // override from SkPixelRef @@ -57,6 +62,8 @@ protected: private: GrSurface* fSurface; + bool fUnlock; // if true the pixel ref owns a texture cache lock on fSurface + typedef SkROLockPixelsPixelRef INHERITED; }; diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 8d43f704e1..fa0f60e684 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -172,23 +172,23 @@ static SkBitmap make_bitmap(GrContext* context, GrRenderTarget* renderTarget) { SkGpuDevice::SkGpuDevice(GrContext* context, GrTexture* texture) : SkDevice(make_bitmap(context, texture->asRenderTarget())) { - this->initFromRenderTarget(context, texture->asRenderTarget()); + this->initFromRenderTarget(context, texture->asRenderTarget(), false); } SkGpuDevice::SkGpuDevice(GrContext* context, GrRenderTarget* renderTarget) : SkDevice(make_bitmap(context, renderTarget)) { - this->initFromRenderTarget(context, renderTarget); + this->initFromRenderTarget(context, renderTarget, false); } void SkGpuDevice::initFromRenderTarget(GrContext* context, - GrRenderTarget* renderTarget) { + GrRenderTarget* renderTarget, + bool cached) { fNeedPrepareRenderTarget = false; fDrawProcs = NULL; fContext = context; fContext->ref(); - fCached = false; fRenderTarget = NULL; fNeedClear = false; @@ -204,7 +204,7 @@ void SkGpuDevice::initFromRenderTarget(GrContext* context, if (NULL == surface) { surface = fRenderTarget; } - SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (surface)); + SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (surface, cached)); this->setPixelRef(pr, 0)->unref(); } @@ -221,7 +221,6 @@ SkGpuDevice::SkGpuDevice(GrContext* context, fContext = context; fContext->ref(); - fCached = false; fRenderTarget = NULL; fNeedClear = false; @@ -264,10 +263,6 @@ SkGpuDevice::~SkGpuDevice() { // This call gives the context a chance to relinquish it fContext->setRenderTarget(NULL); - GrTexture* texture = fRenderTarget->asTexture(); - if (NULL != texture && fCached) { - fContext->unlockTexture(texture); - } SkSafeUnref(fRenderTarget); fContext->unref(); } @@ -1964,7 +1959,8 @@ SkGpuDevice::SkGpuDevice(GrContext* context, : SkDevice(make_bitmap(context, texture->asRenderTarget())) { GrAssert(texture && texture->asRenderTarget()); - this->initFromRenderTarget(context, texture->asRenderTarget()); - fCached = true; + // This constructor is called from onCreateCompatibleDevice. It has locked the RT in the texture + // cache. We pass true for the third argument so that it will get unlocked. + this->initFromRenderTarget(context, texture->asRenderTarget(), true); fNeedClear = needClear; } diff --git a/src/gpu/SkGrPixelRef.cpp b/src/gpu/SkGrPixelRef.cpp index 05c3f02c10..b7a0765a85 100644 --- a/src/gpu/SkGrPixelRef.cpp +++ b/src/gpu/SkGrPixelRef.cpp @@ -88,7 +88,7 @@ static SkGrPixelRef* copyToTexturePixelRef(GrTexture* texture, /////////////////////////////////////////////////////////////////////////////// -SkGrPixelRef::SkGrPixelRef(GrSurface* surface) { +SkGrPixelRef::SkGrPixelRef(GrSurface* surface, bool transferCacheLock) { // TODO: figure out if this is responsible for Chrome canvas errors #if 0 // The GrTexture has a ref to the GrRenderTarget but not vice versa. @@ -101,11 +101,18 @@ SkGrPixelRef::SkGrPixelRef(GrSurface* surface) { if (NULL == fSurface) { fSurface = surface; } - + fUnlock = transferCacheLock; GrSafeRef(surface); } SkGrPixelRef::~SkGrPixelRef() { + if (fUnlock) { + GrContext* context = fSurface->getContext(); + GrTexture* texture= fSurface->asTexture(); + if (NULL != context && NULL != texture) { + context->unlockTexture(texture); + } + } GrSafeUnref(fSurface); } |