diff --git a/include/gpu/GrContext.h b/include/gpu/GrContext.h
index 76cba9a..53c6cb7 100644
--- a/include/gpu/GrContext.h
+++ b/include/gpu/GrContext.h
@@ -110,10 +110,10 @@
      * @param rowBytes  The number of bytes between rows of the texture. Zero
      *                  implies tightly packed rows.
      */
-    GrTexture* createAndLockTexture(const GrTextureParams* params,
-                                    const GrTextureDesc& desc,
-                                    const GrCacheData& cacheData,
-                                    void* srcData, size_t rowBytes);
+    GrTexture* createTexture(const GrTextureParams* params,
+                             const GrTextureDesc& desc,
+                             const GrCacheData& cacheData,
+                             void* srcData, size_t rowBytes);
 
     /**
      * Look for a texture that matches 'key' in the cache. If not found,
@@ -122,9 +122,8 @@
     GrTexture* findTexture(const GrCacheKey& key);
 
     /**
-     *  Search for an entry based on key and dimensions. If found, "lock" it and
+     *  Search for an entry based on key and dimensions. If found, 
      *  return it. The return value will be NULL if not found.
-     *  Must be balanced with an unlockTexture() call.
      *
      *  @param desc     Description of the texture properties.
      *  @param cacheData Cache-specific properties (e.g., texture gen ID)
@@ -133,9 +132,9 @@
      *                  for different wrap modes on GPUs with limited NPOT
      *                  texture support). NULL implies clamp wrap modes.
      */
-    GrTexture* findAndLockTexture(const GrTextureDesc& desc,
-                                  const GrCacheData& cacheData,
-                                  const GrTextureParams* params);
+    GrTexture* findTexture(const GrTextureDesc& desc,
+                           const GrCacheData& cacheData,
+                           const GrTextureParams* params);
     /**
      * Determines whether a texture is in the cache. If the texture is found it
      * will not be locked or returned. This call does not affect the priority of
@@ -181,20 +180,17 @@
                                   ScratchTexMatch match);
 
     /**
-     * Make a texture un-purgeable in the cache
-     */
-    void lockTexture(GrTexture* texture);
-
-    /**
      *  When done with an entry, call unlockTexture(entry) on it, which returns
      *  it to the cache, where it may be purged.
      */
-    void unlockTexture(GrTexture* texture);
+    void unlockScratchTexture(GrTexture* texture);
 
     /**
      * This method should be called whenever a GrTexture is unreffed or
      * switched from exclusive to non-exclusive. This
      * gives the resource cache a chance to discard unneeded textures.
+     * Note: this entry point will be removed once totally ref-driven
+     * cache maintenance is implemented
      */
     void purgeCache();
 
@@ -767,14 +763,11 @@
 
     /**
      * Stencil buffers add themselves to the cache using
-     * addAndLockStencilBuffer. When a SB's RT-attachment count
-     * reaches zero the SB unlocks itself using unlockStencilBuffer and is
-     * eligible for purging. findAndLockStencilBuffer is called to check the
+     * addStencilBuffer. findStencilBuffer is called to check the
      * cache for a SB that matches an RT's criteria.
      */
-    void addAndLockStencilBuffer(GrStencilBuffer* sb);
-    void unlockStencilBuffer(GrStencilBuffer* sb);
-    GrStencilBuffer* findAndLockStencilBuffer(int width, int height, int sampleCnt);
+    void addStencilBuffer(GrStencilBuffer* sb);
+    GrStencilBuffer* findStencilBuffer(int width, int height, int sampleCnt);
 
     GrPathRenderer* getPathRenderer(const SkPath& path,
                                     GrPathFill fill,
@@ -875,7 +868,7 @@
 
     void reset() {
         if (NULL != fContext && NULL != fTexture) {
-            fContext->unlockTexture(fTexture);
+            fContext->unlockScratchTexture(fTexture);
             fTexture = NULL;
         }
     }
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 9b01eb2..4599990 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -212,11 +212,11 @@
     return static_cast<GrTexture*>(fTextureCache->find(key.key()));
 }
 
-GrTexture* GrContext::findAndLockTexture(const GrTextureDesc& desc,
-                                         const GrCacheData& cacheData,
-                                         const GrTextureParams* params) {
+GrTexture* GrContext::findTexture(const GrTextureDesc& desc,
+                                  const GrCacheData& cacheData,
+                                  const GrTextureParams* params) {
     GrResourceKey resourceKey = GrTexture::ComputeKey(fGpu, params, desc, cacheData, false);
-    GrResource* resource = fTextureCache->findAndLock(resourceKey);
+    GrResource* resource = fTextureCache->find(resourceKey);
     return static_cast<GrTexture*>(resource);
 }
 
@@ -227,41 +227,24 @@
     return fTextureCache->hasKey(resourceKey);
 }
 
-void GrContext::addAndLockStencilBuffer(GrStencilBuffer* sb) {
+void GrContext::addStencilBuffer(GrStencilBuffer* sb) {
     ASSERT_OWNED_RESOURCE(sb);
 
     GrResourceKey resourceKey = GrStencilBuffer::ComputeKey(sb->width(),
                                                             sb->height(),
                                                             sb->numSamples());
-    fTextureCache->createAndLock(resourceKey, sb);
+    fTextureCache->create(resourceKey, sb);
 }
 
-GrStencilBuffer* GrContext::findAndLockStencilBuffer(int width, int height,
+GrStencilBuffer* GrContext::findStencilBuffer(int width, int height,
                                               int sampleCnt) {
     GrResourceKey resourceKey = GrStencilBuffer::ComputeKey(width,
                                                             height,
                                                             sampleCnt);
-    GrResource* resource = fTextureCache->findAndLock(resourceKey);
+    GrResource* resource = fTextureCache->find(resourceKey);
     return static_cast<GrStencilBuffer*>(resource);
 }
 
-void GrContext::unlockStencilBuffer(GrStencilBuffer* sb) {
-
-    if (NULL == sb->getCacheEntry()) {
-        // This can happen when the GrResourceCache is being deleted. If
-        // a stencil buffer was evicted before its reffing render targets,
-        // the render targets will attempt to unlock the stencil buffer
-        // when they are deleted.
-        return;
-    }
-
-    // If the texture cache still exists we know the GrGpu & GrContext still
-    // exist so we can verify ownership.
-    ASSERT_OWNED_RESOURCE(sb);
-
-    fTextureCache->unlock(sb->getCacheEntry());
-}
-
 static void stretchImage(void* dst,
                          int dstW,
                          int dstH,
@@ -296,10 +279,12 @@
                                            void* srcData,
                                            size_t rowBytes,
                                            bool needsFiltering) {
-    GrTexture* clampedTexture = this->findAndLockTexture(desc, cacheData, NULL);
+    SkAutoTUnref<GrTexture> clampedTexture(this->findTexture(desc, cacheData, NULL));
 
     if (NULL == clampedTexture) {
-        clampedTexture = this->createAndLockTexture(NULL, desc, cacheData, srcData, rowBytes);
+        clampedTexture.reset(
+            this->createTexture(NULL, desc, cacheData, srcData, rowBytes));
+
         GrAssert(NULL != clampedTexture);
         if (NULL == clampedTexture) {
             return NULL;
@@ -365,12 +350,11 @@
                                                     stretchedRowBytes);
         GrAssert(NULL != texture);
     }
-    this->unlockTexture(clampedTexture);
 
     return texture;
 }
 
-GrTexture* GrContext::createAndLockTexture(
+GrTexture* GrContext::createTexture(
         const GrTextureParams* params,
         const GrTextureDesc& desc,
         const GrCacheData& cacheData,
@@ -394,7 +378,7 @@
     }
 
     if (NULL != texture) {
-        fTextureCache->createAndLock(resourceKey, texture);
+        fTextureCache->create(resourceKey, texture);
     }
 
     return texture;
@@ -423,7 +407,7 @@
 
     do {
         GrResourceKey key = GrTexture::ComputeKey(fGpu, NULL, desc, cacheData, true);
-        resource = fTextureCache->findAndLock(key);
+        resource = fTextureCache->find(key);
         // if we miss, relax the fit of the flags...
         // then try doubling width... then height.
         if (NULL != resource || kExact_ScratchTexMatch == match) {
@@ -459,7 +443,7 @@
                                                       texture->desc(),
                                                       cacheData,
                                                       true);
-            fTextureCache->createAndLock(key, texture);
+            fTextureCache->create(key, texture);
             resource = texture;
         }
     }
@@ -492,23 +476,11 @@
     // still be in the exclusive pile
     fTextureCache->makeNonExclusive(texture->getCacheEntry());
 
-    // and it should still be locked
-    fTextureCache->unlock(texture->getCacheEntry());
     this->purgeCache();
 }
 
-void GrContext::lockTexture(GrTexture* texture) {
 
-    if (NULL == texture->getCacheEntry()) {
-        // not in the cache
-        GrAssert(0);
-        return;
-    }
-
-    fTextureCache->lock(texture->getCacheEntry());
-}
-
-void GrContext::unlockTexture(GrTexture* texture) {
+void GrContext::unlockScratchTexture(GrTexture* texture) {
     ASSERT_OWNED_RESOURCE(texture);
     GrAssert(NULL != texture->getCacheEntry());
 
@@ -519,7 +491,6 @@
         fTextureCache->makeNonExclusive(texture->getCacheEntry());
     }
 
-    fTextureCache->unlock(texture->getCacheEntry());
     this->purgeCache();
 }
 
diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp
index fae9d99..514d176 100644
--- a/src/gpu/GrGpu.cpp
+++ b/src/gpu/GrGpu.cpp
@@ -144,9 +144,9 @@
 bool GrGpu::attachStencilBufferToRenderTarget(GrRenderTarget* rt) {
     GrAssert(NULL == rt->getStencilBuffer());
     GrStencilBuffer* sb =
-        this->getContext()->findAndLockStencilBuffer(rt->width(),
-                                                     rt->height(),
-                                                     rt->numSamples());
+        this->getContext()->findStencilBuffer(rt->width(),
+                                              rt->height(),
+                                              rt->numSamples());
     if (NULL != sb) {
         rt->setStencilBuffer(sb);
         bool attached = this->attachStencilBufferToRenderTarget(sb, rt);
diff --git a/src/gpu/GrRenderTarget.cpp b/src/gpu/GrRenderTarget.cpp
index f8f9e3c..0d36fd0 100644
--- a/src/gpu/GrRenderTarget.cpp
+++ b/src/gpu/GrRenderTarget.cpp
@@ -96,11 +96,12 @@
 
 void GrRenderTarget::setStencilBuffer(GrStencilBuffer* stencilBuffer) {
     if (NULL != fStencilBuffer) {
+        fStencilBuffer->unref();
+
         GrContext* context = this->getContext();
         if (NULL != context) {
-            context->unlockStencilBuffer(fStencilBuffer);
+            context->purgeCache();
         }
-        fStencilBuffer->unref();
 
         if (NULL != context) {
             context->purgeCache();
diff --git a/src/gpu/GrResourceCache.cpp b/src/gpu/GrResourceCache.cpp
index b567ecb..89fce55 100644
--- a/src/gpu/GrResourceCache.cpp
+++ b/src/gpu/GrResourceCache.cpp
@@ -13,8 +13,6 @@
 
 GrResourceEntry::GrResourceEntry(const GrResourceKey& key, GrResource* resource)
         : fKey(key), fResource(resource) {
-    fLockCount = 0;
-
     // we assume ownership of the resource, and will unref it when we die
     GrAssert(resource);
     resource->ref();
@@ -27,7 +25,6 @@
 
 #if GR_DEBUG
 void GrResourceEntry::validate() const {
-    GrAssert(fLockCount >= 0);
     GrAssert(fResource);
     GrAssert(fResource->getCacheEntry() == this);
     fResource->validate();
@@ -71,14 +68,12 @@
         fMaxBytes(maxBytes) {
 #if GR_CACHE_STATS
     fHighWaterEntryCount          = 0;
-    fHighWaterUnlockedEntryCount  = 0;
     fHighWaterEntryBytes          = 0;
     fHighWaterClientDetachedCount = 0;
     fHighWaterClientDetachedBytes = 0;
 #endif
 
     fEntryCount                   = 0;
-    fUnlockedEntryCount           = 0;
     fEntryBytes                   = 0;
     fClientDetachedCount          = 0;
     fClientDetachedBytes          = 0;
@@ -129,10 +124,6 @@
                                     bool clientDetach) {
     fList.remove(entry);
 
-    if (!entry->isLocked()) {
-        --fUnlockedEntryCount;
-    }
-
     // update our stats
     if (clientDetach) {
         fClientDetachedCount += 1;
@@ -157,15 +148,6 @@
                                    bool clientReattach) {
     fList.addToHead(entry);
 
-    if (!entry->isLocked()) {
-        ++fUnlockedEntryCount;
-#if GR_CACHE_STATS
-        if (fHighWaterUnlockedEntryCount < fUnlockedEntryCount) {
-            fHighWaterUnlockedEntryCount = fUnlockedEntryCount;
-        }
-#endif
-    }
-
     // update our stats
     if (clientReattach) {
         fClientDetachedCount -= 1;
@@ -193,22 +175,9 @@
         return NULL;
     }
 
-    return entry->fResource;
-}
-
-GrResource* GrResourceCache::findAndLock(const GrResourceKey& key) {
-    GrAutoResourceCacheValidate atcv(this);
-
-    GrResourceEntry* entry = fCache.find(key);
-    if (NULL == entry) {
-        return NULL;
-    }
-
     this->internalDetach(entry, false);
     this->attachToHead(entry, false);
 
-    this->lock(entry);
-
     return entry->fResource;
 }
 
@@ -237,14 +206,6 @@
 #endif
 }
 
-void GrResourceCache::createAndLock(const GrResourceKey& key,
-                                    GrResource* resource) {
-    this->create(key, resource);
-
-    GrAssert(NULL != resource->getCacheEntry());
-    this->lock(resource->getCacheEntry());
-}
-
 void GrResourceCache::makeExclusive(GrResourceEntry* entry) {
     GrAutoResourceCacheValidate atcv(this);
 
@@ -284,39 +245,6 @@
     }
 }
 
-void GrResourceCache::lock(GrResourceEntry* entry) {
-    GrAutoResourceCacheValidate atcv(this);
-
-    GrAssert(entry);
-    GrAssert(fCache.find(entry->key()));
-
-    if (!entry->isLocked()) {
-        --fUnlockedEntryCount;
-    }
-
-    entry->lock();
-}
-
-void GrResourceCache::unlock(GrResourceEntry* entry) {
-    GrAutoResourceCacheValidate atcv(this);
-
-    GrAssert(entry);
-    GrAssert(entry->isLocked());
-    GrAssert(fCache.find(entry->key()));
-
-    entry->unlock();
-    if (!entry->isLocked()) {
-        ++fUnlockedEntryCount;
-#if GR_CACHE_STATS
-        if (fHighWaterUnlockedEntryCount < fUnlockedEntryCount) {
-            fHighWaterUnlockedEntryCount = fUnlockedEntryCount;
-        }
-#endif
-    }
-
-    this->purgeAsNeeded();
-}
-
 /**
  * Destroying a resource may potentially trigger the unlock of additional
  * resources which in turn will trigger a nested purge. We block the nested
@@ -331,14 +259,14 @@
     if (!fPurging) {
         fPurging = true;
         bool withinBudget = false;
-        int priorUnlockedEntryCount = 0;
+        bool changed = false;
 
         // The purging process is repeated several times since one pass
         // may free up other resources
         do {
             EntryList::Iter iter;
 
-            priorUnlockedEntryCount = fUnlockedEntryCount;
+            changed = false;
 
             // Note: the following code relies on the fact that the
             // doubly linked list doesn't invalidate its data/pointers
@@ -346,15 +274,18 @@
             // in internalDetach)
             GrResourceEntry* entry = iter.init(fList, EntryList::Iter::kTail_IterStart);
 
-            while (entry && fUnlockedEntryCount) {
+            while (NULL != entry) {
                 GrAutoResourceCacheValidate atcv(this);
+
                 if (fEntryCount <= fMaxCount && fEntryBytes <= fMaxBytes) {
                     withinBudget = true;
                     break;
                 }
 
                 GrResourceEntry* prev = iter.prev();
-                if (!entry->isLocked() && entry->fResource->getRefCnt() == 1) {
+                if (1 == entry->fResource->getRefCnt()) {
+                    changed = true;
+
                     // remove from our cache
                     fCache.remove(entry->key(), entry);
 
@@ -372,7 +303,7 @@
                 }
                 entry = prev;
             }
-        } while (!withinBudget && (fUnlockedEntryCount != priorUnlockedEntryCount));
+        } while (!withinBudget && changed);
         fPurging = false;
     }
 }
@@ -393,7 +324,6 @@
 #if GR_DEBUG
     GrAssert(fExclusiveList.countEntries() == fClientDetachedCount);
     GrAssert(countBytes(fExclusiveList) == fClientDetachedBytes);
-    GrAssert(!fUnlockedEntryCount);
     if (!fCache.count()) {
         // Items may have been detached from the cache (such as the backing
         // texture for an SkGpuDevice). The above purge would not have removed
@@ -443,25 +373,22 @@
 
     EntryList::Iter iter;
 
+    // check that the exclusively held entries are okay
     const GrResourceEntry* entry = iter.init(const_cast<EntryList&>(fExclusiveList),
                                              EntryList::Iter::kHead_IterStart);
 
     for ( ; NULL != entry; entry = iter.next()) {
         entry->validate();
-        GrAssert(entry->isLocked());
     }
 
+    // check that the shareable entries are okay
     entry = iter.init(const_cast<EntryList&>(fList), EntryList::Iter::kHead_IterStart);
 
     int count = 0;
-    int unlockCount = 0;
     for ( ; NULL != entry; entry = iter.next()) {
         entry->validate();
         GrAssert(fCache.find(entry->key()));
         count += 1;
-        if (!entry->isLocked()) {
-            unlockCount += 1;
-        }
     }
     GrAssert(count == fEntryCount - fClientDetachedCount);
 
@@ -471,8 +398,6 @@
     bytes = countBytes(fExclusiveList);
     GrAssert(bytes == fClientDetachedBytes);
 
-    GrAssert(unlockCount == fUnlockedEntryCount);
-
     GrAssert(fList.countEntries() == fEntryCount - fClientDetachedCount);
 
     GrAssert(fExclusiveList.countEntries() == fClientDetachedCount);
@@ -481,12 +406,22 @@
 
 #if GR_CACHE_STATS
 
-void GrResourceCache::printStats() const {
+void GrResourceCache::printStats() {
+    int locked = 0;
+
+    EntryList::Iter iter;
+
+    GrResourceEntry* entry = iter.init(fList, EntryList::Iter::kTail_IterStart);
+
+    for ( ; NULL != entry; entry = iter.prev()) {
+        if (entry->fResource->getRefCnt() > 1) {
+            ++locked;
+        }
+    }
+
     SkDebugf("Budget: %d items %d bytes\n", fMaxCount, fMaxBytes);
-    SkDebugf("\t\tEntry Count: current %d high %d\n",
-                fEntryCount, fHighWaterEntryCount);
-    SkDebugf("\t\tUnlocked Entry Count: current %d high %d\n",
-                fUnlockedEntryCount, fHighWaterUnlockedEntryCount);
+    SkDebugf("\t\tEntry Count: current %d (%d locked) high %d\n",
+                fEntryCount, locked, fHighWaterEntryCount);
     SkDebugf("\t\tEntry Bytes: current %d high %d\n",
                 fEntryBytes, fHighWaterEntryBytes);
     SkDebugf("\t\tDetached Entry Count: current %d high %d\n",
diff --git a/src/gpu/GrResourceCache.h b/src/gpu/GrResourceCache.h
index e6b412e..7897b7a 100644
--- a/src/gpu/GrResourceCache.h
+++ b/src/gpu/GrResourceCache.h
@@ -156,20 +156,9 @@
     GrResourceEntry(const GrResourceKey& key, GrResource* resource);
     ~GrResourceEntry();
 
-    bool isLocked() const { return fLockCount != 0; }
-    void lock() { ++fLockCount; }
-    void unlock() {
-        GrAssert(fLockCount > 0);
-        --fLockCount;
-    }
-
     GrResourceKey    fKey;
     GrResource*      fResource;
 
-    // track if we're in use, used when we need to purge
-    // we only purge unlocked entries
-    int fLockCount;
-
     // we're a dlinklist
     SK_DEFINE_DLINKEDLIST_INTERFACE(GrResourceEntry);
 
@@ -238,19 +227,13 @@
     GrResource* find(const GrResourceKey& key);
 
     /**
-     *  Search for an entry with the same Key. If found, "lock" it and return it.
-     *  If not found, return null.
-     */
-    GrResource* findAndLock(const GrResourceKey&);
-
-    /**
      *  Create a new cache entry, based on the provided key and resource, and
      *  return it.
      *
      *  Ownership of the resource is transferred to the resource cache,
      *  which will unref() it when it is purged or deleted.
      */
-    void createAndLock(const GrResourceKey&, GrResource*);
+    void create(const GrResourceKey&, GrResource*);
 
     /**
      * Determines if the cache contains an entry matching a key. If a matching
@@ -273,23 +256,14 @@
     void makeNonExclusive(GrResourceEntry* entry);
 
     /**
-     * When done with an entry, call unlock(entry) on it, which returns it to
-     * a purgable state.
-     */
-    void unlock(GrResourceEntry*);
-
-    /**
-     * Make a resource un-purgeable.
-     */
-    void lock(GrResourceEntry* entry);
-
-    /**
      * Removes every resource in the cache that isn't locked.
      */
     void purgeAllUnlocked();
 
     /**
      * Allow cache to purge unused resources to obey resource limitations
+     * Note: this entry point will be hidden (again) once totally ref-driven
+     * cache maintenance is implemented
      */
     void purgeAsNeeded();
 
@@ -300,7 +274,7 @@
 #endif
 
 #if GR_CACHE_STATS
-    void printStats() const;
+    void printStats();
 #endif
 
 private:
@@ -328,14 +302,12 @@
     // our current stats, related to our budget
 #if GR_CACHE_STATS
     int fHighWaterEntryCount;
-    int fHighWaterUnlockedEntryCount;
     size_t fHighWaterEntryBytes;
     int fHighWaterClientDetachedCount;
     size_t fHighWaterClientDetachedBytes;
 #endif
 
     int fEntryCount;
-    int fUnlockedEntryCount;
     size_t fEntryBytes;
     int fClientDetachedCount;
     size_t fClientDetachedBytes;
@@ -343,8 +315,6 @@
     // prevents recursive purging
     bool fPurging;
 
-    void create(const GrResourceKey& key, GrResource* resource);
-
 #if GR_DEBUG
     static size_t countBytes(const SkTDLinkedList<GrResourceEntry>& list);
 #endif
diff --git a/src/gpu/GrStencilBuffer.cpp b/src/gpu/GrStencilBuffer.cpp
index 2b7dfed..da59762 100644
--- a/src/gpu/GrStencilBuffer.cpp
+++ b/src/gpu/GrStencilBuffer.cpp
@@ -14,10 +14,10 @@
 
 GR_DEFINE_RESOURCE_CACHE_TYPE(GrStencilBuffer)
 
-void GrStencilBuffer::transferToCacheAndLock() {
+void GrStencilBuffer::transferToCache() {
     GrAssert(NULL == this->getCacheEntry());
 
-    this->getGpu()->getContext()->addAndLockStencilBuffer(this);
+    this->getGpu()->getContext()->addStencilBuffer(this);
 }
 
 namespace {
diff --git a/src/gpu/GrStencilBuffer.h b/src/gpu/GrStencilBuffer.h
index 690fa32..2a0dbc0 100644
--- a/src/gpu/GrStencilBuffer.h
+++ b/src/gpu/GrStencilBuffer.h
@@ -59,9 +59,8 @@
         return fLastClipData;
     }
 
-    // Places the sb in the cache and locks it. The cache takes a ref
-    // of the stencil buffer.
-    void transferToCacheAndLock();
+    // Places the sb in the cache. The cache takes a ref of the stencil buffer.
+    void transferToCache();
 
     static GrResourceKey ComputeKey(int width, int height, int sampleCnt);
 
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 8701178..79bc75d 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -92,9 +92,9 @@
             // "rowBytes", since they are the same now.
 
             if (GrCacheData::kScratch_CacheID != key) {
-                return ctx->createAndLockTexture(params, desc, cacheData,
-                                                 storage.get(),
-                                                 bitmap->width());
+                return ctx->createTexture(params, desc, cacheData,
+                                          storage.get(),
+                                          bitmap->width());
             } else {
                 GrTexture* result = ctx->lockScratchTexture(desc,
                                           GrContext::kExact_ScratchTexMatch);
@@ -115,9 +115,9 @@
     if (GrCacheData::kScratch_CacheID != key) {
         // This texture is likely to be used again so leave it in the cache
         // but locked.
-        return ctx->createAndLockTexture(params, desc, cacheData,
-                                         bitmap->getPixels(),
-                                         bitmap->rowBytes());
+        return ctx->createTexture(params, desc, cacheData,
+                                  bitmap->getPixels(),
+                                  bitmap->rowBytes());
     } else {
         // This texture is unlikely to be used again (in its present form) so
         // just use a scratch texture. This will remove the texture from the
@@ -154,8 +154,9 @@
 
         GrCacheData cacheData(key);
 
-        result = ctx->findAndLockTexture(desc, cacheData, params);
+        result = ctx->findTexture(desc, cacheData, params);
         if (NULL == result) {
+            // didn't find a cached copy so create one
             result = sk_gr_create_bitmap_texture(ctx, key, params, bitmap);
         }
     } else {
@@ -171,7 +172,7 @@
 void GrUnlockCachedBitmapTexture(GrTexture* texture) {
     GrAssert(NULL != texture->getContext());
 
-    texture->getContext()->unlockTexture(texture);
+    texture->getContext()->unlockScratchTexture(texture);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/SkGrPixelRef.cpp b/src/gpu/SkGrPixelRef.cpp
index bb36d32..e770ef0 100644
--- a/src/gpu/SkGrPixelRef.cpp
+++ b/src/gpu/SkGrPixelRef.cpp
@@ -110,7 +110,7 @@
         GrContext* context = fSurface->getContext();
         GrTexture* texture = fSurface->asTexture();
         if (NULL != context && NULL != texture) {
-            context->unlockTexture(texture);
+            context->unlockScratchTexture(texture);
         }
     }
     GrSafeUnref(fSurface);
diff --git a/src/gpu/effects/GrTextureStripAtlas.cpp b/src/gpu/effects/GrTextureStripAtlas.cpp
index 86c4645..3a2942b 100644
--- a/src/gpu/effects/GrTextureStripAtlas.cpp
+++ b/src/gpu/effects/GrTextureStripAtlas.cpp
@@ -179,9 +179,9 @@
     texDesc.fConfig = fDesc.fConfig;
     GrCacheData cacheData(fCacheID);
     cacheData.fResourceDomain = GetTextureStripAtlasDomain();
-    fTexture = fDesc.fContext->findAndLockTexture(texDesc, cacheData, &params);
+    fTexture = fDesc.fContext->findTexture(texDesc, cacheData, &params);
     if (NULL == fTexture) {
-        fTexture = fDesc.fContext->createAndLockTexture(&params, texDesc, cacheData, NULL, 0);
+        fTexture = fDesc.fContext->createTexture(&params, texDesc, cacheData, NULL, 0);
         // This is a new texture, so all of our cache info is now invalid
         this->initLRU();
         fKeyTable.rewind();
@@ -192,7 +192,6 @@
 
 void GrTextureStripAtlas::unlockTexture() {
     GrAssert(NULL != fTexture && 0 == fLockedRows);
-    fDesc.fContext->unlockTexture(fTexture);
     fTexture->unref();
     fTexture = NULL;
     fDesc.fContext->purgeCache();
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
index 887ed76..845d1f8 100644
--- a/src/gpu/gl/GrGpuGL.cpp
+++ b/src/gpu/gl/GrGpuGL.cpp
@@ -1110,7 +1110,7 @@
                                                   samples, format)));
             if (this->attachStencilBufferToRenderTarget(sb, rt)) {
                 fLastSuccessfulStencilFmtIdx = sIdx;
-                sb->transferToCacheAndLock();
+                sb->transferToCache();
                 rt->setStencilBuffer(sb);
                 return true;
            }
