| Index: src/gpu/GrGpu.cpp | 
| diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp | 
| index d22399f81cab0c372972e8672aa73d21e901d857..efe1a618e6a8ebe9961243e7b32e1f94fb095940 100644 | 
| --- a/src/gpu/GrGpu.cpp | 
| +++ b/src/gpu/GrGpu.cpp | 
| @@ -15,6 +15,7 @@ | 
| #include "GrGpuResourcePriv.h" | 
| #include "GrIndexBuffer.h" | 
| #include "GrResourceCache.h" | 
| +#include "GrRenderTargetPriv.h" | 
| #include "GrStencilBuffer.h" | 
| #include "GrVertexBuffer.h" | 
|  | 
| @@ -61,16 +62,6 @@ GrTexture* GrGpu::createTexture(const GrSurfaceDesc& desc, bool budgeted, | 
| } else { | 
| this->handleDirtyContext(); | 
| tex = this->onCreateTexture(desc, budgeted, srcData, rowBytes); | 
| -        if (tex && | 
| -            (kRenderTarget_GrSurfaceFlag & desc.fFlags) && | 
| -            !(kNoStencil_GrSurfaceFlag & desc.fFlags)) { | 
| -            SkASSERT(tex->asRenderTarget()); | 
| -            // TODO: defer this and attach dynamically | 
| -            if (!this->attachStencilBufferToRenderTarget(tex->asRenderTarget())) { | 
| -                tex->unref(); | 
| -                return NULL; | 
| -            } | 
| -        } | 
| } | 
| if (!this->caps()->reuseScratchTextures() && !isRT) { | 
| tex->resourcePriv().removeScratchKey(); | 
| @@ -85,7 +76,7 @@ GrTexture* GrGpu::createTexture(const GrSurfaceDesc& desc, bool budgeted, | 
| } | 
|  | 
| bool GrGpu::attachStencilBufferToRenderTarget(GrRenderTarget* rt) { | 
| -    SkASSERT(NULL == rt->getStencilBuffer()); | 
| +    SkASSERT(NULL == rt->renderTargetPriv().getStencilBuffer()); | 
| GrUniqueKey sbKey; | 
|  | 
| int width = rt->width(); | 
| @@ -99,12 +90,11 @@ bool GrGpu::attachStencilBufferToRenderTarget(GrRenderTarget* rt) { | 
| SkAutoTUnref<GrStencilBuffer> sb(static_cast<GrStencilBuffer*>( | 
| this->getContext()->getResourceCache()->findAndRefUniqueResource(sbKey))); | 
| if (sb) { | 
| -        rt->setStencilBuffer(sb); | 
| -        bool attached = this->attachStencilBufferToRenderTarget(sb, rt); | 
| -        if (!attached) { | 
| -            rt->setStencilBuffer(NULL); | 
| +        if (this->attachStencilBufferToRenderTarget(sb, rt)) { | 
| +            rt->renderTargetPriv().didAttachStencilBuffer(sb); | 
| +            return true; | 
| } | 
| -        return attached; | 
| +        return false; | 
| } | 
| if (this->createStencilBufferForRenderTarget(rt, width, height)) { | 
| // Right now we're clearing the stencil buffer here after it is | 
| @@ -116,7 +106,8 @@ bool GrGpu::attachStencilBufferToRenderTarget(GrRenderTarget* rt) { | 
| // FBO. But iOS doesn't allow a stencil-only FBO. It reports unsupported | 
| // FBO status. | 
| this->clearStencil(rt); | 
| -        rt->getStencilBuffer()->resourcePriv().setUniqueKey(sbKey); | 
| +        GrStencilBuffer* sb = rt->renderTargetPriv().getStencilBuffer(); | 
| +        sb->resourcePriv().setUniqueKey(sbKey); | 
| return true; | 
| } else { | 
| return false; | 
|  |