| Index: src/gpu/GrImmediateDrawTarget.cpp
 | 
| diff --git a/src/gpu/GrImmediateDrawTarget.cpp b/src/gpu/GrImmediateDrawTarget.cpp
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..4c42a30f864d7c3982b80642882329ddeff24446
 | 
| --- /dev/null
 | 
| +++ b/src/gpu/GrImmediateDrawTarget.cpp
 | 
| @@ -0,0 +1,106 @@
 | 
| +/*
 | 
| + * Copyright 2015 Google Inc.
 | 
| + *
 | 
| + * Use of this source code is governed by a BSD-style license that can be
 | 
| + * found in the LICENSE file.
 | 
| + */
 | 
| +
 | 
| +#include "GrImmediateDrawTarget.h"
 | 
| +
 | 
| +#include "GrBatch.h"
 | 
| +#include "GrGpu.h"
 | 
| +#include "GrPipeline.h"
 | 
| +#include "GrRenderTarget.h"
 | 
| +#include "SkRect.h"
 | 
| +#include "SkTypes.h"
 | 
| +
 | 
| +GrImmediateDrawTarget::GrImmediateDrawTarget(GrContext* context)
 | 
| +    : INHERITED(context)
 | 
| +    , fBatchTarget(this->getGpu())
 | 
| +    , fDrawID(0) {
 | 
| +}
 | 
| +
 | 
| +GrImmediateDrawTarget::~GrImmediateDrawTarget() {
 | 
| +    this->reset();
 | 
| +}
 | 
| +
 | 
| +void GrImmediateDrawTarget::onDrawBatch(GrBatch* batch,
 | 
| +                                        const PipelineInfo& pipelineInfo) {
 | 
| +    SkAlignedSStorage<sizeof(GrPipeline)> pipelineStorage;
 | 
| +    GrPipeline* pipeline = reinterpret_cast<GrPipeline*>(pipelineStorage.get());
 | 
| +    if (!this->setupPipelineAndShouldDraw(pipeline, pipelineInfo)) {
 | 
| +        pipeline->~GrPipeline();
 | 
| +        return;
 | 
| +    }
 | 
| +
 | 
| +    batch->initBatchTracker(pipeline->getInitBatchTracker());
 | 
| +
 | 
| +    fBatchTarget.resetNumberOfDraws();
 | 
| +
 | 
| +    batch->generateGeometry(&fBatchTarget, pipeline);
 | 
| +    batch->setNumberOfDraws(fBatchTarget.numberOfDraws());
 | 
| +
 | 
| +    fBatchTarget.preFlush();
 | 
| +    fBatchTarget.flushNext(batch->numberOfDraws());
 | 
| +    fBatchTarget.postFlush();
 | 
| +
 | 
| +    pipeline->~GrPipeline();
 | 
| +}
 | 
| +
 | 
| +void GrImmediateDrawTarget::onClear(const SkIRect* rect, GrColor color,
 | 
| +                                    bool canIgnoreRect, GrRenderTarget* renderTarget) {
 | 
| +    this->getGpu()->clear(rect, color, canIgnoreRect, renderTarget);
 | 
| +}
 | 
| +
 | 
| +void GrImmediateDrawTarget::onCopySurface(GrSurface* dst,
 | 
| +                                          GrSurface* src,
 | 
| +                                          const SkIRect& srcRect,
 | 
| +                                          const SkIPoint& dstPoint) {
 | 
| +    SkASSERT(this->getGpu()->canCopySurface(dst, src, srcRect, dstPoint));
 | 
| +    this->getGpu()->copySurface(dst, src, srcRect, dstPoint);
 | 
| +}
 | 
| +
 | 
| +void GrImmediateDrawTarget::clearStencilClip(const SkIRect& rect,
 | 
| +                                             bool insideClip,
 | 
| +                                             GrRenderTarget* renderTarget) {
 | 
| +    this->getGpu()->clearStencilClip(rect, insideClip, renderTarget);
 | 
| +}
 | 
| +
 | 
| +void GrImmediateDrawTarget::discard(GrRenderTarget* renderTarget) {
 | 
| +    if (!this->caps()->discardRenderTargetSupport()) {
 | 
| +        return;
 | 
| +    }
 | 
| +
 | 
| +    this->getGpu()->discard(renderTarget);
 | 
| +}
 | 
| +
 | 
| +void GrImmediateDrawTarget::onReset() {
 | 
| +    fBatchTarget.reset();
 | 
| +}
 | 
| +
 | 
| +void GrImmediateDrawTarget::onFlush() {
 | 
| +    ++fDrawID;
 | 
| +}
 | 
| +
 | 
| +bool
 | 
| +GrImmediateDrawTarget::setupPipelineAndShouldDraw(GrPipeline* pipeline,
 | 
| +                                                  const GrDrawTarget::PipelineInfo& pipelineInfo) {
 | 
| +    this->setupPipeline(pipelineInfo, pipeline);
 | 
| +
 | 
| +    if (pipeline->mustSkip()) {
 | 
| +        return false;
 | 
| +    }
 | 
| +
 | 
| +    this->recordXferBarrierIfNecessary(pipeline);
 | 
| +    return true;
 | 
| +}
 | 
| +
 | 
| +void GrImmediateDrawTarget::recordXferBarrierIfNecessary(const GrPipeline* pipeline) {
 | 
| +    const GrXferProcessor& xp = *pipeline->getXferProcessor();
 | 
| +    GrRenderTarget* rt = pipeline->getRenderTarget();
 | 
| +
 | 
| +    GrXferBarrierType barrierType;
 | 
| +    if (xp.willNeedXferBarrier(rt, *this->caps(), &barrierType)) {
 | 
| +        this->getGpu()->xferBarrier(rt, barrierType);
 | 
| +    }
 | 
| +}
 | 
| 
 |