| Index: src/gpu/GrDrawTarget.cpp | 
| diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp | 
| index fc5599e712591cdb5a01f5cd20d3927482ea320c..fed97a9b0302624fe417ff204d33908ffd92c05a 100644 | 
| --- a/src/gpu/GrDrawTarget.cpp | 
| +++ b/src/gpu/GrDrawTarget.cpp | 
| @@ -24,6 +24,7 @@ | 
| #include "batches/GrCopySurfaceBatch.h" | 
| #include "batches/GrDiscardBatch.h" | 
| #include "batches/GrDrawBatch.h" | 
| +#include "batches/GrDrawPathBatch.h" | 
| #include "batches/GrRectBatchFactory.h" | 
| #include "batches/GrStencilPathBatch.h" | 
|  | 
| @@ -130,8 +131,6 @@ void GrDrawTarget::flush() { | 
| } | 
|  | 
| void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, GrDrawBatch* batch) { | 
| -    // TODO some kind of checkdraw, but not at this level | 
| - | 
| // Setup clip | 
| GrScissorState scissorState; | 
| GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps; | 
| @@ -147,6 +146,7 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, GrDrawBat | 
|  | 
| GrDrawTarget::PipelineInfo pipelineInfo(&pipelineBuilder, &scissorState, batch, &bounds, | 
| this); | 
| + | 
| if (!pipelineInfo.valid()) { | 
| return; | 
| } | 
| @@ -226,34 +226,44 @@ void GrDrawTarget::drawPath(const GrPipelineBuilder& pipelineBuilder, | 
| const GrPathProcessor* pathProc, | 
| const GrPath* path, | 
| GrPathRendering::FillType fill) { | 
| -    // TODO: extract portions of checkDraw that are relevant to path rendering. | 
| SkASSERT(path); | 
| SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport()); | 
|  | 
| -    SkRect devBounds = path->getBounds(); | 
| -    pathProc->viewMatrix().mapRect(&devBounds); | 
| +    GrDrawPathBatch* batch = GrDrawPathBatch::Create(pathProc, path); | 
| + | 
| +    // This looks like drawBatch() but there is an added wrinkle that stencil settings get inserted | 
| +    // after setupClip() but before onDrawBatch(). TODO: Figure out a better model for handling | 
| +    // stencil settings WRT interactions between pipeline(builder), clipmaskmanager, and batches. | 
|  | 
| -    // Setup clip | 
| GrScissorState scissorState; | 
| GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps; | 
| GrPipelineBuilder::AutoRestoreStencil ars; | 
| -    if (!this->setupClip(pipelineBuilder, &arfps, &ars, &scissorState, &devBounds)) { | 
| -       return; | 
| +    if (!this->setupClip(pipelineBuilder, &arfps, &ars, &scissorState, &batch->bounds())) { | 
| +        return; | 
| } | 
|  | 
| -    // set stencil settings for path | 
| +    // Ensure the render target has a stencil buffer and get the stencil settings. | 
| GrStencilSettings stencilSettings; | 
| GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); | 
| GrStencilAttachment* sb = rt->renderTargetPriv().attachStencilAttachment(); | 
| this->getPathStencilSettingsForFilltype(fill, sb, &stencilSettings); | 
| +    batch->setStencilSettings(stencilSettings); | 
| + | 
| +    // Don't compute a bounding box for dst copy texture, we'll opt | 
| +    // instead for it to just copy the entire dst. Realistically this is a moot | 
| +    // point, because any context that supports NV_path_rendering will also | 
| +    // support NV_blend_equation_advanced. | 
| +    GrDrawTarget::PipelineInfo pipelineInfo(&pipelineBuilder, &scissorState, batch, NULL, this); | 
|  | 
| -    GrDrawTarget::PipelineInfo pipelineInfo(&pipelineBuilder, &scissorState, pathProc, &devBounds, | 
| -                                            this); | 
| if (!pipelineInfo.valid()) { | 
| return; | 
| } | 
| +    if (!batch->installPipeline(pipelineInfo.pipelineCreateArgs())) { | 
| +        return; | 
| +    } | 
|  | 
| -    this->onDrawPath(pathProc, path, stencilSettings, pipelineInfo); | 
| +    this->onDrawBatch(batch); | 
| +    batch->unref(); | 
| } | 
|  | 
| void GrDrawTarget::drawPaths(const GrPipelineBuilder& pipelineBuilder, | 
|  |