aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/gpu/SkGpuDevice.h4
-rw-r--r--include/gpu/SkGrPixelRef.h9
-rw-r--r--src/gpu/SkGpuDevice.cpp20
-rw-r--r--src/gpu/SkGrPixelRef.cpp11
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);
}