| Index: src/gpu/GrDrawContext.cpp
 | 
| diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp
 | 
| index d057984f9c67b61e399cfc967437091aad4230f7..dc24fb54390a82fb7eba556aa046c3a4020e0ab2 100644
 | 
| --- a/src/gpu/GrDrawContext.cpp
 | 
| +++ b/src/gpu/GrDrawContext.cpp
 | 
| @@ -25,6 +25,8 @@
 | 
|  
 | 
|  #include "effects/GrRRectEffect.h"
 | 
|  
 | 
| +#include "instanced/InstancedRendering.h"
 | 
| +
 | 
|  #include "text/GrAtlasTextContext.h"
 | 
|  #include "text/GrStencilAndCoverTextContext.h"
 | 
|  
 | 
| @@ -41,6 +43,8 @@
 | 
|  #define RETURN_FALSE_IF_ABANDONED_PRIV  if (fDrawContext->fDrawingManager->wasAbandoned()) { return false; }
 | 
|  #define RETURN_NULL_IF_ABANDONED   if (fDrawingManager->wasAbandoned()) { return nullptr; }
 | 
|  
 | 
| +using gr_instanced::InstancedRendering;
 | 
| +
 | 
|  class AutoCheckFlush {
 | 
|  public:
 | 
|      AutoCheckFlush(GrDrawingManager* drawingManager) : fDrawingManager(drawingManager) {
 | 
| @@ -70,6 +74,7 @@ GrDrawContext::GrDrawContext(GrContext* context,
 | 
|      , fRenderTarget(std::move(rt))
 | 
|      , fDrawTarget(SkSafeRef(fRenderTarget->getLastDrawTarget()))
 | 
|      , fContext(context)
 | 
| +    , fInstancedPipelineInfo(fRenderTarget.get())
 | 
|      , fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps))
 | 
|      , fAuditTrail(auditTrail)
 | 
|  #ifdef SK_DEBUG
 | 
| @@ -273,23 +278,29 @@ GrDrawBatch* GrDrawContext::getFillRectBatch(const GrPaint& paint,
 | 
|                                               const SkMatrix& viewMatrix,
 | 
|                                               const SkRect& rect,
 | 
|                                               bool* useHWAA) {
 | 
| +    if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) {
 | 
| +        if (GrDrawBatch* batch = ir->recordRect(rect, viewMatrix, paint.getColor(),
 | 
| +                                                paint.isAntiAlias(), fInstancedPipelineInfo,
 | 
| +                                                useHWAA)) {
 | 
| +            return batch;
 | 
| +        }
 | 
| +    }
 | 
|  
 | 
| -    GrDrawBatch* batch = nullptr;
 | 
|      if (should_apply_coverage_aa(paint, fRenderTarget.get(), useHWAA)) {
 | 
|          // The fill path can handle rotation but not skew.
 | 
|          if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) {
 | 
|              SkRect devBoundRect;
 | 
|              viewMatrix.mapRect(&devBoundRect, rect);
 | 
| -            batch = GrRectBatchFactory::CreateAAFill(paint.getColor(), viewMatrix,
 | 
| -                                                     rect, devBoundRect);
 | 
| +            return GrRectBatchFactory::CreateAAFill(paint.getColor(), viewMatrix,
 | 
| +                                                    rect, devBoundRect);
 | 
|          }
 | 
|      } else {
 | 
|          // filled BW rect
 | 
| -        batch = GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rect,
 | 
| -                                                    nullptr, nullptr);
 | 
| +        return GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rect,
 | 
| +                                                   nullptr, nullptr);
 | 
|      }
 | 
|  
 | 
| -    return batch;
 | 
| +    return nullptr;
 | 
|  }
 | 
|  
 | 
|  void GrDrawContext::drawRect(const GrClip& clip,
 | 
| @@ -479,9 +490,19 @@ void GrDrawContext::fillRectToRect(const GrClip& clip,
 | 
|      GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectToRect");
 | 
|  
 | 
|      AutoCheckFlush acf(fDrawingManager);
 | 
| -
 | 
| -    bool useHWAA;
 | 
|      SkAutoTUnref<GrDrawBatch> batch;
 | 
| +    bool useHWAA;
 | 
| +
 | 
| +    if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) {
 | 
| +        batch.reset(ir->recordRect(rectToDraw, viewMatrix, paint.getColor(), localRect,
 | 
| +                                   paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA));
 | 
| +        if (batch) {
 | 
| +            GrPipelineBuilder pipelineBuilder(paint, useHWAA);
 | 
| +            this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch);
 | 
| +            return;
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
|      if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) &&
 | 
|          view_matrix_ok_for_aa_fill_rect(viewMatrix)) {
 | 
|          batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), viewMatrix, rectToDraw,
 | 
| @@ -508,9 +529,19 @@ void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip,
 | 
|      GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectWithLocalMatrix");
 | 
|  
 | 
|      AutoCheckFlush acf(fDrawingManager);
 | 
| -
 | 
| -    bool useHWAA;
 | 
|      SkAutoTUnref<GrDrawBatch> batch;
 | 
| +    bool useHWAA;
 | 
| +
 | 
| +    if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) {
 | 
| +        batch.reset(ir->recordRect(rectToDraw, viewMatrix, paint.getColor(), localMatrix,
 | 
| +                                   paint.isAntiAlias(), fInstancedPipelineInfo, &useHWAA));
 | 
| +        if (batch) {
 | 
| +            GrPipelineBuilder pipelineBuilder(paint, useHWAA);
 | 
| +            this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch);
 | 
| +            return;
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
|      if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA) &&
 | 
|          view_matrix_ok_for_aa_fill_rect(viewMatrix)) {
 | 
|          batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, localMatrix,
 | 
| @@ -607,13 +638,25 @@ void GrDrawContext::drawRRect(const GrClip& clip,
 | 
|      }
 | 
|  
 | 
|      SkASSERT(!style.pathEffect()); // this should've been devolved to a path in SkGpuDevice
 | 
| -    const SkStrokeRec stroke = style.strokeRec();
 | 
| -    AutoCheckFlush acf(fDrawingManager);
 | 
|  
 | 
| +    AutoCheckFlush acf(fDrawingManager);
 | 
| +    const SkStrokeRec stroke = style.strokeRec();
 | 
|      bool useHWAA;
 | 
| +
 | 
| +    if (this->getDrawTarget()->instancedRendering() && stroke.isFillStyle()) {
 | 
| +        InstancedRendering* ir = this->getDrawTarget()->instancedRendering();
 | 
| +        SkAutoTUnref<GrDrawBatch> batch(ir->recordRRect(rrect, viewMatrix, paint.getColor(),
 | 
| +                                                        paint.isAntiAlias(), fInstancedPipelineInfo,
 | 
| +                                                        &useHWAA));
 | 
| +        if (batch) {
 | 
| +            GrPipelineBuilder pipelineBuilder(paint, useHWAA);
 | 
| +            this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch);
 | 
| +            return;
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
|      if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA)) {
 | 
|          GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps();
 | 
| -
 | 
|          SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(paint.getColor(),
 | 
|                                                                           viewMatrix,
 | 
|                                                                           rrect,
 | 
| @@ -640,6 +683,18 @@ bool GrDrawContext::drawFilledDRRect(const GrClip& clip,
 | 
|      SkASSERT(!origInner.isEmpty());
 | 
|      SkASSERT(!origOuter.isEmpty());
 | 
|  
 | 
| +    if (InstancedRendering* ir = this->getDrawTarget()->instancedRendering()) {
 | 
| +        bool useHWAA;
 | 
| +        SkAutoTUnref<GrDrawBatch> batch(ir->recordDRRect(origOuter, origInner, viewMatrix,
 | 
| +                                                         paintIn.getColor(), paintIn.isAntiAlias(),
 | 
| +                                                         fInstancedPipelineInfo, &useHWAA));
 | 
| +        if (batch) {
 | 
| +            GrPipelineBuilder pipelineBuilder(paintIn, useHWAA);
 | 
| +            this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch);
 | 
| +            return true;
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
|      bool applyAA = paintIn.isAntiAlias() && !fRenderTarget->isUnifiedMultisampled();
 | 
|  
 | 
|      GrPrimitiveEdgeType innerEdgeType = applyAA ? kInverseFillAA_GrProcessorEdgeType :
 | 
| @@ -738,6 +793,19 @@ void GrDrawContext::drawOval(const GrClip& clip,
 | 
|      AutoCheckFlush acf(fDrawingManager);
 | 
|      const SkStrokeRec& stroke = style.strokeRec();
 | 
|      bool useHWAA;
 | 
| +
 | 
| +    if (this->getDrawTarget()->instancedRendering() && stroke.isFillStyle()) {
 | 
| +        InstancedRendering* ir = this->getDrawTarget()->instancedRendering();
 | 
| +        SkAutoTUnref<GrDrawBatch> batch(ir->recordOval(oval, viewMatrix, paint.getColor(),
 | 
| +                                                       paint.isAntiAlias(), fInstancedPipelineInfo,
 | 
| +                                                       &useHWAA));
 | 
| +        if (batch) {
 | 
| +            GrPipelineBuilder pipelineBuilder(paint, useHWAA);
 | 
| +            this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch);
 | 
| +            return;
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
|      if (should_apply_coverage_aa(paint, fRenderTarget.get(), &useHWAA)) {
 | 
|          GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps();
 | 
|          SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(paint.getColor(),
 | 
| 
 |